OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" | 5 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <stack> | 8 #include <stack> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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, ¤t) || !current.active()) | 791 if (!FindTrackerByTrackerID(tracker_id, ¤t) || !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(), ¤t) || | 800 if (!FindTrackerByTrackerID(current.parent_tracker_id(), ¤t) || |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |