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 |