Index: chrome/browser/sync_file_system/drive_backend/metadata_database.cc |
diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database.cc |
index 6401a5578469e6928f7281ca1638fcb7783227b5..1fa24f1bf182cddf6fa7da904427852b70fb4120 100644 |
--- a/chrome/browser/sync_file_system/drive_backend/metadata_database.cc |
+++ b/chrome/browser/sync_file_system/drive_backend/metadata_database.cc |
@@ -500,17 +500,13 @@ int64 MetadataDatabase::GetSyncRootTrackerID() const { |
} |
int64 MetadataDatabase::GetLargestKnownChangeID() const { |
- // TODO(tzik): Implement: |
- // - Add |largest_known_file_id| member to hold the value, that should |
- // initially have the same value to |largest_change_id|. |
- // - Change UpdateByFileResource and UpdateByChangeList not to overwrite |
- // FileMetadata if the newer one. |
- // - Change ListChangesTask to set UpdateLargestKnownChangeID. |
- return GetLargestFetchedChangeID(); |
+ DCHECK_LE(GetLargestFetchedChangeID(), largest_known_change_id_); |
+ return largest_known_change_id_; |
} |
void MetadataDatabase::UpdateLargestKnownChangeID(int64 change_id) { |
- NOTIMPLEMENTED(); |
+ if (largest_known_change_id_ < change_id) |
+ largest_known_change_id_ = change_id; |
} |
bool MetadataDatabase::HasSyncRoot() const { |
@@ -528,6 +524,7 @@ void MetadataDatabase::PopulateInitialData( |
scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
service_metadata_->set_largest_change_id(largest_change_id); |
+ UpdateLargestKnownChangeID(largest_change_id); |
FileTracker* sync_root_tracker = NULL; |
int64 sync_root_tracker_id = 0; |
@@ -761,6 +758,9 @@ void MetadataDatabase::UpdateByChangeList( |
itr != changes.end(); |
++itr) { |
const google_apis::ChangeResource& change = **itr; |
+ if (HasNewerFileMetadata(change.file_id(), change.change_id())) |
+ continue; |
+ |
scoped_ptr<FileMetadata> file( |
CreateFileMetadataFromChangeResource(change)); |
std::string file_id = file->file_id(); |
@@ -779,6 +779,7 @@ void MetadataDatabase::UpdateByChangeList( |
} |
} |
+ UpdateLargestKnownChangeID(largest_change_id); |
service_metadata_->set_largest_change_id(largest_change_id); |
PutServiceMetadataToBatch(*service_metadata_, batch.get()); |
WriteToDatabase(batch.Pass(), callback); |
@@ -793,6 +794,8 @@ void MetadataDatabase::UpdateByFileResource( |
scoped_ptr<FileMetadata> file( |
CreateFileMetadataFromFileResource(change_id, resource)); |
std::string file_id = file->file_id(); |
+ if (HasNewerFileMetadata(file_id, change_id)) |
+ return; |
// TODO(tzik): Consolidate with UpdateByChangeList. |
MarkTrackersDirtyByFileID(file_id, batch.get()); |
@@ -954,7 +957,9 @@ bool MetadataDatabase::GetLowPriorityDirtyTracker(FileTracker* tracker) { |
} |
MetadataDatabase::MetadataDatabase(base::SequencedTaskRunner* task_runner) |
- : task_runner_(task_runner), weak_ptr_factory_(this) { |
+ : task_runner_(task_runner), |
+ largest_known_change_id_(0), |
+ weak_ptr_factory_(this) { |
DCHECK(task_runner); |
} |
@@ -1048,6 +1053,7 @@ SyncStatusCode MetadataDatabase::InitializeOnTaskRunner( |
void MetadataDatabase::BuildIndexes(DatabaseContents* contents) { |
service_metadata_ = contents->service_metadata.Pass(); |
+ UpdateLargestKnownChangeID(service_metadata_->largest_change_id()); |
for (ScopedVector<FileMetadata>::const_iterator itr = |
contents->file_metadata.begin(); |
@@ -1555,5 +1561,14 @@ scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles( |
return files.Pass(); |
} |
+bool MetadataDatabase::HasNewerFileMetadata(const std::string& file_id, |
+ int64 change_id) { |
+ FileByID::const_iterator found = file_by_id_.find(file_id); |
+ if (found == file_by_id_.end()) |
+ return false; |
+ DCHECK(found->second->has_details()); |
+ return found->second->details().change_id() >= change_id; |
+} |
+ |
} // namespace drive_backend |
} // namespace sync_file_system |