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

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

Issue 556803002: [SyncFS] Drop TaskRunner in MetadataDatabase (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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"
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 MarkTrackersDirtyByPath(parent_tracker_id, title, index); 513 MarkTrackersDirtyByPath(parent_tracker_id, title, index);
514 514
515 if (index->GetFileTrackerIDsByFileID(file_id).empty()) { 515 if (index->GetFileTrackerIDsByFileID(file_id).empty()) {
516 index->RemoveFileMetadata(file_id); 516 index->RemoveFileMetadata(file_id);
517 } 517 }
518 } 518 }
519 519
520 } // namespace 520 } // namespace
521 521
522 struct MetadataDatabase::CreateParam { 522 struct MetadataDatabase::CreateParam {
523 scoped_refptr<base::SequencedTaskRunner> worker_task_runner;
524 base::FilePath database_path; 523 base::FilePath database_path;
525 leveldb::Env* env_override; 524 leveldb::Env* env_override;
526 525
527 CreateParam( 526 CreateParam(const base::FilePath& database_path,
528 const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner, 527 leveldb::Env* env_override)
529 const base::FilePath& database_path, 528 : database_path(database_path),
530 leveldb::Env* env_override)
531 : worker_task_runner(worker_task_runner),
532 database_path(database_path),
533 env_override(env_override) {} 529 env_override(env_override) {}
534 }; 530 };
535 531
536 // static 532 // static
537 void MetadataDatabase::Create( 533 void MetadataDatabase::Create(
538 const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner,
539 const base::FilePath& database_path, 534 const base::FilePath& database_path,
540 leveldb::Env* env_override, 535 leveldb::Env* env_override,
541 const CreateCallback& callback) { 536 const CreateCallback& callback) {
542 worker_task_runner->PostTask(FROM_HERE, base::Bind( 537 CreateOnWorkerTaskRunner(
543 &MetadataDatabase::CreateOnWorkerTaskRunner, 538 make_scoped_ptr(new CreateParam(database_path, env_override)),
544 base::Passed(make_scoped_ptr(new CreateParam( 539 callback);
545 worker_task_runner,
546 database_path,
547 env_override))),
548 callback));
549 } 540 }
550 541
551 // static 542 // static
552 SyncStatusCode MetadataDatabase::CreateForTesting( 543 SyncStatusCode MetadataDatabase::CreateForTesting(
553 scoped_ptr<LevelDBWrapper> db, 544 scoped_ptr<LevelDBWrapper> db,
554 bool enable_on_disk_index, 545 bool enable_on_disk_index,
555 scoped_ptr<MetadataDatabase>* metadata_database_out) { 546 scoped_ptr<MetadataDatabase>* metadata_database_out) {
556 scoped_ptr<MetadataDatabase> metadata_database( 547 scoped_ptr<MetadataDatabase> metadata_database(
557 new MetadataDatabase(base::ThreadTaskRunnerHandle::Get(), 548 new MetadataDatabase(base::FilePath(),
558 base::FilePath(),
559 enable_on_disk_index, 549 enable_on_disk_index,
560 NULL)); 550 NULL));
561 metadata_database->db_ = db.Pass(); 551 metadata_database->db_ = db.Pass();
562 SyncStatusCode status = metadata_database->Initialize(); 552 SyncStatusCode status = metadata_database->Initialize();
563 if (status == SYNC_STATUS_OK) 553 if (status == SYNC_STATUS_OK)
564 *metadata_database_out = metadata_database.Pass(); 554 *metadata_database_out = metadata_database.Pass();
565 return status; 555 return status;
566 } 556 }
567 557
568 MetadataDatabase::~MetadataDatabase() { 558 MetadataDatabase::~MetadataDatabase() {
569 worker_task_runner_->DeleteSoon(FROM_HERE, db_.release());
570 } 559 }
571 560
572 // static 561 // static
573 void MetadataDatabase::ClearDatabase( 562 void MetadataDatabase::ClearDatabase(
574 scoped_ptr<MetadataDatabase> metadata_database) { 563 scoped_ptr<MetadataDatabase> metadata_database) {
575 DCHECK(metadata_database); 564 DCHECK(metadata_database);
576 scoped_refptr<base::SequencedTaskRunner> worker_task_runner =
577 metadata_database->worker_task_runner_;
578 base::FilePath database_path = metadata_database->database_path_; 565 base::FilePath database_path = metadata_database->database_path_;
579 DCHECK(!database_path.empty()); 566 DCHECK(!database_path.empty());
580 metadata_database.reset(); 567 metadata_database.reset();
581 568
582 worker_task_runner->PostTask( 569 base::DeleteFile(database_path, true /* recursive */);
583 FROM_HERE,
584 base::Bind(base::IgnoreResult(base::DeleteFile),
585 database_path, true /* recursive */));
586 } 570 }
587 571
588 int64 MetadataDatabase::GetLargestFetchedChangeID() const { 572 int64 MetadataDatabase::GetLargestFetchedChangeID() const {
589 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
590 return index_->GetLargestChangeID(); 573 return index_->GetLargestChangeID();
591 } 574 }
592 575
593 int64 MetadataDatabase::GetSyncRootTrackerID() const { 576 int64 MetadataDatabase::GetSyncRootTrackerID() const {
594 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
595 return index_->GetSyncRootTrackerID(); 577 return index_->GetSyncRootTrackerID();
596 } 578 }
597 579
598 int64 MetadataDatabase::GetLargestKnownChangeID() const { 580 int64 MetadataDatabase::GetLargestKnownChangeID() const {
599 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
600 DCHECK_LE(GetLargestFetchedChangeID(), largest_known_change_id_); 581 DCHECK_LE(GetLargestFetchedChangeID(), largest_known_change_id_);
601 return largest_known_change_id_; 582 return largest_known_change_id_;
602 } 583 }
603 584
604 void MetadataDatabase::UpdateLargestKnownChangeID(int64 change_id) { 585 void MetadataDatabase::UpdateLargestKnownChangeID(int64 change_id) {
605 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
606 if (largest_known_change_id_ < change_id) 586 if (largest_known_change_id_ < change_id)
607 largest_known_change_id_ = change_id; 587 largest_known_change_id_ = change_id;
608 } 588 }
609 589
610 bool MetadataDatabase::HasSyncRoot() const { 590 bool MetadataDatabase::HasSyncRoot() const {
611 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
612 return index_->GetSyncRootTrackerID() != kInvalidTrackerID; 591 return index_->GetSyncRootTrackerID() != kInvalidTrackerID;
613 } 592 }
614 593
615 void MetadataDatabase::PopulateInitialData( 594 void MetadataDatabase::PopulateInitialData(
616 int64 largest_change_id, 595 int64 largest_change_id,
617 const google_apis::FileResource& sync_root_folder, 596 const google_apis::FileResource& sync_root_folder,
618 const ScopedVector<google_apis::FileResource>& app_root_folders, 597 const ScopedVector<google_apis::FileResource>& app_root_folders,
619 const SyncStatusCallback& callback) { 598 const SyncStatusCallback& callback) {
620 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
621
622 index_->SetLargestChangeID(largest_change_id); 599 index_->SetLargestChangeID(largest_change_id);
623 UpdateLargestKnownChangeID(largest_change_id); 600 UpdateLargestKnownChangeID(largest_change_id);
624 601
625 AttachSyncRoot(sync_root_folder); 602 AttachSyncRoot(sync_root_folder);
626 for (size_t i = 0; i < app_root_folders.size(); ++i) 603 for (size_t i = 0; i < app_root_folders.size(); ++i)
627 AttachInitialAppRoot(*app_root_folders[i]); 604 AttachInitialAppRoot(*app_root_folders[i]);
628 605
629 WriteToDatabase(callback); 606 WriteToDatabase(callback);
630 } 607 }
631 608
632 bool MetadataDatabase::IsAppEnabled(const std::string& app_id) const { 609 bool MetadataDatabase::IsAppEnabled(const std::string& app_id) const {
633 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
634
635 int64 tracker_id = index_->GetAppRootTracker(app_id); 610 int64 tracker_id = index_->GetAppRootTracker(app_id);
636 if (tracker_id == kInvalidTrackerID) 611 if (tracker_id == kInvalidTrackerID)
637 return false; 612 return false;
638 613
639 FileTracker tracker; 614 FileTracker tracker;
640 if (!index_->GetFileTracker(tracker_id, &tracker)) 615 if (!index_->GetFileTracker(tracker_id, &tracker))
641 return false; 616 return false;
642 return tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; 617 return tracker.tracker_kind() == TRACKER_KIND_APP_ROOT;
643 } 618 }
644 619
645 void MetadataDatabase::RegisterApp(const std::string& app_id, 620 void MetadataDatabase::RegisterApp(const std::string& app_id,
646 const std::string& folder_id, 621 const std::string& folder_id,
647 const SyncStatusCallback& callback) { 622 const SyncStatusCallback& callback) {
648 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
649
650 if (index_->GetAppRootTracker(app_id)) { 623 if (index_->GetAppRootTracker(app_id)) {
651 // The app-root is already registered. 624 // The app-root is already registered.
652 worker_task_runner_->PostTask( 625 callback.Run(SYNC_STATUS_OK);
653 FROM_HERE,
654 base::Bind(callback, SYNC_STATUS_OK));
655 return; 626 return;
656 } 627 }
657 628
658 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(folder_id); 629 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(folder_id);
659 if (trackers.empty()) { 630 if (trackers.empty()) {
660 worker_task_runner_->PostTask( 631 callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND);
661 FROM_HERE,
662 base::Bind(callback, SYNC_DATABASE_ERROR_NOT_FOUND));
663 return; 632 return;
664 } 633 }
665 634
666 if (trackers.has_active()) { 635 if (trackers.has_active()) {
667 // The folder is tracked by another tracker. 636 // The folder is tracked by another tracker.
668 util::Log(logging::LOG_WARNING, FROM_HERE, 637 util::Log(logging::LOG_WARNING, FROM_HERE,
669 "Failed to register App for %s", app_id.c_str()); 638 "Failed to register App for %s", app_id.c_str());
670 worker_task_runner_->PostTask( 639 callback.Run(SYNC_STATUS_HAS_CONFLICT);
671 FROM_HERE,
672 base::Bind(callback, SYNC_STATUS_HAS_CONFLICT));
673 return; 640 return;
674 } 641 }
675 642
676 int64 sync_root_tracker_id = index_->GetSyncRootTrackerID(); 643 int64 sync_root_tracker_id = index_->GetSyncRootTrackerID();
677 if (!sync_root_tracker_id) { 644 if (!sync_root_tracker_id) {
678 util::Log(logging::LOG_WARNING, FROM_HERE, 645 util::Log(logging::LOG_WARNING, FROM_HERE,
679 "Sync-root needs to be set up before registering app-root"); 646 "Sync-root needs to be set up before registering app-root");
680 worker_task_runner_->PostTask( 647 callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND);
681 FROM_HERE,
682 base::Bind(callback, SYNC_DATABASE_ERROR_NOT_FOUND));
683 return; 648 return;
684 } 649 }
685 650
686 scoped_ptr<FileTracker> tracker(new FileTracker); 651 scoped_ptr<FileTracker> tracker(new FileTracker);
687 if (!FilterFileTrackersByParent(index_.get(), trackers, 652 if (!FilterFileTrackersByParent(index_.get(), trackers,
688 sync_root_tracker_id, tracker.get())) { 653 sync_root_tracker_id, tracker.get())) {
689 worker_task_runner_->PostTask( 654 callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND);
690 FROM_HERE,
691 base::Bind(callback, SYNC_DATABASE_ERROR_NOT_FOUND));
692 return; 655 return;
693 } 656 }
694 657
695 tracker->set_app_id(app_id); 658 tracker->set_app_id(app_id);
696 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); 659 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT);
697 tracker->set_active(true); 660 tracker->set_active(true);
698 tracker->set_needs_folder_listing(true); 661 tracker->set_needs_folder_listing(true);
699 tracker->set_dirty(true); 662 tracker->set_dirty(true);
700 663
701 index_->StoreFileTracker(tracker.Pass()); 664 index_->StoreFileTracker(tracker.Pass());
702 WriteToDatabase(callback); 665 WriteToDatabase(callback);
703 } 666 }
704 667
705 void MetadataDatabase::DisableApp(const std::string& app_id, 668 void MetadataDatabase::DisableApp(const std::string& app_id,
706 const SyncStatusCallback& callback) { 669 const SyncStatusCallback& callback) {
707 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
708
709 int64 tracker_id = index_->GetAppRootTracker(app_id); 670 int64 tracker_id = index_->GetAppRootTracker(app_id);
710 scoped_ptr<FileTracker> tracker(new FileTracker); 671 scoped_ptr<FileTracker> tracker(new FileTracker);
711 if (!index_->GetFileTracker(tracker_id, tracker.get())) { 672 if (!index_->GetFileTracker(tracker_id, tracker.get())) {
712 callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND); 673 callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND);
713 return; 674 return;
714 } 675 }
715 676
716 if (tracker->tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT) { 677 if (tracker->tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT) {
717 callback.Run(SYNC_STATUS_OK); 678 callback.Run(SYNC_STATUS_OK);
718 return; 679 return;
719 } 680 }
720 681
721 DCHECK_EQ(TRACKER_KIND_APP_ROOT, tracker->tracker_kind()); 682 DCHECK_EQ(TRACKER_KIND_APP_ROOT, tracker->tracker_kind());
722 DCHECK(tracker->active()); 683 DCHECK(tracker->active());
723 684
724 // Keep the app-root tracker active (but change the tracker_kind) so that 685 // Keep the app-root tracker active (but change the tracker_kind) so that
725 // other conflicting trackers won't become active. 686 // other conflicting trackers won't become active.
726 tracker->set_tracker_kind(TRACKER_KIND_DISABLED_APP_ROOT); 687 tracker->set_tracker_kind(TRACKER_KIND_DISABLED_APP_ROOT);
727 688
728 index_->StoreFileTracker(tracker.Pass()); 689 index_->StoreFileTracker(tracker.Pass());
729 WriteToDatabase(callback); 690 WriteToDatabase(callback);
730 } 691 }
731 692
732 void MetadataDatabase::EnableApp(const std::string& app_id, 693 void MetadataDatabase::EnableApp(const std::string& app_id,
733 const SyncStatusCallback& callback) { 694 const SyncStatusCallback& callback) {
734 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
735
736 int64 tracker_id = index_->GetAppRootTracker(app_id); 695 int64 tracker_id = index_->GetAppRootTracker(app_id);
737 scoped_ptr<FileTracker> tracker(new FileTracker); 696 scoped_ptr<FileTracker> tracker(new FileTracker);
738 if (!index_->GetFileTracker(tracker_id, tracker.get())) { 697 if (!index_->GetFileTracker(tracker_id, tracker.get())) {
739 callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND); 698 callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND);
740 return; 699 return;
741 } 700 }
742 701
743 if (tracker->tracker_kind() == TRACKER_KIND_APP_ROOT) { 702 if (tracker->tracker_kind() == TRACKER_KIND_APP_ROOT) {
744 callback.Run(SYNC_STATUS_OK); 703 callback.Run(SYNC_STATUS_OK);
745 return; 704 return;
746 } 705 }
747 706
748 DCHECK_EQ(TRACKER_KIND_DISABLED_APP_ROOT, tracker->tracker_kind()); 707 DCHECK_EQ(TRACKER_KIND_DISABLED_APP_ROOT, tracker->tracker_kind());
749 DCHECK(tracker->active()); 708 DCHECK(tracker->active());
750 709
751 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); 710 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT);
752 index_->StoreFileTracker(tracker.Pass()); 711 index_->StoreFileTracker(tracker.Pass());
753 712
754 MarkTrackersDirtyRecursively(tracker_id, index_.get()); 713 MarkTrackersDirtyRecursively(tracker_id, index_.get());
755 WriteToDatabase(callback); 714 WriteToDatabase(callback);
756 } 715 }
757 716
758 void MetadataDatabase::UnregisterApp(const std::string& app_id, 717 void MetadataDatabase::UnregisterApp(const std::string& app_id,
759 const SyncStatusCallback& callback) { 718 const SyncStatusCallback& callback) {
760 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
761
762 int64 tracker_id = index_->GetAppRootTracker(app_id); 719 int64 tracker_id = index_->GetAppRootTracker(app_id);
763 scoped_ptr<FileTracker> tracker(new FileTracker); 720 scoped_ptr<FileTracker> tracker(new FileTracker);
764 if (!index_->GetFileTracker(tracker_id, tracker.get()) || 721 if (!index_->GetFileTracker(tracker_id, tracker.get()) ||
765 tracker->tracker_kind() == TRACKER_KIND_REGULAR) { 722 tracker->tracker_kind() == TRACKER_KIND_REGULAR) {
766 worker_task_runner_->PostTask( 723 callback.Run(SYNC_STATUS_OK);
767 FROM_HERE,
768 base::Bind(callback, SYNC_STATUS_OK));
769 return; 724 return;
770 } 725 }
771 726
772 RemoveAllDescendantTrackers(tracker_id, index_.get()); 727 RemoveAllDescendantTrackers(tracker_id, index_.get());
773 728
774 tracker->clear_app_id(); 729 tracker->clear_app_id();
775 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); 730 tracker->set_tracker_kind(TRACKER_KIND_REGULAR);
776 tracker->set_active(false); 731 tracker->set_active(false);
777 tracker->set_dirty(true); 732 tracker->set_dirty(true);
778 733
779 index_->StoreFileTracker(tracker.Pass()); 734 index_->StoreFileTracker(tracker.Pass());
780 WriteToDatabase(callback); 735 WriteToDatabase(callback);
781 } 736 }
782 737
783 bool MetadataDatabase::FindAppRootTracker(const std::string& app_id, 738 bool MetadataDatabase::FindAppRootTracker(const std::string& app_id,
784 FileTracker* tracker_out) const { 739 FileTracker* tracker_out) const {
785 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
786
787 int64 app_root_tracker_id = index_->GetAppRootTracker(app_id); 740 int64 app_root_tracker_id = index_->GetAppRootTracker(app_id);
788 if (!app_root_tracker_id) 741 if (!app_root_tracker_id)
789 return false; 742 return false;
790 743
791 if (tracker_out && 744 if (tracker_out &&
792 !index_->GetFileTracker(app_root_tracker_id, tracker_out)) { 745 !index_->GetFileTracker(app_root_tracker_id, tracker_out)) {
793 NOTREACHED(); 746 NOTREACHED();
794 return false; 747 return false;
795 } 748 }
796 749
797 return true; 750 return true;
798 } 751 }
799 752
800 bool MetadataDatabase::FindFileByFileID(const std::string& file_id, 753 bool MetadataDatabase::FindFileByFileID(const std::string& file_id,
801 FileMetadata* metadata_out) const { 754 FileMetadata* metadata_out) const {
802 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
803 return index_->GetFileMetadata(file_id, metadata_out); 755 return index_->GetFileMetadata(file_id, metadata_out);
804 } 756 }
805 757
806 bool MetadataDatabase::FindTrackersByFileID(const std::string& file_id, 758 bool MetadataDatabase::FindTrackersByFileID(const std::string& file_id,
807 TrackerIDSet* trackers_out) const { 759 TrackerIDSet* trackers_out) const {
808 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
809
810 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); 760 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id);
811 if (trackers.empty()) 761 if (trackers.empty())
812 return false; 762 return false;
813 763
814 if (trackers_out) 764 if (trackers_out)
815 std::swap(trackers, *trackers_out); 765 std::swap(trackers, *trackers_out);
816 return true; 766 return true;
817 } 767 }
818 768
819 bool MetadataDatabase::FindTrackersByParentAndTitle( 769 bool MetadataDatabase::FindTrackersByParentAndTitle(
820 int64 parent_tracker_id, 770 int64 parent_tracker_id,
821 const std::string& title, 771 const std::string& title,
822 TrackerIDSet* trackers_out) const { 772 TrackerIDSet* trackers_out) const {
823 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
824
825 TrackerIDSet trackers = 773 TrackerIDSet trackers =
826 index_->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title); 774 index_->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title);
827 if (trackers.empty()) 775 if (trackers.empty())
828 return false; 776 return false;
829 777
830 if (trackers_out) 778 if (trackers_out)
831 std::swap(trackers, *trackers_out); 779 std::swap(trackers, *trackers_out);
832 return true; 780 return true;
833 } 781 }
834 782
835 bool MetadataDatabase::FindTrackerByTrackerID(int64 tracker_id, 783 bool MetadataDatabase::FindTrackerByTrackerID(int64 tracker_id,
836 FileTracker* tracker_out) const { 784 FileTracker* tracker_out) const {
837 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
838 return index_->GetFileTracker(tracker_id, tracker_out); 785 return index_->GetFileTracker(tracker_id, tracker_out);
839 } 786 }
840 787
841 bool MetadataDatabase::BuildPathForTracker(int64 tracker_id, 788 bool MetadataDatabase::BuildPathForTracker(int64 tracker_id,
842 base::FilePath* path) const { 789 base::FilePath* path) const {
843 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
844
845 FileTracker current; 790 FileTracker current;
846 if (!FindTrackerByTrackerID(tracker_id, &current) || !current.active()) 791 if (!FindTrackerByTrackerID(tracker_id, &current) || !current.active())
847 return false; 792 return false;
848 793
849 std::vector<base::FilePath> components; 794 std::vector<base::FilePath> components;
850 while (!IsAppRoot(current)) { 795 while (!IsAppRoot(current)) {
851 std::string title = GetTrackerTitle(current); 796 std::string title = GetTrackerTitle(current);
852 if (title.empty()) 797 if (title.empty())
853 return false; 798 return false;
854 components.push_back(base::FilePath::FromUTF8Unsafe(title)); 799 components.push_back(base::FilePath::FromUTF8Unsafe(title));
855 if (!FindTrackerByTrackerID(current.parent_tracker_id(), &current) || 800 if (!FindTrackerByTrackerID(current.parent_tracker_id(), &current) ||
856 !current.active()) 801 !current.active())
857 return false; 802 return false;
858 } 803 }
859 804
860 if (path) 805 if (path)
861 *path = ReverseConcatPathComponents(components); 806 *path = ReverseConcatPathComponents(components);
862 807
863 return true; 808 return true;
864 } 809 }
865 810
866 base::FilePath MetadataDatabase::BuildDisplayPathForTracker( 811 base::FilePath MetadataDatabase::BuildDisplayPathForTracker(
867 const FileTracker& tracker) const { 812 const FileTracker& tracker) const {
868 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
869
870 base::FilePath path; 813 base::FilePath path;
871 if (tracker.active()) { 814 if (tracker.active()) {
872 BuildPathForTracker(tracker.tracker_id(), &path); 815 BuildPathForTracker(tracker.tracker_id(), &path);
873 return path; 816 return path;
874 } 817 }
875 BuildPathForTracker(tracker.parent_tracker_id(), &path); 818 BuildPathForTracker(tracker.parent_tracker_id(), &path);
876 if (tracker.has_synced_details()) { 819 if (tracker.has_synced_details()) {
877 path = path.Append( 820 path = path.Append(
878 base::FilePath::FromUTF8Unsafe(tracker.synced_details().title())); 821 base::FilePath::FromUTF8Unsafe(tracker.synced_details().title()));
879 } else { 822 } else {
880 path = path.Append(FILE_PATH_LITERAL("<unknown>")); 823 path = path.Append(FILE_PATH_LITERAL("<unknown>"));
881 } 824 }
882 return path; 825 return path;
883 } 826 }
884 827
885 bool MetadataDatabase::FindNearestActiveAncestor( 828 bool MetadataDatabase::FindNearestActiveAncestor(
886 const std::string& app_id, 829 const std::string& app_id,
887 const base::FilePath& full_path, 830 const base::FilePath& full_path,
888 FileTracker* tracker_out, 831 FileTracker* tracker_out,
889 base::FilePath* path_out) const { 832 base::FilePath* path_out) const {
890 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
891 DCHECK(tracker_out); 833 DCHECK(tracker_out);
892 DCHECK(path_out); 834 DCHECK(path_out);
893 835
894 if (full_path.IsAbsolute() || 836 if (full_path.IsAbsolute() ||
895 !FindAppRootTracker(app_id, tracker_out) || 837 !FindAppRootTracker(app_id, tracker_out) ||
896 tracker_out->tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT) { 838 tracker_out->tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT) {
897 return false; 839 return false;
898 } 840 }
899 841
900 std::vector<base::FilePath::StringType> components; 842 std::vector<base::FilePath::StringType> components;
(...skipping 23 matching lines...) Expand all
924 *path_out = path_out->Append(components[i]); 866 *path_out = path_out->Append(components[i]);
925 } 867 }
926 868
927 return true; 869 return true;
928 } 870 }
929 871
930 void MetadataDatabase::UpdateByChangeList( 872 void MetadataDatabase::UpdateByChangeList(
931 int64 largest_change_id, 873 int64 largest_change_id,
932 ScopedVector<google_apis::ChangeResource> changes, 874 ScopedVector<google_apis::ChangeResource> changes,
933 const SyncStatusCallback& callback) { 875 const SyncStatusCallback& callback) {
934 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
935 DCHECK_LE(index_->GetLargestChangeID(), largest_change_id); 876 DCHECK_LE(index_->GetLargestChangeID(), largest_change_id);
936 877
937 for (size_t i = 0; i < changes.size(); ++i) { 878 for (size_t i = 0; i < changes.size(); ++i) {
938 const google_apis::ChangeResource& change = *changes[i]; 879 const google_apis::ChangeResource& change = *changes[i];
939 if (HasNewerFileMetadata(change.file_id(), change.change_id())) 880 if (HasNewerFileMetadata(change.file_id(), change.change_id()))
940 continue; 881 continue;
941 882
942 scoped_ptr<FileMetadata> metadata( 883 scoped_ptr<FileMetadata> metadata(
943 CreateFileMetadataFromChangeResource(change)); 884 CreateFileMetadataFromChangeResource(change));
944 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), 885 UpdateByFileMetadata(FROM_HERE, metadata.Pass(),
945 UPDATE_TRACKER_FOR_UNSYNCED_FILE); 886 UPDATE_TRACKER_FOR_UNSYNCED_FILE);
946 } 887 }
947 888
948 UpdateLargestKnownChangeID(largest_change_id); 889 UpdateLargestKnownChangeID(largest_change_id);
949 index_->SetLargestChangeID(largest_change_id); 890 index_->SetLargestChangeID(largest_change_id);
950 WriteToDatabase(callback); 891 WriteToDatabase(callback);
951 } 892 }
952 893
953 void MetadataDatabase::UpdateByFileResource( 894 void MetadataDatabase::UpdateByFileResource(
954 const google_apis::FileResource& resource, 895 const google_apis::FileResource& resource,
955 const SyncStatusCallback& callback) { 896 const SyncStatusCallback& callback) {
956 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
957
958 scoped_ptr<FileMetadata> metadata( 897 scoped_ptr<FileMetadata> metadata(
959 CreateFileMetadataFromFileResource( 898 CreateFileMetadataFromFileResource(
960 GetLargestKnownChangeID(), resource)); 899 GetLargestKnownChangeID(), resource));
961 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), 900 UpdateByFileMetadata(FROM_HERE, metadata.Pass(),
962 UPDATE_TRACKER_FOR_UNSYNCED_FILE); 901 UPDATE_TRACKER_FOR_UNSYNCED_FILE);
963 WriteToDatabase(callback); 902 WriteToDatabase(callback);
964 } 903 }
965 904
966 void MetadataDatabase::UpdateByFileResourceList( 905 void MetadataDatabase::UpdateByFileResourceList(
967 ScopedVector<google_apis::FileResource> resources, 906 ScopedVector<google_apis::FileResource> resources,
968 const SyncStatusCallback& callback) { 907 const SyncStatusCallback& callback) {
969 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
970
971 for (size_t i = 0; i < resources.size(); ++i) { 908 for (size_t i = 0; i < resources.size(); ++i) {
972 scoped_ptr<FileMetadata> metadata( 909 scoped_ptr<FileMetadata> metadata(
973 CreateFileMetadataFromFileResource( 910 CreateFileMetadataFromFileResource(
974 GetLargestKnownChangeID(), *resources[i])); 911 GetLargestKnownChangeID(), *resources[i]));
975 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), 912 UpdateByFileMetadata(FROM_HERE, metadata.Pass(),
976 UPDATE_TRACKER_FOR_UNSYNCED_FILE); 913 UPDATE_TRACKER_FOR_UNSYNCED_FILE);
977 } 914 }
978 WriteToDatabase(callback); 915 WriteToDatabase(callback);
979 } 916 }
980 917
981 void MetadataDatabase::UpdateByDeletedRemoteFile( 918 void MetadataDatabase::UpdateByDeletedRemoteFile(
982 const std::string& file_id, 919 const std::string& file_id,
983 const SyncStatusCallback& callback) { 920 const SyncStatusCallback& callback) {
984 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
985
986 scoped_ptr<FileMetadata> metadata( 921 scoped_ptr<FileMetadata> metadata(
987 CreateDeletedFileMetadata(GetLargestKnownChangeID(), file_id)); 922 CreateDeletedFileMetadata(GetLargestKnownChangeID(), file_id));
988 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), 923 UpdateByFileMetadata(FROM_HERE, metadata.Pass(),
989 UPDATE_TRACKER_FOR_UNSYNCED_FILE); 924 UPDATE_TRACKER_FOR_UNSYNCED_FILE);
990 WriteToDatabase(callback); 925 WriteToDatabase(callback);
991 } 926 }
992 927
993 void MetadataDatabase::UpdateByDeletedRemoteFileList( 928 void MetadataDatabase::UpdateByDeletedRemoteFileList(
994 const FileIDList& file_ids, 929 const FileIDList& file_ids,
995 const SyncStatusCallback& callback) { 930 const SyncStatusCallback& callback) {
996 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
997
998 for (FileIDList::const_iterator itr = file_ids.begin(); 931 for (FileIDList::const_iterator itr = file_ids.begin();
999 itr != file_ids.end(); ++itr) { 932 itr != file_ids.end(); ++itr) {
1000 scoped_ptr<FileMetadata> metadata( 933 scoped_ptr<FileMetadata> metadata(
1001 CreateDeletedFileMetadata(GetLargestKnownChangeID(), *itr)); 934 CreateDeletedFileMetadata(GetLargestKnownChangeID(), *itr));
1002 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), 935 UpdateByFileMetadata(FROM_HERE, metadata.Pass(),
1003 UPDATE_TRACKER_FOR_UNSYNCED_FILE); 936 UPDATE_TRACKER_FOR_UNSYNCED_FILE);
1004 } 937 }
1005 WriteToDatabase(callback); 938 WriteToDatabase(callback);
1006 } 939 }
1007 940
1008 void MetadataDatabase::ReplaceActiveTrackerWithNewResource( 941 void MetadataDatabase::ReplaceActiveTrackerWithNewResource(
1009 int64 parent_tracker_id, 942 int64 parent_tracker_id,
1010 const google_apis::FileResource& resource, 943 const google_apis::FileResource& resource,
1011 const SyncStatusCallback& callback) { 944 const SyncStatusCallback& callback) {
1012 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1013
1014 DCHECK(!index_->GetFileMetadata(resource.file_id(), NULL)); 945 DCHECK(!index_->GetFileMetadata(resource.file_id(), NULL));
1015 DCHECK(index_->GetFileTracker(parent_tracker_id, NULL)); 946 DCHECK(index_->GetFileTracker(parent_tracker_id, NULL));
1016 947
1017 UpdateByFileMetadata( 948 UpdateByFileMetadata(
1018 FROM_HERE, 949 FROM_HERE,
1019 CreateFileMetadataFromFileResource(GetLargestKnownChangeID(), resource), 950 CreateFileMetadataFromFileResource(GetLargestKnownChangeID(), resource),
1020 UPDATE_TRACKER_FOR_SYNCED_FILE); 951 UPDATE_TRACKER_FOR_SYNCED_FILE);
1021 952
1022 DCHECK(index_->GetFileMetadata(resource.file_id(), NULL)); 953 DCHECK(index_->GetFileMetadata(resource.file_id(), NULL));
1023 DCHECK(!index_->GetFileTrackerIDsByFileID(resource.file_id()).has_active()); 954 DCHECK(!index_->GetFileTrackerIDsByFileID(resource.file_id()).has_active());
1024 955
1025 TrackerIDSet same_path_trackers = 956 TrackerIDSet same_path_trackers =
1026 index_->GetFileTrackerIDsByParentAndTitle( 957 index_->GetFileTrackerIDsByParentAndTitle(
1027 parent_tracker_id, resource.title()); 958 parent_tracker_id, resource.title());
1028 FileTracker to_be_activated; 959 FileTracker to_be_activated;
1029 if (!FilterFileTrackersByFileID(index_.get(), same_path_trackers, 960 if (!FilterFileTrackersByFileID(index_.get(), same_path_trackers,
1030 resource.file_id(), &to_be_activated)) { 961 resource.file_id(), &to_be_activated)) {
1031 NOTREACHED(); 962 NOTREACHED();
1032 worker_task_runner_->PostTask( 963 callback.Run(SYNC_STATUS_FAILED);
1033 FROM_HERE,
1034 base::Bind(callback, SYNC_STATUS_FAILED));
1035 return; 964 return;
1036 } 965 }
1037 966
1038 int64 tracker_id = to_be_activated.tracker_id(); 967 int64 tracker_id = to_be_activated.tracker_id();
1039 if (same_path_trackers.has_active()) { 968 if (same_path_trackers.has_active()) {
1040 DeactivateFileTracker(same_path_trackers.active_tracker(), 969 DeactivateFileTracker(same_path_trackers.active_tracker(),
1041 MARK_ITSELF_DIRTY | 970 MARK_ITSELF_DIRTY |
1042 MARK_SAME_FILE_ID_TRACKERS_DIRTY, 971 MARK_SAME_FILE_ID_TRACKERS_DIRTY,
1043 index_.get()); 972 index_.get());
1044 } 973 }
1045 974
1046 ActivateFileTracker(tracker_id, MARK_NOTHING_DIRTY, index_.get()); 975 ActivateFileTracker(tracker_id, MARK_NOTHING_DIRTY, index_.get());
1047 WriteToDatabase(callback); 976 WriteToDatabase(callback);
1048 } 977 }
1049 978
1050 void MetadataDatabase::PopulateFolderByChildList( 979 void MetadataDatabase::PopulateFolderByChildList(
1051 const std::string& folder_id, 980 const std::string& folder_id,
1052 const FileIDList& child_file_ids, 981 const FileIDList& child_file_ids,
1053 const SyncStatusCallback& callback) { 982 const SyncStatusCallback& callback) {
1054 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1055
1056 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(folder_id); 983 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(folder_id);
1057 if (!trackers.has_active()) { 984 if (!trackers.has_active()) {
1058 // It's OK that there is no folder to populate its children. 985 // It's OK that there is no folder to populate its children.
1059 // Inactive folders should ignore their contents updates. 986 // Inactive folders should ignore their contents updates.
1060 worker_task_runner_->PostTask( 987 callback.Run(SYNC_STATUS_OK);
1061 FROM_HERE,
1062 base::Bind(callback, SYNC_STATUS_OK));
1063 return; 988 return;
1064 } 989 }
1065 990
1066 scoped_ptr<FileTracker> folder_tracker(new FileTracker); 991 scoped_ptr<FileTracker> folder_tracker(new FileTracker);
1067 if (!index_->GetFileTracker(trackers.active_tracker(), 992 if (!index_->GetFileTracker(trackers.active_tracker(),
1068 folder_tracker.get())) { 993 folder_tracker.get())) {
1069 NOTREACHED(); 994 NOTREACHED();
1070 worker_task_runner_->PostTask( 995 callback.Run(SYNC_STATUS_FAILED);
1071 FROM_HERE,
1072 base::Bind(callback, SYNC_STATUS_FAILED));
1073 return; 996 return;
1074 } 997 }
1075 998
1076 base::hash_set<std::string> children(child_file_ids.begin(), 999 base::hash_set<std::string> children(child_file_ids.begin(),
1077 child_file_ids.end()); 1000 child_file_ids.end());
1078 1001
1079 std::vector<int64> known_children = 1002 std::vector<int64> known_children =
1080 index_->GetFileTrackerIDsByParent(folder_tracker->tracker_id()); 1003 index_->GetFileTrackerIDsByParent(folder_tracker->tracker_id());
1081 for (size_t i = 0; i < known_children.size(); ++i) { 1004 for (size_t i = 0; i < known_children.size(); ++i) {
1082 FileTracker tracker; 1005 FileTracker tracker;
(...skipping 11 matching lines...) Expand all
1094 if (folder_tracker->dirty() && !ShouldKeepDirty(*folder_tracker)) 1017 if (folder_tracker->dirty() && !ShouldKeepDirty(*folder_tracker))
1095 folder_tracker->set_dirty(false); 1018 folder_tracker->set_dirty(false);
1096 index_->StoreFileTracker(folder_tracker.Pass()); 1019 index_->StoreFileTracker(folder_tracker.Pass());
1097 1020
1098 WriteToDatabase(callback); 1021 WriteToDatabase(callback);
1099 } 1022 }
1100 1023
1101 void MetadataDatabase::UpdateTracker(int64 tracker_id, 1024 void MetadataDatabase::UpdateTracker(int64 tracker_id,
1102 const FileDetails& updated_details, 1025 const FileDetails& updated_details,
1103 const SyncStatusCallback& callback) { 1026 const SyncStatusCallback& callback) {
1104 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1105
1106 FileTracker tracker; 1027 FileTracker tracker;
1107 if (!index_->GetFileTracker(tracker_id, &tracker)) { 1028 if (!index_->GetFileTracker(tracker_id, &tracker)) {
1108 worker_task_runner_->PostTask( 1029 callback.Run(SYNC_DATABASE_ERROR_NOT_FOUND);
1109 FROM_HERE,
1110 base::Bind(callback, SYNC_DATABASE_ERROR_NOT_FOUND));
1111 return; 1030 return;
1112 } 1031 }
1113 1032
1114 // Check if the tracker is to be deleted. 1033 // Check if the tracker is to be deleted.
1115 if (updated_details.missing()) { 1034 if (updated_details.missing()) {
1116 FileMetadata metadata; 1035 FileMetadata metadata;
1117 if (!index_->GetFileMetadata(tracker.file_id(), &metadata) || 1036 if (!index_->GetFileMetadata(tracker.file_id(), &metadata) ||
1118 metadata.details().missing()) { 1037 metadata.details().missing()) {
1119 // Both the tracker and metadata have the missing flag, now it's safe to 1038 // Both the tracker and metadata have the missing flag, now it's safe to
1120 // delete the |tracker|. 1039 // delete the |tracker|.
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1199 if (should_promote) 1118 if (should_promote)
1200 index_->PromoteDemotedDirtyTracker(tracker_id); 1119 index_->PromoteDemotedDirtyTracker(tracker_id);
1201 1120
1202 WriteToDatabase(callback); 1121 WriteToDatabase(callback);
1203 } 1122 }
1204 1123
1205 MetadataDatabase::ActivationStatus MetadataDatabase::TryActivateTracker( 1124 MetadataDatabase::ActivationStatus MetadataDatabase::TryActivateTracker(
1206 int64 parent_tracker_id, 1125 int64 parent_tracker_id,
1207 const std::string& file_id, 1126 const std::string& file_id,
1208 const SyncStatusCallback& callback) { 1127 const SyncStatusCallback& callback) {
1209 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1210
1211 FileMetadata metadata; 1128 FileMetadata metadata;
1212 if (!index_->GetFileMetadata(file_id, &metadata)) { 1129 if (!index_->GetFileMetadata(file_id, &metadata)) {
1213 NOTREACHED(); 1130 NOTREACHED();
1214 worker_task_runner_->PostTask( 1131 callback.Run(SYNC_STATUS_FAILED);
1215 FROM_HERE,
1216 base::Bind(callback, SYNC_STATUS_FAILED));
1217 return ACTIVATION_PENDING; 1132 return ACTIVATION_PENDING;
1218 } 1133 }
1219 std::string title = metadata.details().title(); 1134 std::string title = metadata.details().title();
1220 DCHECK(!HasInvalidTitle(title)); 1135 DCHECK(!HasInvalidTitle(title));
1221 1136
1222 TrackerIDSet same_file_id_trackers = 1137 TrackerIDSet same_file_id_trackers =
1223 index_->GetFileTrackerIDsByFileID(file_id); 1138 index_->GetFileTrackerIDsByFileID(file_id);
1224 scoped_ptr<FileTracker> tracker_to_be_activated(new FileTracker); 1139 scoped_ptr<FileTracker> tracker_to_be_activated(new FileTracker);
1225 FilterFileTrackersByParentAndTitle( 1140 FilterFileTrackersByParentAndTitle(
1226 index_.get(), same_file_id_trackers, parent_tracker_id, 1141 index_.get(), same_file_id_trackers, parent_tracker_id,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1265 } 1180 }
1266 tracker_to_be_activated->set_dirty(false); 1181 tracker_to_be_activated->set_dirty(false);
1267 1182
1268 index_->StoreFileTracker(tracker_to_be_activated.Pass()); 1183 index_->StoreFileTracker(tracker_to_be_activated.Pass());
1269 1184
1270 WriteToDatabase(callback); 1185 WriteToDatabase(callback);
1271 return ACTIVATION_PENDING; 1186 return ACTIVATION_PENDING;
1272 } 1187 }
1273 1188
1274 void MetadataDatabase::DemoteTracker(int64 tracker_id) { 1189 void MetadataDatabase::DemoteTracker(int64 tracker_id) {
1275 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1276 index_->DemoteDirtyTracker(tracker_id); 1190 index_->DemoteDirtyTracker(tracker_id);
1277 WriteToDatabase(base::Bind(&EmptyStatusCallback)); 1191 WriteToDatabase(base::Bind(&EmptyStatusCallback));
1278 } 1192 }
1279 1193
1280 bool MetadataDatabase::PromoteDemotedTrackers() { 1194 bool MetadataDatabase::PromoteDemotedTrackers() {
1281 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1282 bool promoted = index_->PromoteDemotedDirtyTrackers(); 1195 bool promoted = index_->PromoteDemotedDirtyTrackers();
1283 WriteToDatabase(base::Bind(&EmptyStatusCallback)); 1196 WriteToDatabase(base::Bind(&EmptyStatusCallback));
1284 return promoted; 1197 return promoted;
1285 } 1198 }
1286 1199
1287 void MetadataDatabase::PromoteDemotedTracker(int64 tracker_id) { 1200 void MetadataDatabase::PromoteDemotedTracker(int64 tracker_id) {
1288 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1289 index_->PromoteDemotedDirtyTracker(tracker_id); 1201 index_->PromoteDemotedDirtyTracker(tracker_id);
1290 WriteToDatabase(base::Bind(&EmptyStatusCallback)); 1202 WriteToDatabase(base::Bind(&EmptyStatusCallback));
1291 } 1203 }
1292 1204
1293 bool MetadataDatabase::GetDirtyTracker( 1205 bool MetadataDatabase::GetDirtyTracker(
1294 FileTracker* tracker_out) const { 1206 FileTracker* tracker_out) const {
1295 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1296
1297 int64 dirty_tracker_id = index_->PickDirtyTracker(); 1207 int64 dirty_tracker_id = index_->PickDirtyTracker();
1298 if (!dirty_tracker_id) 1208 if (!dirty_tracker_id)
1299 return false; 1209 return false;
1300 1210
1301 if (tracker_out) { 1211 if (tracker_out) {
1302 if (!index_->GetFileTracker(dirty_tracker_id, tracker_out)) { 1212 if (!index_->GetFileTracker(dirty_tracker_id, tracker_out)) {
1303 NOTREACHED(); 1213 NOTREACHED();
1304 return false; 1214 return false;
1305 } 1215 }
1306 } 1216 }
1307 return true; 1217 return true;
1308 } 1218 }
1309 1219
1310 bool MetadataDatabase::HasDemotedDirtyTracker() const { 1220 bool MetadataDatabase::HasDemotedDirtyTracker() const {
1311 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1312 return index_->HasDemotedDirtyTracker(); 1221 return index_->HasDemotedDirtyTracker();
1313 } 1222 }
1314 1223
1315 bool MetadataDatabase::HasDirtyTracker() const { 1224 bool MetadataDatabase::HasDirtyTracker() const {
1316 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1317 return index_->PickDirtyTracker() != kInvalidTrackerID; 1225 return index_->PickDirtyTracker() != kInvalidTrackerID;
1318 } 1226 }
1319 1227
1320 size_t MetadataDatabase::CountDirtyTracker() const { 1228 size_t MetadataDatabase::CountDirtyTracker() const {
1321 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1322 return index_->CountDirtyTracker(); 1229 return index_->CountDirtyTracker();
1323 } 1230 }
1324 1231
1325 bool MetadataDatabase::GetMultiParentFileTrackers(std::string* file_id_out, 1232 bool MetadataDatabase::GetMultiParentFileTrackers(std::string* file_id_out,
1326 TrackerIDSet* trackers_out) { 1233 TrackerIDSet* trackers_out) {
1327 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1328 DCHECK(file_id_out); 1234 DCHECK(file_id_out);
1329 DCHECK(trackers_out); 1235 DCHECK(trackers_out);
1330 1236
1331 std::string file_id = index_->PickMultiTrackerFileID(); 1237 std::string file_id = index_->PickMultiTrackerFileID();
1332 if (file_id.empty()) 1238 if (file_id.empty())
1333 return false; 1239 return false;
1334 1240
1335 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); 1241 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id);
1336 if (trackers.size() <= 1) { 1242 if (trackers.size() <= 1) {
1337 NOTREACHED(); 1243 NOTREACHED();
1338 return false; 1244 return false;
1339 } 1245 }
1340 1246
1341 *file_id_out = file_id; 1247 *file_id_out = file_id;
1342 std::swap(*trackers_out, trackers); 1248 std::swap(*trackers_out, trackers);
1343 return true; 1249 return true;
1344 } 1250 }
1345 1251
1346 size_t MetadataDatabase::CountFileMetadata() const { 1252 size_t MetadataDatabase::CountFileMetadata() const {
1347 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1348 return index_->CountFileMetadata(); 1253 return index_->CountFileMetadata();
1349 } 1254 }
1350 1255
1351 size_t MetadataDatabase::CountFileTracker() const { 1256 size_t MetadataDatabase::CountFileTracker() const {
1352 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1353 return index_->CountFileTracker(); 1257 return index_->CountFileTracker();
1354 } 1258 }
1355 1259
1356 bool MetadataDatabase::GetConflictingTrackers(TrackerIDSet* trackers_out) { 1260 bool MetadataDatabase::GetConflictingTrackers(TrackerIDSet* trackers_out) {
1357 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1358 DCHECK(trackers_out); 1261 DCHECK(trackers_out);
1359 1262
1360 ParentIDAndTitle parent_and_title = index_->PickMultiBackingFilePath(); 1263 ParentIDAndTitle parent_and_title = index_->PickMultiBackingFilePath();
1361 if (parent_and_title.parent_id == kInvalidTrackerID) 1264 if (parent_and_title.parent_id == kInvalidTrackerID)
1362 return false; 1265 return false;
1363 1266
1364 TrackerIDSet trackers = index_->GetFileTrackerIDsByParentAndTitle( 1267 TrackerIDSet trackers = index_->GetFileTrackerIDsByParentAndTitle(
1365 parent_and_title.parent_id, parent_and_title.title); 1268 parent_and_title.parent_id, parent_and_title.title);
1366 if (trackers.size() <= 1) { 1269 if (trackers.size() <= 1) {
1367 NOTREACHED(); 1270 NOTREACHED();
1368 return false; 1271 return false;
1369 } 1272 }
1370 1273
1371 std::swap(*trackers_out, trackers); 1274 std::swap(*trackers_out, trackers);
1372 return true; 1275 return true;
1373 } 1276 }
1374 1277
1375 void MetadataDatabase::GetRegisteredAppIDs(std::vector<std::string>* app_ids) { 1278 void MetadataDatabase::GetRegisteredAppIDs(std::vector<std::string>* app_ids) {
1376 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1377 DCHECK(app_ids); 1279 DCHECK(app_ids);
1378 *app_ids = index_->GetRegisteredAppIDs(); 1280 *app_ids = index_->GetRegisteredAppIDs();
1379 } 1281 }
1380 1282
1381 void MetadataDatabase::SweepDirtyTrackers( 1283 void MetadataDatabase::SweepDirtyTrackers(
1382 const std::vector<std::string>& file_ids, 1284 const std::vector<std::string>& file_ids,
1383 const SyncStatusCallback& callback) { 1285 const SyncStatusCallback& callback) {
1384 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1385
1386 std::set<int64> tracker_ids; 1286 std::set<int64> tracker_ids;
1387 for (size_t i = 0; i < file_ids.size(); ++i) { 1287 for (size_t i = 0; i < file_ids.size(); ++i) {
1388 TrackerIDSet trackers_for_file_id = 1288 TrackerIDSet trackers_for_file_id =
1389 index_->GetFileTrackerIDsByFileID(file_ids[i]); 1289 index_->GetFileTrackerIDsByFileID(file_ids[i]);
1390 for (TrackerIDSet::iterator itr = trackers_for_file_id.begin(); 1290 for (TrackerIDSet::iterator itr = trackers_for_file_id.begin();
1391 itr != trackers_for_file_id.end(); ++itr) 1291 itr != trackers_for_file_id.end(); ++itr)
1392 tracker_ids.insert(*itr); 1292 tracker_ids.insert(*itr);
1393 } 1293 }
1394 1294
1395 for (std::set<int64>::iterator itr = tracker_ids.begin(); 1295 for (std::set<int64>::iterator itr = tracker_ids.begin();
1396 itr != tracker_ids.end(); ++itr) { 1296 itr != tracker_ids.end(); ++itr) {
1397 scoped_ptr<FileTracker> tracker(new FileTracker); 1297 scoped_ptr<FileTracker> tracker(new FileTracker);
1398 if (!index_->GetFileTracker(*itr, tracker.get()) || 1298 if (!index_->GetFileTracker(*itr, tracker.get()) ||
1399 !CanClearDirty(*tracker)) 1299 !CanClearDirty(*tracker))
1400 continue; 1300 continue;
1401 tracker->set_dirty(false); 1301 tracker->set_dirty(false);
1402 index_->StoreFileTracker(tracker.Pass()); 1302 index_->StoreFileTracker(tracker.Pass());
1403 } 1303 }
1404 1304
1405 WriteToDatabase(callback); 1305 WriteToDatabase(callback);
1406 } 1306 }
1407 1307
1408 MetadataDatabase::MetadataDatabase( 1308 MetadataDatabase::MetadataDatabase(
1409 const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner,
1410 const base::FilePath& database_path, 1309 const base::FilePath& database_path,
1411 bool enable_on_disk_index, 1310 bool enable_on_disk_index,
1412 leveldb::Env* env_override) 1311 leveldb::Env* env_override)
1413 : worker_task_runner_(worker_task_runner), 1312 : database_path_(database_path),
1414 database_path_(database_path),
1415 env_override_(env_override), 1313 env_override_(env_override),
1416 enable_on_disk_index_(enable_on_disk_index), 1314 enable_on_disk_index_(enable_on_disk_index),
1417 largest_known_change_id_(0), 1315 largest_known_change_id_(0),
1418 weak_ptr_factory_(this) { 1316 weak_ptr_factory_(this) {
1419 DCHECK(worker_task_runner.get());
1420 } 1317 }
1421 1318
1422 // static 1319 // static
1423 void MetadataDatabase::CreateOnWorkerTaskRunner( 1320 void MetadataDatabase::CreateOnWorkerTaskRunner(
1424 scoped_ptr<CreateParam> create_param, 1321 scoped_ptr<CreateParam> create_param,
1425 const CreateCallback& callback) { 1322 const CreateCallback& callback) {
peria 2014/09/09 10:29:34 I think we can merge this method into Create() and
peria 2014/09/09 10:32:13 Please ignore the previous comment. I found you di
1426 DCHECK(create_param->worker_task_runner->RunsTasksOnCurrentThread());
1427
1428 bool enable_on_disk_index = !CommandLine::ForCurrentProcess()->HasSwitch( 1323 bool enable_on_disk_index = !CommandLine::ForCurrentProcess()->HasSwitch(
1429 kDisableMetadataDatabaseOnDisk); 1324 kDisableMetadataDatabaseOnDisk);
1430 scoped_ptr<MetadataDatabase> metadata_database( 1325 scoped_ptr<MetadataDatabase> metadata_database(
1431 new MetadataDatabase(create_param->worker_task_runner, 1326 new MetadataDatabase(create_param->database_path,
1432 create_param->database_path,
1433 enable_on_disk_index, 1327 enable_on_disk_index,
1434 create_param->env_override)); 1328 create_param->env_override));
1435 1329
1436 SyncStatusCode status = metadata_database->Initialize(); 1330 SyncStatusCode status = metadata_database->Initialize();
1437 if (status == SYNC_DATABASE_ERROR_FAILED) { 1331 if (status == SYNC_DATABASE_ERROR_FAILED) {
1438 // Delete the previous instance to avoid creating a LevelDB instance for 1332 // Delete the previous instance to avoid creating a LevelDB instance for
1439 // the same path. 1333 // the same path.
1440 metadata_database.reset(); 1334 metadata_database.reset();
1441 1335
1442 metadata_database.reset( 1336 metadata_database.reset(
1443 new MetadataDatabase(create_param->worker_task_runner, 1337 new MetadataDatabase(create_param->database_path,
1444 create_param->database_path,
1445 enable_on_disk_index, 1338 enable_on_disk_index,
1446 create_param->env_override)); 1339 create_param->env_override));
1447 status = metadata_database->Initialize(); 1340 status = metadata_database->Initialize();
1448 } 1341 }
1449 1342
1450 if (status != SYNC_STATUS_OK) 1343 if (status != SYNC_STATUS_OK)
1451 metadata_database.reset(); 1344 metadata_database.reset();
1452 1345
1453 if (metadata_database) 1346 callback.Run(status, metadata_database.Pass());
1454 metadata_database->DetachFromSequence();
1455 create_param->worker_task_runner->PostTask(
1456 FROM_HERE,
1457 base::Bind(
1458 callback, status, base::Passed(&metadata_database)));
1459 } 1347 }
1460 1348
1461 SyncStatusCode MetadataDatabase::Initialize() { 1349 SyncStatusCode MetadataDatabase::Initialize() {
1462 base::ThreadRestrictions::AssertIOAllowed();
1463 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1464
1465 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 1350 SyncStatusCode status = SYNC_STATUS_UNKNOWN;
1466 bool created = false; 1351 bool created = false;
1467 // Open database unless |db_| is overridden for testing. 1352 // Open database unless |db_| is overridden for testing.
1468 if (!db_) { 1353 if (!db_) {
1469 status = OpenDatabase(database_path_, env_override_, &db_, &created); 1354 status = OpenDatabase(database_path_, env_override_, &db_, &created);
1470 if (status != SYNC_STATUS_OK) 1355 if (status != SYNC_STATUS_OK)
1471 return status; 1356 return status;
1472 } 1357 }
1473 1358
1474 if (!created) { 1359 if (!created) {
(...skipping 23 matching lines...) Expand all
1498 return status; 1383 return status;
1499 1384
1500 UpdateLargestKnownChangeID(index_->GetLargestChangeID()); 1385 UpdateLargestKnownChangeID(index_->GetLargestChangeID());
1501 1386
1502 return status; 1387 return status;
1503 } 1388 }
1504 1389
1505 void MetadataDatabase::CreateTrackerForParentAndFileID( 1390 void MetadataDatabase::CreateTrackerForParentAndFileID(
1506 const FileTracker& parent_tracker, 1391 const FileTracker& parent_tracker,
1507 const std::string& file_id) { 1392 const std::string& file_id) {
1508 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1509 CreateTrackerInternal(parent_tracker, file_id, NULL, 1393 CreateTrackerInternal(parent_tracker, file_id, NULL,
1510 UPDATE_TRACKER_FOR_UNSYNCED_FILE); 1394 UPDATE_TRACKER_FOR_UNSYNCED_FILE);
1511 } 1395 }
1512 1396
1513 void MetadataDatabase::CreateTrackerForParentAndFileMetadata( 1397 void MetadataDatabase::CreateTrackerForParentAndFileMetadata(
1514 const FileTracker& parent_tracker, 1398 const FileTracker& parent_tracker,
1515 const FileMetadata& file_metadata, 1399 const FileMetadata& file_metadata,
1516 UpdateOption option) { 1400 UpdateOption option) {
1517 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1518 DCHECK(file_metadata.has_details()); 1401 DCHECK(file_metadata.has_details());
1519 CreateTrackerInternal(parent_tracker, 1402 CreateTrackerInternal(parent_tracker,
1520 file_metadata.file_id(), 1403 file_metadata.file_id(),
1521 &file_metadata.details(), 1404 &file_metadata.details(),
1522 option); 1405 option);
1523 } 1406 }
1524 1407
1525 void MetadataDatabase::CreateTrackerInternal(const FileTracker& parent_tracker, 1408 void MetadataDatabase::CreateTrackerInternal(const FileTracker& parent_tracker,
1526 const std::string& file_id, 1409 const std::string& file_id,
1527 const FileDetails* details, 1410 const FileDetails* details,
1528 UpdateOption option) { 1411 UpdateOption option) {
1529 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1530
1531 int64 tracker_id = IncrementTrackerID(); 1412 int64 tracker_id = IncrementTrackerID();
1532 scoped_ptr<FileTracker> tracker(new FileTracker); 1413 scoped_ptr<FileTracker> tracker(new FileTracker);
1533 tracker->set_tracker_id(tracker_id); 1414 tracker->set_tracker_id(tracker_id);
1534 tracker->set_parent_tracker_id(parent_tracker.tracker_id()); 1415 tracker->set_parent_tracker_id(parent_tracker.tracker_id());
1535 tracker->set_file_id(file_id); 1416 tracker->set_file_id(file_id);
1536 tracker->set_app_id(parent_tracker.app_id()); 1417 tracker->set_app_id(parent_tracker.app_id());
1537 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); 1418 tracker->set_tracker_kind(TRACKER_KIND_REGULAR);
1538 tracker->set_dirty(true); 1419 tracker->set_dirty(true);
1539 tracker->set_active(false); 1420 tracker->set_active(false);
1540 tracker->set_needs_folder_listing(false); 1421 tracker->set_needs_folder_listing(false);
1541 if (details) { 1422 if (details) {
1542 *tracker->mutable_synced_details() = *details; 1423 *tracker->mutable_synced_details() = *details;
1543 if (option == UPDATE_TRACKER_FOR_UNSYNCED_FILE) { 1424 if (option == UPDATE_TRACKER_FOR_UNSYNCED_FILE) {
1544 tracker->mutable_synced_details()->set_missing(true); 1425 tracker->mutable_synced_details()->set_missing(true);
1545 tracker->mutable_synced_details()->clear_md5(); 1426 tracker->mutable_synced_details()->clear_md5();
1546 } 1427 }
1547 } 1428 }
1548 index_->StoreFileTracker(tracker.Pass()); 1429 index_->StoreFileTracker(tracker.Pass());
1549 } 1430 }
1550 1431
1551 void MetadataDatabase::MaybeAddTrackersForNewFile( 1432 void MetadataDatabase::MaybeAddTrackersForNewFile(
1552 const FileMetadata& metadata, 1433 const FileMetadata& metadata,
1553 UpdateOption option) { 1434 UpdateOption option) {
1554 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1555
1556 std::set<int64> parents_to_exclude; 1435 std::set<int64> parents_to_exclude;
1557 TrackerIDSet existing_trackers = 1436 TrackerIDSet existing_trackers =
1558 index_->GetFileTrackerIDsByFileID(metadata.file_id()); 1437 index_->GetFileTrackerIDsByFileID(metadata.file_id());
1559 for (TrackerIDSet::const_iterator itr = existing_trackers.begin(); 1438 for (TrackerIDSet::const_iterator itr = existing_trackers.begin();
1560 itr != existing_trackers.end(); ++itr) { 1439 itr != existing_trackers.end(); ++itr) {
1561 FileTracker tracker; 1440 FileTracker tracker;
1562 if (!index_->GetFileTracker(*itr, &tracker)) { 1441 if (!index_->GetFileTracker(*itr, &tracker)) {
1563 NOTREACHED(); 1442 NOTREACHED();
1564 continue; 1443 continue;
1565 } 1444 }
(...skipping 24 matching lines...) Expand all
1590 if (ContainsKey(parents_to_exclude, parent_tracker.tracker_id())) 1469 if (ContainsKey(parents_to_exclude, parent_tracker.tracker_id()))
1591 continue; 1470 continue;
1592 1471
1593 CreateTrackerForParentAndFileMetadata( 1472 CreateTrackerForParentAndFileMetadata(
1594 parent_tracker, metadata, option); 1473 parent_tracker, metadata, option);
1595 } 1474 }
1596 } 1475 }
1597 } 1476 }
1598 1477
1599 int64 MetadataDatabase::IncrementTrackerID() { 1478 int64 MetadataDatabase::IncrementTrackerID() {
1600 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1601
1602 int64 tracker_id = index_->GetNextTrackerID(); 1479 int64 tracker_id = index_->GetNextTrackerID();
1603 index_->SetNextTrackerID(tracker_id + 1); 1480 index_->SetNextTrackerID(tracker_id + 1);
1604 DCHECK_GT(tracker_id, 0); 1481 DCHECK_GT(tracker_id, 0);
1605 return tracker_id; 1482 return tracker_id;
1606 } 1483 }
1607 1484
1608 bool MetadataDatabase::CanActivateTracker(const FileTracker& tracker) { 1485 bool MetadataDatabase::CanActivateTracker(const FileTracker& tracker) {
1609 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1610 DCHECK(!tracker.active()); 1486 DCHECK(!tracker.active());
1611 DCHECK_NE(index_->GetSyncRootTrackerID(), tracker.tracker_id()); 1487 DCHECK_NE(index_->GetSyncRootTrackerID(), tracker.tracker_id());
1612 1488
1613 if (HasActiveTrackerForFileID(tracker.file_id())) 1489 if (HasActiveTrackerForFileID(tracker.file_id()))
1614 return false; 1490 return false;
1615 1491
1616 if (tracker.app_id().empty() && 1492 if (tracker.app_id().empty() &&
1617 tracker.tracker_id() != GetSyncRootTrackerID()) { 1493 tracker.tracker_id() != GetSyncRootTrackerID()) {
1618 return false; 1494 return false;
1619 } 1495 }
1620 1496
1621 if (!tracker.has_synced_details()) 1497 if (!tracker.has_synced_details())
1622 return false; 1498 return false;
1623 if (tracker.synced_details().file_kind() == FILE_KIND_UNSUPPORTED) 1499 if (tracker.synced_details().file_kind() == FILE_KIND_UNSUPPORTED)
1624 return false; 1500 return false;
1625 if (HasInvalidTitle(tracker.synced_details().title())) 1501 if (HasInvalidTitle(tracker.synced_details().title()))
1626 return false; 1502 return false;
1627 DCHECK(tracker.parent_tracker_id()); 1503 DCHECK(tracker.parent_tracker_id());
1628 1504
1629 return !HasActiveTrackerForPath(tracker.parent_tracker_id(), 1505 return !HasActiveTrackerForPath(tracker.parent_tracker_id(),
1630 tracker.synced_details().title()); 1506 tracker.synced_details().title());
1631 } 1507 }
1632 1508
1633 bool MetadataDatabase::ShouldKeepDirty(const FileTracker& tracker) const { 1509 bool MetadataDatabase::ShouldKeepDirty(const FileTracker& tracker) const {
1634 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1635
1636 if (HasDisabledAppRoot(tracker)) 1510 if (HasDisabledAppRoot(tracker))
1637 return false; 1511 return false;
1638 1512
1639 DCHECK(tracker.dirty()); 1513 DCHECK(tracker.dirty());
1640 if (!tracker.has_synced_details()) 1514 if (!tracker.has_synced_details())
1641 return true; 1515 return true;
1642 1516
1643 FileMetadata metadata; 1517 FileMetadata metadata;
1644 if (!index_->GetFileMetadata(tracker.file_id(), &metadata)) 1518 if (!index_->GetFileMetadata(tracker.file_id(), &metadata))
1645 return true; 1519 return true;
(...skipping 11 matching lines...) Expand all
1657 return true; 1531 return true;
1658 } 1532 }
1659 1533
1660 if (local_details.title() != remote_details.title()) 1534 if (local_details.title() != remote_details.title())
1661 return true; 1535 return true;
1662 1536
1663 return false; 1537 return false;
1664 } 1538 }
1665 1539
1666 bool MetadataDatabase::HasDisabledAppRoot(const FileTracker& tracker) const { 1540 bool MetadataDatabase::HasDisabledAppRoot(const FileTracker& tracker) const {
1667 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1668
1669 int64 app_root_tracker_id = index_->GetAppRootTracker(tracker.app_id()); 1541 int64 app_root_tracker_id = index_->GetAppRootTracker(tracker.app_id());
1670 if (app_root_tracker_id == kInvalidTrackerID) 1542 if (app_root_tracker_id == kInvalidTrackerID)
1671 return false; 1543 return false;
1672 1544
1673 FileTracker app_root_tracker; 1545 FileTracker app_root_tracker;
1674 if (!index_->GetFileTracker(app_root_tracker_id, &app_root_tracker)) { 1546 if (!index_->GetFileTracker(app_root_tracker_id, &app_root_tracker)) {
1675 NOTREACHED(); 1547 NOTREACHED();
1676 return false; 1548 return false;
1677 } 1549 }
1678 return app_root_tracker.tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT; 1550 return app_root_tracker.tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT;
1679 } 1551 }
1680 1552
1681 bool MetadataDatabase::HasActiveTrackerForFileID( 1553 bool MetadataDatabase::HasActiveTrackerForFileID(
1682 const std::string& file_id) const { 1554 const std::string& file_id) const {
1683 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1684 return index_->GetFileTrackerIDsByFileID(file_id).has_active(); 1555 return index_->GetFileTrackerIDsByFileID(file_id).has_active();
1685 } 1556 }
1686 1557
1687 bool MetadataDatabase::HasActiveTrackerForPath(int64 parent_tracker_id, 1558 bool MetadataDatabase::HasActiveTrackerForPath(int64 parent_tracker_id,
1688 const std::string& title) const { 1559 const std::string& title) const {
1689 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1690 return index_->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title) 1560 return index_->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title)
1691 .has_active(); 1561 .has_active();
1692 } 1562 }
1693 1563
1694 void MetadataDatabase::RemoveUnneededTrackersForMissingFile( 1564 void MetadataDatabase::RemoveUnneededTrackersForMissingFile(
1695 const std::string& file_id) { 1565 const std::string& file_id) {
1696 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1697
1698 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); 1566 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id);
1699 for (TrackerIDSet::const_iterator itr = trackers.begin(); 1567 for (TrackerIDSet::const_iterator itr = trackers.begin();
1700 itr != trackers.end(); ++itr) { 1568 itr != trackers.end(); ++itr) {
1701 FileTracker tracker; 1569 FileTracker tracker;
1702 if (!index_->GetFileTracker(*itr, &tracker)) { 1570 if (!index_->GetFileTracker(*itr, &tracker)) {
1703 NOTREACHED(); 1571 NOTREACHED();
1704 continue; 1572 continue;
1705 } 1573 }
1706 1574
1707 if (!tracker.has_synced_details() || tracker.synced_details().missing()) { 1575 if (!tracker.has_synced_details() || tracker.synced_details().missing()) {
1708 RemoveFileTracker(*itr, MARK_NOTHING_DIRTY, index_.get()); 1576 RemoveFileTracker(*itr, MARK_NOTHING_DIRTY, index_.get());
1709 } 1577 }
1710 } 1578 }
1711 } 1579 }
1712 1580
1713 void MetadataDatabase::UpdateByFileMetadata( 1581 void MetadataDatabase::UpdateByFileMetadata(
1714 const tracked_objects::Location& from_where, 1582 const tracked_objects::Location& from_where,
1715 scoped_ptr<FileMetadata> metadata, 1583 scoped_ptr<FileMetadata> metadata,
1716 UpdateOption option) { 1584 UpdateOption option) {
1717 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1718 DCHECK(metadata); 1585 DCHECK(metadata);
1719 DCHECK(metadata->has_details()); 1586 DCHECK(metadata->has_details());
1720 1587
1721 DVLOG(1) << from_where.function_name() << ": " 1588 DVLOG(1) << from_where.function_name() << ": "
1722 << metadata->file_id() << " (" 1589 << metadata->file_id() << " ("
1723 << metadata->details().title() << ")" 1590 << metadata->details().title() << ")"
1724 << (metadata->details().missing() ? " deleted" : ""); 1591 << (metadata->details().missing() ? " deleted" : "");
1725 1592
1726 std::string file_id = metadata->file_id(); 1593 std::string file_id = metadata->file_id();
1727 if (metadata->details().missing()) 1594 if (metadata->details().missing())
1728 RemoveUnneededTrackersForMissingFile(file_id); 1595 RemoveUnneededTrackersForMissingFile(file_id);
1729 else 1596 else
1730 MaybeAddTrackersForNewFile(*metadata, option); 1597 MaybeAddTrackersForNewFile(*metadata, option);
1731 1598
1732 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); 1599 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id);
1733 if (!trackers.empty()) { 1600 if (!trackers.empty()) {
1734 index_->StoreFileMetadata(metadata.Pass()); 1601 index_->StoreFileMetadata(metadata.Pass());
1735 1602
1736 if (option != UPDATE_TRACKER_FOR_SYNCED_FILE) 1603 if (option != UPDATE_TRACKER_FOR_SYNCED_FILE)
1737 MarkTrackerSetDirty(trackers, index_.get()); 1604 MarkTrackerSetDirty(trackers, index_.get());
1738 } 1605 }
1739 } 1606 }
1740 1607
1741 void MetadataDatabase::WriteToDatabase(const SyncStatusCallback& callback) { 1608 void MetadataDatabase::WriteToDatabase(const SyncStatusCallback& callback) {
1742 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1743
1744 leveldb::Status status = db_->Commit(); 1609 leveldb::Status status = db_->Commit();
1745 callback.Run(LevelDBStatusToSyncStatusCode(status)); 1610 callback.Run(LevelDBStatusToSyncStatusCode(status));
1746 } 1611 }
1747 1612
1748 scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles( 1613 scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles(
1749 const std::string& app_id) { 1614 const std::string& app_id) {
1750 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1751
1752 scoped_ptr<base::ListValue> files(new base::ListValue); 1615 scoped_ptr<base::ListValue> files(new base::ListValue);
1753 1616
1754 FileTracker app_root_tracker; 1617 FileTracker app_root_tracker;
1755 if (!FindAppRootTracker(app_id, &app_root_tracker)) 1618 if (!FindAppRootTracker(app_id, &app_root_tracker))
1756 return files.Pass(); 1619 return files.Pass();
1757 1620
1758 std::vector<int64> stack; 1621 std::vector<int64> stack;
1759 AppendContents( 1622 AppendContents(
1760 index_->GetFileTrackerIDsByParent(app_root_tracker.tracker_id()), &stack); 1623 index_->GetFileTrackerIDsByParent(app_root_tracker.tracker_id()), &stack);
1761 while (!stack.empty()) { 1624 while (!stack.empty()) {
(...skipping 26 matching lines...) Expand all
1788 1651
1789 file->Set("details", details); 1652 file->Set("details", details);
1790 1653
1791 files->Append(file); 1654 files->Append(file);
1792 } 1655 }
1793 1656
1794 return files.Pass(); 1657 return files.Pass();
1795 } 1658 }
1796 1659
1797 scoped_ptr<base::ListValue> MetadataDatabase::DumpDatabase() { 1660 scoped_ptr<base::ListValue> MetadataDatabase::DumpDatabase() {
1798 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1799
1800 scoped_ptr<base::ListValue> list(new base::ListValue); 1661 scoped_ptr<base::ListValue> list(new base::ListValue);
1801 list->Append(DumpTrackers().release()); 1662 list->Append(DumpTrackers().release());
1802 list->Append(DumpMetadata().release()); 1663 list->Append(DumpMetadata().release());
1803 return list.Pass(); 1664 return list.Pass();
1804 } 1665 }
1805 1666
1806 bool MetadataDatabase::HasNewerFileMetadata(const std::string& file_id, 1667 bool MetadataDatabase::HasNewerFileMetadata(const std::string& file_id,
1807 int64 change_id) { 1668 int64 change_id) {
1808 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1809
1810 FileMetadata metadata; 1669 FileMetadata metadata;
1811 if (!index_->GetFileMetadata(file_id, &metadata)) 1670 if (!index_->GetFileMetadata(file_id, &metadata))
1812 return false; 1671 return false;
1813 DCHECK(metadata.has_details()); 1672 DCHECK(metadata.has_details());
1814 return metadata.details().change_id() >= change_id; 1673 return metadata.details().change_id() >= change_id;
1815 } 1674 }
1816 1675
1817 scoped_ptr<base::ListValue> MetadataDatabase::DumpTrackers() { 1676 scoped_ptr<base::ListValue> MetadataDatabase::DumpTrackers() {
1818 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1819
1820 scoped_ptr<base::ListValue> trackers(new base::ListValue); 1677 scoped_ptr<base::ListValue> trackers(new base::ListValue);
1821 1678
1822 // Append the first element for metadata. 1679 // Append the first element for metadata.
1823 base::DictionaryValue* metadata = new base::DictionaryValue; 1680 base::DictionaryValue* metadata = new base::DictionaryValue;
1824 const char *trackerKeys[] = { 1681 const char *trackerKeys[] = {
1825 "tracker_id", "path", "file_id", "tracker_kind", "app_id", 1682 "tracker_id", "path", "file_id", "tracker_kind", "app_id",
1826 "active", "dirty", "folder_listing", 1683 "active", "dirty", "folder_listing",
1827 "title", "kind", "md5", "etag", "missing", "change_id", 1684 "title", "kind", "md5", "etag", "missing", "change_id",
1828 }; 1685 };
1829 std::vector<std::string> key_strings( 1686 std::vector<std::string> key_strings(
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1870 dict->SetString("etag", details.etag()); 1727 dict->SetString("etag", details.etag());
1871 dict->SetString("missing", details.missing() ? "true" : "false"); 1728 dict->SetString("missing", details.missing() ? "true" : "false");
1872 dict->SetString("change_id", base::Int64ToString(details.change_id())); 1729 dict->SetString("change_id", base::Int64ToString(details.change_id()));
1873 } 1730 }
1874 trackers->Append(dict); 1731 trackers->Append(dict);
1875 } 1732 }
1876 return trackers.Pass(); 1733 return trackers.Pass();
1877 } 1734 }
1878 1735
1879 scoped_ptr<base::ListValue> MetadataDatabase::DumpMetadata() { 1736 scoped_ptr<base::ListValue> MetadataDatabase::DumpMetadata() {
1880 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1881
1882 scoped_ptr<base::ListValue> files(new base::ListValue); 1737 scoped_ptr<base::ListValue> files(new base::ListValue);
1883 1738
1884 // Append the first element for metadata. 1739 // Append the first element for metadata.
1885 base::DictionaryValue* metadata = new base::DictionaryValue; 1740 base::DictionaryValue* metadata = new base::DictionaryValue;
1886 const char *fileKeys[] = { 1741 const char *fileKeys[] = {
1887 "file_id", "title", "type", "md5", "etag", "missing", 1742 "file_id", "title", "type", "md5", "etag", "missing",
1888 "change_id", "parents" 1743 "change_id", "parents"
1889 }; 1744 };
1890 std::vector<std::string> key_strings( 1745 std::vector<std::string> key_strings(
1891 fileKeys, fileKeys + ARRAYSIZE_UNSAFE(fileKeys)); 1746 fileKeys, fileKeys + ARRAYSIZE_UNSAFE(fileKeys));
(...skipping 30 matching lines...) Expand all
1922 parents.push_back(details.parent_folder_ids(i)); 1777 parents.push_back(details.parent_folder_ids(i));
1923 dict->SetString("parents", JoinString(parents, ",")); 1778 dict->SetString("parents", JoinString(parents, ","));
1924 } 1779 }
1925 files->Append(dict); 1780 files->Append(dict);
1926 } 1781 }
1927 return files.Pass(); 1782 return files.Pass();
1928 } 1783 }
1929 1784
1930 void MetadataDatabase::AttachSyncRoot( 1785 void MetadataDatabase::AttachSyncRoot(
1931 const google_apis::FileResource& sync_root_folder) { 1786 const google_apis::FileResource& sync_root_folder) {
1932 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1933
1934 scoped_ptr<FileMetadata> sync_root_metadata = 1787 scoped_ptr<FileMetadata> sync_root_metadata =
1935 CreateFileMetadataFromFileResource( 1788 CreateFileMetadataFromFileResource(
1936 GetLargestKnownChangeID(), sync_root_folder); 1789 GetLargestKnownChangeID(), sync_root_folder);
1937 scoped_ptr<FileTracker> sync_root_tracker = 1790 scoped_ptr<FileTracker> sync_root_tracker =
1938 CreateSyncRootTracker(IncrementTrackerID(), *sync_root_metadata); 1791 CreateSyncRootTracker(IncrementTrackerID(), *sync_root_metadata);
1939 1792
1940 index_->SetSyncRootTrackerID(sync_root_tracker->tracker_id()); 1793 index_->SetSyncRootTrackerID(sync_root_tracker->tracker_id());
1941 index_->StoreFileMetadata(sync_root_metadata.Pass()); 1794 index_->StoreFileMetadata(sync_root_metadata.Pass());
1942 index_->StoreFileTracker(sync_root_tracker.Pass()); 1795 index_->StoreFileTracker(sync_root_tracker.Pass());
1943 } 1796 }
1944 1797
1945 void MetadataDatabase::AttachInitialAppRoot( 1798 void MetadataDatabase::AttachInitialAppRoot(
1946 const google_apis::FileResource& app_root_folder) { 1799 const google_apis::FileResource& app_root_folder) {
1947 scoped_ptr<FileMetadata> app_root_metadata = 1800 scoped_ptr<FileMetadata> app_root_metadata =
1948 CreateFileMetadataFromFileResource( 1801 CreateFileMetadataFromFileResource(
1949 GetLargestKnownChangeID(), app_root_folder); 1802 GetLargestKnownChangeID(), app_root_folder);
1950 scoped_ptr<FileTracker> app_root_tracker = 1803 scoped_ptr<FileTracker> app_root_tracker =
1951 CreateInitialAppRootTracker(IncrementTrackerID(), 1804 CreateInitialAppRootTracker(IncrementTrackerID(),
1952 GetSyncRootTrackerID(), 1805 GetSyncRootTrackerID(),
1953 *app_root_metadata); 1806 *app_root_metadata);
1954 1807
1955 index_->StoreFileMetadata(app_root_metadata.Pass()); 1808 index_->StoreFileMetadata(app_root_metadata.Pass());
1956 index_->StoreFileTracker(app_root_tracker.Pass()); 1809 index_->StoreFileTracker(app_root_tracker.Pass());
1957 } 1810 }
1958 1811
1959 void MetadataDatabase::DetachFromSequence() {
1960 worker_sequence_checker_.DetachFromSequence();
1961 }
1962
1963 bool MetadataDatabase::CanClearDirty(const FileTracker& tracker) { 1812 bool MetadataDatabase::CanClearDirty(const FileTracker& tracker) {
1964 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread());
1965
1966 FileMetadata metadata; 1813 FileMetadata metadata;
1967 if (!index_->GetFileMetadata(tracker.file_id(), &metadata) || 1814 if (!index_->GetFileMetadata(tracker.file_id(), &metadata) ||
1968 !tracker.active() || !tracker.dirty() || 1815 !tracker.active() || !tracker.dirty() ||
1969 !tracker.has_synced_details() || 1816 !tracker.has_synced_details() ||
1970 tracker.needs_folder_listing()) 1817 tracker.needs_folder_listing())
1971 return false; 1818 return false;
1972 1819
1973 const FileDetails& remote_details = metadata.details(); 1820 const FileDetails& remote_details = metadata.details();
1974 const FileDetails& synced_details = tracker.synced_details(); 1821 const FileDetails& synced_details = tracker.synced_details();
1975 if (remote_details.title() != synced_details.title() || 1822 if (remote_details.title() != synced_details.title() ||
(...skipping 10 matching lines...) Expand all
1986 return false; 1833 return false;
1987 1834
1988 if (!parents.empty()) 1835 if (!parents.empty())
1989 return false; 1836 return false;
1990 1837
1991 return true; 1838 return true;
1992 } 1839 }
1993 1840
1994 } // namespace drive_backend 1841 } // namespace drive_backend
1995 } // namespace sync_file_system 1842 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698