OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" | 5 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <stack> | 8 #include <stack> |
| 9 #include <utility> |
9 | 10 |
10 #include "base/bind.h" | 11 #include "base/bind.h" |
11 #include "base/command_line.h" | 12 #include "base/command_line.h" |
12 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
13 #include "base/files/file_util.h" | 14 #include "base/files/file_util.h" |
14 #include "base/location.h" | 15 #include "base/location.h" |
15 #include "base/macros.h" | 16 #include "base/macros.h" |
16 #include "base/memory/scoped_vector.h" | 17 #include "base/memory/scoped_vector.h" |
17 #include "base/single_thread_task_runner.h" | 18 #include "base/single_thread_task_runner.h" |
18 #include "base/stl_util.h" | 19 #include "base/stl_util.h" |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 int64_t change_id, | 117 int64_t change_id, |
117 const google_apis::FileResource& resource) { | 118 const google_apis::FileResource& resource) { |
118 scoped_ptr<FileMetadata> file(new FileMetadata); | 119 scoped_ptr<FileMetadata> file(new FileMetadata); |
119 file->set_file_id(resource.file_id()); | 120 file->set_file_id(resource.file_id()); |
120 | 121 |
121 FileDetails* details = file->mutable_details(); | 122 FileDetails* details = file->mutable_details(); |
122 details->set_change_id(change_id); | 123 details->set_change_id(change_id); |
123 | 124 |
124 if (resource.labels().is_trashed()) { | 125 if (resource.labels().is_trashed()) { |
125 details->set_missing(true); | 126 details->set_missing(true); |
126 return file.Pass(); | 127 return file; |
127 } | 128 } |
128 | 129 |
129 PopulateFileDetailsByFileResource(resource, details); | 130 PopulateFileDetailsByFileResource(resource, details); |
130 return file.Pass(); | 131 return file; |
131 } | 132 } |
132 | 133 |
133 scoped_ptr<FileMetadata> CreateFileMetadataFromChangeResource( | 134 scoped_ptr<FileMetadata> CreateFileMetadataFromChangeResource( |
134 const google_apis::ChangeResource& change) { | 135 const google_apis::ChangeResource& change) { |
135 scoped_ptr<FileMetadata> file(new FileMetadata); | 136 scoped_ptr<FileMetadata> file(new FileMetadata); |
136 file->set_file_id(change.file_id()); | 137 file->set_file_id(change.file_id()); |
137 | 138 |
138 FileDetails* details = file->mutable_details(); | 139 FileDetails* details = file->mutable_details(); |
139 details->set_change_id(change.change_id()); | 140 details->set_change_id(change.change_id()); |
140 | 141 |
141 if (change.is_deleted()) { | 142 if (change.is_deleted()) { |
142 details->set_missing(true); | 143 details->set_missing(true); |
143 return file.Pass(); | 144 return file; |
144 } | 145 } |
145 | 146 |
146 PopulateFileDetailsByFileResource(*change.file(), details); | 147 PopulateFileDetailsByFileResource(*change.file(), details); |
147 return file.Pass(); | 148 return file; |
148 } | 149 } |
149 | 150 |
150 scoped_ptr<FileMetadata> CreateDeletedFileMetadata(int64_t change_id, | 151 scoped_ptr<FileMetadata> CreateDeletedFileMetadata(int64_t change_id, |
151 const std::string& file_id) { | 152 const std::string& file_id) { |
152 scoped_ptr<FileMetadata> file(new FileMetadata); | 153 scoped_ptr<FileMetadata> file(new FileMetadata); |
153 file->set_file_id(file_id); | 154 file->set_file_id(file_id); |
154 | 155 |
155 FileDetails* details = file->mutable_details(); | 156 FileDetails* details = file->mutable_details(); |
156 details->set_change_id(change_id); | 157 details->set_change_id(change_id); |
157 details->set_missing(true); | 158 details->set_missing(true); |
158 return file.Pass(); | 159 return file; |
159 } | 160 } |
160 | 161 |
161 scoped_ptr<FileTracker> CreateSyncRootTracker( | 162 scoped_ptr<FileTracker> CreateSyncRootTracker( |
162 int64_t tracker_id, | 163 int64_t tracker_id, |
163 const FileMetadata& sync_root_metadata) { | 164 const FileMetadata& sync_root_metadata) { |
164 scoped_ptr<FileTracker> sync_root_tracker(new FileTracker); | 165 scoped_ptr<FileTracker> sync_root_tracker(new FileTracker); |
165 sync_root_tracker->set_tracker_id(tracker_id); | 166 sync_root_tracker->set_tracker_id(tracker_id); |
166 sync_root_tracker->set_file_id(sync_root_metadata.file_id()); | 167 sync_root_tracker->set_file_id(sync_root_metadata.file_id()); |
167 sync_root_tracker->set_parent_tracker_id(0); | 168 sync_root_tracker->set_parent_tracker_id(0); |
168 sync_root_tracker->set_tracker_kind(TRACKER_KIND_REGULAR); | 169 sync_root_tracker->set_tracker_kind(TRACKER_KIND_REGULAR); |
169 sync_root_tracker->set_dirty(false); | 170 sync_root_tracker->set_dirty(false); |
170 sync_root_tracker->set_active(true); | 171 sync_root_tracker->set_active(true); |
171 sync_root_tracker->set_needs_folder_listing(false); | 172 sync_root_tracker->set_needs_folder_listing(false); |
172 *sync_root_tracker->mutable_synced_details() = sync_root_metadata.details(); | 173 *sync_root_tracker->mutable_synced_details() = sync_root_metadata.details(); |
173 return sync_root_tracker.Pass(); | 174 return sync_root_tracker; |
174 } | 175 } |
175 | 176 |
176 scoped_ptr<FileTracker> CreateInitialAppRootTracker( | 177 scoped_ptr<FileTracker> CreateInitialAppRootTracker( |
177 int64_t tracker_id, | 178 int64_t tracker_id, |
178 int64_t parent_tracker_id, | 179 int64_t parent_tracker_id, |
179 const FileMetadata& app_root_metadata) { | 180 const FileMetadata& app_root_metadata) { |
180 scoped_ptr<FileTracker> app_root_tracker(new FileTracker); | 181 scoped_ptr<FileTracker> app_root_tracker(new FileTracker); |
181 app_root_tracker->set_tracker_id(tracker_id); | 182 app_root_tracker->set_tracker_id(tracker_id); |
182 app_root_tracker->set_parent_tracker_id(parent_tracker_id); | 183 app_root_tracker->set_parent_tracker_id(parent_tracker_id); |
183 app_root_tracker->set_file_id(app_root_metadata.file_id()); | 184 app_root_tracker->set_file_id(app_root_metadata.file_id()); |
184 app_root_tracker->set_tracker_kind(TRACKER_KIND_REGULAR); | 185 app_root_tracker->set_tracker_kind(TRACKER_KIND_REGULAR); |
185 app_root_tracker->set_dirty(false); | 186 app_root_tracker->set_dirty(false); |
186 app_root_tracker->set_active(false); | 187 app_root_tracker->set_active(false); |
187 app_root_tracker->set_needs_folder_listing(false); | 188 app_root_tracker->set_needs_folder_listing(false); |
188 *app_root_tracker->mutable_synced_details() = app_root_metadata.details(); | 189 *app_root_tracker->mutable_synced_details() = app_root_metadata.details(); |
189 return app_root_tracker.Pass(); | 190 return app_root_tracker; |
190 } | 191 } |
191 | 192 |
192 scoped_ptr<FileTracker> CloneFileTracker(const FileTracker* obj) { | 193 scoped_ptr<FileTracker> CloneFileTracker(const FileTracker* obj) { |
193 if (!obj) | 194 if (!obj) |
194 return nullptr; | 195 return nullptr; |
195 return scoped_ptr<FileTracker>(new FileTracker(*obj)); | 196 return scoped_ptr<FileTracker>(new FileTracker(*obj)); |
196 } | 197 } |
197 | 198 |
198 // Returns true if |db| has no content. | 199 // Returns true if |db| has no content. |
199 bool IsDatabaseEmpty(LevelDBWrapper* db) { | 200 bool IsDatabaseEmpty(LevelDBWrapper* db) { |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 | 284 |
284 void MarkTrackerSetDirty(const TrackerIDSet& trackers, | 285 void MarkTrackerSetDirty(const TrackerIDSet& trackers, |
285 MetadataDatabaseIndexInterface* index) { | 286 MetadataDatabaseIndexInterface* index) { |
286 for (TrackerIDSet::const_iterator itr = trackers.begin(); | 287 for (TrackerIDSet::const_iterator itr = trackers.begin(); |
287 itr != trackers.end(); ++itr) { | 288 itr != trackers.end(); ++itr) { |
288 scoped_ptr<FileTracker> tracker(new FileTracker); | 289 scoped_ptr<FileTracker> tracker(new FileTracker); |
289 index->GetFileTracker(*itr, tracker.get()); | 290 index->GetFileTracker(*itr, tracker.get()); |
290 if (tracker->dirty()) | 291 if (tracker->dirty()) |
291 continue; | 292 continue; |
292 tracker->set_dirty(true); | 293 tracker->set_dirty(true); |
293 index->StoreFileTracker(tracker.Pass()); | 294 index->StoreFileTracker(std::move(tracker)); |
294 } | 295 } |
295 } | 296 } |
296 | 297 |
297 void MarkTrackersDirtyByPath(int64_t parent_tracker_id, | 298 void MarkTrackersDirtyByPath(int64_t parent_tracker_id, |
298 const std::string& title, | 299 const std::string& title, |
299 MetadataDatabaseIndexInterface* index) { | 300 MetadataDatabaseIndexInterface* index) { |
300 if (parent_tracker_id == kInvalidTrackerID || title.empty()) | 301 if (parent_tracker_id == kInvalidTrackerID || title.empty()) |
301 return; | 302 return; |
302 MarkTrackerSetDirty( | 303 MarkTrackerSetDirty( |
303 index->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title), | 304 index->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title), |
(...skipping 11 matching lines...) Expand all Loading... |
315 stack.push_back(root_tracker_id); | 316 stack.push_back(root_tracker_id); |
316 while (!stack.empty()) { | 317 while (!stack.empty()) { |
317 int64_t tracker_id = stack.back(); | 318 int64_t tracker_id = stack.back(); |
318 stack.pop_back(); | 319 stack.pop_back(); |
319 AppendContents(index->GetFileTrackerIDsByParent(tracker_id), &stack); | 320 AppendContents(index->GetFileTrackerIDsByParent(tracker_id), &stack); |
320 | 321 |
321 scoped_ptr<FileTracker> tracker(new FileTracker); | 322 scoped_ptr<FileTracker> tracker(new FileTracker); |
322 index->GetFileTracker(tracker_id, tracker.get()); | 323 index->GetFileTracker(tracker_id, tracker.get()); |
323 tracker->set_dirty(true); | 324 tracker->set_dirty(true); |
324 | 325 |
325 index->StoreFileTracker(tracker.Pass()); | 326 index->StoreFileTracker(std::move(tracker)); |
326 } | 327 } |
327 } | 328 } |
328 | 329 |
329 void RemoveAllDescendantTrackers(int64_t root_tracker_id, | 330 void RemoveAllDescendantTrackers(int64_t root_tracker_id, |
330 MetadataDatabaseIndexInterface* index) { | 331 MetadataDatabaseIndexInterface* index) { |
331 std::vector<int64_t> pending_trackers; | 332 std::vector<int64_t> pending_trackers; |
332 AppendContents(index->GetFileTrackerIDsByParent(root_tracker_id), | 333 AppendContents(index->GetFileTrackerIDsByParent(root_tracker_id), |
333 &pending_trackers); | 334 &pending_trackers); |
334 | 335 |
335 std::vector<int64_t> to_be_removed; | 336 std::vector<int64_t> to_be_removed; |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 if (dirtying_options & MARK_ITSELF_DIRTY) { | 464 if (dirtying_options & MARK_ITSELF_DIRTY) { |
464 tracker->set_dirty(true); | 465 tracker->set_dirty(true); |
465 tracker->set_needs_folder_listing( | 466 tracker->set_needs_folder_listing( |
466 tracker->has_synced_details() && | 467 tracker->has_synced_details() && |
467 tracker->synced_details().file_kind() == FILE_KIND_FOLDER); | 468 tracker->synced_details().file_kind() == FILE_KIND_FOLDER); |
468 } else { | 469 } else { |
469 tracker->set_dirty(false); | 470 tracker->set_dirty(false); |
470 tracker->set_needs_folder_listing(false); | 471 tracker->set_needs_folder_listing(false); |
471 } | 472 } |
472 | 473 |
473 index->StoreFileTracker(tracker.Pass()); | 474 index->StoreFileTracker(std::move(tracker)); |
474 } | 475 } |
475 | 476 |
476 void DeactivateFileTracker(int64_t tracker_id, | 477 void DeactivateFileTracker(int64_t tracker_id, |
477 int dirtying_options, | 478 int dirtying_options, |
478 MetadataDatabaseIndexInterface* index) { | 479 MetadataDatabaseIndexInterface* index) { |
479 RemoveAllDescendantTrackers(tracker_id, index); | 480 RemoveAllDescendantTrackers(tracker_id, index); |
480 | 481 |
481 scoped_ptr<FileTracker> tracker(new FileTracker); | 482 scoped_ptr<FileTracker> tracker(new FileTracker); |
482 index->GetFileTracker(tracker_id, tracker.get()); | 483 index->GetFileTracker(tracker_id, tracker.get()); |
483 | 484 |
484 if (dirtying_options & MARK_SAME_FILE_ID_TRACKERS_DIRTY) | 485 if (dirtying_options & MARK_SAME_FILE_ID_TRACKERS_DIRTY) |
485 MarkTrackersDirtyByFileID(tracker->file_id(), index); | 486 MarkTrackersDirtyByFileID(tracker->file_id(), index); |
486 if (dirtying_options & MARK_SAME_PATH_TRACKERS_DIRTY) { | 487 if (dirtying_options & MARK_SAME_PATH_TRACKERS_DIRTY) { |
487 MarkTrackersDirtyByPath(tracker->parent_tracker_id(), | 488 MarkTrackersDirtyByPath(tracker->parent_tracker_id(), |
488 GetTrackerTitle(*tracker), index); | 489 GetTrackerTitle(*tracker), index); |
489 } | 490 } |
490 | 491 |
491 tracker->set_dirty(dirtying_options & MARK_ITSELF_DIRTY); | 492 tracker->set_dirty(dirtying_options & MARK_ITSELF_DIRTY); |
492 tracker->set_active(false); | 493 tracker->set_active(false); |
493 index->StoreFileTracker(tracker.Pass()); | 494 index->StoreFileTracker(std::move(tracker)); |
494 } | 495 } |
495 | 496 |
496 void RemoveFileTracker(int64_t tracker_id, | 497 void RemoveFileTracker(int64_t tracker_id, |
497 int dirtying_options, | 498 int dirtying_options, |
498 MetadataDatabaseIndexInterface* index) { | 499 MetadataDatabaseIndexInterface* index) { |
499 DCHECK(!(dirtying_options & MARK_ITSELF_DIRTY)); | 500 DCHECK(!(dirtying_options & MARK_ITSELF_DIRTY)); |
500 | 501 |
501 FileTracker tracker; | 502 FileTracker tracker; |
502 if (!index->GetFileTracker(tracker_id, &tracker)) | 503 if (!index->GetFileTracker(tracker_id, &tracker)) |
503 return; | 504 return; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 new MetadataDatabase(database_path, | 555 new MetadataDatabase(database_path, |
555 enable_on_disk_index, | 556 enable_on_disk_index, |
556 env_override)); | 557 env_override)); |
557 status = metadata_database->Initialize(); | 558 status = metadata_database->Initialize(); |
558 } | 559 } |
559 | 560 |
560 if (status != SYNC_STATUS_OK) | 561 if (status != SYNC_STATUS_OK) |
561 metadata_database.reset(); | 562 metadata_database.reset(); |
562 | 563 |
563 *status_out = status; | 564 *status_out = status; |
564 return metadata_database.Pass(); | 565 return metadata_database; |
565 } | 566 } |
566 | 567 |
567 // static | 568 // static |
568 SyncStatusCode MetadataDatabase::CreateForTesting( | 569 SyncStatusCode MetadataDatabase::CreateForTesting( |
569 scoped_ptr<LevelDBWrapper> db, | 570 scoped_ptr<LevelDBWrapper> db, |
570 bool enable_on_disk_index, | 571 bool enable_on_disk_index, |
571 scoped_ptr<MetadataDatabase>* metadata_database_out) { | 572 scoped_ptr<MetadataDatabase>* metadata_database_out) { |
572 scoped_ptr<MetadataDatabase> metadata_database( | 573 scoped_ptr<MetadataDatabase> metadata_database( |
573 new MetadataDatabase(base::FilePath(), | 574 new MetadataDatabase(base::FilePath(), |
574 enable_on_disk_index, | 575 enable_on_disk_index, |
575 nullptr)); | 576 nullptr)); |
576 metadata_database->db_ = db.Pass(); | 577 metadata_database->db_ = std::move(db); |
577 SyncStatusCode status = metadata_database->Initialize(); | 578 SyncStatusCode status = metadata_database->Initialize(); |
578 if (status == SYNC_STATUS_OK) | 579 if (status == SYNC_STATUS_OK) |
579 *metadata_database_out = metadata_database.Pass(); | 580 *metadata_database_out = std::move(metadata_database); |
580 return status; | 581 return status; |
581 } | 582 } |
582 | 583 |
583 MetadataDatabase::~MetadataDatabase() { | 584 MetadataDatabase::~MetadataDatabase() { |
584 } | 585 } |
585 | 586 |
586 // static | 587 // static |
587 void MetadataDatabase::ClearDatabase( | 588 void MetadataDatabase::ClearDatabase( |
588 scoped_ptr<MetadataDatabase> metadata_database) { | 589 scoped_ptr<MetadataDatabase> metadata_database) { |
589 DCHECK(metadata_database); | 590 DCHECK(metadata_database); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
681 sync_root_tracker_id, tracker.get())) { | 682 sync_root_tracker_id, tracker.get())) { |
682 return SYNC_DATABASE_ERROR_NOT_FOUND; | 683 return SYNC_DATABASE_ERROR_NOT_FOUND; |
683 } | 684 } |
684 | 685 |
685 tracker->set_app_id(app_id); | 686 tracker->set_app_id(app_id); |
686 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); | 687 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); |
687 tracker->set_active(true); | 688 tracker->set_active(true); |
688 tracker->set_needs_folder_listing(true); | 689 tracker->set_needs_folder_listing(true); |
689 tracker->set_dirty(true); | 690 tracker->set_dirty(true); |
690 | 691 |
691 index_->StoreFileTracker(tracker.Pass()); | 692 index_->StoreFileTracker(std::move(tracker)); |
692 return WriteToDatabase(); | 693 return WriteToDatabase(); |
693 } | 694 } |
694 | 695 |
695 SyncStatusCode MetadataDatabase::DisableApp(const std::string& app_id) { | 696 SyncStatusCode MetadataDatabase::DisableApp(const std::string& app_id) { |
696 int64_t tracker_id = index_->GetAppRootTracker(app_id); | 697 int64_t tracker_id = index_->GetAppRootTracker(app_id); |
697 scoped_ptr<FileTracker> tracker(new FileTracker); | 698 scoped_ptr<FileTracker> tracker(new FileTracker); |
698 if (!index_->GetFileTracker(tracker_id, tracker.get())) { | 699 if (!index_->GetFileTracker(tracker_id, tracker.get())) { |
699 return SYNC_DATABASE_ERROR_NOT_FOUND; | 700 return SYNC_DATABASE_ERROR_NOT_FOUND; |
700 } | 701 } |
701 | 702 |
702 if (tracker->tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT) { | 703 if (tracker->tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT) { |
703 return SYNC_STATUS_OK; | 704 return SYNC_STATUS_OK; |
704 } | 705 } |
705 | 706 |
706 DCHECK_EQ(TRACKER_KIND_APP_ROOT, tracker->tracker_kind()); | 707 DCHECK_EQ(TRACKER_KIND_APP_ROOT, tracker->tracker_kind()); |
707 DCHECK(tracker->active()); | 708 DCHECK(tracker->active()); |
708 | 709 |
709 // Keep the app-root tracker active (but change the tracker_kind) so that | 710 // Keep the app-root tracker active (but change the tracker_kind) so that |
710 // other conflicting trackers won't become active. | 711 // other conflicting trackers won't become active. |
711 tracker->set_tracker_kind(TRACKER_KIND_DISABLED_APP_ROOT); | 712 tracker->set_tracker_kind(TRACKER_KIND_DISABLED_APP_ROOT); |
712 | 713 |
713 index_->StoreFileTracker(tracker.Pass()); | 714 index_->StoreFileTracker(std::move(tracker)); |
714 return WriteToDatabase(); | 715 return WriteToDatabase(); |
715 } | 716 } |
716 | 717 |
717 SyncStatusCode MetadataDatabase::EnableApp(const std::string& app_id) { | 718 SyncStatusCode MetadataDatabase::EnableApp(const std::string& app_id) { |
718 int64_t tracker_id = index_->GetAppRootTracker(app_id); | 719 int64_t tracker_id = index_->GetAppRootTracker(app_id); |
719 scoped_ptr<FileTracker> tracker(new FileTracker); | 720 scoped_ptr<FileTracker> tracker(new FileTracker); |
720 if (!index_->GetFileTracker(tracker_id, tracker.get())) { | 721 if (!index_->GetFileTracker(tracker_id, tracker.get())) { |
721 return SYNC_DATABASE_ERROR_NOT_FOUND; | 722 return SYNC_DATABASE_ERROR_NOT_FOUND; |
722 } | 723 } |
723 | 724 |
724 if (tracker->tracker_kind() == TRACKER_KIND_APP_ROOT) { | 725 if (tracker->tracker_kind() == TRACKER_KIND_APP_ROOT) { |
725 return SYNC_STATUS_OK; | 726 return SYNC_STATUS_OK; |
726 } | 727 } |
727 | 728 |
728 DCHECK_EQ(TRACKER_KIND_DISABLED_APP_ROOT, tracker->tracker_kind()); | 729 DCHECK_EQ(TRACKER_KIND_DISABLED_APP_ROOT, tracker->tracker_kind()); |
729 DCHECK(tracker->active()); | 730 DCHECK(tracker->active()); |
730 | 731 |
731 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); | 732 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); |
732 index_->StoreFileTracker(tracker.Pass()); | 733 index_->StoreFileTracker(std::move(tracker)); |
733 | 734 |
734 MarkTrackersDirtyRecursively(tracker_id, index_.get()); | 735 MarkTrackersDirtyRecursively(tracker_id, index_.get()); |
735 return WriteToDatabase(); | 736 return WriteToDatabase(); |
736 } | 737 } |
737 | 738 |
738 SyncStatusCode MetadataDatabase::UnregisterApp(const std::string& app_id) { | 739 SyncStatusCode MetadataDatabase::UnregisterApp(const std::string& app_id) { |
739 int64_t tracker_id = index_->GetAppRootTracker(app_id); | 740 int64_t tracker_id = index_->GetAppRootTracker(app_id); |
740 scoped_ptr<FileTracker> tracker(new FileTracker); | 741 scoped_ptr<FileTracker> tracker(new FileTracker); |
741 if (!index_->GetFileTracker(tracker_id, tracker.get()) || | 742 if (!index_->GetFileTracker(tracker_id, tracker.get()) || |
742 tracker->tracker_kind() == TRACKER_KIND_REGULAR) { | 743 tracker->tracker_kind() == TRACKER_KIND_REGULAR) { |
743 return SYNC_STATUS_OK; | 744 return SYNC_STATUS_OK; |
744 } | 745 } |
745 | 746 |
746 RemoveAllDescendantTrackers(tracker_id, index_.get()); | 747 RemoveAllDescendantTrackers(tracker_id, index_.get()); |
747 | 748 |
748 tracker->clear_app_id(); | 749 tracker->clear_app_id(); |
749 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); | 750 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); |
750 tracker->set_active(false); | 751 tracker->set_active(false); |
751 tracker->set_dirty(true); | 752 tracker->set_dirty(true); |
752 | 753 |
753 index_->StoreFileTracker(tracker.Pass()); | 754 index_->StoreFileTracker(std::move(tracker)); |
754 return WriteToDatabase(); | 755 return WriteToDatabase(); |
755 } | 756 } |
756 | 757 |
757 bool MetadataDatabase::FindAppRootTracker(const std::string& app_id, | 758 bool MetadataDatabase::FindAppRootTracker(const std::string& app_id, |
758 FileTracker* tracker_out) const { | 759 FileTracker* tracker_out) const { |
759 int64_t app_root_tracker_id = index_->GetAppRootTracker(app_id); | 760 int64_t app_root_tracker_id = index_->GetAppRootTracker(app_id); |
760 if (!app_root_tracker_id) | 761 if (!app_root_tracker_id) |
761 return false; | 762 return false; |
762 | 763 |
763 if (tracker_out && | 764 if (tracker_out && |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
893 ScopedVector<google_apis::ChangeResource> changes) { | 894 ScopedVector<google_apis::ChangeResource> changes) { |
894 DCHECK_LE(index_->GetLargestChangeID(), largest_change_id); | 895 DCHECK_LE(index_->GetLargestChangeID(), largest_change_id); |
895 | 896 |
896 for (size_t i = 0; i < changes.size(); ++i) { | 897 for (size_t i = 0; i < changes.size(); ++i) { |
897 const google_apis::ChangeResource& change = *changes[i]; | 898 const google_apis::ChangeResource& change = *changes[i]; |
898 if (HasNewerFileMetadata(change.file_id(), change.change_id())) | 899 if (HasNewerFileMetadata(change.file_id(), change.change_id())) |
899 continue; | 900 continue; |
900 | 901 |
901 scoped_ptr<FileMetadata> metadata( | 902 scoped_ptr<FileMetadata> metadata( |
902 CreateFileMetadataFromChangeResource(change)); | 903 CreateFileMetadataFromChangeResource(change)); |
903 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), | 904 UpdateByFileMetadata(FROM_HERE, std::move(metadata), |
904 UPDATE_TRACKER_FOR_UNSYNCED_FILE); | 905 UPDATE_TRACKER_FOR_UNSYNCED_FILE); |
905 } | 906 } |
906 | 907 |
907 UpdateLargestKnownChangeID(largest_change_id); | 908 UpdateLargestKnownChangeID(largest_change_id); |
908 index_->SetLargestChangeID(largest_change_id); | 909 index_->SetLargestChangeID(largest_change_id); |
909 return WriteToDatabase(); | 910 return WriteToDatabase(); |
910 } | 911 } |
911 | 912 |
912 SyncStatusCode MetadataDatabase::UpdateByFileResource( | 913 SyncStatusCode MetadataDatabase::UpdateByFileResource( |
913 const google_apis::FileResource& resource) { | 914 const google_apis::FileResource& resource) { |
914 scoped_ptr<FileMetadata> metadata( | 915 scoped_ptr<FileMetadata> metadata( |
915 CreateFileMetadataFromFileResource( | 916 CreateFileMetadataFromFileResource( |
916 GetLargestKnownChangeID(), resource)); | 917 GetLargestKnownChangeID(), resource)); |
917 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), | 918 UpdateByFileMetadata(FROM_HERE, std::move(metadata), |
918 UPDATE_TRACKER_FOR_UNSYNCED_FILE); | 919 UPDATE_TRACKER_FOR_UNSYNCED_FILE); |
919 return WriteToDatabase(); | 920 return WriteToDatabase(); |
920 } | 921 } |
921 | 922 |
922 SyncStatusCode MetadataDatabase::UpdateByFileResourceList( | 923 SyncStatusCode MetadataDatabase::UpdateByFileResourceList( |
923 ScopedVector<google_apis::FileResource> resources) { | 924 ScopedVector<google_apis::FileResource> resources) { |
924 for (size_t i = 0; i < resources.size(); ++i) { | 925 for (size_t i = 0; i < resources.size(); ++i) { |
925 scoped_ptr<FileMetadata> metadata( | 926 scoped_ptr<FileMetadata> metadata( |
926 CreateFileMetadataFromFileResource( | 927 CreateFileMetadataFromFileResource( |
927 GetLargestKnownChangeID(), *resources[i])); | 928 GetLargestKnownChangeID(), *resources[i])); |
928 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), | 929 UpdateByFileMetadata(FROM_HERE, std::move(metadata), |
929 UPDATE_TRACKER_FOR_UNSYNCED_FILE); | 930 UPDATE_TRACKER_FOR_UNSYNCED_FILE); |
930 } | 931 } |
931 return WriteToDatabase(); | 932 return WriteToDatabase(); |
932 } | 933 } |
933 | 934 |
934 SyncStatusCode MetadataDatabase::UpdateByDeletedRemoteFile( | 935 SyncStatusCode MetadataDatabase::UpdateByDeletedRemoteFile( |
935 const std::string& file_id) { | 936 const std::string& file_id) { |
936 scoped_ptr<FileMetadata> metadata( | 937 scoped_ptr<FileMetadata> metadata( |
937 CreateDeletedFileMetadata(GetLargestKnownChangeID(), file_id)); | 938 CreateDeletedFileMetadata(GetLargestKnownChangeID(), file_id)); |
938 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), | 939 UpdateByFileMetadata(FROM_HERE, std::move(metadata), |
939 UPDATE_TRACKER_FOR_UNSYNCED_FILE); | 940 UPDATE_TRACKER_FOR_UNSYNCED_FILE); |
940 return WriteToDatabase(); | 941 return WriteToDatabase(); |
941 } | 942 } |
942 | 943 |
943 SyncStatusCode MetadataDatabase::UpdateByDeletedRemoteFileList( | 944 SyncStatusCode MetadataDatabase::UpdateByDeletedRemoteFileList( |
944 const FileIDList& file_ids) { | 945 const FileIDList& file_ids) { |
945 for (FileIDList::const_iterator itr = file_ids.begin(); | 946 for (FileIDList::const_iterator itr = file_ids.begin(); |
946 itr != file_ids.end(); ++itr) { | 947 itr != file_ids.end(); ++itr) { |
947 scoped_ptr<FileMetadata> metadata( | 948 scoped_ptr<FileMetadata> metadata( |
948 CreateDeletedFileMetadata(GetLargestKnownChangeID(), *itr)); | 949 CreateDeletedFileMetadata(GetLargestKnownChangeID(), *itr)); |
949 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), | 950 UpdateByFileMetadata(FROM_HERE, std::move(metadata), |
950 UPDATE_TRACKER_FOR_UNSYNCED_FILE); | 951 UPDATE_TRACKER_FOR_UNSYNCED_FILE); |
951 } | 952 } |
952 return WriteToDatabase(); | 953 return WriteToDatabase(); |
953 } | 954 } |
954 | 955 |
955 SyncStatusCode MetadataDatabase::ReplaceActiveTrackerWithNewResource( | 956 SyncStatusCode MetadataDatabase::ReplaceActiveTrackerWithNewResource( |
956 int64_t parent_tracker_id, | 957 int64_t parent_tracker_id, |
957 const google_apis::FileResource& resource) { | 958 const google_apis::FileResource& resource) { |
958 DCHECK(!index_->GetFileMetadata(resource.file_id(), nullptr)); | 959 DCHECK(!index_->GetFileMetadata(resource.file_id(), nullptr)); |
959 DCHECK(index_->GetFileTracker(parent_tracker_id, nullptr)); | 960 DCHECK(index_->GetFileTracker(parent_tracker_id, nullptr)); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1018 } | 1019 } |
1019 children.erase(tracker.file_id()); | 1020 children.erase(tracker.file_id()); |
1020 } | 1021 } |
1021 | 1022 |
1022 for (base::hash_set<std::string>::const_iterator itr = children.begin(); | 1023 for (base::hash_set<std::string>::const_iterator itr = children.begin(); |
1023 itr != children.end(); ++itr) | 1024 itr != children.end(); ++itr) |
1024 CreateTrackerForParentAndFileID(*folder_tracker, *itr); | 1025 CreateTrackerForParentAndFileID(*folder_tracker, *itr); |
1025 folder_tracker->set_needs_folder_listing(false); | 1026 folder_tracker->set_needs_folder_listing(false); |
1026 if (folder_tracker->dirty() && !ShouldKeepDirty(*folder_tracker)) | 1027 if (folder_tracker->dirty() && !ShouldKeepDirty(*folder_tracker)) |
1027 folder_tracker->set_dirty(false); | 1028 folder_tracker->set_dirty(false); |
1028 index_->StoreFileTracker(folder_tracker.Pass()); | 1029 index_->StoreFileTracker(std::move(folder_tracker)); |
1029 | 1030 |
1030 return WriteToDatabase(); | 1031 return WriteToDatabase(); |
1031 } | 1032 } |
1032 | 1033 |
1033 SyncStatusCode MetadataDatabase::UpdateTracker( | 1034 SyncStatusCode MetadataDatabase::UpdateTracker( |
1034 int64_t tracker_id, | 1035 int64_t tracker_id, |
1035 const FileDetails& updated_details) { | 1036 const FileDetails& updated_details) { |
1036 FileTracker tracker; | 1037 FileTracker tracker; |
1037 if (!index_->GetFileTracker(tracker_id, &tracker)) { | 1038 if (!index_->GetFileTracker(tracker_id, &tracker)) { |
1038 return SYNC_DATABASE_ERROR_NOT_FOUND; | 1039 return SYNC_DATABASE_ERROR_NOT_FOUND; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1111 // - There is no active tracker that has the same |parent| and |title|. | 1112 // - There is no active tracker that has the same |parent| and |title|. |
1112 if (!tracker.active() && CanActivateTracker(tracker)) { | 1113 if (!tracker.active() && CanActivateTracker(tracker)) { |
1113 updated_tracker->set_active(true); | 1114 updated_tracker->set_active(true); |
1114 updated_tracker->set_dirty(true); | 1115 updated_tracker->set_dirty(true); |
1115 updated_tracker->set_needs_folder_listing( | 1116 updated_tracker->set_needs_folder_listing( |
1116 tracker.synced_details().file_kind() == FILE_KIND_FOLDER); | 1117 tracker.synced_details().file_kind() == FILE_KIND_FOLDER); |
1117 should_promote = true; | 1118 should_promote = true; |
1118 } else if (tracker.dirty() && !ShouldKeepDirty(tracker)) { | 1119 } else if (tracker.dirty() && !ShouldKeepDirty(tracker)) { |
1119 updated_tracker->set_dirty(false); | 1120 updated_tracker->set_dirty(false); |
1120 } | 1121 } |
1121 index_->StoreFileTracker(updated_tracker.Pass()); | 1122 index_->StoreFileTracker(std::move(updated_tracker)); |
1122 if (should_promote) | 1123 if (should_promote) |
1123 index_->PromoteDemotedDirtyTracker(tracker_id); | 1124 index_->PromoteDemotedDirtyTracker(tracker_id); |
1124 | 1125 |
1125 return WriteToDatabase(); | 1126 return WriteToDatabase(); |
1126 } | 1127 } |
1127 | 1128 |
1128 MetadataDatabase::ActivationStatus MetadataDatabase::TryActivateTracker( | 1129 MetadataDatabase::ActivationStatus MetadataDatabase::TryActivateTracker( |
1129 int64_t parent_tracker_id, | 1130 int64_t parent_tracker_id, |
1130 const std::string& file_id, | 1131 const std::string& file_id, |
1131 SyncStatusCode* status_out) { | 1132 SyncStatusCode* status_out) { |
(...skipping 27 matching lines...) Expand all Loading... |
1159 index_->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title); | 1160 index_->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title); |
1160 if (same_title_trackers.has_active()) { | 1161 if (same_title_trackers.has_active()) { |
1161 RemoveAllDescendantTrackers(same_title_trackers.active_tracker(), | 1162 RemoveAllDescendantTrackers(same_title_trackers.active_tracker(), |
1162 index_.get()); | 1163 index_.get()); |
1163 | 1164 |
1164 scoped_ptr<FileTracker> tracker_to_be_deactivated(new FileTracker); | 1165 scoped_ptr<FileTracker> tracker_to_be_deactivated(new FileTracker); |
1165 if (index_->GetFileTracker(same_title_trackers.active_tracker(), | 1166 if (index_->GetFileTracker(same_title_trackers.active_tracker(), |
1166 tracker_to_be_deactivated.get())) { | 1167 tracker_to_be_deactivated.get())) { |
1167 const std::string file_id = tracker_to_be_deactivated->file_id(); | 1168 const std::string file_id = tracker_to_be_deactivated->file_id(); |
1168 tracker_to_be_deactivated->set_active(false); | 1169 tracker_to_be_deactivated->set_active(false); |
1169 index_->StoreFileTracker(tracker_to_be_deactivated.Pass()); | 1170 index_->StoreFileTracker(std::move(tracker_to_be_deactivated)); |
1170 | 1171 |
1171 MarkTrackersDirtyByFileID(file_id, index_.get()); | 1172 MarkTrackersDirtyByFileID(file_id, index_.get()); |
1172 } else { | 1173 } else { |
1173 NOTREACHED(); | 1174 NOTREACHED(); |
1174 } | 1175 } |
1175 } | 1176 } |
1176 } | 1177 } |
1177 | 1178 |
1178 tracker_to_be_activated->set_dirty(false); | 1179 tracker_to_be_activated->set_dirty(false); |
1179 tracker_to_be_activated->set_active(true); | 1180 tracker_to_be_activated->set_active(true); |
1180 *tracker_to_be_activated->mutable_synced_details() = metadata.details(); | 1181 *tracker_to_be_activated->mutable_synced_details() = metadata.details(); |
1181 if (tracker_to_be_activated->synced_details().file_kind() == | 1182 if (tracker_to_be_activated->synced_details().file_kind() == |
1182 FILE_KIND_FOLDER) { | 1183 FILE_KIND_FOLDER) { |
1183 tracker_to_be_activated->set_needs_folder_listing(true); | 1184 tracker_to_be_activated->set_needs_folder_listing(true); |
1184 } | 1185 } |
1185 tracker_to_be_activated->set_dirty(false); | 1186 tracker_to_be_activated->set_dirty(false); |
1186 | 1187 |
1187 index_->StoreFileTracker(tracker_to_be_activated.Pass()); | 1188 index_->StoreFileTracker(std::move(tracker_to_be_activated)); |
1188 | 1189 |
1189 *status_out = WriteToDatabase(); | 1190 *status_out = WriteToDatabase(); |
1190 return ACTIVATION_PENDING; | 1191 return ACTIVATION_PENDING; |
1191 } | 1192 } |
1192 | 1193 |
1193 void MetadataDatabase::DemoteTracker(int64_t tracker_id) { | 1194 void MetadataDatabase::DemoteTracker(int64_t tracker_id) { |
1194 index_->DemoteDirtyTracker(tracker_id); | 1195 index_->DemoteDirtyTracker(tracker_id); |
1195 WriteToDatabase(); | 1196 WriteToDatabase(); |
1196 } | 1197 } |
1197 | 1198 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1295 tracker_ids.insert(*itr); | 1296 tracker_ids.insert(*itr); |
1296 } | 1297 } |
1297 | 1298 |
1298 for (std::set<int64_t>::iterator itr = tracker_ids.begin(); | 1299 for (std::set<int64_t>::iterator itr = tracker_ids.begin(); |
1299 itr != tracker_ids.end(); ++itr) { | 1300 itr != tracker_ids.end(); ++itr) { |
1300 scoped_ptr<FileTracker> tracker(new FileTracker); | 1301 scoped_ptr<FileTracker> tracker(new FileTracker); |
1301 if (!index_->GetFileTracker(*itr, tracker.get()) || | 1302 if (!index_->GetFileTracker(*itr, tracker.get()) || |
1302 !CanClearDirty(*tracker)) | 1303 !CanClearDirty(*tracker)) |
1303 continue; | 1304 continue; |
1304 tracker->set_dirty(false); | 1305 tracker->set_dirty(false); |
1305 index_->StoreFileTracker(tracker.Pass()); | 1306 index_->StoreFileTracker(std::move(tracker)); |
1306 } | 1307 } |
1307 | 1308 |
1308 return WriteToDatabase(); | 1309 return WriteToDatabase(); |
1309 } | 1310 } |
1310 | 1311 |
1311 MetadataDatabase::MetadataDatabase( | 1312 MetadataDatabase::MetadataDatabase( |
1312 const base::FilePath& database_path, | 1313 const base::FilePath& database_path, |
1313 bool enable_on_disk_index, | 1314 bool enable_on_disk_index, |
1314 leveldb::Env* env_override) | 1315 leveldb::Env* env_override) |
1315 : database_path_(database_path), | 1316 : database_path_(database_path), |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1392 tracker->set_dirty(true); | 1393 tracker->set_dirty(true); |
1393 tracker->set_active(false); | 1394 tracker->set_active(false); |
1394 tracker->set_needs_folder_listing(false); | 1395 tracker->set_needs_folder_listing(false); |
1395 if (details) { | 1396 if (details) { |
1396 *tracker->mutable_synced_details() = *details; | 1397 *tracker->mutable_synced_details() = *details; |
1397 if (option == UPDATE_TRACKER_FOR_UNSYNCED_FILE) { | 1398 if (option == UPDATE_TRACKER_FOR_UNSYNCED_FILE) { |
1398 tracker->mutable_synced_details()->set_missing(true); | 1399 tracker->mutable_synced_details()->set_missing(true); |
1399 tracker->mutable_synced_details()->clear_md5(); | 1400 tracker->mutable_synced_details()->clear_md5(); |
1400 } | 1401 } |
1401 } | 1402 } |
1402 index_->StoreFileTracker(tracker.Pass()); | 1403 index_->StoreFileTracker(std::move(tracker)); |
1403 } | 1404 } |
1404 | 1405 |
1405 void MetadataDatabase::MaybeAddTrackersForNewFile( | 1406 void MetadataDatabase::MaybeAddTrackersForNewFile( |
1406 const FileMetadata& metadata, | 1407 const FileMetadata& metadata, |
1407 UpdateOption option) { | 1408 UpdateOption option) { |
1408 std::set<int64_t> parents_to_exclude; | 1409 std::set<int64_t> parents_to_exclude; |
1409 TrackerIDSet existing_trackers = | 1410 TrackerIDSet existing_trackers = |
1410 index_->GetFileTrackerIDsByFileID(metadata.file_id()); | 1411 index_->GetFileTrackerIDsByFileID(metadata.file_id()); |
1411 for (TrackerIDSet::const_iterator itr = existing_trackers.begin(); | 1412 for (TrackerIDSet::const_iterator itr = existing_trackers.begin(); |
1412 itr != existing_trackers.end(); ++itr) { | 1413 itr != existing_trackers.end(); ++itr) { |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1564 << (metadata->details().missing() ? " deleted" : ""); | 1565 << (metadata->details().missing() ? " deleted" : ""); |
1565 | 1566 |
1566 std::string file_id = metadata->file_id(); | 1567 std::string file_id = metadata->file_id(); |
1567 if (metadata->details().missing()) | 1568 if (metadata->details().missing()) |
1568 RemoveUnneededTrackersForMissingFile(file_id); | 1569 RemoveUnneededTrackersForMissingFile(file_id); |
1569 else | 1570 else |
1570 MaybeAddTrackersForNewFile(*metadata, option); | 1571 MaybeAddTrackersForNewFile(*metadata, option); |
1571 | 1572 |
1572 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); | 1573 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); |
1573 if (!trackers.empty()) { | 1574 if (!trackers.empty()) { |
1574 index_->StoreFileMetadata(metadata.Pass()); | 1575 index_->StoreFileMetadata(std::move(metadata)); |
1575 | 1576 |
1576 if (option != UPDATE_TRACKER_FOR_SYNCED_FILE) | 1577 if (option != UPDATE_TRACKER_FOR_SYNCED_FILE) |
1577 MarkTrackerSetDirty(trackers, index_.get()); | 1578 MarkTrackerSetDirty(trackers, index_.get()); |
1578 } | 1579 } |
1579 } | 1580 } |
1580 | 1581 |
1581 | 1582 |
1582 SyncStatusCode MetadataDatabase::WriteToDatabase() { | 1583 SyncStatusCode MetadataDatabase::WriteToDatabase() { |
1583 return LevelDBStatusToSyncStatusCode(db_->Commit()); | 1584 return LevelDBStatusToSyncStatusCode(db_->Commit()); |
1584 } | 1585 } |
1585 | 1586 |
1586 scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles( | 1587 scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles( |
1587 const std::string& app_id) { | 1588 const std::string& app_id) { |
1588 scoped_ptr<base::ListValue> files(new base::ListValue); | 1589 scoped_ptr<base::ListValue> files(new base::ListValue); |
1589 | 1590 |
1590 FileTracker app_root_tracker; | 1591 FileTracker app_root_tracker; |
1591 if (!FindAppRootTracker(app_id, &app_root_tracker)) | 1592 if (!FindAppRootTracker(app_id, &app_root_tracker)) |
1592 return files.Pass(); | 1593 return files; |
1593 | 1594 |
1594 std::vector<int64_t> stack; | 1595 std::vector<int64_t> stack; |
1595 AppendContents( | 1596 AppendContents( |
1596 index_->GetFileTrackerIDsByParent(app_root_tracker.tracker_id()), &stack); | 1597 index_->GetFileTrackerIDsByParent(app_root_tracker.tracker_id()), &stack); |
1597 while (!stack.empty()) { | 1598 while (!stack.empty()) { |
1598 int64_t tracker_id = stack.back(); | 1599 int64_t tracker_id = stack.back(); |
1599 stack.pop_back(); | 1600 stack.pop_back(); |
1600 AppendContents(index_->GetFileTrackerIDsByParent(tracker_id), &stack); | 1601 AppendContents(index_->GetFileTrackerIDsByParent(tracker_id), &stack); |
1601 | 1602 |
1602 FileTracker tracker; | 1603 FileTracker tracker; |
(...skipping 17 matching lines...) Expand all Loading... |
1620 tracker.synced_details().file_kind() == FILE_KIND_FILE) | 1621 tracker.synced_details().file_kind() == FILE_KIND_FILE) |
1621 details->SetString("md5", tracker.synced_details().md5()); | 1622 details->SetString("md5", tracker.synced_details().md5()); |
1622 details->SetString("active", tracker.active() ? "true" : "false"); | 1623 details->SetString("active", tracker.active() ? "true" : "false"); |
1623 details->SetString("dirty", tracker.dirty() ? "true" : "false"); | 1624 details->SetString("dirty", tracker.dirty() ? "true" : "false"); |
1624 | 1625 |
1625 file->Set("details", details); | 1626 file->Set("details", details); |
1626 | 1627 |
1627 files->Append(file); | 1628 files->Append(file); |
1628 } | 1629 } |
1629 | 1630 |
1630 return files.Pass(); | 1631 return files; |
1631 } | 1632 } |
1632 | 1633 |
1633 scoped_ptr<base::ListValue> MetadataDatabase::DumpDatabase() { | 1634 scoped_ptr<base::ListValue> MetadataDatabase::DumpDatabase() { |
1634 scoped_ptr<base::ListValue> list(new base::ListValue); | 1635 scoped_ptr<base::ListValue> list(new base::ListValue); |
1635 list->Append(DumpTrackers().release()); | 1636 list->Append(DumpTrackers().release()); |
1636 list->Append(DumpMetadata().release()); | 1637 list->Append(DumpMetadata().release()); |
1637 return list.Pass(); | 1638 return list; |
1638 } | 1639 } |
1639 | 1640 |
1640 bool MetadataDatabase::HasNewerFileMetadata(const std::string& file_id, | 1641 bool MetadataDatabase::HasNewerFileMetadata(const std::string& file_id, |
1641 int64_t change_id) { | 1642 int64_t change_id) { |
1642 FileMetadata metadata; | 1643 FileMetadata metadata; |
1643 if (!index_->GetFileMetadata(file_id, &metadata)) | 1644 if (!index_->GetFileMetadata(file_id, &metadata)) |
1644 return false; | 1645 return false; |
1645 DCHECK(metadata.has_details()); | 1646 DCHECK(metadata.has_details()); |
1646 return metadata.details().change_id() >= change_id; | 1647 return metadata.details().change_id() >= change_id; |
1647 } | 1648 } |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1699 const FileDetails& details = tracker.synced_details(); | 1700 const FileDetails& details = tracker.synced_details(); |
1700 dict->SetString("title", details.title()); | 1701 dict->SetString("title", details.title()); |
1701 dict->SetString("kind", FileKindToString(details.file_kind())); | 1702 dict->SetString("kind", FileKindToString(details.file_kind())); |
1702 dict->SetString("md5", details.md5()); | 1703 dict->SetString("md5", details.md5()); |
1703 dict->SetString("etag", details.etag()); | 1704 dict->SetString("etag", details.etag()); |
1704 dict->SetString("missing", details.missing() ? "true" : "false"); | 1705 dict->SetString("missing", details.missing() ? "true" : "false"); |
1705 dict->SetString("change_id", base::Int64ToString(details.change_id())); | 1706 dict->SetString("change_id", base::Int64ToString(details.change_id())); |
1706 } | 1707 } |
1707 trackers->Append(dict); | 1708 trackers->Append(dict); |
1708 } | 1709 } |
1709 return trackers.Pass(); | 1710 return trackers; |
1710 } | 1711 } |
1711 | 1712 |
1712 scoped_ptr<base::ListValue> MetadataDatabase::DumpMetadata() { | 1713 scoped_ptr<base::ListValue> MetadataDatabase::DumpMetadata() { |
1713 scoped_ptr<base::ListValue> files(new base::ListValue); | 1714 scoped_ptr<base::ListValue> files(new base::ListValue); |
1714 | 1715 |
1715 // Append the first element for metadata. | 1716 // Append the first element for metadata. |
1716 base::DictionaryValue* metadata = new base::DictionaryValue; | 1717 base::DictionaryValue* metadata = new base::DictionaryValue; |
1717 const char *fileKeys[] = { | 1718 const char *fileKeys[] = { |
1718 "file_id", "title", "type", "md5", "etag", "missing", | 1719 "file_id", "title", "type", "md5", "etag", "missing", |
1719 "change_id", "parents" | 1720 "change_id", "parents" |
(...skipping 28 matching lines...) Expand all Loading... |
1748 dict->SetString("missing", details.missing() ? "true" : "false"); | 1749 dict->SetString("missing", details.missing() ? "true" : "false"); |
1749 dict->SetString("change_id", base::Int64ToString(details.change_id())); | 1750 dict->SetString("change_id", base::Int64ToString(details.change_id())); |
1750 | 1751 |
1751 std::vector<std::string> parents; | 1752 std::vector<std::string> parents; |
1752 for (int i = 0; i < details.parent_folder_ids_size(); ++i) | 1753 for (int i = 0; i < details.parent_folder_ids_size(); ++i) |
1753 parents.push_back(details.parent_folder_ids(i)); | 1754 parents.push_back(details.parent_folder_ids(i)); |
1754 dict->SetString("parents", base::JoinString(parents, ",")); | 1755 dict->SetString("parents", base::JoinString(parents, ",")); |
1755 } | 1756 } |
1756 files->Append(dict); | 1757 files->Append(dict); |
1757 } | 1758 } |
1758 return files.Pass(); | 1759 return files; |
1759 } | 1760 } |
1760 | 1761 |
1761 void MetadataDatabase::AttachSyncRoot( | 1762 void MetadataDatabase::AttachSyncRoot( |
1762 const google_apis::FileResource& sync_root_folder) { | 1763 const google_apis::FileResource& sync_root_folder) { |
1763 scoped_ptr<FileMetadata> sync_root_metadata = | 1764 scoped_ptr<FileMetadata> sync_root_metadata = |
1764 CreateFileMetadataFromFileResource( | 1765 CreateFileMetadataFromFileResource( |
1765 GetLargestKnownChangeID(), sync_root_folder); | 1766 GetLargestKnownChangeID(), sync_root_folder); |
1766 scoped_ptr<FileTracker> sync_root_tracker = | 1767 scoped_ptr<FileTracker> sync_root_tracker = |
1767 CreateSyncRootTracker(IncrementTrackerID(), *sync_root_metadata); | 1768 CreateSyncRootTracker(IncrementTrackerID(), *sync_root_metadata); |
1768 | 1769 |
1769 index_->SetSyncRootTrackerID(sync_root_tracker->tracker_id()); | 1770 index_->SetSyncRootTrackerID(sync_root_tracker->tracker_id()); |
1770 index_->StoreFileMetadata(sync_root_metadata.Pass()); | 1771 index_->StoreFileMetadata(std::move(sync_root_metadata)); |
1771 index_->StoreFileTracker(sync_root_tracker.Pass()); | 1772 index_->StoreFileTracker(std::move(sync_root_tracker)); |
1772 } | 1773 } |
1773 | 1774 |
1774 void MetadataDatabase::AttachInitialAppRoot( | 1775 void MetadataDatabase::AttachInitialAppRoot( |
1775 const google_apis::FileResource& app_root_folder) { | 1776 const google_apis::FileResource& app_root_folder) { |
1776 scoped_ptr<FileMetadata> app_root_metadata = | 1777 scoped_ptr<FileMetadata> app_root_metadata = |
1777 CreateFileMetadataFromFileResource( | 1778 CreateFileMetadataFromFileResource( |
1778 GetLargestKnownChangeID(), app_root_folder); | 1779 GetLargestKnownChangeID(), app_root_folder); |
1779 scoped_ptr<FileTracker> app_root_tracker = | 1780 scoped_ptr<FileTracker> app_root_tracker = |
1780 CreateInitialAppRootTracker(IncrementTrackerID(), | 1781 CreateInitialAppRootTracker(IncrementTrackerID(), |
1781 GetSyncRootTrackerID(), | 1782 GetSyncRootTrackerID(), |
1782 *app_root_metadata); | 1783 *app_root_metadata); |
1783 | 1784 |
1784 index_->StoreFileMetadata(app_root_metadata.Pass()); | 1785 index_->StoreFileMetadata(std::move(app_root_metadata)); |
1785 index_->StoreFileTracker(app_root_tracker.Pass()); | 1786 index_->StoreFileTracker(std::move(app_root_tracker)); |
1786 } | 1787 } |
1787 | 1788 |
1788 bool MetadataDatabase::CanClearDirty(const FileTracker& tracker) { | 1789 bool MetadataDatabase::CanClearDirty(const FileTracker& tracker) { |
1789 FileMetadata metadata; | 1790 FileMetadata metadata; |
1790 if (!index_->GetFileMetadata(tracker.file_id(), &metadata) || | 1791 if (!index_->GetFileMetadata(tracker.file_id(), &metadata) || |
1791 !tracker.active() || !tracker.dirty() || | 1792 !tracker.active() || !tracker.dirty() || |
1792 !tracker.has_synced_details() || | 1793 !tracker.has_synced_details() || |
1793 tracker.needs_folder_listing()) | 1794 tracker.needs_folder_listing()) |
1794 return false; | 1795 return false; |
1795 | 1796 |
(...skipping 13 matching lines...) Expand all Loading... |
1809 return false; | 1810 return false; |
1810 | 1811 |
1811 if (!parents.empty()) | 1812 if (!parents.empty()) |
1812 return false; | 1813 return false; |
1813 | 1814 |
1814 return true; | 1815 return true; |
1815 } | 1816 } |
1816 | 1817 |
1817 } // namespace drive_backend | 1818 } // namespace drive_backend |
1818 } // namespace sync_file_system | 1819 } // namespace sync_file_system |
OLD | NEW |