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 |
800 void MetadataDatabase::UpdateByChangeList( | 829 void MetadataDatabase::UpdateByChangeList( |
801 int64 largest_change_id, | 830 int64 largest_change_id, |
802 ScopedVector<google_apis::ChangeResource> changes, | 831 ScopedVector<google_apis::ChangeResource> changes, |
803 const SyncStatusCallback& callback) { | 832 const SyncStatusCallback& callback) { |
804 DCHECK_LE(service_metadata_->largest_change_id(), largest_change_id); | 833 DCHECK_LE(service_metadata_->largest_change_id(), largest_change_id); |
805 | 834 |
806 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); | 835 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
807 | 836 |
808 for (ScopedVector<google_apis::ChangeResource>::const_iterator itr = | 837 for (ScopedVector<google_apis::ChangeResource>::const_iterator itr = |
809 changes.begin(); | 838 changes.begin(); |
810 itr != changes.end(); | 839 itr != changes.end(); |
811 ++itr) { | 840 ++itr) { |
812 const google_apis::ChangeResource& change = **itr; | 841 const google_apis::ChangeResource& change = **itr; |
813 if (HasNewerFileMetadata(change.file_id(), change.change_id())) | 842 if (HasNewerFileMetadata(change.file_id(), change.change_id())) |
814 continue; | 843 continue; |
815 | 844 |
816 scoped_ptr<FileMetadata> file( | 845 scoped_ptr<FileMetadata> file( |
817 CreateFileMetadataFromChangeResource(change)); | 846 CreateFileMetadataFromChangeResource(change)); |
818 UpdateByFileMetadata(FROM_HERE, file.Pass(), batch.get()); | 847 UpdateByFileMetadata(file.Pass(), batch.get()); |
819 } | 848 } |
820 | 849 |
821 UpdateLargestKnownChangeID(largest_change_id); | 850 UpdateLargestKnownChangeID(largest_change_id); |
822 service_metadata_->set_largest_change_id(largest_change_id); | 851 service_metadata_->set_largest_change_id(largest_change_id); |
823 PutServiceMetadataToBatch(*service_metadata_, batch.get()); | 852 PutServiceMetadataToBatch(*service_metadata_, batch.get()); |
824 WriteToDatabase(batch.Pass(), callback); | 853 WriteToDatabase(batch.Pass(), callback); |
825 } | 854 } |
826 | 855 |
827 void MetadataDatabase::UpdateByFileResource( | 856 void MetadataDatabase::UpdateByFileResource( |
828 const google_apis::FileResource& resource, | 857 const google_apis::FileResource& resource, |
829 const SyncStatusCallback& callback) { | 858 const SyncStatusCallback& callback) { |
830 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); | 859 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
831 | 860 |
832 scoped_ptr<FileMetadata> file( | 861 scoped_ptr<FileMetadata> file( |
833 CreateFileMetadataFromFileResource( | 862 CreateFileMetadataFromFileResource( |
834 GetLargestKnownChangeID(), resource)); | 863 GetLargestKnownChangeID(), resource)); |
835 UpdateByFileMetadata(FROM_HERE, file.Pass(), batch.get()); | 864 UpdateByFileMetadata(file.Pass(), batch.get()); |
836 WriteToDatabase(batch.Pass(), callback); | 865 WriteToDatabase(batch.Pass(), callback); |
837 } | 866 } |
838 | 867 |
839 void MetadataDatabase::UpdateByDeletedRemoteFile( | 868 void MetadataDatabase::UpdateByDeletedRemoteFile( |
840 const std::string& file_id, | 869 const std::string& file_id, |
841 const SyncStatusCallback& callback) { | 870 const SyncStatusCallback& callback) { |
842 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); | 871 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
843 scoped_ptr<FileMetadata> file( | 872 scoped_ptr<FileMetadata> file( |
844 CreateDeletedFileMetadata(GetLargestKnownChangeID(), file_id)); | 873 CreateDeletedFileMetadata(GetLargestKnownChangeID(), file_id)); |
845 UpdateByFileMetadata(FROM_HERE, file.Pass(), batch.get()); | 874 UpdateByFileMetadata(file.Pass(), batch.get()); |
846 WriteToDatabase(batch.Pass(), callback); | 875 WriteToDatabase(batch.Pass(), callback); |
847 } | 876 } |
848 | 877 |
849 void MetadataDatabase::ReplaceActiveTrackerWithNewResource( | 878 void MetadataDatabase::ReplaceActiveTrackerWithNewResource( |
850 int64 parent_tracker_id, | 879 int64 parent_tracker_id, |
851 const google_apis::FileResource& resource, | 880 const google_apis::FileResource& resource, |
852 const SyncStatusCallback& callback) { | 881 const SyncStatusCallback& callback) { |
853 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); | 882 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
854 | 883 |
855 scoped_ptr<FileMetadata> file( | 884 scoped_ptr<FileMetadata> file( |
(...skipping 813 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1669 TrackersByParentAndTitle::const_iterator found_by_parent = | 1698 TrackersByParentAndTitle::const_iterator found_by_parent = |
1670 trackers_by_parent_and_title_.find(parent_tracker_id); | 1699 trackers_by_parent_and_title_.find(parent_tracker_id); |
1671 if (found_by_parent == trackers_by_parent_and_title_.end()) | 1700 if (found_by_parent == trackers_by_parent_and_title_.end()) |
1672 return false; | 1701 return false; |
1673 | 1702 |
1674 const TrackersByTitle& trackers_by_title = found_by_parent->second; | 1703 const TrackersByTitle& trackers_by_title = found_by_parent->second; |
1675 TrackersByTitle::const_iterator found = trackers_by_title.find(title); | 1704 TrackersByTitle::const_iterator found = trackers_by_title.find(title); |
1676 return found != trackers_by_title.end() && found->second.has_active(); | 1705 return found != trackers_by_title.end() && found->second.has_active(); |
1677 } | 1706 } |
1678 | 1707 |
1679 void MetadataDatabase::UpdateByFileMetadata( | |
1680 const tracked_objects::Location& from_where, | |
1681 scoped_ptr<FileMetadata> file, | |
1682 leveldb::WriteBatch* batch) { | |
1683 DCHECK(file); | |
1684 DCHECK(file->has_details()); | |
1685 | |
1686 DVLOG(1) << from_where.function_name() << ": " | |
1687 << file->file_id() << " (" | |
1688 << file->details().title() << ")" | |
1689 << (file->details().missing() ? " deleted" : ""); | |
1690 | |
1691 std::string file_id = file->file_id(); | |
1692 if (file->details().missing()) { | |
1693 TrackerSet trackers; | |
1694 FindTrackersByFileID(file_id, &trackers); | |
1695 for (TrackerSet::const_iterator itr = trackers.begin(); | |
1696 itr != trackers.end(); ++itr) { | |
1697 const FileTracker& tracker = **itr; | |
1698 if (!tracker.has_synced_details() || | |
1699 tracker.synced_details().missing()) { | |
1700 RemoveTracker(tracker.tracker_id(), batch); | |
1701 } | |
1702 } | |
1703 } else { | |
1704 MaybeAddTrackersForNewFile(*file, batch); | |
1705 } | |
1706 | |
1707 if (FindTrackersByFileID(file_id, NULL)) { | |
1708 MarkTrackersDirtyByFileID(file_id, batch); | |
1709 PutFileToBatch(*file, batch); | |
1710 FileMetadata* file_ptr = file.release(); | |
1711 std::swap(file_ptr, file_by_id_[file_id]); | |
1712 delete file_ptr; | |
1713 } | |
1714 } | |
1715 | |
1716 void MetadataDatabase::WriteToDatabase(scoped_ptr<leveldb::WriteBatch> batch, | 1708 void MetadataDatabase::WriteToDatabase(scoped_ptr<leveldb::WriteBatch> batch, |
1717 const SyncStatusCallback& callback) { | 1709 const SyncStatusCallback& callback) { |
1718 base::PostTaskAndReplyWithResult( | 1710 base::PostTaskAndReplyWithResult( |
1719 task_runner_.get(), | 1711 task_runner_.get(), |
1720 FROM_HERE, | 1712 FROM_HERE, |
1721 base::Bind(&leveldb::DB::Write, | 1713 base::Bind(&leveldb::DB::Write, |
1722 base::Unretained(db_.get()), | 1714 base::Unretained(db_.get()), |
1723 leveldb::WriteOptions(), | 1715 leveldb::WriteOptions(), |
1724 base::Owned(batch.release())), | 1716 base::Owned(batch.release())), |
1725 base::Bind(&AdaptLevelDBStatusToSyncStatusCode, callback)); | 1717 base::Bind(&AdaptLevelDBStatusToSyncStatusCode, callback)); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1786 int64 change_id) { | 1778 int64 change_id) { |
1787 FileByID::const_iterator found = file_by_id_.find(file_id); | 1779 FileByID::const_iterator found = file_by_id_.find(file_id); |
1788 if (found == file_by_id_.end()) | 1780 if (found == file_by_id_.end()) |
1789 return false; | 1781 return false; |
1790 DCHECK(found->second->has_details()); | 1782 DCHECK(found->second->has_details()); |
1791 return found->second->details().change_id() >= change_id; | 1783 return found->second->details().change_id() >= change_id; |
1792 } | 1784 } |
1793 | 1785 |
1794 } // namespace drive_backend | 1786 } // namespace drive_backend |
1795 } // namespace sync_file_system | 1787 } // namespace sync_file_system |
OLD | NEW |