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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 result.reserve(total_size); | 77 result.reserve(total_size); |
78 for (PathComponents::const_reverse_iterator itr = components.rbegin(); | 78 for (PathComponents::const_reverse_iterator itr = components.rbegin(); |
79 itr != components.rend(); ++itr) { | 79 itr != components.rend(); ++itr) { |
80 result.append(1, base::FilePath::kSeparators[0]); | 80 result.append(1, base::FilePath::kSeparators[0]); |
81 result.append(itr->value()); | 81 result.append(itr->value()); |
82 } | 82 } |
83 | 83 |
84 return base::FilePath(result).NormalizePathSeparators(); | 84 return base::FilePath(result).NormalizePathSeparators(); |
85 } | 85 } |
86 | 86 |
87 scoped_ptr<FileMetadata> CreateFileMetadataFromChangeResource( | 87 void PopulateFileDetailsByFileResource( |
88 const google_apis::ChangeResource& change) { | 88 const google_apis::FileResource& file_resource, |
89 scoped_ptr<FileMetadata> file(new FileMetadata); | 89 FileDetails* details) { |
90 file->set_file_id(change.file_id()); | 90 details->clear_parent_folder_ids(); |
91 | |
92 FileDetails* details = file->mutable_details(); | |
93 details->set_change_id(change.change_id()); | |
94 | |
95 if (change.is_deleted()) { | |
96 details->set_deleted(true); | |
97 return file.Pass(); | |
98 } | |
99 | |
100 const google_apis::FileResource& file_resource = *change.file(); | |
101 for (ScopedVector<google_apis::ParentReference>::const_iterator itr = | 91 for (ScopedVector<google_apis::ParentReference>::const_iterator itr = |
102 file_resource.parents().begin(); | 92 file_resource.parents().begin(); |
103 itr != file_resource.parents().end(); | 93 itr != file_resource.parents().end(); |
104 ++itr) { | 94 ++itr) { |
105 details->add_parent_folder_ids((*itr)->file_id()); | 95 details->add_parent_folder_ids((*itr)->file_id()); |
106 } | 96 } |
107 details->set_title(file_resource.title()); | 97 details->set_title(file_resource.title()); |
108 | 98 |
109 google_apis::DriveEntryKind kind = file_resource.GetKind(); | 99 google_apis::DriveEntryKind kind = file_resource.GetKind(); |
110 if (kind == google_apis::ENTRY_KIND_FILE) | 100 if (kind == google_apis::ENTRY_KIND_FILE) |
111 details->set_file_kind(FILE_KIND_FILE); | 101 details->set_file_kind(FILE_KIND_FILE); |
112 else if (kind == google_apis::ENTRY_KIND_FOLDER) | 102 else if (kind == google_apis::ENTRY_KIND_FOLDER) |
113 details->set_file_kind(FILE_KIND_FOLDER); | 103 details->set_file_kind(FILE_KIND_FOLDER); |
114 else | 104 else |
115 details->set_file_kind(FILE_KIND_UNSUPPORTED); | 105 details->set_file_kind(FILE_KIND_UNSUPPORTED); |
116 | 106 |
117 details->set_md5(file_resource.md5_checksum()); | 107 details->set_md5(file_resource.md5_checksum()); |
118 details->set_etag(file_resource.etag()); | 108 details->set_etag(file_resource.etag()); |
119 details->set_creation_time(file_resource.created_date().ToInternalValue()); | 109 details->set_creation_time(file_resource.created_date().ToInternalValue()); |
120 details->set_modification_time( | 110 details->set_modification_time( |
121 file_resource.modified_date().ToInternalValue()); | 111 file_resource.modified_date().ToInternalValue()); |
122 details->set_deleted(false); | 112 details->set_deleted(false); |
| 113 } |
123 | 114 |
| 115 scoped_ptr<FileMetadata> CreateFileMetadataFromChangeResource( |
| 116 const google_apis::ChangeResource& change) { |
| 117 scoped_ptr<FileMetadata> file(new FileMetadata); |
| 118 file->set_file_id(change.file_id()); |
| 119 |
| 120 FileDetails* details = file->mutable_details(); |
| 121 details->set_change_id(change.change_id()); |
| 122 |
| 123 if (change.is_deleted()) { |
| 124 details->set_deleted(true); |
| 125 return file.Pass(); |
| 126 } |
| 127 |
| 128 PopulateFileDetailsByFileResource(*change.file(), details); |
124 return file.Pass(); | 129 return file.Pass(); |
125 } | 130 } |
126 | 131 |
| 132 void CreateInitialSyncRootTracker( |
| 133 int64 tracker_id, |
| 134 const google_apis::FileResource& file_resource, |
| 135 scoped_ptr<FileMetadata>* file_out, |
| 136 scoped_ptr<FileTracker>* tracker_out) { |
| 137 FileDetails details; |
| 138 PopulateFileDetailsByFileResource(file_resource, &details); |
| 139 |
| 140 scoped_ptr<FileMetadata> file(new FileMetadata); |
| 141 file->set_file_id(file_resource.file_id()); |
| 142 *file->mutable_details() = details; |
| 143 |
| 144 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 145 tracker->set_tracker_id(tracker_id); |
| 146 tracker->set_file_id(file_resource.file_id()); |
| 147 tracker->set_parent_tracker_id(0); |
| 148 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); |
| 149 tracker->set_dirty(false); |
| 150 tracker->set_active(true); |
| 151 tracker->set_needs_folder_listing(false); |
| 152 *tracker->mutable_synced_details() = details; |
| 153 |
| 154 *file_out = file.Pass(); |
| 155 *tracker_out = tracker.Pass(); |
| 156 } |
| 157 |
| 158 void CreateInitialAppRootTracker( |
| 159 int64 tracker_id, |
| 160 const FileTracker& parent_tracker, |
| 161 const google_apis::FileResource& file_resource, |
| 162 scoped_ptr<FileMetadata>* file_out, |
| 163 scoped_ptr<FileTracker>* tracker_out) { |
| 164 FileDetails details; |
| 165 PopulateFileDetailsByFileResource(file_resource, &details); |
| 166 |
| 167 scoped_ptr<FileMetadata> file(new FileMetadata); |
| 168 file->set_file_id(file_resource.file_id()); |
| 169 *file->mutable_details() = details; |
| 170 |
| 171 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 172 tracker->set_tracker_id(tracker_id); |
| 173 tracker->set_parent_tracker_id(parent_tracker.tracker_id()); |
| 174 tracker->set_file_id(file_resource.file_id()); |
| 175 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); |
| 176 tracker->set_dirty(false); |
| 177 tracker->set_active(false); |
| 178 tracker->set_needs_folder_listing(false); |
| 179 *tracker->mutable_synced_details() = details; |
| 180 |
| 181 *file_out = file.Pass(); |
| 182 *tracker_out = tracker.Pass(); |
| 183 } |
| 184 |
127 void AdaptLevelDBStatusToSyncStatusCode(const SyncStatusCallback& callback, | 185 void AdaptLevelDBStatusToSyncStatusCode(const SyncStatusCallback& callback, |
128 const leveldb::Status& status) { | 186 const leveldb::Status& status) { |
129 callback.Run(LevelDBStatusToSyncStatusCode(status)); | 187 callback.Run(LevelDBStatusToSyncStatusCode(status)); |
130 } | 188 } |
131 | 189 |
132 void PutServiceMetadataToBatch(const ServiceMetadata& service_metadata, | 190 void PutServiceMetadataToBatch(const ServiceMetadata& service_metadata, |
133 leveldb::WriteBatch* batch) { | 191 leveldb::WriteBatch* batch) { |
134 std::string value; | 192 std::string value; |
135 bool success = service_metadata.SerializeToString(&value); | 193 bool success = service_metadata.SerializeToString(&value); |
136 DCHECK(success); | 194 DCHECK(success); |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 STLDeleteContainerPairSecondPointers( | 558 STLDeleteContainerPairSecondPointers( |
501 file_by_id_.begin(), file_by_id_.end()); | 559 file_by_id_.begin(), file_by_id_.end()); |
502 STLDeleteContainerPairSecondPointers( | 560 STLDeleteContainerPairSecondPointers( |
503 tracker_by_id_.begin(), tracker_by_id_.end()); | 561 tracker_by_id_.begin(), tracker_by_id_.end()); |
504 } | 562 } |
505 | 563 |
506 int64 MetadataDatabase::GetLargestChangeID() const { | 564 int64 MetadataDatabase::GetLargestChangeID() const { |
507 return service_metadata_->largest_change_id(); | 565 return service_metadata_->largest_change_id(); |
508 } | 566 } |
509 | 567 |
| 568 bool MetadataDatabase::HasSyncRoot() const { |
| 569 return service_metadata_->has_sync_root_tracker_id() && |
| 570 !!service_metadata_->sync_root_tracker_id(); |
| 571 } |
| 572 |
| 573 void MetadataDatabase::PopulateInitialData( |
| 574 int64 largest_change_id, |
| 575 const google_apis::FileResource& sync_root_folder, |
| 576 const ScopedVector<google_apis::FileResource>& app_root_folders, |
| 577 const SyncStatusCallback& callback) { |
| 578 DCHECK(tracker_by_id_.empty()); |
| 579 DCHECK(file_by_id_.empty()); |
| 580 |
| 581 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
| 582 service_metadata_->set_largest_change_id(largest_change_id); |
| 583 |
| 584 FileTracker* sync_root_tracker = NULL; |
| 585 int64 sync_root_tracker_id = 0; |
| 586 { |
| 587 scoped_ptr<FileMetadata> folder; |
| 588 scoped_ptr<FileTracker> tracker; |
| 589 CreateInitialSyncRootTracker(GetNextTrackerID(batch.get()), |
| 590 sync_root_folder, |
| 591 &folder, |
| 592 &tracker); |
| 593 std::string sync_root_folder_id = folder->file_id(); |
| 594 sync_root_tracker = tracker.get(); |
| 595 sync_root_tracker_id = tracker->tracker_id(); |
| 596 |
| 597 PutFileToBatch(*folder, batch.get()); |
| 598 PutTrackerToBatch(*tracker, batch.get()); |
| 599 |
| 600 service_metadata_->set_sync_root_tracker_id(tracker->tracker_id()); |
| 601 PutServiceMetadataToBatch(*service_metadata_, batch.get()); |
| 602 |
| 603 trackers_by_file_id_[folder->file_id()].Insert(tracker.get()); |
| 604 |
| 605 file_by_id_[sync_root_folder_id] = folder.release(); |
| 606 tracker_by_id_[sync_root_tracker_id] = tracker.release(); |
| 607 } |
| 608 |
| 609 for (ScopedVector<google_apis::FileResource>::const_iterator itr = |
| 610 app_root_folders.begin(); |
| 611 itr != app_root_folders.end(); |
| 612 ++itr) { |
| 613 const google_apis::FileResource& folder_resource = **itr; |
| 614 scoped_ptr<FileMetadata> folder; |
| 615 scoped_ptr<FileTracker> tracker; |
| 616 CreateInitialAppRootTracker(GetNextTrackerID(batch.get()), |
| 617 *sync_root_tracker, |
| 618 folder_resource, |
| 619 &folder, |
| 620 &tracker); |
| 621 std::string title = folder->details().title(); |
| 622 std::string folder_id = folder->file_id(); |
| 623 int64 tracker_id = tracker->tracker_id(); |
| 624 |
| 625 PutFileToBatch(*folder, batch.get()); |
| 626 PutTrackerToBatch(*tracker, batch.get()); |
| 627 |
| 628 trackers_by_file_id_[folder_id].Insert(tracker.get()); |
| 629 trackers_by_parent_and_title_[sync_root_tracker_id][title] |
| 630 .Insert(tracker.get()); |
| 631 |
| 632 file_by_id_[folder_id] = folder.release(); |
| 633 tracker_by_id_[tracker_id] = tracker.release(); |
| 634 } |
| 635 |
| 636 WriteToDatabase(batch.Pass(), callback); |
| 637 } |
| 638 |
| 639 |
510 void MetadataDatabase::RegisterApp(const std::string& app_id, | 640 void MetadataDatabase::RegisterApp(const std::string& app_id, |
511 const std::string& folder_id, | 641 const std::string& folder_id, |
512 const SyncStatusCallback& callback) { | 642 const SyncStatusCallback& callback) { |
513 if (FindAppRootTracker(app_id, NULL)) { | 643 if (FindAppRootTracker(app_id, NULL)) { |
514 // The app-root is already registered. | 644 // The app-root is already registered. |
515 RunSoon(FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); | 645 RunSoon(FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); |
516 return; | 646 return; |
517 } | 647 } |
518 | 648 |
519 TrackerSet trackers; | 649 TrackerSet trackers; |
(...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1338 FROM_HERE, | 1468 FROM_HERE, |
1339 base::Bind(&leveldb::DB::Write, | 1469 base::Bind(&leveldb::DB::Write, |
1340 base::Unretained(db_.get()), | 1470 base::Unretained(db_.get()), |
1341 leveldb::WriteOptions(), | 1471 leveldb::WriteOptions(), |
1342 base::Owned(batch.release())), | 1472 base::Owned(batch.release())), |
1343 base::Bind(&AdaptLevelDBStatusToSyncStatusCode, callback)); | 1473 base::Bind(&AdaptLevelDBStatusToSyncStatusCode, callback)); |
1344 } | 1474 } |
1345 | 1475 |
1346 } // namespace drive_backend | 1476 } // namespace drive_backend |
1347 } // namespace sync_file_system | 1477 } // namespace sync_file_system |
OLD | NEW |