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 779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 return true; | 790 return true; |
791 } | 791 } |
792 | 792 |
793 *tracker = *trackers.active_tracker(); | 793 *tracker = *trackers.active_tracker(); |
794 *path = path->Append(components[i]); | 794 *path = path->Append(components[i]); |
795 } | 795 } |
796 | 796 |
797 return true; | 797 return true; |
798 } | 798 } |
799 | 799 |
800 void MetadataDatabase::UpdateByFileMetadata(scoped_ptr<FileMetadata> file, | |
801 leveldb::WriteBatch* batch) { | |
802 DCHECK(file); | |
803 DCHECK(file->has_details()); | |
804 std::string file_id = file->file_id(); | |
805 if (file->details().missing()) { | |
806 TrackerSet trackers; | |
807 FindTrackersByFileID(file_id, &trackers); | |
808 for (TrackerSet::const_iterator itr = trackers.begin(); | |
809 itr != trackers.end(); ++itr) { | |
810 const FileTracker& tracker = **itr; | |
811 if (!tracker.has_synced_details() || | |
812 tracker.synced_details().missing()) { | |
813 RemoveTracker(tracker.tracker_id(), batch); | |
814 } | |
815 } | |
816 } else { | |
817 MaybeAddTrackersForNewFile(*file, batch); | |
818 } | |
819 | |
820 if (FindTrackersByFileID(file_id, NULL)) { | |
821 MarkTrackersDirtyByFileID(file_id, batch); | |
822 PutFileToBatch(*file, batch); | |
823 FileMetadata* file_ptr = file.release(); | |
824 std::swap(file_ptr, file_by_id_[file_id]); | |
825 delete file_ptr; | |
826 } | |
827 } | |
828 | |
829 void MetadataDatabase::UpdateByChangeList( | 800 void MetadataDatabase::UpdateByChangeList( |
830 int64 largest_change_id, | 801 int64 largest_change_id, |
831 ScopedVector<google_apis::ChangeResource> changes, | 802 ScopedVector<google_apis::ChangeResource> changes, |
832 const SyncStatusCallback& callback) { | 803 const SyncStatusCallback& callback) { |
833 DCHECK_LE(service_metadata_->largest_change_id(), largest_change_id); | 804 DCHECK_LE(service_metadata_->largest_change_id(), largest_change_id); |
834 | 805 |
835 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); | 806 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
836 | 807 |
837 for (ScopedVector<google_apis::ChangeResource>::const_iterator itr = | 808 for (ScopedVector<google_apis::ChangeResource>::const_iterator itr = |
838 changes.begin(); | 809 changes.begin(); |
839 itr != changes.end(); | 810 itr != changes.end(); |
840 ++itr) { | 811 ++itr) { |
841 const google_apis::ChangeResource& change = **itr; | 812 const google_apis::ChangeResource& change = **itr; |
842 if (HasNewerFileMetadata(change.file_id(), change.change_id())) | 813 if (HasNewerFileMetadata(change.file_id(), change.change_id())) |
843 continue; | 814 continue; |
844 | 815 |
845 scoped_ptr<FileMetadata> file( | 816 scoped_ptr<FileMetadata> file( |
846 CreateFileMetadataFromChangeResource(change)); | 817 CreateFileMetadataFromChangeResource(change)); |
847 UpdateByFileMetadata(file.Pass(), batch.get()); | 818 UpdateByFileMetadata(FROM_HERE, file.Pass(), batch.get()); |
848 } | 819 } |
849 | 820 |
850 UpdateLargestKnownChangeID(largest_change_id); | 821 UpdateLargestKnownChangeID(largest_change_id); |
851 service_metadata_->set_largest_change_id(largest_change_id); | 822 service_metadata_->set_largest_change_id(largest_change_id); |
852 PutServiceMetadataToBatch(*service_metadata_, batch.get()); | 823 PutServiceMetadataToBatch(*service_metadata_, batch.get()); |
853 WriteToDatabase(batch.Pass(), callback); | 824 WriteToDatabase(batch.Pass(), callback); |
854 } | 825 } |
855 | 826 |
856 void MetadataDatabase::UpdateByFileResource( | 827 void MetadataDatabase::UpdateByFileResource( |
857 const google_apis::FileResource& resource, | 828 const google_apis::FileResource& resource, |
858 const SyncStatusCallback& callback) { | 829 const SyncStatusCallback& callback) { |
859 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); | 830 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
860 | 831 |
861 scoped_ptr<FileMetadata> file( | 832 scoped_ptr<FileMetadata> file( |
862 CreateFileMetadataFromFileResource( | 833 CreateFileMetadataFromFileResource( |
863 GetLargestKnownChangeID(), resource)); | 834 GetLargestKnownChangeID(), resource)); |
864 UpdateByFileMetadata(file.Pass(), batch.get()); | 835 UpdateByFileMetadata(FROM_HERE, file.Pass(), batch.get()); |
865 WriteToDatabase(batch.Pass(), callback); | 836 WriteToDatabase(batch.Pass(), callback); |
866 } | 837 } |
867 | 838 |
868 void MetadataDatabase::UpdateByDeletedRemoteFile( | 839 void MetadataDatabase::UpdateByDeletedRemoteFile( |
869 const std::string& file_id, | 840 const std::string& file_id, |
870 const SyncStatusCallback& callback) { | 841 const SyncStatusCallback& callback) { |
871 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); | 842 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
872 scoped_ptr<FileMetadata> file( | 843 scoped_ptr<FileMetadata> file( |
873 CreateDeletedFileMetadata(GetLargestKnownChangeID(), file_id)); | 844 CreateDeletedFileMetadata(GetLargestKnownChangeID(), file_id)); |
874 UpdateByFileMetadata(file.Pass(), batch.get()); | 845 UpdateByFileMetadata(FROM_HERE, file.Pass(), batch.get()); |
875 WriteToDatabase(batch.Pass(), callback); | 846 WriteToDatabase(batch.Pass(), callback); |
876 } | 847 } |
877 | 848 |
878 void MetadataDatabase::ReplaceActiveTrackerWithNewResource( | 849 void MetadataDatabase::ReplaceActiveTrackerWithNewResource( |
879 int64 parent_tracker_id, | 850 int64 parent_tracker_id, |
880 const google_apis::FileResource& resource, | 851 const google_apis::FileResource& resource, |
881 const SyncStatusCallback& callback) { | 852 const SyncStatusCallback& callback) { |
882 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); | 853 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
883 | 854 |
884 scoped_ptr<FileMetadata> file( | 855 scoped_ptr<FileMetadata> file( |
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1679 TrackersByParentAndTitle::const_iterator found_by_parent = | 1650 TrackersByParentAndTitle::const_iterator found_by_parent = |
1680 trackers_by_parent_and_title_.find(parent_tracker_id); | 1651 trackers_by_parent_and_title_.find(parent_tracker_id); |
1681 if (found_by_parent == trackers_by_parent_and_title_.end()) | 1652 if (found_by_parent == trackers_by_parent_and_title_.end()) |
1682 return false; | 1653 return false; |
1683 | 1654 |
1684 const TrackersByTitle& trackers_by_title = found_by_parent->second; | 1655 const TrackersByTitle& trackers_by_title = found_by_parent->second; |
1685 TrackersByTitle::const_iterator found = trackers_by_title.find(title); | 1656 TrackersByTitle::const_iterator found = trackers_by_title.find(title); |
1686 return found != trackers_by_title.end() && found->second.has_active(); | 1657 return found != trackers_by_title.end() && found->second.has_active(); |
1687 } | 1658 } |
1688 | 1659 |
| 1660 void MetadataDatabase::UpdateByFileMetadata( |
| 1661 const tracked_objects::Location& from_where, |
| 1662 scoped_ptr<FileMetadata> file, |
| 1663 leveldb::WriteBatch* batch) { |
| 1664 DCHECK(file); |
| 1665 DCHECK(file->has_details()); |
| 1666 |
| 1667 DVLOG(1) << from_where.function_name() << ": " |
| 1668 << file->file_id() << " (" |
| 1669 << file->details().title() << ")" |
| 1670 << (file->details().missing() ? " deleted" : ""); |
| 1671 |
| 1672 std::string file_id = file->file_id(); |
| 1673 if (file->details().missing()) { |
| 1674 TrackerSet trackers; |
| 1675 FindTrackersByFileID(file_id, &trackers); |
| 1676 for (TrackerSet::const_iterator itr = trackers.begin(); |
| 1677 itr != trackers.end(); ++itr) { |
| 1678 const FileTracker& tracker = **itr; |
| 1679 if (!tracker.has_synced_details() || |
| 1680 tracker.synced_details().missing()) { |
| 1681 RemoveTracker(tracker.tracker_id(), batch); |
| 1682 } |
| 1683 } |
| 1684 } else { |
| 1685 MaybeAddTrackersForNewFile(*file, batch); |
| 1686 } |
| 1687 |
| 1688 if (FindTrackersByFileID(file_id, NULL)) { |
| 1689 MarkTrackersDirtyByFileID(file_id, batch); |
| 1690 PutFileToBatch(*file, batch); |
| 1691 FileMetadata* file_ptr = file.release(); |
| 1692 std::swap(file_ptr, file_by_id_[file_id]); |
| 1693 delete file_ptr; |
| 1694 } |
| 1695 } |
| 1696 |
1689 void MetadataDatabase::WriteToDatabase(scoped_ptr<leveldb::WriteBatch> batch, | 1697 void MetadataDatabase::WriteToDatabase(scoped_ptr<leveldb::WriteBatch> batch, |
1690 const SyncStatusCallback& callback) { | 1698 const SyncStatusCallback& callback) { |
1691 base::PostTaskAndReplyWithResult( | 1699 base::PostTaskAndReplyWithResult( |
1692 task_runner_.get(), | 1700 task_runner_.get(), |
1693 FROM_HERE, | 1701 FROM_HERE, |
1694 base::Bind(&leveldb::DB::Write, | 1702 base::Bind(&leveldb::DB::Write, |
1695 base::Unretained(db_.get()), | 1703 base::Unretained(db_.get()), |
1696 leveldb::WriteOptions(), | 1704 leveldb::WriteOptions(), |
1697 base::Owned(batch.release())), | 1705 base::Owned(batch.release())), |
1698 base::Bind(&AdaptLevelDBStatusToSyncStatusCode, callback)); | 1706 base::Bind(&AdaptLevelDBStatusToSyncStatusCode, callback)); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1759 int64 change_id) { | 1767 int64 change_id) { |
1760 FileByID::const_iterator found = file_by_id_.find(file_id); | 1768 FileByID::const_iterator found = file_by_id_.find(file_id); |
1761 if (found == file_by_id_.end()) | 1769 if (found == file_by_id_.end()) |
1762 return false; | 1770 return false; |
1763 DCHECK(found->second->has_details()); | 1771 DCHECK(found->second->has_details()); |
1764 return found->second->details().change_id() >= change_id; | 1772 return found->second->details().change_id() >= change_id; |
1765 } | 1773 } |
1766 | 1774 |
1767 } // namespace drive_backend | 1775 } // namespace drive_backend |
1768 } // namespace sync_file_system | 1776 } // namespace sync_file_system |
OLD | NEW |