| 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 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/callback.h" | |
| 12 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 13 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
| 14 #include "base/files/file_util.h" | 13 #include "base/files/file_util.h" |
| 15 #include "base/location.h" | 14 #include "base/location.h" |
| 16 #include "base/memory/scoped_vector.h" | 15 #include "base/memory/scoped_vector.h" |
| 17 #include "base/single_thread_task_runner.h" | 16 #include "base/single_thread_task_runner.h" |
| 18 #include "base/stl_util.h" | 17 #include "base/stl_util.h" |
| 19 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
| 20 #include "base/strings/string_util.h" | 19 #include "base/strings/string_util.h" |
| 21 #include "base/strings/stringprintf.h" | 20 #include "base/strings/stringprintf.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 41 #include "webkit/common/fileapi/file_system_util.h" | 40 #include "webkit/common/fileapi/file_system_util.h" |
| 42 | 41 |
| 43 namespace sync_file_system { | 42 namespace sync_file_system { |
| 44 namespace drive_backend { | 43 namespace drive_backend { |
| 45 | 44 |
| 46 namespace { | 45 namespace { |
| 47 | 46 |
| 48 // Command line flag to disable on-disk indexing. | 47 // Command line flag to disable on-disk indexing. |
| 49 const char kDisableMetadataDatabaseOnDisk[] = "disable-syncfs-on-disk-indexing"; | 48 const char kDisableMetadataDatabaseOnDisk[] = "disable-syncfs-on-disk-indexing"; |
| 50 | 49 |
| 51 void EmptyStatusCallback(SyncStatusCode status) {} | |
| 52 | |
| 53 std::string FileKindToString(FileKind file_kind) { | 50 std::string FileKindToString(FileKind file_kind) { |
| 54 switch (file_kind) { | 51 switch (file_kind) { |
| 55 case FILE_KIND_UNSUPPORTED: | 52 case FILE_KIND_UNSUPPORTED: |
| 56 return "unsupported"; | 53 return "unsupported"; |
| 57 case FILE_KIND_FILE: | 54 case FILE_KIND_FILE: |
| 58 return "file"; | 55 return "file"; |
| 59 case FILE_KIND_FOLDER: | 56 case FILE_KIND_FOLDER: |
| 60 return "folder"; | 57 return "folder"; |
| 61 } | 58 } |
| 62 | 59 |
| (...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 MarkTrackersDirtyByPath(parent_tracker_id, title, index); | 510 MarkTrackersDirtyByPath(parent_tracker_id, title, index); |
| 514 | 511 |
| 515 if (index->GetFileTrackerIDsByFileID(file_id).empty()) { | 512 if (index->GetFileTrackerIDsByFileID(file_id).empty()) { |
| 516 index->RemoveFileMetadata(file_id); | 513 index->RemoveFileMetadata(file_id); |
| 517 } | 514 } |
| 518 } | 515 } |
| 519 | 516 |
| 520 } // namespace | 517 } // namespace |
| 521 | 518 |
| 522 // static | 519 // static |
| 523 void MetadataDatabase::Create( | 520 scoped_ptr<MetadataDatabase> MetadataDatabase::Create( |
| 524 const base::FilePath& database_path, | 521 const base::FilePath& database_path, |
| 525 leveldb::Env* env_override, | 522 leveldb::Env* env_override, |
| 526 const CreateCallback& callback) { | 523 SyncStatusCode* status_out) { |
| 527 bool enable_on_disk_index = !CommandLine::ForCurrentProcess()->HasSwitch( | 524 bool enable_on_disk_index = !CommandLine::ForCurrentProcess()->HasSwitch( |
| 528 kDisableMetadataDatabaseOnDisk); | 525 kDisableMetadataDatabaseOnDisk); |
| 529 scoped_ptr<MetadataDatabase> metadata_database( | 526 scoped_ptr<MetadataDatabase> metadata_database( |
| 530 new MetadataDatabase(database_path, | 527 new MetadataDatabase(database_path, |
| 531 enable_on_disk_index, | 528 enable_on_disk_index, |
| 532 env_override)); | 529 env_override)); |
| 533 | 530 |
| 534 SyncStatusCode status = metadata_database->Initialize(); | 531 SyncStatusCode status = metadata_database->Initialize(); |
| 535 if (status == SYNC_DATABASE_ERROR_FAILED) { | 532 if (status == SYNC_DATABASE_ERROR_FAILED) { |
| 536 // Delete the previous instance to avoid creating a LevelDB instance for | 533 // Delete the previous instance to avoid creating a LevelDB instance for |
| 537 // the same path. | 534 // the same path. |
| 538 metadata_database.reset(); | 535 metadata_database.reset(); |
| 539 | 536 |
| 540 metadata_database.reset( | 537 metadata_database.reset( |
| 541 new MetadataDatabase(database_path, | 538 new MetadataDatabase(database_path, |
| 542 enable_on_disk_index, | 539 enable_on_disk_index, |
| 543 env_override)); | 540 env_override)); |
| 544 status = metadata_database->Initialize(); | 541 status = metadata_database->Initialize(); |
| 545 } | 542 } |
| 546 | 543 |
| 547 if (status != SYNC_STATUS_OK) | 544 if (status != SYNC_STATUS_OK) |
| 548 metadata_database.reset(); | 545 metadata_database.reset(); |
| 549 | 546 |
| 550 callback.Run(status, metadata_database.Pass()); | 547 *status_out = status; |
| 548 return metadata_database.Pass(); |
| 551 } | 549 } |
| 552 | 550 |
| 553 // static | 551 // static |
| 554 SyncStatusCode MetadataDatabase::CreateForTesting( | 552 SyncStatusCode MetadataDatabase::CreateForTesting( |
| 555 scoped_ptr<LevelDBWrapper> db, | 553 scoped_ptr<LevelDBWrapper> db, |
| 556 bool enable_on_disk_index, | 554 bool enable_on_disk_index, |
| 557 scoped_ptr<MetadataDatabase>* metadata_database_out) { | 555 scoped_ptr<MetadataDatabase>* metadata_database_out) { |
| 558 scoped_ptr<MetadataDatabase> metadata_database( | 556 scoped_ptr<MetadataDatabase> metadata_database( |
| 559 new MetadataDatabase(base::FilePath(), | 557 new MetadataDatabase(base::FilePath(), |
| 560 enable_on_disk_index, | 558 enable_on_disk_index, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 | 593 |
| 596 void MetadataDatabase::UpdateLargestKnownChangeID(int64 change_id) { | 594 void MetadataDatabase::UpdateLargestKnownChangeID(int64 change_id) { |
| 597 if (largest_known_change_id_ < change_id) | 595 if (largest_known_change_id_ < change_id) |
| 598 largest_known_change_id_ = change_id; | 596 largest_known_change_id_ = change_id; |
| 599 } | 597 } |
| 600 | 598 |
| 601 bool MetadataDatabase::HasSyncRoot() const { | 599 bool MetadataDatabase::HasSyncRoot() const { |
| 602 return index_->GetSyncRootTrackerID() != kInvalidTrackerID; | 600 return index_->GetSyncRootTrackerID() != kInvalidTrackerID; |
| 603 } | 601 } |
| 604 | 602 |
| 605 void MetadataDatabase::PopulateInitialData( | 603 SyncStatusCode MetadataDatabase::PopulateInitialData( |
| 606 int64 largest_change_id, | 604 int64 largest_change_id, |
| 607 const google_apis::FileResource& sync_root_folder, | 605 const google_apis::FileResource& sync_root_folder, |
| 608 const ScopedVector<google_apis::FileResource>& app_root_folders, | 606 const ScopedVector<google_apis::FileResource>& app_root_folders) { |
| 609 const SyncStatusCallback& callback) { | |
| 610 index_->SetLargestChangeID(largest_change_id); | 607 index_->SetLargestChangeID(largest_change_id); |
| 611 UpdateLargestKnownChangeID(largest_change_id); | 608 UpdateLargestKnownChangeID(largest_change_id); |
| 612 | 609 |
| 613 AttachSyncRoot(sync_root_folder); | 610 AttachSyncRoot(sync_root_folder); |
| 614 for (size_t i = 0; i < app_root_folders.size(); ++i) | 611 for (size_t i = 0; i < app_root_folders.size(); ++i) |
| 615 AttachInitialAppRoot(*app_root_folders[i]); | 612 AttachInitialAppRoot(*app_root_folders[i]); |
| 616 | 613 |
| 617 WriteToDatabase(callback); | 614 return WriteToDatabase(); |
| 618 } | 615 } |
| 619 | 616 |
| 620 bool MetadataDatabase::IsAppEnabled(const std::string& app_id) const { | 617 bool MetadataDatabase::IsAppEnabled(const std::string& app_id) const { |
| 621 int64 tracker_id = index_->GetAppRootTracker(app_id); | 618 int64 tracker_id = index_->GetAppRootTracker(app_id); |
| 622 if (tracker_id == kInvalidTrackerID) | 619 if (tracker_id == kInvalidTrackerID) |
| 623 return false; | 620 return false; |
| 624 | 621 |
| 625 FileTracker tracker; | 622 FileTracker tracker; |
| 626 if (!index_->GetFileTracker(tracker_id, &tracker)) | 623 if (!index_->GetFileTracker(tracker_id, &tracker)) |
| 627 return false; | 624 return false; |
| 628 return tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; | 625 return tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; |
| 629 } | 626 } |
| 630 | 627 |
| 631 void MetadataDatabase::RegisterApp(const std::string& app_id, | 628 SyncStatusCode MetadataDatabase::RegisterApp(const std::string& app_id, |
| 632 const std::string& folder_id, | 629 const std::string& folder_id) { |
| 633 const SyncStatusCallback& callback) { | |
| 634 if (index_->GetAppRootTracker(app_id)) { | 630 if (index_->GetAppRootTracker(app_id)) { |
| 635 // The app-root is already registered. | 631 // The app-root is already registered. |
| 636 callback.Run(SYNC_STATUS_OK); | 632 return SYNC_STATUS_OK; |
| 637 return; | |
| 638 } | 633 } |
| 639 | 634 |
| 640 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(folder_id); | 635 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(folder_id); |
| 641 if (trackers.empty()) { | 636 if (trackers.empty()) { |
| 642 callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND); | 637 return SYNC_DATABASE_ERROR_NOT_FOUND; |
| 643 return; | |
| 644 } | 638 } |
| 645 | 639 |
| 646 if (trackers.has_active()) { | 640 if (trackers.has_active()) { |
| 647 // The folder is tracked by another tracker. | 641 // The folder is tracked by another tracker. |
| 648 util::Log(logging::LOG_WARNING, FROM_HERE, | 642 util::Log(logging::LOG_WARNING, FROM_HERE, |
| 649 "Failed to register App for %s", app_id.c_str()); | 643 "Failed to register App for %s", app_id.c_str()); |
| 650 callback.Run(SYNC_STATUS_HAS_CONFLICT); | 644 return SYNC_STATUS_HAS_CONFLICT; |
| 651 return; | |
| 652 } | 645 } |
| 653 | 646 |
| 654 int64 sync_root_tracker_id = index_->GetSyncRootTrackerID(); | 647 int64 sync_root_tracker_id = index_->GetSyncRootTrackerID(); |
| 655 if (!sync_root_tracker_id) { | 648 if (!sync_root_tracker_id) { |
| 656 util::Log(logging::LOG_WARNING, FROM_HERE, | 649 util::Log(logging::LOG_WARNING, FROM_HERE, |
| 657 "Sync-root needs to be set up before registering app-root"); | 650 "Sync-root needs to be set up before registering app-root"); |
| 658 callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND); | 651 return SYNC_DATABASE_ERROR_NOT_FOUND; |
| 659 return; | |
| 660 } | 652 } |
| 661 | 653 |
| 662 scoped_ptr<FileTracker> tracker(new FileTracker); | 654 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 663 if (!FilterFileTrackersByParent(index_.get(), trackers, | 655 if (!FilterFileTrackersByParent(index_.get(), trackers, |
| 664 sync_root_tracker_id, tracker.get())) { | 656 sync_root_tracker_id, tracker.get())) { |
| 665 callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND); | 657 return SYNC_DATABASE_ERROR_NOT_FOUND; |
| 666 return; | |
| 667 } | 658 } |
| 668 | 659 |
| 669 tracker->set_app_id(app_id); | 660 tracker->set_app_id(app_id); |
| 670 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); | 661 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); |
| 671 tracker->set_active(true); | 662 tracker->set_active(true); |
| 672 tracker->set_needs_folder_listing(true); | 663 tracker->set_needs_folder_listing(true); |
| 673 tracker->set_dirty(true); | 664 tracker->set_dirty(true); |
| 674 | 665 |
| 675 index_->StoreFileTracker(tracker.Pass()); | 666 index_->StoreFileTracker(tracker.Pass()); |
| 676 WriteToDatabase(callback); | 667 return WriteToDatabase(); |
| 677 } | 668 } |
| 678 | 669 |
| 679 void MetadataDatabase::DisableApp(const std::string& app_id, | 670 SyncStatusCode MetadataDatabase::DisableApp(const std::string& app_id) { |
| 680 const SyncStatusCallback& callback) { | |
| 681 int64 tracker_id = index_->GetAppRootTracker(app_id); | 671 int64 tracker_id = index_->GetAppRootTracker(app_id); |
| 682 scoped_ptr<FileTracker> tracker(new FileTracker); | 672 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 683 if (!index_->GetFileTracker(tracker_id, tracker.get())) { | 673 if (!index_->GetFileTracker(tracker_id, tracker.get())) { |
| 684 callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND); | 674 return SYNC_DATABASE_ERROR_NOT_FOUND; |
| 685 return; | |
| 686 } | 675 } |
| 687 | 676 |
| 688 if (tracker->tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT) { | 677 if (tracker->tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT) { |
| 689 callback.Run(SYNC_STATUS_OK); | 678 return SYNC_STATUS_OK; |
| 690 return; | |
| 691 } | 679 } |
| 692 | 680 |
| 693 DCHECK_EQ(TRACKER_KIND_APP_ROOT, tracker->tracker_kind()); | 681 DCHECK_EQ(TRACKER_KIND_APP_ROOT, tracker->tracker_kind()); |
| 694 DCHECK(tracker->active()); | 682 DCHECK(tracker->active()); |
| 695 | 683 |
| 696 // Keep the app-root tracker active (but change the tracker_kind) so that | 684 // Keep the app-root tracker active (but change the tracker_kind) so that |
| 697 // other conflicting trackers won't become active. | 685 // other conflicting trackers won't become active. |
| 698 tracker->set_tracker_kind(TRACKER_KIND_DISABLED_APP_ROOT); | 686 tracker->set_tracker_kind(TRACKER_KIND_DISABLED_APP_ROOT); |
| 699 | 687 |
| 700 index_->StoreFileTracker(tracker.Pass()); | 688 index_->StoreFileTracker(tracker.Pass()); |
| 701 WriteToDatabase(callback); | 689 return WriteToDatabase(); |
| 702 } | 690 } |
| 703 | 691 |
| 704 void MetadataDatabase::EnableApp(const std::string& app_id, | 692 SyncStatusCode MetadataDatabase::EnableApp(const std::string& app_id) { |
| 705 const SyncStatusCallback& callback) { | |
| 706 int64 tracker_id = index_->GetAppRootTracker(app_id); | 693 int64 tracker_id = index_->GetAppRootTracker(app_id); |
| 707 scoped_ptr<FileTracker> tracker(new FileTracker); | 694 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 708 if (!index_->GetFileTracker(tracker_id, tracker.get())) { | 695 if (!index_->GetFileTracker(tracker_id, tracker.get())) { |
| 709 callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND); | 696 return SYNC_DATABASE_ERROR_NOT_FOUND; |
| 710 return; | |
| 711 } | 697 } |
| 712 | 698 |
| 713 if (tracker->tracker_kind() == TRACKER_KIND_APP_ROOT) { | 699 if (tracker->tracker_kind() == TRACKER_KIND_APP_ROOT) { |
| 714 callback.Run(SYNC_STATUS_OK); | 700 return SYNC_STATUS_OK; |
| 715 return; | |
| 716 } | 701 } |
| 717 | 702 |
| 718 DCHECK_EQ(TRACKER_KIND_DISABLED_APP_ROOT, tracker->tracker_kind()); | 703 DCHECK_EQ(TRACKER_KIND_DISABLED_APP_ROOT, tracker->tracker_kind()); |
| 719 DCHECK(tracker->active()); | 704 DCHECK(tracker->active()); |
| 720 | 705 |
| 721 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); | 706 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); |
| 722 index_->StoreFileTracker(tracker.Pass()); | 707 index_->StoreFileTracker(tracker.Pass()); |
| 723 | 708 |
| 724 MarkTrackersDirtyRecursively(tracker_id, index_.get()); | 709 MarkTrackersDirtyRecursively(tracker_id, index_.get()); |
| 725 WriteToDatabase(callback); | 710 return WriteToDatabase(); |
| 726 } | 711 } |
| 727 | 712 |
| 728 void MetadataDatabase::UnregisterApp(const std::string& app_id, | 713 SyncStatusCode MetadataDatabase::UnregisterApp(const std::string& app_id) { |
| 729 const SyncStatusCallback& callback) { | |
| 730 int64 tracker_id = index_->GetAppRootTracker(app_id); | 714 int64 tracker_id = index_->GetAppRootTracker(app_id); |
| 731 scoped_ptr<FileTracker> tracker(new FileTracker); | 715 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 732 if (!index_->GetFileTracker(tracker_id, tracker.get()) || | 716 if (!index_->GetFileTracker(tracker_id, tracker.get()) || |
| 733 tracker->tracker_kind() == TRACKER_KIND_REGULAR) { | 717 tracker->tracker_kind() == TRACKER_KIND_REGULAR) { |
| 734 callback.Run(SYNC_STATUS_OK); | 718 return SYNC_STATUS_OK; |
| 735 return; | |
| 736 } | 719 } |
| 737 | 720 |
| 738 RemoveAllDescendantTrackers(tracker_id, index_.get()); | 721 RemoveAllDescendantTrackers(tracker_id, index_.get()); |
| 739 | 722 |
| 740 tracker->clear_app_id(); | 723 tracker->clear_app_id(); |
| 741 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); | 724 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); |
| 742 tracker->set_active(false); | 725 tracker->set_active(false); |
| 743 tracker->set_dirty(true); | 726 tracker->set_dirty(true); |
| 744 | 727 |
| 745 index_->StoreFileTracker(tracker.Pass()); | 728 index_->StoreFileTracker(tracker.Pass()); |
| 746 WriteToDatabase(callback); | 729 return WriteToDatabase(); |
| 747 } | 730 } |
| 748 | 731 |
| 749 bool MetadataDatabase::FindAppRootTracker(const std::string& app_id, | 732 bool MetadataDatabase::FindAppRootTracker(const std::string& app_id, |
| 750 FileTracker* tracker_out) const { | 733 FileTracker* tracker_out) const { |
| 751 int64 app_root_tracker_id = index_->GetAppRootTracker(app_id); | 734 int64 app_root_tracker_id = index_->GetAppRootTracker(app_id); |
| 752 if (!app_root_tracker_id) | 735 if (!app_root_tracker_id) |
| 753 return false; | 736 return false; |
| 754 | 737 |
| 755 if (tracker_out && | 738 if (tracker_out && |
| 756 !index_->GetFileTracker(app_root_tracker_id, tracker_out)) { | 739 !index_->GetFileTracker(app_root_tracker_id, tracker_out)) { |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 873 return true; | 856 return true; |
| 874 } | 857 } |
| 875 | 858 |
| 876 tracker_out->CopyFrom(tracker); | 859 tracker_out->CopyFrom(tracker); |
| 877 *path_out = path_out->Append(components[i]); | 860 *path_out = path_out->Append(components[i]); |
| 878 } | 861 } |
| 879 | 862 |
| 880 return true; | 863 return true; |
| 881 } | 864 } |
| 882 | 865 |
| 883 void MetadataDatabase::UpdateByChangeList( | 866 SyncStatusCode MetadataDatabase::UpdateByChangeList( |
| 884 int64 largest_change_id, | 867 int64 largest_change_id, |
| 885 ScopedVector<google_apis::ChangeResource> changes, | 868 ScopedVector<google_apis::ChangeResource> changes) { |
| 886 const SyncStatusCallback& callback) { | |
| 887 DCHECK_LE(index_->GetLargestChangeID(), largest_change_id); | 869 DCHECK_LE(index_->GetLargestChangeID(), largest_change_id); |
| 888 | 870 |
| 889 for (size_t i = 0; i < changes.size(); ++i) { | 871 for (size_t i = 0; i < changes.size(); ++i) { |
| 890 const google_apis::ChangeResource& change = *changes[i]; | 872 const google_apis::ChangeResource& change = *changes[i]; |
| 891 if (HasNewerFileMetadata(change.file_id(), change.change_id())) | 873 if (HasNewerFileMetadata(change.file_id(), change.change_id())) |
| 892 continue; | 874 continue; |
| 893 | 875 |
| 894 scoped_ptr<FileMetadata> metadata( | 876 scoped_ptr<FileMetadata> metadata( |
| 895 CreateFileMetadataFromChangeResource(change)); | 877 CreateFileMetadataFromChangeResource(change)); |
| 896 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), | 878 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), |
| 897 UPDATE_TRACKER_FOR_UNSYNCED_FILE); | 879 UPDATE_TRACKER_FOR_UNSYNCED_FILE); |
| 898 } | 880 } |
| 899 | 881 |
| 900 UpdateLargestKnownChangeID(largest_change_id); | 882 UpdateLargestKnownChangeID(largest_change_id); |
| 901 index_->SetLargestChangeID(largest_change_id); | 883 index_->SetLargestChangeID(largest_change_id); |
| 902 WriteToDatabase(callback); | 884 return WriteToDatabase(); |
| 903 } | 885 } |
| 904 | 886 |
| 905 void MetadataDatabase::UpdateByFileResource( | 887 SyncStatusCode MetadataDatabase::UpdateByFileResource( |
| 906 const google_apis::FileResource& resource, | 888 const google_apis::FileResource& resource) { |
| 907 const SyncStatusCallback& callback) { | |
| 908 scoped_ptr<FileMetadata> metadata( | 889 scoped_ptr<FileMetadata> metadata( |
| 909 CreateFileMetadataFromFileResource( | 890 CreateFileMetadataFromFileResource( |
| 910 GetLargestKnownChangeID(), resource)); | 891 GetLargestKnownChangeID(), resource)); |
| 911 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), | 892 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), |
| 912 UPDATE_TRACKER_FOR_UNSYNCED_FILE); | 893 UPDATE_TRACKER_FOR_UNSYNCED_FILE); |
| 913 WriteToDatabase(callback); | 894 return WriteToDatabase(); |
| 914 } | 895 } |
| 915 | 896 |
| 916 void MetadataDatabase::UpdateByFileResourceList( | 897 SyncStatusCode MetadataDatabase::UpdateByFileResourceList( |
| 917 ScopedVector<google_apis::FileResource> resources, | 898 ScopedVector<google_apis::FileResource> resources) { |
| 918 const SyncStatusCallback& callback) { | |
| 919 for (size_t i = 0; i < resources.size(); ++i) { | 899 for (size_t i = 0; i < resources.size(); ++i) { |
| 920 scoped_ptr<FileMetadata> metadata( | 900 scoped_ptr<FileMetadata> metadata( |
| 921 CreateFileMetadataFromFileResource( | 901 CreateFileMetadataFromFileResource( |
| 922 GetLargestKnownChangeID(), *resources[i])); | 902 GetLargestKnownChangeID(), *resources[i])); |
| 923 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), | 903 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), |
| 924 UPDATE_TRACKER_FOR_UNSYNCED_FILE); | 904 UPDATE_TRACKER_FOR_UNSYNCED_FILE); |
| 925 } | 905 } |
| 926 WriteToDatabase(callback); | 906 return WriteToDatabase(); |
| 927 } | 907 } |
| 928 | 908 |
| 929 void MetadataDatabase::UpdateByDeletedRemoteFile( | 909 SyncStatusCode MetadataDatabase::UpdateByDeletedRemoteFile( |
| 930 const std::string& file_id, | 910 const std::string& file_id) { |
| 931 const SyncStatusCallback& callback) { | |
| 932 scoped_ptr<FileMetadata> metadata( | 911 scoped_ptr<FileMetadata> metadata( |
| 933 CreateDeletedFileMetadata(GetLargestKnownChangeID(), file_id)); | 912 CreateDeletedFileMetadata(GetLargestKnownChangeID(), file_id)); |
| 934 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), | 913 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), |
| 935 UPDATE_TRACKER_FOR_UNSYNCED_FILE); | 914 UPDATE_TRACKER_FOR_UNSYNCED_FILE); |
| 936 WriteToDatabase(callback); | 915 return WriteToDatabase(); |
| 937 } | 916 } |
| 938 | 917 |
| 939 void MetadataDatabase::UpdateByDeletedRemoteFileList( | 918 SyncStatusCode MetadataDatabase::UpdateByDeletedRemoteFileList( |
| 940 const FileIDList& file_ids, | 919 const FileIDList& file_ids) { |
| 941 const SyncStatusCallback& callback) { | |
| 942 for (FileIDList::const_iterator itr = file_ids.begin(); | 920 for (FileIDList::const_iterator itr = file_ids.begin(); |
| 943 itr != file_ids.end(); ++itr) { | 921 itr != file_ids.end(); ++itr) { |
| 944 scoped_ptr<FileMetadata> metadata( | 922 scoped_ptr<FileMetadata> metadata( |
| 945 CreateDeletedFileMetadata(GetLargestKnownChangeID(), *itr)); | 923 CreateDeletedFileMetadata(GetLargestKnownChangeID(), *itr)); |
| 946 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), | 924 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), |
| 947 UPDATE_TRACKER_FOR_UNSYNCED_FILE); | 925 UPDATE_TRACKER_FOR_UNSYNCED_FILE); |
| 948 } | 926 } |
| 949 WriteToDatabase(callback); | 927 return WriteToDatabase(); |
| 950 } | 928 } |
| 951 | 929 |
| 952 void MetadataDatabase::ReplaceActiveTrackerWithNewResource( | 930 SyncStatusCode MetadataDatabase::ReplaceActiveTrackerWithNewResource( |
| 953 int64 parent_tracker_id, | 931 int64 parent_tracker_id, |
| 954 const google_apis::FileResource& resource, | 932 const google_apis::FileResource& resource) { |
| 955 const SyncStatusCallback& callback) { | |
| 956 DCHECK(!index_->GetFileMetadata(resource.file_id(), NULL)); | 933 DCHECK(!index_->GetFileMetadata(resource.file_id(), NULL)); |
| 957 DCHECK(index_->GetFileTracker(parent_tracker_id, NULL)); | 934 DCHECK(index_->GetFileTracker(parent_tracker_id, NULL)); |
| 958 | 935 |
| 959 UpdateByFileMetadata( | 936 UpdateByFileMetadata( |
| 960 FROM_HERE, | 937 FROM_HERE, |
| 961 CreateFileMetadataFromFileResource(GetLargestKnownChangeID(), resource), | 938 CreateFileMetadataFromFileResource(GetLargestKnownChangeID(), resource), |
| 962 UPDATE_TRACKER_FOR_SYNCED_FILE); | 939 UPDATE_TRACKER_FOR_SYNCED_FILE); |
| 963 | 940 |
| 964 DCHECK(index_->GetFileMetadata(resource.file_id(), NULL)); | 941 DCHECK(index_->GetFileMetadata(resource.file_id(), NULL)); |
| 965 DCHECK(!index_->GetFileTrackerIDsByFileID(resource.file_id()).has_active()); | 942 DCHECK(!index_->GetFileTrackerIDsByFileID(resource.file_id()).has_active()); |
| 966 | 943 |
| 967 TrackerIDSet same_path_trackers = | 944 TrackerIDSet same_path_trackers = |
| 968 index_->GetFileTrackerIDsByParentAndTitle( | 945 index_->GetFileTrackerIDsByParentAndTitle( |
| 969 parent_tracker_id, resource.title()); | 946 parent_tracker_id, resource.title()); |
| 970 FileTracker to_be_activated; | 947 FileTracker to_be_activated; |
| 971 if (!FilterFileTrackersByFileID(index_.get(), same_path_trackers, | 948 if (!FilterFileTrackersByFileID(index_.get(), same_path_trackers, |
| 972 resource.file_id(), &to_be_activated)) { | 949 resource.file_id(), &to_be_activated)) { |
| 973 NOTREACHED(); | 950 NOTREACHED(); |
| 974 callback.Run(SYNC_STATUS_FAILED); | 951 return SYNC_STATUS_FAILED; |
| 975 return; | |
| 976 } | 952 } |
| 977 | 953 |
| 978 int64 tracker_id = to_be_activated.tracker_id(); | 954 int64 tracker_id = to_be_activated.tracker_id(); |
| 979 if (same_path_trackers.has_active()) { | 955 if (same_path_trackers.has_active()) { |
| 980 DeactivateFileTracker(same_path_trackers.active_tracker(), | 956 DeactivateFileTracker(same_path_trackers.active_tracker(), |
| 981 MARK_ITSELF_DIRTY | | 957 MARK_ITSELF_DIRTY | |
| 982 MARK_SAME_FILE_ID_TRACKERS_DIRTY, | 958 MARK_SAME_FILE_ID_TRACKERS_DIRTY, |
| 983 index_.get()); | 959 index_.get()); |
| 984 } | 960 } |
| 985 | 961 |
| 986 ActivateFileTracker(tracker_id, MARK_NOTHING_DIRTY, index_.get()); | 962 ActivateFileTracker(tracker_id, MARK_NOTHING_DIRTY, index_.get()); |
| 987 WriteToDatabase(callback); | 963 return WriteToDatabase(); |
| 988 } | 964 } |
| 989 | 965 |
| 990 void MetadataDatabase::PopulateFolderByChildList( | 966 SyncStatusCode MetadataDatabase::PopulateFolderByChildList( |
| 991 const std::string& folder_id, | 967 const std::string& folder_id, |
| 992 const FileIDList& child_file_ids, | 968 const FileIDList& child_file_ids) { |
| 993 const SyncStatusCallback& callback) { | |
| 994 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(folder_id); | 969 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(folder_id); |
| 995 if (!trackers.has_active()) { | 970 if (!trackers.has_active()) { |
| 996 // It's OK that there is no folder to populate its children. | 971 // It's OK that there is no folder to populate its children. |
| 997 // Inactive folders should ignore their contents updates. | 972 // Inactive folders should ignore their contents updates. |
| 998 callback.Run(SYNC_STATUS_OK); | 973 return SYNC_STATUS_OK; |
| 999 return; | |
| 1000 } | 974 } |
| 1001 | 975 |
| 1002 scoped_ptr<FileTracker> folder_tracker(new FileTracker); | 976 scoped_ptr<FileTracker> folder_tracker(new FileTracker); |
| 1003 if (!index_->GetFileTracker(trackers.active_tracker(), | 977 if (!index_->GetFileTracker(trackers.active_tracker(), |
| 1004 folder_tracker.get())) { | 978 folder_tracker.get())) { |
| 1005 NOTREACHED(); | 979 NOTREACHED(); |
| 1006 callback.Run(SYNC_STATUS_FAILED); | 980 return SYNC_STATUS_FAILED; |
| 1007 return; | |
| 1008 } | 981 } |
| 1009 | 982 |
| 1010 base::hash_set<std::string> children(child_file_ids.begin(), | 983 base::hash_set<std::string> children(child_file_ids.begin(), |
| 1011 child_file_ids.end()); | 984 child_file_ids.end()); |
| 1012 | 985 |
| 1013 std::vector<int64> known_children = | 986 std::vector<int64> known_children = |
| 1014 index_->GetFileTrackerIDsByParent(folder_tracker->tracker_id()); | 987 index_->GetFileTrackerIDsByParent(folder_tracker->tracker_id()); |
| 1015 for (size_t i = 0; i < known_children.size(); ++i) { | 988 for (size_t i = 0; i < known_children.size(); ++i) { |
| 1016 FileTracker tracker; | 989 FileTracker tracker; |
| 1017 if (!index_->GetFileTracker(known_children[i], &tracker)) { | 990 if (!index_->GetFileTracker(known_children[i], &tracker)) { |
| 1018 NOTREACHED(); | 991 NOTREACHED(); |
| 1019 continue; | 992 continue; |
| 1020 } | 993 } |
| 1021 children.erase(tracker.file_id()); | 994 children.erase(tracker.file_id()); |
| 1022 } | 995 } |
| 1023 | 996 |
| 1024 for (base::hash_set<std::string>::const_iterator itr = children.begin(); | 997 for (base::hash_set<std::string>::const_iterator itr = children.begin(); |
| 1025 itr != children.end(); ++itr) | 998 itr != children.end(); ++itr) |
| 1026 CreateTrackerForParentAndFileID(*folder_tracker, *itr); | 999 CreateTrackerForParentAndFileID(*folder_tracker, *itr); |
| 1027 folder_tracker->set_needs_folder_listing(false); | 1000 folder_tracker->set_needs_folder_listing(false); |
| 1028 if (folder_tracker->dirty() && !ShouldKeepDirty(*folder_tracker)) | 1001 if (folder_tracker->dirty() && !ShouldKeepDirty(*folder_tracker)) |
| 1029 folder_tracker->set_dirty(false); | 1002 folder_tracker->set_dirty(false); |
| 1030 index_->StoreFileTracker(folder_tracker.Pass()); | 1003 index_->StoreFileTracker(folder_tracker.Pass()); |
| 1031 | 1004 |
| 1032 WriteToDatabase(callback); | 1005 return WriteToDatabase(); |
| 1033 } | 1006 } |
| 1034 | 1007 |
| 1035 void MetadataDatabase::UpdateTracker(int64 tracker_id, | 1008 SyncStatusCode MetadataDatabase::UpdateTracker( |
| 1036 const FileDetails& updated_details, | 1009 int64 tracker_id, |
| 1037 const SyncStatusCallback& callback) { | 1010 const FileDetails& updated_details) { |
| 1038 FileTracker tracker; | 1011 FileTracker tracker; |
| 1039 if (!index_->GetFileTracker(tracker_id, &tracker)) { | 1012 if (!index_->GetFileTracker(tracker_id, &tracker)) { |
| 1040 callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND); | 1013 return SYNC_DATABASE_ERROR_NOT_FOUND; |
| 1041 return; | |
| 1042 } | 1014 } |
| 1043 | 1015 |
| 1044 // Check if the tracker is to be deleted. | 1016 // Check if the tracker is to be deleted. |
| 1045 if (updated_details.missing()) { | 1017 if (updated_details.missing()) { |
| 1046 FileMetadata metadata; | 1018 FileMetadata metadata; |
| 1047 if (!index_->GetFileMetadata(tracker.file_id(), &metadata) || | 1019 if (!index_->GetFileMetadata(tracker.file_id(), &metadata) || |
| 1048 metadata.details().missing()) { | 1020 metadata.details().missing()) { |
| 1049 // Both the tracker and metadata have the missing flag, now it's safe to | 1021 // Both the tracker and metadata have the missing flag, now it's safe to |
| 1050 // delete the |tracker|. | 1022 // delete the |tracker|. |
| 1051 RemoveFileTracker(tracker_id, | 1023 RemoveFileTracker(tracker_id, |
| 1052 MARK_SAME_FILE_ID_TRACKERS_DIRTY | | 1024 MARK_SAME_FILE_ID_TRACKERS_DIRTY | |
| 1053 MARK_SAME_PATH_TRACKERS_DIRTY, | 1025 MARK_SAME_PATH_TRACKERS_DIRTY, |
| 1054 index_.get()); | 1026 index_.get()); |
| 1055 WriteToDatabase(callback); | 1027 return WriteToDatabase(); |
| 1056 return; | |
| 1057 } | 1028 } |
| 1058 } | 1029 } |
| 1059 | 1030 |
| 1060 // Sync-root deletion should be handled separately by SyncEngine. | 1031 // Sync-root deletion should be handled separately by SyncEngine. |
| 1061 DCHECK(tracker_id != GetSyncRootTrackerID() || | 1032 DCHECK(tracker_id != GetSyncRootTrackerID() || |
| 1062 (tracker.has_synced_details() && | 1033 (tracker.has_synced_details() && |
| 1063 tracker.synced_details().title() == updated_details.title() && | 1034 tracker.synced_details().title() == updated_details.title() && |
| 1064 !updated_details.missing())); | 1035 !updated_details.missing())); |
| 1065 | 1036 |
| 1066 if (tracker_id != GetSyncRootTrackerID()) { | 1037 if (tracker_id != GetSyncRootTrackerID()) { |
| 1067 // Check if the tracker's parent is still in |parent_tracker_ids|. | 1038 // Check if the tracker's parent is still in |parent_tracker_ids|. |
| 1068 // If not, there should exist another tracker for the new parent, so delete | 1039 // If not, there should exist another tracker for the new parent, so delete |
| 1069 // old tracker. | 1040 // old tracker. |
| 1070 FileTracker parent_tracker; | 1041 FileTracker parent_tracker; |
| 1071 index_->GetFileTracker(tracker.parent_tracker_id(), &parent_tracker); | 1042 index_->GetFileTracker(tracker.parent_tracker_id(), &parent_tracker); |
| 1072 | 1043 |
| 1073 if (!HasFileAsParent(updated_details, parent_tracker.file_id())) { | 1044 if (!HasFileAsParent(updated_details, parent_tracker.file_id())) { |
| 1074 RemoveFileTracker(tracker.tracker_id(), | 1045 RemoveFileTracker(tracker.tracker_id(), |
| 1075 MARK_SAME_PATH_TRACKERS_DIRTY, | 1046 MARK_SAME_PATH_TRACKERS_DIRTY, |
| 1076 index_.get()); | 1047 index_.get()); |
| 1077 WriteToDatabase(callback); | 1048 return WriteToDatabase(); |
| 1078 return; | |
| 1079 } | 1049 } |
| 1080 | 1050 |
| 1081 if (tracker.has_synced_details()) { | 1051 if (tracker.has_synced_details()) { |
| 1082 // Check if the tracker was retitled. If it was, there should exist | 1052 // Check if the tracker was retitled. If it was, there should exist |
| 1083 // another tracker for the new title, so delete the tracker being updated. | 1053 // another tracker for the new title, so delete the tracker being updated. |
| 1084 if (tracker.synced_details().title() != updated_details.title()) { | 1054 if (tracker.synced_details().title() != updated_details.title()) { |
| 1085 RemoveFileTracker(tracker.tracker_id(), | 1055 RemoveFileTracker(tracker.tracker_id(), |
| 1086 MARK_SAME_FILE_ID_TRACKERS_DIRTY, | 1056 MARK_SAME_FILE_ID_TRACKERS_DIRTY, |
| 1087 index_.get()); | 1057 index_.get()); |
| 1088 WriteToDatabase(callback); | 1058 return WriteToDatabase(); |
| 1089 return; | |
| 1090 } | 1059 } |
| 1091 } else { | 1060 } else { |
| 1092 // Check if any other tracker exists has the same parent, title and | 1061 // Check if any other tracker exists has the same parent, title and |
| 1093 // file_id to the updated tracker. If it exists, delete the tracker being | 1062 // file_id to the updated tracker. If it exists, delete the tracker being |
| 1094 // updated. | 1063 // updated. |
| 1095 if (FilterFileTrackersByFileID( | 1064 if (FilterFileTrackersByFileID( |
| 1096 index_.get(), | 1065 index_.get(), |
| 1097 index_->GetFileTrackerIDsByParentAndTitle( | 1066 index_->GetFileTrackerIDsByParentAndTitle( |
| 1098 parent_tracker.tracker_id(), | 1067 parent_tracker.tracker_id(), |
| 1099 updated_details.title()), | 1068 updated_details.title()), |
| 1100 tracker.file_id(), | 1069 tracker.file_id(), |
| 1101 NULL)) { | 1070 NULL)) { |
| 1102 RemoveFileTracker(tracker.tracker_id(), | 1071 RemoveFileTracker(tracker.tracker_id(), |
| 1103 MARK_NOTHING_DIRTY, | 1072 MARK_NOTHING_DIRTY, |
| 1104 index_.get()); | 1073 index_.get()); |
| 1105 WriteToDatabase(callback); | 1074 return WriteToDatabase(); |
| 1106 return; | |
| 1107 } | 1075 } |
| 1108 } | 1076 } |
| 1109 } | 1077 } |
| 1110 | 1078 |
| 1111 scoped_ptr<FileTracker> updated_tracker = CloneFileTracker(&tracker); | 1079 scoped_ptr<FileTracker> updated_tracker = CloneFileTracker(&tracker); |
| 1112 *updated_tracker->mutable_synced_details() = updated_details; | 1080 *updated_tracker->mutable_synced_details() = updated_details; |
| 1113 | 1081 |
| 1114 bool should_promote = false; | 1082 bool should_promote = false; |
| 1115 | 1083 |
| 1116 // Activate the tracker if: | 1084 // Activate the tracker if: |
| 1117 // - There is no active tracker that tracks |tracker->file_id()|. | 1085 // - There is no active tracker that tracks |tracker->file_id()|. |
| 1118 // - There is no active tracker that has the same |parent| and |title|. | 1086 // - There is no active tracker that has the same |parent| and |title|. |
| 1119 if (!tracker.active() && CanActivateTracker(tracker)) { | 1087 if (!tracker.active() && CanActivateTracker(tracker)) { |
| 1120 updated_tracker->set_active(true); | 1088 updated_tracker->set_active(true); |
| 1121 updated_tracker->set_dirty(true); | 1089 updated_tracker->set_dirty(true); |
| 1122 updated_tracker->set_needs_folder_listing( | 1090 updated_tracker->set_needs_folder_listing( |
| 1123 tracker.synced_details().file_kind() == FILE_KIND_FOLDER); | 1091 tracker.synced_details().file_kind() == FILE_KIND_FOLDER); |
| 1124 should_promote = true; | 1092 should_promote = true; |
| 1125 } else if (tracker.dirty() && !ShouldKeepDirty(tracker)) { | 1093 } else if (tracker.dirty() && !ShouldKeepDirty(tracker)) { |
| 1126 updated_tracker->set_dirty(false); | 1094 updated_tracker->set_dirty(false); |
| 1127 } | 1095 } |
| 1128 index_->StoreFileTracker(updated_tracker.Pass()); | 1096 index_->StoreFileTracker(updated_tracker.Pass()); |
| 1129 if (should_promote) | 1097 if (should_promote) |
| 1130 index_->PromoteDemotedDirtyTracker(tracker_id); | 1098 index_->PromoteDemotedDirtyTracker(tracker_id); |
| 1131 | 1099 |
| 1132 WriteToDatabase(callback); | 1100 return WriteToDatabase(); |
| 1133 } | 1101 } |
| 1134 | 1102 |
| 1135 MetadataDatabase::ActivationStatus MetadataDatabase::TryActivateTracker( | 1103 MetadataDatabase::ActivationStatus MetadataDatabase::TryActivateTracker( |
| 1136 int64 parent_tracker_id, | 1104 int64 parent_tracker_id, |
| 1137 const std::string& file_id, | 1105 const std::string& file_id, |
| 1138 const SyncStatusCallback& callback) { | 1106 SyncStatusCode* status_out) { |
| 1139 FileMetadata metadata; | 1107 FileMetadata metadata; |
| 1140 if (!index_->GetFileMetadata(file_id, &metadata)) { | 1108 if (!index_->GetFileMetadata(file_id, &metadata)) { |
| 1141 NOTREACHED(); | 1109 NOTREACHED(); |
| 1142 callback.Run(SYNC_STATUS_FAILED); | 1110 *status_out = SYNC_STATUS_FAILED; |
| 1143 return ACTIVATION_PENDING; | 1111 return ACTIVATION_PENDING; |
| 1144 } | 1112 } |
| 1145 std::string title = metadata.details().title(); | 1113 std::string title = metadata.details().title(); |
| 1146 DCHECK(!HasInvalidTitle(title)); | 1114 DCHECK(!HasInvalidTitle(title)); |
| 1147 | 1115 |
| 1148 TrackerIDSet same_file_id_trackers = | 1116 TrackerIDSet same_file_id_trackers = |
| 1149 index_->GetFileTrackerIDsByFileID(file_id); | 1117 index_->GetFileTrackerIDsByFileID(file_id); |
| 1150 scoped_ptr<FileTracker> tracker_to_be_activated(new FileTracker); | 1118 scoped_ptr<FileTracker> tracker_to_be_activated(new FileTracker); |
| 1151 FilterFileTrackersByParentAndTitle( | 1119 FilterFileTrackersByParentAndTitle( |
| 1152 index_.get(), same_file_id_trackers, parent_tracker_id, | 1120 index_.get(), same_file_id_trackers, parent_tracker_id, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1186 tracker_to_be_activated->set_active(true); | 1154 tracker_to_be_activated->set_active(true); |
| 1187 *tracker_to_be_activated->mutable_synced_details() = metadata.details(); | 1155 *tracker_to_be_activated->mutable_synced_details() = metadata.details(); |
| 1188 if (tracker_to_be_activated->synced_details().file_kind() == | 1156 if (tracker_to_be_activated->synced_details().file_kind() == |
| 1189 FILE_KIND_FOLDER) { | 1157 FILE_KIND_FOLDER) { |
| 1190 tracker_to_be_activated->set_needs_folder_listing(true); | 1158 tracker_to_be_activated->set_needs_folder_listing(true); |
| 1191 } | 1159 } |
| 1192 tracker_to_be_activated->set_dirty(false); | 1160 tracker_to_be_activated->set_dirty(false); |
| 1193 | 1161 |
| 1194 index_->StoreFileTracker(tracker_to_be_activated.Pass()); | 1162 index_->StoreFileTracker(tracker_to_be_activated.Pass()); |
| 1195 | 1163 |
| 1196 WriteToDatabase(callback); | 1164 *status_out = WriteToDatabase(); |
| 1197 return ACTIVATION_PENDING; | 1165 return ACTIVATION_PENDING; |
| 1198 } | 1166 } |
| 1199 | 1167 |
| 1200 void MetadataDatabase::DemoteTracker(int64 tracker_id) { | 1168 void MetadataDatabase::DemoteTracker(int64 tracker_id) { |
| 1201 index_->DemoteDirtyTracker(tracker_id); | 1169 index_->DemoteDirtyTracker(tracker_id); |
| 1202 WriteToDatabase(base::Bind(&EmptyStatusCallback)); | 1170 WriteToDatabase(); |
| 1203 } | 1171 } |
| 1204 | 1172 |
| 1205 bool MetadataDatabase::PromoteDemotedTrackers() { | 1173 bool MetadataDatabase::PromoteDemotedTrackers() { |
| 1206 bool promoted = index_->PromoteDemotedDirtyTrackers(); | 1174 bool promoted = index_->PromoteDemotedDirtyTrackers(); |
| 1207 WriteToDatabase(base::Bind(&EmptyStatusCallback)); | 1175 WriteToDatabase(); |
| 1208 return promoted; | 1176 return promoted; |
| 1209 } | 1177 } |
| 1210 | 1178 |
| 1211 void MetadataDatabase::PromoteDemotedTracker(int64 tracker_id) { | 1179 void MetadataDatabase::PromoteDemotedTracker(int64 tracker_id) { |
| 1212 index_->PromoteDemotedDirtyTracker(tracker_id); | 1180 index_->PromoteDemotedDirtyTracker(tracker_id); |
| 1213 WriteToDatabase(base::Bind(&EmptyStatusCallback)); | 1181 WriteToDatabase(); |
| 1214 } | 1182 } |
| 1215 | 1183 |
| 1216 bool MetadataDatabase::GetDirtyTracker( | 1184 bool MetadataDatabase::GetDirtyTracker( |
| 1217 FileTracker* tracker_out) const { | 1185 FileTracker* tracker_out) const { |
| 1218 int64 dirty_tracker_id = index_->PickDirtyTracker(); | 1186 int64 dirty_tracker_id = index_->PickDirtyTracker(); |
| 1219 if (!dirty_tracker_id) | 1187 if (!dirty_tracker_id) |
| 1220 return false; | 1188 return false; |
| 1221 | 1189 |
| 1222 if (tracker_out) { | 1190 if (tracker_out) { |
| 1223 if (!index_->GetFileTracker(dirty_tracker_id, tracker_out)) { | 1191 if (!index_->GetFileTracker(dirty_tracker_id, tracker_out)) { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1284 | 1252 |
| 1285 std::swap(*trackers_out, trackers); | 1253 std::swap(*trackers_out, trackers); |
| 1286 return true; | 1254 return true; |
| 1287 } | 1255 } |
| 1288 | 1256 |
| 1289 void MetadataDatabase::GetRegisteredAppIDs(std::vector<std::string>* app_ids) { | 1257 void MetadataDatabase::GetRegisteredAppIDs(std::vector<std::string>* app_ids) { |
| 1290 DCHECK(app_ids); | 1258 DCHECK(app_ids); |
| 1291 *app_ids = index_->GetRegisteredAppIDs(); | 1259 *app_ids = index_->GetRegisteredAppIDs(); |
| 1292 } | 1260 } |
| 1293 | 1261 |
| 1294 void MetadataDatabase::SweepDirtyTrackers( | 1262 SyncStatusCode MetadataDatabase::SweepDirtyTrackers( |
| 1295 const std::vector<std::string>& file_ids, | 1263 const std::vector<std::string>& file_ids) { |
| 1296 const SyncStatusCallback& callback) { | |
| 1297 std::set<int64> tracker_ids; | 1264 std::set<int64> tracker_ids; |
| 1298 for (size_t i = 0; i < file_ids.size(); ++i) { | 1265 for (size_t i = 0; i < file_ids.size(); ++i) { |
| 1299 TrackerIDSet trackers_for_file_id = | 1266 TrackerIDSet trackers_for_file_id = |
| 1300 index_->GetFileTrackerIDsByFileID(file_ids[i]); | 1267 index_->GetFileTrackerIDsByFileID(file_ids[i]); |
| 1301 for (TrackerIDSet::iterator itr = trackers_for_file_id.begin(); | 1268 for (TrackerIDSet::iterator itr = trackers_for_file_id.begin(); |
| 1302 itr != trackers_for_file_id.end(); ++itr) | 1269 itr != trackers_for_file_id.end(); ++itr) |
| 1303 tracker_ids.insert(*itr); | 1270 tracker_ids.insert(*itr); |
| 1304 } | 1271 } |
| 1305 | 1272 |
| 1306 for (std::set<int64>::iterator itr = tracker_ids.begin(); | 1273 for (std::set<int64>::iterator itr = tracker_ids.begin(); |
| 1307 itr != tracker_ids.end(); ++itr) { | 1274 itr != tracker_ids.end(); ++itr) { |
| 1308 scoped_ptr<FileTracker> tracker(new FileTracker); | 1275 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 1309 if (!index_->GetFileTracker(*itr, tracker.get()) || | 1276 if (!index_->GetFileTracker(*itr, tracker.get()) || |
| 1310 !CanClearDirty(*tracker)) | 1277 !CanClearDirty(*tracker)) |
| 1311 continue; | 1278 continue; |
| 1312 tracker->set_dirty(false); | 1279 tracker->set_dirty(false); |
| 1313 index_->StoreFileTracker(tracker.Pass()); | 1280 index_->StoreFileTracker(tracker.Pass()); |
| 1314 } | 1281 } |
| 1315 | 1282 |
| 1316 WriteToDatabase(callback); | 1283 return WriteToDatabase(); |
| 1317 } | 1284 } |
| 1318 | 1285 |
| 1319 MetadataDatabase::MetadataDatabase( | 1286 MetadataDatabase::MetadataDatabase( |
| 1320 const base::FilePath& database_path, | 1287 const base::FilePath& database_path, |
| 1321 bool enable_on_disk_index, | 1288 bool enable_on_disk_index, |
| 1322 leveldb::Env* env_override) | 1289 leveldb::Env* env_override) |
| 1323 : database_path_(database_path), | 1290 : database_path_(database_path), |
| 1324 env_override_(env_override), | 1291 env_override_(env_override), |
| 1325 enable_on_disk_index_(enable_on_disk_index), | 1292 enable_on_disk_index_(enable_on_disk_index), |
| 1326 largest_known_change_id_(0), | 1293 largest_known_change_id_(0), |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1579 | 1546 |
| 1580 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); | 1547 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); |
| 1581 if (!trackers.empty()) { | 1548 if (!trackers.empty()) { |
| 1582 index_->StoreFileMetadata(metadata.Pass()); | 1549 index_->StoreFileMetadata(metadata.Pass()); |
| 1583 | 1550 |
| 1584 if (option != UPDATE_TRACKER_FOR_SYNCED_FILE) | 1551 if (option != UPDATE_TRACKER_FOR_SYNCED_FILE) |
| 1585 MarkTrackerSetDirty(trackers, index_.get()); | 1552 MarkTrackerSetDirty(trackers, index_.get()); |
| 1586 } | 1553 } |
| 1587 } | 1554 } |
| 1588 | 1555 |
| 1589 void MetadataDatabase::WriteToDatabase(const SyncStatusCallback& callback) { | 1556 |
| 1590 leveldb::Status status = db_->Commit(); | 1557 SyncStatusCode MetadataDatabase::WriteToDatabase() { |
| 1591 callback.Run(LevelDBStatusToSyncStatusCode(status)); | 1558 return LevelDBStatusToSyncStatusCode(db_->Commit()); |
| 1592 } | 1559 } |
| 1593 | 1560 |
| 1594 scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles( | 1561 scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles( |
| 1595 const std::string& app_id) { | 1562 const std::string& app_id) { |
| 1596 scoped_ptr<base::ListValue> files(new base::ListValue); | 1563 scoped_ptr<base::ListValue> files(new base::ListValue); |
| 1597 | 1564 |
| 1598 FileTracker app_root_tracker; | 1565 FileTracker app_root_tracker; |
| 1599 if (!FindAppRootTracker(app_id, &app_root_tracker)) | 1566 if (!FindAppRootTracker(app_id, &app_root_tracker)) |
| 1600 return files.Pass(); | 1567 return files.Pass(); |
| 1601 | 1568 |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1814 return false; | 1781 return false; |
| 1815 | 1782 |
| 1816 if (!parents.empty()) | 1783 if (!parents.empty()) |
| 1817 return false; | 1784 return false; |
| 1818 | 1785 |
| 1819 return true; | 1786 return true; |
| 1820 } | 1787 } |
| 1821 | 1788 |
| 1822 } // namespace drive_backend | 1789 } // namespace drive_backend |
| 1823 } // namespace sync_file_system | 1790 } // namespace sync_file_system |
| OLD | NEW |