Chromium Code Reviews| 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 97cc5b46178903ba3ce8e4f4d2852124cf188983..04c0c62dce3c4bef4163a1cca245b9e59611b5fc 100644 |
| --- a/chrome/browser/sync_file_system/drive_backend/metadata_database.cc |
| +++ b/chrome/browser/sync_file_system/drive_backend/metadata_database.cc |
| @@ -84,20 +84,10 @@ base::FilePath ReverseConcatPathComponents( |
| return base::FilePath(result).NormalizePathSeparators(); |
| } |
| -scoped_ptr<FileMetadata> CreateFileMetadataFromChangeResource( |
| - const google_apis::ChangeResource& change) { |
| - scoped_ptr<FileMetadata> file(new FileMetadata); |
| - file->set_file_id(change.file_id()); |
| - |
| - FileDetails* details = file->mutable_details(); |
| - details->set_change_id(change.change_id()); |
| - |
| - if (change.is_deleted()) { |
| - details->set_deleted(true); |
| - return file.Pass(); |
| - } |
| - |
| - const google_apis::FileResource& file_resource = *change.file(); |
| +void PopulateFileDetailsByFileResource( |
| + const google_apis::FileResource& file_resource, |
| + FileDetails* details) { |
| + details->clear_parent_folder_ids(); |
| for (ScopedVector<google_apis::ParentReference>::const_iterator itr = |
| file_resource.parents().begin(); |
| itr != file_resource.parents().end(); |
| @@ -120,10 +110,78 @@ scoped_ptr<FileMetadata> CreateFileMetadataFromChangeResource( |
| details->set_modification_time( |
| file_resource.modified_date().ToInternalValue()); |
| details->set_deleted(false); |
| +} |
| + |
| +scoped_ptr<FileMetadata> CreateFileMetadataFromChangeResource( |
| + const google_apis::ChangeResource& change) { |
| + scoped_ptr<FileMetadata> file(new FileMetadata); |
| + file->set_file_id(change.file_id()); |
| + |
| + FileDetails* details = file->mutable_details(); |
| + details->set_change_id(change.change_id()); |
| + if (change.is_deleted()) { |
| + details->set_deleted(true); |
| + return file.Pass(); |
| + } |
| + |
| + PopulateFileDetailsByFileResource(*change.file(), details); |
| return file.Pass(); |
| } |
| +void CreateInitialSyncRootTracker( |
| + int64 tracker_id, |
| + const google_apis::FileResource& file_resource, |
| + scoped_ptr<FileMetadata>* file_out, |
| + scoped_ptr<FileTracker>* tracker_out) { |
| + FileDetails details; |
| + PopulateFileDetailsByFileResource(file_resource, &details); |
| + |
| + scoped_ptr<FileMetadata> file(new FileMetadata); |
| + file->set_file_id(file_resource.file_id()); |
| + *file->mutable_details() = details; |
| + |
| + scoped_ptr<FileTracker> tracker(new FileTracker); |
| + tracker->set_tracker_id(tracker_id); |
| + tracker->set_file_id(file_resource.file_id()); |
| + tracker->set_parent_tracker_id(0); |
| + tracker->set_tracker_kind(TRACKER_KIND_REGULAR); |
| + tracker->set_dirty(false); |
| + tracker->set_active(true); |
| + tracker->set_needs_folder_listing(false); |
| + *tracker->mutable_synced_details() = details; |
| + |
| + *file_out = file.Pass(); |
| + *tracker_out = tracker.Pass(); |
| +} |
| + |
| +void CreateInitialAppRootTracker( |
| + int64 tracker_id, |
| + const FileTracker& parent_tracker, |
| + const google_apis::FileResource& file_resource, |
| + scoped_ptr<FileMetadata>* file_out, |
| + scoped_ptr<FileTracker>* tracker_out) { |
| + FileDetails details; |
| + PopulateFileDetailsByFileResource(file_resource, &details); |
| + |
| + scoped_ptr<FileMetadata> file(new FileMetadata); |
| + file->set_file_id(file_resource.file_id()); |
| + *file->mutable_details() = details; |
| + |
| + scoped_ptr<FileTracker> tracker(new FileTracker); |
| + tracker->set_tracker_id(tracker_id); |
| + tracker->set_parent_tracker_id(parent_tracker.tracker_id()); |
| + tracker->set_file_id(file_resource.file_id()); |
| + tracker->set_tracker_kind(TRACKER_KIND_REGULAR); |
| + tracker->set_dirty(false); |
| + tracker->set_active(false); |
|
kinuko
2013/09/05 08:43:43
Initially we add this as non-active REGULAR tracke
tzik
2013/09/05 09:17:02
Yes, we do.
The tracker will be registered as a ap
|
| + tracker->set_needs_folder_listing(false); |
| + *tracker->mutable_synced_details() = details; |
| + |
| + *file_out = file.Pass(); |
| + *tracker_out = tracker.Pass(); |
| +} |
| + |
| void AdaptLevelDBStatusToSyncStatusCode(const SyncStatusCallback& callback, |
| const leveldb::Status& status) { |
| callback.Run(LevelDBStatusToSyncStatusCode(status)); |
| @@ -507,6 +565,76 @@ int64 MetadataDatabase::GetLargestChangeID() const { |
| return service_metadata_->largest_change_id(); |
| } |
| +bool MetadataDatabase::HasSyncRoot() const { |
| + return service_metadata_->has_sync_root_tracker_id() && |
| + !!service_metadata_->sync_root_tracker_id(); |
| +} |
| + |
| +void MetadataDatabase::PopulateInitialData( |
| + int64 largest_change_id, |
| + const google_apis::FileResource& sync_root_folder, |
| + const ScopedVector<google_apis::FileResource>& app_root_folders, |
| + const SyncStatusCallback& callback) { |
| + DCHECK(tracker_by_id_.empty()); |
| + DCHECK(file_by_id_.empty()); |
| + |
| + scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
| + service_metadata_->set_largest_change_id(largest_change_id); |
| + |
| + FileTracker* sync_root_tracker = NULL; |
| + int64 sync_root_tracker_id = 0; |
| + { |
| + scoped_ptr<FileMetadata> folder; |
| + scoped_ptr<FileTracker> tracker; |
| + CreateInitialSyncRootTracker(GetNextTrackerID(batch.get()), |
| + sync_root_folder, |
| + &folder, |
| + &tracker); |
| + std::string sync_root_folder_id = folder->file_id(); |
| + sync_root_tracker = tracker.get(); |
| + sync_root_tracker_id = tracker->tracker_id(); |
| + |
| + PutFileToBatch(*folder, batch.get()); |
| + PutTrackerToBatch(*tracker, batch.get()); |
| + |
| + service_metadata_->set_sync_root_tracker_id(tracker->tracker_id()); |
| + trackers_by_file_id_[folder->file_id()].Insert(tracker.get()); |
| + |
| + file_by_id_[sync_root_folder_id] = folder.release(); |
| + tracker_by_id_[sync_root_tracker_id] = tracker.release(); |
| + } |
| + |
| + for (ScopedVector<google_apis::FileResource>::const_iterator itr = |
| + app_root_folders.begin(); |
| + itr != app_root_folders.end(); |
| + ++itr) { |
| + const google_apis::FileResource& folder_resource = **itr; |
|
kinuko
2013/09/05 08:43:43
nit: extra space
tzik
2013/09/05 09:17:02
Done.
|
| + scoped_ptr<FileMetadata> folder; |
| + scoped_ptr<FileTracker> tracker; |
| + CreateInitialAppRootTracker(GetNextTrackerID(batch.get()), |
| + *sync_root_tracker, |
| + folder_resource, |
| + &folder, |
| + &tracker); |
| + std::string title = folder->details().title(); |
| + std::string folder_id = folder->file_id(); |
| + int64 tracker_id = tracker->tracker_id(); |
| + |
| + PutFileToBatch(*folder, batch.get()); |
| + PutTrackerToBatch(*tracker, batch.get()); |
| + |
| + trackers_by_file_id_[folder_id].Insert(tracker.get()); |
| + trackers_by_parent_and_title_[sync_root_tracker_id][title] |
| + .Insert(tracker.get()); |
| + |
| + file_by_id_[folder_id] = folder.release(); |
| + tracker_by_id_[tracker_id] = tracker.release(); |
| + } |
| + |
| + WriteToDatabase(batch.Pass(), callback); |
|
kinuko
2013/09/05 08:43:43
We don't call PutServiceMetadataToBatch since it's
tzik
2013/09/05 09:17:02
I just forgot to call that. Good catch!
Fixed.
|
| +} |
| + |
| + |
| void MetadataDatabase::RegisterApp(const std::string& app_id, |
| const std::string& folder_id, |
| const SyncStatusCallback& callback) { |