Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/metadata_database.cc

Issue 558603002: [SyncFS] Make MetadataDatabase operations synchronous (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@01_create
Patch Set: +TODO Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698