Chromium Code Reviews| 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 |