Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(397)

Unified Diff: chrome/browser/sync_file_system/drive_backend/metadata_database.cc

Issue 23582013: [SyncFS] Add MetadataDatabase::PopulateInitialData (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698