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

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/metadata_database.cc

Issue 1873683002: Convert //chrome/browser/sync_file_system from scoped_ptr to std::unique_ptr (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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 unified diff | Download patch
OLDNEW
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 #include <utility> 9 #include <utility>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/command_line.h" 12 #include "base/command_line.h"
13 #include "base/files/file_path.h" 13 #include "base/files/file_path.h"
14 #include "base/files/file_util.h" 14 #include "base/files/file_util.h"
15 #include "base/location.h" 15 #include "base/location.h"
16 #include "base/macros.h" 16 #include "base/macros.h"
17 #include "base/memory/ptr_util.h"
17 #include "base/memory/scoped_vector.h" 18 #include "base/memory/scoped_vector.h"
18 #include "base/single_thread_task_runner.h" 19 #include "base/single_thread_task_runner.h"
19 #include "base/stl_util.h" 20 #include "base/stl_util.h"
20 #include "base/strings/string_number_conversions.h" 21 #include "base/strings/string_number_conversions.h"
21 #include "base/strings/string_util.h" 22 #include "base/strings/string_util.h"
22 #include "base/strings/stringprintf.h" 23 #include "base/strings/stringprintf.h"
23 #include "base/task_runner_util.h" 24 #include "base/task_runner_util.h"
24 #include "base/thread_task_runner_handle.h" 25 #include "base/thread_task_runner_handle.h"
25 #include "base/threading/thread_restrictions.h" 26 #include "base/threading/thread_restrictions.h"
26 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants. h" 27 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants. h"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 details->set_file_kind(FILE_KIND_FILE); 107 details->set_file_kind(FILE_KIND_FILE);
107 108
108 details->set_md5(file_resource.md5_checksum()); 109 details->set_md5(file_resource.md5_checksum());
109 details->set_etag(file_resource.etag()); 110 details->set_etag(file_resource.etag());
110 details->set_creation_time(file_resource.created_date().ToInternalValue()); 111 details->set_creation_time(file_resource.created_date().ToInternalValue());
111 details->set_modification_time( 112 details->set_modification_time(
112 file_resource.modified_date().ToInternalValue()); 113 file_resource.modified_date().ToInternalValue());
113 details->set_missing(file_resource.labels().is_trashed()); 114 details->set_missing(file_resource.labels().is_trashed());
114 } 115 }
115 116
116 scoped_ptr<FileMetadata> CreateFileMetadataFromFileResource( 117 std::unique_ptr<FileMetadata> CreateFileMetadataFromFileResource(
117 int64_t change_id, 118 int64_t change_id,
118 const google_apis::FileResource& resource) { 119 const google_apis::FileResource& resource) {
119 scoped_ptr<FileMetadata> file(new FileMetadata); 120 std::unique_ptr<FileMetadata> file(new FileMetadata);
120 file->set_file_id(resource.file_id()); 121 file->set_file_id(resource.file_id());
121 122
122 FileDetails* details = file->mutable_details(); 123 FileDetails* details = file->mutable_details();
123 details->set_change_id(change_id); 124 details->set_change_id(change_id);
124 125
125 if (resource.labels().is_trashed()) { 126 if (resource.labels().is_trashed()) {
126 details->set_missing(true); 127 details->set_missing(true);
127 return file; 128 return file;
128 } 129 }
129 130
130 PopulateFileDetailsByFileResource(resource, details); 131 PopulateFileDetailsByFileResource(resource, details);
131 return file; 132 return file;
132 } 133 }
133 134
134 scoped_ptr<FileMetadata> CreateFileMetadataFromChangeResource( 135 std::unique_ptr<FileMetadata> CreateFileMetadataFromChangeResource(
135 const google_apis::ChangeResource& change) { 136 const google_apis::ChangeResource& change) {
136 scoped_ptr<FileMetadata> file(new FileMetadata); 137 std::unique_ptr<FileMetadata> file(new FileMetadata);
137 file->set_file_id(change.file_id()); 138 file->set_file_id(change.file_id());
138 139
139 FileDetails* details = file->mutable_details(); 140 FileDetails* details = file->mutable_details();
140 details->set_change_id(change.change_id()); 141 details->set_change_id(change.change_id());
141 142
142 if (change.is_deleted()) { 143 if (change.is_deleted()) {
143 details->set_missing(true); 144 details->set_missing(true);
144 return file; 145 return file;
145 } 146 }
146 147
147 PopulateFileDetailsByFileResource(*change.file(), details); 148 PopulateFileDetailsByFileResource(*change.file(), details);
148 return file; 149 return file;
149 } 150 }
150 151
151 scoped_ptr<FileMetadata> CreateDeletedFileMetadata(int64_t change_id, 152 std::unique_ptr<FileMetadata> CreateDeletedFileMetadata(
152 const std::string& file_id) { 153 int64_t change_id,
153 scoped_ptr<FileMetadata> file(new FileMetadata); 154 const std::string& file_id) {
155 std::unique_ptr<FileMetadata> file(new FileMetadata);
154 file->set_file_id(file_id); 156 file->set_file_id(file_id);
155 157
156 FileDetails* details = file->mutable_details(); 158 FileDetails* details = file->mutable_details();
157 details->set_change_id(change_id); 159 details->set_change_id(change_id);
158 details->set_missing(true); 160 details->set_missing(true);
159 return file; 161 return file;
160 } 162 }
161 163
162 scoped_ptr<FileTracker> CreateSyncRootTracker( 164 std::unique_ptr<FileTracker> CreateSyncRootTracker(
163 int64_t tracker_id, 165 int64_t tracker_id,
164 const FileMetadata& sync_root_metadata) { 166 const FileMetadata& sync_root_metadata) {
165 scoped_ptr<FileTracker> sync_root_tracker(new FileTracker); 167 std::unique_ptr<FileTracker> sync_root_tracker(new FileTracker);
166 sync_root_tracker->set_tracker_id(tracker_id); 168 sync_root_tracker->set_tracker_id(tracker_id);
167 sync_root_tracker->set_file_id(sync_root_metadata.file_id()); 169 sync_root_tracker->set_file_id(sync_root_metadata.file_id());
168 sync_root_tracker->set_parent_tracker_id(0); 170 sync_root_tracker->set_parent_tracker_id(0);
169 sync_root_tracker->set_tracker_kind(TRACKER_KIND_REGULAR); 171 sync_root_tracker->set_tracker_kind(TRACKER_KIND_REGULAR);
170 sync_root_tracker->set_dirty(false); 172 sync_root_tracker->set_dirty(false);
171 sync_root_tracker->set_active(true); 173 sync_root_tracker->set_active(true);
172 sync_root_tracker->set_needs_folder_listing(false); 174 sync_root_tracker->set_needs_folder_listing(false);
173 *sync_root_tracker->mutable_synced_details() = sync_root_metadata.details(); 175 *sync_root_tracker->mutable_synced_details() = sync_root_metadata.details();
174 return sync_root_tracker; 176 return sync_root_tracker;
175 } 177 }
176 178
177 scoped_ptr<FileTracker> CreateInitialAppRootTracker( 179 std::unique_ptr<FileTracker> CreateInitialAppRootTracker(
178 int64_t tracker_id, 180 int64_t tracker_id,
179 int64_t parent_tracker_id, 181 int64_t parent_tracker_id,
180 const FileMetadata& app_root_metadata) { 182 const FileMetadata& app_root_metadata) {
181 scoped_ptr<FileTracker> app_root_tracker(new FileTracker); 183 std::unique_ptr<FileTracker> app_root_tracker(new FileTracker);
182 app_root_tracker->set_tracker_id(tracker_id); 184 app_root_tracker->set_tracker_id(tracker_id);
183 app_root_tracker->set_parent_tracker_id(parent_tracker_id); 185 app_root_tracker->set_parent_tracker_id(parent_tracker_id);
184 app_root_tracker->set_file_id(app_root_metadata.file_id()); 186 app_root_tracker->set_file_id(app_root_metadata.file_id());
185 app_root_tracker->set_tracker_kind(TRACKER_KIND_REGULAR); 187 app_root_tracker->set_tracker_kind(TRACKER_KIND_REGULAR);
186 app_root_tracker->set_dirty(false); 188 app_root_tracker->set_dirty(false);
187 app_root_tracker->set_active(false); 189 app_root_tracker->set_active(false);
188 app_root_tracker->set_needs_folder_listing(false); 190 app_root_tracker->set_needs_folder_listing(false);
189 *app_root_tracker->mutable_synced_details() = app_root_metadata.details(); 191 *app_root_tracker->mutable_synced_details() = app_root_metadata.details();
190 return app_root_tracker; 192 return app_root_tracker;
191 } 193 }
192 194
193 scoped_ptr<FileTracker> CloneFileTracker(const FileTracker* obj) { 195 std::unique_ptr<FileTracker> CloneFileTracker(const FileTracker* obj) {
194 if (!obj) 196 if (!obj)
195 return nullptr; 197 return nullptr;
196 return scoped_ptr<FileTracker>(new FileTracker(*obj)); 198 return std::unique_ptr<FileTracker>(new FileTracker(*obj));
197 } 199 }
198 200
199 // Returns true if |db| has no content. 201 // Returns true if |db| has no content.
200 bool IsDatabaseEmpty(LevelDBWrapper* db) { 202 bool IsDatabaseEmpty(LevelDBWrapper* db) {
201 DCHECK(db); 203 DCHECK(db);
202 scoped_ptr<LevelDBWrapper::Iterator> itr(db->NewIterator()); 204 std::unique_ptr<LevelDBWrapper::Iterator> itr(db->NewIterator());
203 itr->SeekToFirst(); 205 itr->SeekToFirst();
204 return !itr->Valid(); 206 return !itr->Valid();
205 } 207 }
206 208
207 SyncStatusCode OpenDatabase(const base::FilePath& path, 209 SyncStatusCode OpenDatabase(const base::FilePath& path,
208 leveldb::Env* env_override, 210 leveldb::Env* env_override,
209 scoped_ptr<LevelDBWrapper>* db_out, 211 std::unique_ptr<LevelDBWrapper>* db_out,
210 bool* created) { 212 bool* created) {
211 base::ThreadRestrictions::AssertIOAllowed(); 213 base::ThreadRestrictions::AssertIOAllowed();
212 DCHECK(db_out); 214 DCHECK(db_out);
213 DCHECK(created); 215 DCHECK(created);
214 DCHECK(path.IsAbsolute()); 216 DCHECK(path.IsAbsolute());
215 217
216 leveldb::Options options; 218 leveldb::Options options;
217 options.max_open_files = 0; // Use minimum. 219 options.max_open_files = 0; // Use minimum.
218 options.create_if_missing = true; 220 options.create_if_missing = true;
219 options.paranoid_checks = true; 221 options.paranoid_checks = true;
220 options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue; 222 options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
221 if (env_override) 223 if (env_override)
222 options.env = env_override; 224 options.env = env_override;
223 leveldb::DB* db = nullptr; 225 leveldb::DB* db = nullptr;
224 leveldb::Status db_status = 226 leveldb::Status db_status =
225 leveldb::DB::Open(options, path.AsUTF8Unsafe(), &db); 227 leveldb::DB::Open(options, path.AsUTF8Unsafe(), &db);
226 UMA_HISTOGRAM_ENUMERATION("SyncFileSystem.Database.Open", 228 UMA_HISTOGRAM_ENUMERATION("SyncFileSystem.Database.Open",
227 leveldb_env::GetLevelDBStatusUMAValue(db_status), 229 leveldb_env::GetLevelDBStatusUMAValue(db_status),
228 leveldb_env::LEVELDB_STATUS_MAX); 230 leveldb_env::LEVELDB_STATUS_MAX);
229 SyncStatusCode status = LevelDBStatusToSyncStatusCode(db_status); 231 SyncStatusCode status = LevelDBStatusToSyncStatusCode(db_status);
230 if (status != SYNC_STATUS_OK) { 232 if (status != SYNC_STATUS_OK) {
231 delete db; 233 delete db;
232 return status; 234 return status;
233 } 235 }
234 236
235 db_out->reset(new LevelDBWrapper(make_scoped_ptr(db))); 237 db_out->reset(new LevelDBWrapper(base::WrapUnique(db)));
236 *created = IsDatabaseEmpty(db_out->get()); 238 *created = IsDatabaseEmpty(db_out->get());
237 return status; 239 return status;
238 } 240 }
239 241
240 SyncStatusCode MigrateDatabaseIfNeeded(LevelDBWrapper* db) { 242 SyncStatusCode MigrateDatabaseIfNeeded(LevelDBWrapper* db) {
241 // See metadata_database_index.cc for the database schema. 243 // See metadata_database_index.cc for the database schema.
242 base::ThreadRestrictions::AssertIOAllowed(); 244 base::ThreadRestrictions::AssertIOAllowed();
243 DCHECK(db); 245 DCHECK(db);
244 std::string value; 246 std::string value;
245 leveldb::Status status = db->Get(kDatabaseVersionKey, &value); 247 leveldb::Status status = db->Get(kDatabaseVersionKey, &value);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 bool HasInvalidTitle(const std::string& title) { 281 bool HasInvalidTitle(const std::string& title) {
280 return title.empty() || 282 return title.empty() ||
281 title.find('/') != std::string::npos || 283 title.find('/') != std::string::npos ||
282 title.find('\\') != std::string::npos; 284 title.find('\\') != std::string::npos;
283 } 285 }
284 286
285 void MarkTrackerSetDirty(const TrackerIDSet& trackers, 287 void MarkTrackerSetDirty(const TrackerIDSet& trackers,
286 MetadataDatabaseIndexInterface* index) { 288 MetadataDatabaseIndexInterface* index) {
287 for (TrackerIDSet::const_iterator itr = trackers.begin(); 289 for (TrackerIDSet::const_iterator itr = trackers.begin();
288 itr != trackers.end(); ++itr) { 290 itr != trackers.end(); ++itr) {
289 scoped_ptr<FileTracker> tracker(new FileTracker); 291 std::unique_ptr<FileTracker> tracker(new FileTracker);
290 index->GetFileTracker(*itr, tracker.get()); 292 index->GetFileTracker(*itr, tracker.get());
291 if (tracker->dirty()) 293 if (tracker->dirty())
292 continue; 294 continue;
293 tracker->set_dirty(true); 295 tracker->set_dirty(true);
294 index->StoreFileTracker(std::move(tracker)); 296 index->StoreFileTracker(std::move(tracker));
295 } 297 }
296 } 298 }
297 299
298 void MarkTrackersDirtyByPath(int64_t parent_tracker_id, 300 void MarkTrackersDirtyByPath(int64_t parent_tracker_id,
299 const std::string& title, 301 const std::string& title,
(...skipping 12 matching lines...) Expand all
312 314
313 void MarkTrackersDirtyRecursively(int64_t root_tracker_id, 315 void MarkTrackersDirtyRecursively(int64_t root_tracker_id,
314 MetadataDatabaseIndexInterface* index) { 316 MetadataDatabaseIndexInterface* index) {
315 std::vector<int64_t> stack; 317 std::vector<int64_t> stack;
316 stack.push_back(root_tracker_id); 318 stack.push_back(root_tracker_id);
317 while (!stack.empty()) { 319 while (!stack.empty()) {
318 int64_t tracker_id = stack.back(); 320 int64_t tracker_id = stack.back();
319 stack.pop_back(); 321 stack.pop_back();
320 AppendContents(index->GetFileTrackerIDsByParent(tracker_id), &stack); 322 AppendContents(index->GetFileTrackerIDsByParent(tracker_id), &stack);
321 323
322 scoped_ptr<FileTracker> tracker(new FileTracker); 324 std::unique_ptr<FileTracker> tracker(new FileTracker);
323 index->GetFileTracker(tracker_id, tracker.get()); 325 index->GetFileTracker(tracker_id, tracker.get());
324 tracker->set_dirty(true); 326 tracker->set_dirty(true);
325 327
326 index->StoreFileTracker(std::move(tracker)); 328 index->StoreFileTracker(std::move(tracker));
327 } 329 }
328 } 330 }
329 331
330 void RemoveAllDescendantTrackers(int64_t root_tracker_id, 332 void RemoveAllDescendantTrackers(int64_t root_tracker_id,
331 MetadataDatabaseIndexInterface* index) { 333 MetadataDatabaseIndexInterface* index) {
332 std::vector<int64_t> pending_trackers; 334 std::vector<int64_t> pending_trackers;
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 MARK_SAME_FILE_ID_TRACKERS_DIRTY = 1 << 1, 453 MARK_SAME_FILE_ID_TRACKERS_DIRTY = 1 << 1,
452 MARK_SAME_PATH_TRACKERS_DIRTY = 1 << 2, 454 MARK_SAME_PATH_TRACKERS_DIRTY = 1 << 2,
453 }; 455 };
454 456
455 void ActivateFileTracker(int64_t tracker_id, 457 void ActivateFileTracker(int64_t tracker_id,
456 int dirtying_options, 458 int dirtying_options,
457 MetadataDatabaseIndexInterface* index) { 459 MetadataDatabaseIndexInterface* index) {
458 DCHECK(dirtying_options == MARK_NOTHING_DIRTY || 460 DCHECK(dirtying_options == MARK_NOTHING_DIRTY ||
459 dirtying_options == MARK_ITSELF_DIRTY); 461 dirtying_options == MARK_ITSELF_DIRTY);
460 462
461 scoped_ptr<FileTracker> tracker(new FileTracker); 463 std::unique_ptr<FileTracker> tracker(new FileTracker);
462 index->GetFileTracker(tracker_id, tracker.get()); 464 index->GetFileTracker(tracker_id, tracker.get());
463 tracker->set_active(true); 465 tracker->set_active(true);
464 if (dirtying_options & MARK_ITSELF_DIRTY) { 466 if (dirtying_options & MARK_ITSELF_DIRTY) {
465 tracker->set_dirty(true); 467 tracker->set_dirty(true);
466 tracker->set_needs_folder_listing( 468 tracker->set_needs_folder_listing(
467 tracker->has_synced_details() && 469 tracker->has_synced_details() &&
468 tracker->synced_details().file_kind() == FILE_KIND_FOLDER); 470 tracker->synced_details().file_kind() == FILE_KIND_FOLDER);
469 } else { 471 } else {
470 tracker->set_dirty(false); 472 tracker->set_dirty(false);
471 tracker->set_needs_folder_listing(false); 473 tracker->set_needs_folder_listing(false);
472 } 474 }
473 475
474 index->StoreFileTracker(std::move(tracker)); 476 index->StoreFileTracker(std::move(tracker));
475 } 477 }
476 478
477 void DeactivateFileTracker(int64_t tracker_id, 479 void DeactivateFileTracker(int64_t tracker_id,
478 int dirtying_options, 480 int dirtying_options,
479 MetadataDatabaseIndexInterface* index) { 481 MetadataDatabaseIndexInterface* index) {
480 RemoveAllDescendantTrackers(tracker_id, index); 482 RemoveAllDescendantTrackers(tracker_id, index);
481 483
482 scoped_ptr<FileTracker> tracker(new FileTracker); 484 std::unique_ptr<FileTracker> tracker(new FileTracker);
483 index->GetFileTracker(tracker_id, tracker.get()); 485 index->GetFileTracker(tracker_id, tracker.get());
484 486
485 if (dirtying_options & MARK_SAME_FILE_ID_TRACKERS_DIRTY) 487 if (dirtying_options & MARK_SAME_FILE_ID_TRACKERS_DIRTY)
486 MarkTrackersDirtyByFileID(tracker->file_id(), index); 488 MarkTrackersDirtyByFileID(tracker->file_id(), index);
487 if (dirtying_options & MARK_SAME_PATH_TRACKERS_DIRTY) { 489 if (dirtying_options & MARK_SAME_PATH_TRACKERS_DIRTY) {
488 MarkTrackersDirtyByPath(tracker->parent_tracker_id(), 490 MarkTrackersDirtyByPath(tracker->parent_tracker_id(),
489 GetTrackerTitle(*tracker), index); 491 GetTrackerTitle(*tracker), index);
490 } 492 }
491 493
492 tracker->set_dirty(dirtying_options & MARK_ITSELF_DIRTY); 494 tracker->set_dirty(dirtying_options & MARK_ITSELF_DIRTY);
(...skipping 23 matching lines...) Expand all
516 MarkTrackersDirtyByPath(parent_tracker_id, title, index); 518 MarkTrackersDirtyByPath(parent_tracker_id, title, index);
517 519
518 if (index->GetFileTrackerIDsByFileID(file_id).empty()) { 520 if (index->GetFileTrackerIDsByFileID(file_id).empty()) {
519 index->RemoveFileMetadata(file_id); 521 index->RemoveFileMetadata(file_id);
520 } 522 }
521 } 523 }
522 524
523 } // namespace 525 } // namespace
524 526
525 // static 527 // static
526 scoped_ptr<MetadataDatabase> MetadataDatabase::Create( 528 std::unique_ptr<MetadataDatabase> MetadataDatabase::Create(
527 const base::FilePath& database_path, 529 const base::FilePath& database_path,
528 leveldb::Env* env_override, 530 leveldb::Env* env_override,
529 SyncStatusCode* status_out) { 531 SyncStatusCode* status_out) {
530 bool enable_on_disk_index = 532 bool enable_on_disk_index =
531 !base::CommandLine::ForCurrentProcess()->HasSwitch( 533 !base::CommandLine::ForCurrentProcess()->HasSwitch(
532 kDisableMetadataDatabaseOnDisk); 534 kDisableMetadataDatabaseOnDisk);
533 return CreateInternal(database_path, env_override, enable_on_disk_index, 535 return CreateInternal(database_path, env_override, enable_on_disk_index,
534 status_out); 536 status_out);
535 } 537 }
536 538
537 // static 539 // static
538 scoped_ptr<MetadataDatabase> MetadataDatabase::CreateInternal( 540 std::unique_ptr<MetadataDatabase> MetadataDatabase::CreateInternal(
539 const base::FilePath& database_path, 541 const base::FilePath& database_path,
540 leveldb::Env* env_override, 542 leveldb::Env* env_override,
541 bool enable_on_disk_index, 543 bool enable_on_disk_index,
542 SyncStatusCode* status_out) { 544 SyncStatusCode* status_out) {
543 scoped_ptr<MetadataDatabase> metadata_database( 545 std::unique_ptr<MetadataDatabase> metadata_database(
544 new MetadataDatabase(database_path, 546 new MetadataDatabase(database_path, enable_on_disk_index, env_override));
545 enable_on_disk_index,
546 env_override));
547 547
548 SyncStatusCode status = metadata_database->Initialize(); 548 SyncStatusCode status = metadata_database->Initialize();
549 if (status == SYNC_DATABASE_ERROR_FAILED) { 549 if (status == SYNC_DATABASE_ERROR_FAILED) {
550 // Delete the previous instance to avoid creating a LevelDB instance for 550 // Delete the previous instance to avoid creating a LevelDB instance for
551 // the same path. 551 // the same path.
552 metadata_database.reset(); 552 metadata_database.reset();
553 553
554 metadata_database.reset( 554 metadata_database.reset(
555 new MetadataDatabase(database_path, 555 new MetadataDatabase(database_path,
556 enable_on_disk_index, 556 enable_on_disk_index,
557 env_override)); 557 env_override));
558 status = metadata_database->Initialize(); 558 status = metadata_database->Initialize();
559 } 559 }
560 560
561 if (status != SYNC_STATUS_OK) 561 if (status != SYNC_STATUS_OK)
562 metadata_database.reset(); 562 metadata_database.reset();
563 563
564 *status_out = status; 564 *status_out = status;
565 return metadata_database; 565 return metadata_database;
566 } 566 }
567 567
568 // static 568 // static
569 SyncStatusCode MetadataDatabase::CreateForTesting( 569 SyncStatusCode MetadataDatabase::CreateForTesting(
570 scoped_ptr<LevelDBWrapper> db, 570 std::unique_ptr<LevelDBWrapper> db,
571 bool enable_on_disk_index, 571 bool enable_on_disk_index,
572 scoped_ptr<MetadataDatabase>* metadata_database_out) { 572 std::unique_ptr<MetadataDatabase>* metadata_database_out) {
573 scoped_ptr<MetadataDatabase> metadata_database( 573 std::unique_ptr<MetadataDatabase> metadata_database(
574 new MetadataDatabase(base::FilePath(), 574 new MetadataDatabase(base::FilePath(), enable_on_disk_index, nullptr));
575 enable_on_disk_index,
576 nullptr));
577 metadata_database->db_ = std::move(db); 575 metadata_database->db_ = std::move(db);
578 SyncStatusCode status = metadata_database->Initialize(); 576 SyncStatusCode status = metadata_database->Initialize();
579 if (status == SYNC_STATUS_OK) 577 if (status == SYNC_STATUS_OK)
580 *metadata_database_out = std::move(metadata_database); 578 *metadata_database_out = std::move(metadata_database);
581 return status; 579 return status;
582 } 580 }
583 581
584 MetadataDatabase::~MetadataDatabase() { 582 MetadataDatabase::~MetadataDatabase() {
585 } 583 }
586 584
587 // static 585 // static
588 void MetadataDatabase::ClearDatabase( 586 void MetadataDatabase::ClearDatabase(
589 scoped_ptr<MetadataDatabase> metadata_database) { 587 std::unique_ptr<MetadataDatabase> metadata_database) {
590 DCHECK(metadata_database); 588 DCHECK(metadata_database);
591 base::FilePath database_path = metadata_database->database_path_; 589 base::FilePath database_path = metadata_database->database_path_;
592 DCHECK(!database_path.empty()); 590 DCHECK(!database_path.empty());
593 metadata_database.reset(); 591 metadata_database.reset();
594 592
595 base::DeleteFile(database_path, true /* recursive */); 593 base::DeleteFile(database_path, true /* recursive */);
596 } 594 }
597 595
598 int64_t MetadataDatabase::GetLargestFetchedChangeID() const { 596 int64_t MetadataDatabase::GetLargestFetchedChangeID() const {
599 return index_->GetLargestChangeID(); 597 return index_->GetLargestChangeID();
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 return SYNC_STATUS_HAS_CONFLICT; 668 return SYNC_STATUS_HAS_CONFLICT;
671 } 669 }
672 670
673 int64_t sync_root_tracker_id = index_->GetSyncRootTrackerID(); 671 int64_t sync_root_tracker_id = index_->GetSyncRootTrackerID();
674 if (!sync_root_tracker_id) { 672 if (!sync_root_tracker_id) {
675 util::Log(logging::LOG_WARNING, FROM_HERE, 673 util::Log(logging::LOG_WARNING, FROM_HERE,
676 "Sync-root needs to be set up before registering app-root"); 674 "Sync-root needs to be set up before registering app-root");
677 return SYNC_DATABASE_ERROR_NOT_FOUND; 675 return SYNC_DATABASE_ERROR_NOT_FOUND;
678 } 676 }
679 677
680 scoped_ptr<FileTracker> tracker(new FileTracker); 678 std::unique_ptr<FileTracker> tracker(new FileTracker);
681 if (!FilterFileTrackersByParent(index_.get(), trackers, 679 if (!FilterFileTrackersByParent(index_.get(), trackers,
682 sync_root_tracker_id, tracker.get())) { 680 sync_root_tracker_id, tracker.get())) {
683 return SYNC_DATABASE_ERROR_NOT_FOUND; 681 return SYNC_DATABASE_ERROR_NOT_FOUND;
684 } 682 }
685 683
686 tracker->set_app_id(app_id); 684 tracker->set_app_id(app_id);
687 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); 685 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT);
688 tracker->set_active(true); 686 tracker->set_active(true);
689 tracker->set_needs_folder_listing(true); 687 tracker->set_needs_folder_listing(true);
690 tracker->set_dirty(true); 688 tracker->set_dirty(true);
691 689
692 index_->StoreFileTracker(std::move(tracker)); 690 index_->StoreFileTracker(std::move(tracker));
693 return WriteToDatabase(); 691 return WriteToDatabase();
694 } 692 }
695 693
696 SyncStatusCode MetadataDatabase::DisableApp(const std::string& app_id) { 694 SyncStatusCode MetadataDatabase::DisableApp(const std::string& app_id) {
697 int64_t tracker_id = index_->GetAppRootTracker(app_id); 695 int64_t tracker_id = index_->GetAppRootTracker(app_id);
698 scoped_ptr<FileTracker> tracker(new FileTracker); 696 std::unique_ptr<FileTracker> tracker(new FileTracker);
699 if (!index_->GetFileTracker(tracker_id, tracker.get())) { 697 if (!index_->GetFileTracker(tracker_id, tracker.get())) {
700 return SYNC_DATABASE_ERROR_NOT_FOUND; 698 return SYNC_DATABASE_ERROR_NOT_FOUND;
701 } 699 }
702 700
703 if (tracker->tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT) { 701 if (tracker->tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT) {
704 return SYNC_STATUS_OK; 702 return SYNC_STATUS_OK;
705 } 703 }
706 704
707 DCHECK_EQ(TRACKER_KIND_APP_ROOT, tracker->tracker_kind()); 705 DCHECK_EQ(TRACKER_KIND_APP_ROOT, tracker->tracker_kind());
708 DCHECK(tracker->active()); 706 DCHECK(tracker->active());
709 707
710 // Keep the app-root tracker active (but change the tracker_kind) so that 708 // Keep the app-root tracker active (but change the tracker_kind) so that
711 // other conflicting trackers won't become active. 709 // other conflicting trackers won't become active.
712 tracker->set_tracker_kind(TRACKER_KIND_DISABLED_APP_ROOT); 710 tracker->set_tracker_kind(TRACKER_KIND_DISABLED_APP_ROOT);
713 711
714 index_->StoreFileTracker(std::move(tracker)); 712 index_->StoreFileTracker(std::move(tracker));
715 return WriteToDatabase(); 713 return WriteToDatabase();
716 } 714 }
717 715
718 SyncStatusCode MetadataDatabase::EnableApp(const std::string& app_id) { 716 SyncStatusCode MetadataDatabase::EnableApp(const std::string& app_id) {
719 int64_t tracker_id = index_->GetAppRootTracker(app_id); 717 int64_t tracker_id = index_->GetAppRootTracker(app_id);
720 scoped_ptr<FileTracker> tracker(new FileTracker); 718 std::unique_ptr<FileTracker> tracker(new FileTracker);
721 if (!index_->GetFileTracker(tracker_id, tracker.get())) { 719 if (!index_->GetFileTracker(tracker_id, tracker.get())) {
722 return SYNC_DATABASE_ERROR_NOT_FOUND; 720 return SYNC_DATABASE_ERROR_NOT_FOUND;
723 } 721 }
724 722
725 if (tracker->tracker_kind() == TRACKER_KIND_APP_ROOT) { 723 if (tracker->tracker_kind() == TRACKER_KIND_APP_ROOT) {
726 return SYNC_STATUS_OK; 724 return SYNC_STATUS_OK;
727 } 725 }
728 726
729 DCHECK_EQ(TRACKER_KIND_DISABLED_APP_ROOT, tracker->tracker_kind()); 727 DCHECK_EQ(TRACKER_KIND_DISABLED_APP_ROOT, tracker->tracker_kind());
730 DCHECK(tracker->active()); 728 DCHECK(tracker->active());
731 729
732 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); 730 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT);
733 index_->StoreFileTracker(std::move(tracker)); 731 index_->StoreFileTracker(std::move(tracker));
734 732
735 MarkTrackersDirtyRecursively(tracker_id, index_.get()); 733 MarkTrackersDirtyRecursively(tracker_id, index_.get());
736 return WriteToDatabase(); 734 return WriteToDatabase();
737 } 735 }
738 736
739 SyncStatusCode MetadataDatabase::UnregisterApp(const std::string& app_id) { 737 SyncStatusCode MetadataDatabase::UnregisterApp(const std::string& app_id) {
740 int64_t tracker_id = index_->GetAppRootTracker(app_id); 738 int64_t tracker_id = index_->GetAppRootTracker(app_id);
741 scoped_ptr<FileTracker> tracker(new FileTracker); 739 std::unique_ptr<FileTracker> tracker(new FileTracker);
742 if (!index_->GetFileTracker(tracker_id, tracker.get()) || 740 if (!index_->GetFileTracker(tracker_id, tracker.get()) ||
743 tracker->tracker_kind() == TRACKER_KIND_REGULAR) { 741 tracker->tracker_kind() == TRACKER_KIND_REGULAR) {
744 return SYNC_STATUS_OK; 742 return SYNC_STATUS_OK;
745 } 743 }
746 744
747 RemoveAllDescendantTrackers(tracker_id, index_.get()); 745 RemoveAllDescendantTrackers(tracker_id, index_.get());
748 746
749 tracker->clear_app_id(); 747 tracker->clear_app_id();
750 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); 748 tracker->set_tracker_kind(TRACKER_KIND_REGULAR);
751 tracker->set_active(false); 749 tracker->set_active(false);
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
892 SyncStatusCode MetadataDatabase::UpdateByChangeList( 890 SyncStatusCode MetadataDatabase::UpdateByChangeList(
893 int64_t largest_change_id, 891 int64_t largest_change_id,
894 ScopedVector<google_apis::ChangeResource> changes) { 892 ScopedVector<google_apis::ChangeResource> changes) {
895 DCHECK_LE(index_->GetLargestChangeID(), largest_change_id); 893 DCHECK_LE(index_->GetLargestChangeID(), largest_change_id);
896 894
897 for (size_t i = 0; i < changes.size(); ++i) { 895 for (size_t i = 0; i < changes.size(); ++i) {
898 const google_apis::ChangeResource& change = *changes[i]; 896 const google_apis::ChangeResource& change = *changes[i];
899 if (HasNewerFileMetadata(change.file_id(), change.change_id())) 897 if (HasNewerFileMetadata(change.file_id(), change.change_id()))
900 continue; 898 continue;
901 899
902 scoped_ptr<FileMetadata> metadata( 900 std::unique_ptr<FileMetadata> metadata(
903 CreateFileMetadataFromChangeResource(change)); 901 CreateFileMetadataFromChangeResource(change));
904 UpdateByFileMetadata(FROM_HERE, std::move(metadata), 902 UpdateByFileMetadata(FROM_HERE, std::move(metadata),
905 UPDATE_TRACKER_FOR_UNSYNCED_FILE); 903 UPDATE_TRACKER_FOR_UNSYNCED_FILE);
906 } 904 }
907 905
908 UpdateLargestKnownChangeID(largest_change_id); 906 UpdateLargestKnownChangeID(largest_change_id);
909 index_->SetLargestChangeID(largest_change_id); 907 index_->SetLargestChangeID(largest_change_id);
910 return WriteToDatabase(); 908 return WriteToDatabase();
911 } 909 }
912 910
913 SyncStatusCode MetadataDatabase::UpdateByFileResource( 911 SyncStatusCode MetadataDatabase::UpdateByFileResource(
914 const google_apis::FileResource& resource) { 912 const google_apis::FileResource& resource) {
915 scoped_ptr<FileMetadata> metadata( 913 std::unique_ptr<FileMetadata> metadata(
916 CreateFileMetadataFromFileResource( 914 CreateFileMetadataFromFileResource(GetLargestKnownChangeID(), resource));
917 GetLargestKnownChangeID(), resource));
918 UpdateByFileMetadata(FROM_HERE, std::move(metadata), 915 UpdateByFileMetadata(FROM_HERE, std::move(metadata),
919 UPDATE_TRACKER_FOR_UNSYNCED_FILE); 916 UPDATE_TRACKER_FOR_UNSYNCED_FILE);
920 return WriteToDatabase(); 917 return WriteToDatabase();
921 } 918 }
922 919
923 SyncStatusCode MetadataDatabase::UpdateByFileResourceList( 920 SyncStatusCode MetadataDatabase::UpdateByFileResourceList(
924 ScopedVector<google_apis::FileResource> resources) { 921 ScopedVector<google_apis::FileResource> resources) {
925 for (size_t i = 0; i < resources.size(); ++i) { 922 for (size_t i = 0; i < resources.size(); ++i) {
926 scoped_ptr<FileMetadata> metadata( 923 std::unique_ptr<FileMetadata> metadata(CreateFileMetadataFromFileResource(
927 CreateFileMetadataFromFileResource( 924 GetLargestKnownChangeID(), *resources[i]));
928 GetLargestKnownChangeID(), *resources[i]));
929 UpdateByFileMetadata(FROM_HERE, std::move(metadata), 925 UpdateByFileMetadata(FROM_HERE, std::move(metadata),
930 UPDATE_TRACKER_FOR_UNSYNCED_FILE); 926 UPDATE_TRACKER_FOR_UNSYNCED_FILE);
931 } 927 }
932 return WriteToDatabase(); 928 return WriteToDatabase();
933 } 929 }
934 930
935 SyncStatusCode MetadataDatabase::UpdateByDeletedRemoteFile( 931 SyncStatusCode MetadataDatabase::UpdateByDeletedRemoteFile(
936 const std::string& file_id) { 932 const std::string& file_id) {
937 scoped_ptr<FileMetadata> metadata( 933 std::unique_ptr<FileMetadata> metadata(
938 CreateDeletedFileMetadata(GetLargestKnownChangeID(), file_id)); 934 CreateDeletedFileMetadata(GetLargestKnownChangeID(), file_id));
939 UpdateByFileMetadata(FROM_HERE, std::move(metadata), 935 UpdateByFileMetadata(FROM_HERE, std::move(metadata),
940 UPDATE_TRACKER_FOR_UNSYNCED_FILE); 936 UPDATE_TRACKER_FOR_UNSYNCED_FILE);
941 return WriteToDatabase(); 937 return WriteToDatabase();
942 } 938 }
943 939
944 SyncStatusCode MetadataDatabase::UpdateByDeletedRemoteFileList( 940 SyncStatusCode MetadataDatabase::UpdateByDeletedRemoteFileList(
945 const FileIDList& file_ids) { 941 const FileIDList& file_ids) {
946 for (FileIDList::const_iterator itr = file_ids.begin(); 942 for (FileIDList::const_iterator itr = file_ids.begin();
947 itr != file_ids.end(); ++itr) { 943 itr != file_ids.end(); ++itr) {
948 scoped_ptr<FileMetadata> metadata( 944 std::unique_ptr<FileMetadata> metadata(
949 CreateDeletedFileMetadata(GetLargestKnownChangeID(), *itr)); 945 CreateDeletedFileMetadata(GetLargestKnownChangeID(), *itr));
950 UpdateByFileMetadata(FROM_HERE, std::move(metadata), 946 UpdateByFileMetadata(FROM_HERE, std::move(metadata),
951 UPDATE_TRACKER_FOR_UNSYNCED_FILE); 947 UPDATE_TRACKER_FOR_UNSYNCED_FILE);
952 } 948 }
953 return WriteToDatabase(); 949 return WriteToDatabase();
954 } 950 }
955 951
956 SyncStatusCode MetadataDatabase::ReplaceActiveTrackerWithNewResource( 952 SyncStatusCode MetadataDatabase::ReplaceActiveTrackerWithNewResource(
957 int64_t parent_tracker_id, 953 int64_t parent_tracker_id,
958 const google_apis::FileResource& resource) { 954 const google_apis::FileResource& resource) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
992 SyncStatusCode MetadataDatabase::PopulateFolderByChildList( 988 SyncStatusCode MetadataDatabase::PopulateFolderByChildList(
993 const std::string& folder_id, 989 const std::string& folder_id,
994 const FileIDList& child_file_ids) { 990 const FileIDList& child_file_ids) {
995 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(folder_id); 991 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(folder_id);
996 if (!trackers.has_active()) { 992 if (!trackers.has_active()) {
997 // It's OK that there is no folder to populate its children. 993 // It's OK that there is no folder to populate its children.
998 // Inactive folders should ignore their contents updates. 994 // Inactive folders should ignore their contents updates.
999 return SYNC_STATUS_OK; 995 return SYNC_STATUS_OK;
1000 } 996 }
1001 997
1002 scoped_ptr<FileTracker> folder_tracker(new FileTracker); 998 std::unique_ptr<FileTracker> folder_tracker(new FileTracker);
1003 if (!index_->GetFileTracker(trackers.active_tracker(), 999 if (!index_->GetFileTracker(trackers.active_tracker(),
1004 folder_tracker.get())) { 1000 folder_tracker.get())) {
1005 NOTREACHED(); 1001 NOTREACHED();
1006 return SYNC_STATUS_FAILED; 1002 return SYNC_STATUS_FAILED;
1007 } 1003 }
1008 1004
1009 base::hash_set<std::string> children(child_file_ids.begin(), 1005 base::hash_set<std::string> children(child_file_ids.begin(),
1010 child_file_ids.end()); 1006 child_file_ids.end());
1011 1007
1012 std::vector<int64_t> known_children = 1008 std::vector<int64_t> known_children =
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1095 tracker.file_id(), 1091 tracker.file_id(),
1096 nullptr)) { 1092 nullptr)) {
1097 RemoveFileTracker(tracker.tracker_id(), 1093 RemoveFileTracker(tracker.tracker_id(),
1098 MARK_NOTHING_DIRTY, 1094 MARK_NOTHING_DIRTY,
1099 index_.get()); 1095 index_.get());
1100 return WriteToDatabase(); 1096 return WriteToDatabase();
1101 } 1097 }
1102 } 1098 }
1103 } 1099 }
1104 1100
1105 scoped_ptr<FileTracker> updated_tracker = CloneFileTracker(&tracker); 1101 std::unique_ptr<FileTracker> updated_tracker = CloneFileTracker(&tracker);
1106 *updated_tracker->mutable_synced_details() = updated_details; 1102 *updated_tracker->mutable_synced_details() = updated_details;
1107 1103
1108 bool should_promote = false; 1104 bool should_promote = false;
1109 1105
1110 // Activate the tracker if: 1106 // Activate the tracker if:
1111 // - There is no active tracker that tracks |tracker->file_id()|. 1107 // - There is no active tracker that tracks |tracker->file_id()|.
1112 // - There is no active tracker that has the same |parent| and |title|. 1108 // - There is no active tracker that has the same |parent| and |title|.
1113 if (!tracker.active() && CanActivateTracker(tracker)) { 1109 if (!tracker.active() && CanActivateTracker(tracker)) {
1114 updated_tracker->set_active(true); 1110 updated_tracker->set_active(true);
1115 updated_tracker->set_dirty(true); 1111 updated_tracker->set_dirty(true);
(...skipping 18 matching lines...) Expand all
1134 if (!index_->GetFileMetadata(file_id, &metadata)) { 1130 if (!index_->GetFileMetadata(file_id, &metadata)) {
1135 NOTREACHED(); 1131 NOTREACHED();
1136 *status_out = SYNC_STATUS_FAILED; 1132 *status_out = SYNC_STATUS_FAILED;
1137 return ACTIVATION_PENDING; 1133 return ACTIVATION_PENDING;
1138 } 1134 }
1139 std::string title = metadata.details().title(); 1135 std::string title = metadata.details().title();
1140 DCHECK(!HasInvalidTitle(title)); 1136 DCHECK(!HasInvalidTitle(title));
1141 1137
1142 TrackerIDSet same_file_id_trackers = 1138 TrackerIDSet same_file_id_trackers =
1143 index_->GetFileTrackerIDsByFileID(file_id); 1139 index_->GetFileTrackerIDsByFileID(file_id);
1144 scoped_ptr<FileTracker> tracker_to_be_activated(new FileTracker); 1140 std::unique_ptr<FileTracker> tracker_to_be_activated(new FileTracker);
1145 FilterFileTrackersByParentAndTitle( 1141 FilterFileTrackersByParentAndTitle(
1146 index_.get(), same_file_id_trackers, parent_tracker_id, 1142 index_.get(), same_file_id_trackers, parent_tracker_id,
1147 title, tracker_to_be_activated.get()); 1143 title, tracker_to_be_activated.get());
1148 1144
1149 // Check if there is another active tracker that tracks |file_id|. 1145 // Check if there is another active tracker that tracks |file_id|.
1150 // This can happen when the tracked file has multiple parents. 1146 // This can happen when the tracked file has multiple parents.
1151 // In this case, report the failure to the caller. 1147 // In this case, report the failure to the caller.
1152 if (!tracker_to_be_activated->active() && same_file_id_trackers.has_active()) 1148 if (!tracker_to_be_activated->active() && same_file_id_trackers.has_active())
1153 return ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER; 1149 return ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER;
1154 1150
1155 if (!tracker_to_be_activated->active()) { 1151 if (!tracker_to_be_activated->active()) {
1156 // Check if there exists another active tracker that has the same path to 1152 // Check if there exists another active tracker that has the same path to
1157 // the tracker. If there is, deactivate it, assuming the caller already 1153 // the tracker. If there is, deactivate it, assuming the caller already
1158 // overrides local file with newly added file, 1154 // overrides local file with newly added file,
1159 TrackerIDSet same_title_trackers = 1155 TrackerIDSet same_title_trackers =
1160 index_->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title); 1156 index_->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title);
1161 if (same_title_trackers.has_active()) { 1157 if (same_title_trackers.has_active()) {
1162 RemoveAllDescendantTrackers(same_title_trackers.active_tracker(), 1158 RemoveAllDescendantTrackers(same_title_trackers.active_tracker(),
1163 index_.get()); 1159 index_.get());
1164 1160
1165 scoped_ptr<FileTracker> tracker_to_be_deactivated(new FileTracker); 1161 std::unique_ptr<FileTracker> tracker_to_be_deactivated(new FileTracker);
1166 if (index_->GetFileTracker(same_title_trackers.active_tracker(), 1162 if (index_->GetFileTracker(same_title_trackers.active_tracker(),
1167 tracker_to_be_deactivated.get())) { 1163 tracker_to_be_deactivated.get())) {
1168 const std::string file_id = tracker_to_be_deactivated->file_id(); 1164 const std::string file_id = tracker_to_be_deactivated->file_id();
1169 tracker_to_be_deactivated->set_active(false); 1165 tracker_to_be_deactivated->set_active(false);
1170 index_->StoreFileTracker(std::move(tracker_to_be_deactivated)); 1166 index_->StoreFileTracker(std::move(tracker_to_be_deactivated));
1171 1167
1172 MarkTrackersDirtyByFileID(file_id, index_.get()); 1168 MarkTrackersDirtyByFileID(file_id, index_.get());
1173 } else { 1169 } else {
1174 NOTREACHED(); 1170 NOTREACHED();
1175 } 1171 }
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1291 for (size_t i = 0; i < file_ids.size(); ++i) { 1287 for (size_t i = 0; i < file_ids.size(); ++i) {
1292 TrackerIDSet trackers_for_file_id = 1288 TrackerIDSet trackers_for_file_id =
1293 index_->GetFileTrackerIDsByFileID(file_ids[i]); 1289 index_->GetFileTrackerIDsByFileID(file_ids[i]);
1294 for (TrackerIDSet::iterator itr = trackers_for_file_id.begin(); 1290 for (TrackerIDSet::iterator itr = trackers_for_file_id.begin();
1295 itr != trackers_for_file_id.end(); ++itr) 1291 itr != trackers_for_file_id.end(); ++itr)
1296 tracker_ids.insert(*itr); 1292 tracker_ids.insert(*itr);
1297 } 1293 }
1298 1294
1299 for (std::set<int64_t>::iterator itr = tracker_ids.begin(); 1295 for (std::set<int64_t>::iterator itr = tracker_ids.begin();
1300 itr != tracker_ids.end(); ++itr) { 1296 itr != tracker_ids.end(); ++itr) {
1301 scoped_ptr<FileTracker> tracker(new FileTracker); 1297 std::unique_ptr<FileTracker> tracker(new FileTracker);
1302 if (!index_->GetFileTracker(*itr, tracker.get()) || 1298 if (!index_->GetFileTracker(*itr, tracker.get()) ||
1303 !CanClearDirty(*tracker)) 1299 !CanClearDirty(*tracker))
1304 continue; 1300 continue;
1305 tracker->set_dirty(false); 1301 tracker->set_dirty(false);
1306 index_->StoreFileTracker(std::move(tracker)); 1302 index_->StoreFileTracker(std::move(tracker));
1307 } 1303 }
1308 1304
1309 return WriteToDatabase(); 1305 return WriteToDatabase();
1310 } 1306 }
1311 1307
(...skipping 25 matching lines...) Expand all
1337 } 1333 }
1338 1334
1339 if (enable_on_disk_index_) { 1335 if (enable_on_disk_index_) {
1340 index_ = MetadataDatabaseIndexOnDisk::Create(db_.get()); 1336 index_ = MetadataDatabaseIndexOnDisk::Create(db_.get());
1341 } else { 1337 } else {
1342 index_ = MetadataDatabaseIndex::Create(db_.get()); 1338 index_ = MetadataDatabaseIndex::Create(db_.get());
1343 } 1339 }
1344 if (!index_) { 1340 if (!index_) {
1345 // Delete all entries in |db_| to reset it. 1341 // Delete all entries in |db_| to reset it.
1346 // TODO(peria): Make LevelDBWrapper::DestroyDB() to avoid a full scan. 1342 // TODO(peria): Make LevelDBWrapper::DestroyDB() to avoid a full scan.
1347 scoped_ptr<LevelDBWrapper::Iterator> itr = db_->NewIterator(); 1343 std::unique_ptr<LevelDBWrapper::Iterator> itr = db_->NewIterator();
1348 for (itr->SeekToFirst(); itr->Valid();) 1344 for (itr->SeekToFirst(); itr->Valid();)
1349 itr->Delete(); 1345 itr->Delete();
1350 db_->Commit(); 1346 db_->Commit();
1351 1347
1352 return SYNC_DATABASE_ERROR_FAILED; 1348 return SYNC_DATABASE_ERROR_FAILED;
1353 } 1349 }
1354 1350
1355 status = LevelDBStatusToSyncStatusCode(db_->Commit()); 1351 status = LevelDBStatusToSyncStatusCode(db_->Commit());
1356 if (status != SYNC_STATUS_OK) 1352 if (status != SYNC_STATUS_OK)
1357 return status; 1353 return status;
(...skipping 19 matching lines...) Expand all
1377 file_metadata.file_id(), 1373 file_metadata.file_id(),
1378 &file_metadata.details(), 1374 &file_metadata.details(),
1379 option); 1375 option);
1380 } 1376 }
1381 1377
1382 void MetadataDatabase::CreateTrackerInternal(const FileTracker& parent_tracker, 1378 void MetadataDatabase::CreateTrackerInternal(const FileTracker& parent_tracker,
1383 const std::string& file_id, 1379 const std::string& file_id,
1384 const FileDetails* details, 1380 const FileDetails* details,
1385 UpdateOption option) { 1381 UpdateOption option) {
1386 int64_t tracker_id = IncrementTrackerID(); 1382 int64_t tracker_id = IncrementTrackerID();
1387 scoped_ptr<FileTracker> tracker(new FileTracker); 1383 std::unique_ptr<FileTracker> tracker(new FileTracker);
1388 tracker->set_tracker_id(tracker_id); 1384 tracker->set_tracker_id(tracker_id);
1389 tracker->set_parent_tracker_id(parent_tracker.tracker_id()); 1385 tracker->set_parent_tracker_id(parent_tracker.tracker_id());
1390 tracker->set_file_id(file_id); 1386 tracker->set_file_id(file_id);
1391 tracker->set_app_id(parent_tracker.app_id()); 1387 tracker->set_app_id(parent_tracker.app_id());
1392 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); 1388 tracker->set_tracker_kind(TRACKER_KIND_REGULAR);
1393 tracker->set_dirty(true); 1389 tracker->set_dirty(true);
1394 tracker->set_active(false); 1390 tracker->set_active(false);
1395 tracker->set_needs_folder_listing(false); 1391 tracker->set_needs_folder_listing(false);
1396 if (details) { 1392 if (details) {
1397 *tracker->mutable_synced_details() = *details; 1393 *tracker->mutable_synced_details() = *details;
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
1547 } 1543 }
1548 1544
1549 if (!tracker.has_synced_details() || tracker.synced_details().missing()) { 1545 if (!tracker.has_synced_details() || tracker.synced_details().missing()) {
1550 RemoveFileTracker(*itr, MARK_NOTHING_DIRTY, index_.get()); 1546 RemoveFileTracker(*itr, MARK_NOTHING_DIRTY, index_.get());
1551 } 1547 }
1552 } 1548 }
1553 } 1549 }
1554 1550
1555 void MetadataDatabase::UpdateByFileMetadata( 1551 void MetadataDatabase::UpdateByFileMetadata(
1556 const tracked_objects::Location& from_where, 1552 const tracked_objects::Location& from_where,
1557 scoped_ptr<FileMetadata> metadata, 1553 std::unique_ptr<FileMetadata> metadata,
1558 UpdateOption option) { 1554 UpdateOption option) {
1559 DCHECK(metadata); 1555 DCHECK(metadata);
1560 DCHECK(metadata->has_details()); 1556 DCHECK(metadata->has_details());
1561 1557
1562 DVLOG(1) << from_where.function_name() << ": " 1558 DVLOG(1) << from_where.function_name() << ": "
1563 << metadata->file_id() << " (" 1559 << metadata->file_id() << " ("
1564 << metadata->details().title() << ")" 1560 << metadata->details().title() << ")"
1565 << (metadata->details().missing() ? " deleted" : ""); 1561 << (metadata->details().missing() ? " deleted" : "");
1566 1562
1567 std::string file_id = metadata->file_id(); 1563 std::string file_id = metadata->file_id();
1568 if (metadata->details().missing()) 1564 if (metadata->details().missing())
1569 RemoveUnneededTrackersForMissingFile(file_id); 1565 RemoveUnneededTrackersForMissingFile(file_id);
1570 else 1566 else
1571 MaybeAddTrackersForNewFile(*metadata, option); 1567 MaybeAddTrackersForNewFile(*metadata, option);
1572 1568
1573 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); 1569 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id);
1574 if (!trackers.empty()) { 1570 if (!trackers.empty()) {
1575 index_->StoreFileMetadata(std::move(metadata)); 1571 index_->StoreFileMetadata(std::move(metadata));
1576 1572
1577 if (option != UPDATE_TRACKER_FOR_SYNCED_FILE) 1573 if (option != UPDATE_TRACKER_FOR_SYNCED_FILE)
1578 MarkTrackerSetDirty(trackers, index_.get()); 1574 MarkTrackerSetDirty(trackers, index_.get());
1579 } 1575 }
1580 } 1576 }
1581 1577
1582 1578
1583 SyncStatusCode MetadataDatabase::WriteToDatabase() { 1579 SyncStatusCode MetadataDatabase::WriteToDatabase() {
1584 return LevelDBStatusToSyncStatusCode(db_->Commit()); 1580 return LevelDBStatusToSyncStatusCode(db_->Commit());
1585 } 1581 }
1586 1582
1587 scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles( 1583 std::unique_ptr<base::ListValue> MetadataDatabase::DumpFiles(
1588 const std::string& app_id) { 1584 const std::string& app_id) {
1589 scoped_ptr<base::ListValue> files(new base::ListValue); 1585 std::unique_ptr<base::ListValue> files(new base::ListValue);
1590 1586
1591 FileTracker app_root_tracker; 1587 FileTracker app_root_tracker;
1592 if (!FindAppRootTracker(app_id, &app_root_tracker)) 1588 if (!FindAppRootTracker(app_id, &app_root_tracker))
1593 return files; 1589 return files;
1594 1590
1595 std::vector<int64_t> stack; 1591 std::vector<int64_t> stack;
1596 AppendContents( 1592 AppendContents(
1597 index_->GetFileTrackerIDsByParent(app_root_tracker.tracker_id()), &stack); 1593 index_->GetFileTrackerIDsByParent(app_root_tracker.tracker_id()), &stack);
1598 while (!stack.empty()) { 1594 while (!stack.empty()) {
1599 int64_t tracker_id = stack.back(); 1595 int64_t tracker_id = stack.back();
(...skipping 24 matching lines...) Expand all
1624 details->SetString("dirty", tracker.dirty() ? "true" : "false"); 1620 details->SetString("dirty", tracker.dirty() ? "true" : "false");
1625 1621
1626 file->Set("details", details); 1622 file->Set("details", details);
1627 1623
1628 files->Append(file); 1624 files->Append(file);
1629 } 1625 }
1630 1626
1631 return files; 1627 return files;
1632 } 1628 }
1633 1629
1634 scoped_ptr<base::ListValue> MetadataDatabase::DumpDatabase() { 1630 std::unique_ptr<base::ListValue> MetadataDatabase::DumpDatabase() {
1635 scoped_ptr<base::ListValue> list(new base::ListValue); 1631 std::unique_ptr<base::ListValue> list(new base::ListValue);
1636 list->Append(DumpTrackers().release()); 1632 list->Append(DumpTrackers().release());
1637 list->Append(DumpMetadata().release()); 1633 list->Append(DumpMetadata().release());
1638 return list; 1634 return list;
1639 } 1635 }
1640 1636
1641 bool MetadataDatabase::HasNewerFileMetadata(const std::string& file_id, 1637 bool MetadataDatabase::HasNewerFileMetadata(const std::string& file_id,
1642 int64_t change_id) { 1638 int64_t change_id) {
1643 FileMetadata metadata; 1639 FileMetadata metadata;
1644 if (!index_->GetFileMetadata(file_id, &metadata)) 1640 if (!index_->GetFileMetadata(file_id, &metadata))
1645 return false; 1641 return false;
1646 DCHECK(metadata.has_details()); 1642 DCHECK(metadata.has_details());
1647 return metadata.details().change_id() >= change_id; 1643 return metadata.details().change_id() >= change_id;
1648 } 1644 }
1649 1645
1650 scoped_ptr<base::ListValue> MetadataDatabase::DumpTrackers() { 1646 std::unique_ptr<base::ListValue> MetadataDatabase::DumpTrackers() {
1651 scoped_ptr<base::ListValue> trackers(new base::ListValue); 1647 std::unique_ptr<base::ListValue> trackers(new base::ListValue);
1652 1648
1653 // Append the first element for metadata. 1649 // Append the first element for metadata.
1654 base::DictionaryValue* metadata = new base::DictionaryValue; 1650 base::DictionaryValue* metadata = new base::DictionaryValue;
1655 const char *trackerKeys[] = { 1651 const char *trackerKeys[] = {
1656 "tracker_id", "path", "file_id", "tracker_kind", "app_id", 1652 "tracker_id", "path", "file_id", "tracker_kind", "app_id",
1657 "active", "dirty", "folder_listing", "demoted", 1653 "active", "dirty", "folder_listing", "demoted",
1658 "title", "kind", "md5", "etag", "missing", "change_id", 1654 "title", "kind", "md5", "etag", "missing", "change_id",
1659 }; 1655 };
1660 std::vector<std::string> key_strings( 1656 std::vector<std::string> key_strings(
1661 trackerKeys, trackerKeys + arraysize(trackerKeys)); 1657 trackerKeys, trackerKeys + arraysize(trackerKeys));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1703 dict->SetString("md5", details.md5()); 1699 dict->SetString("md5", details.md5());
1704 dict->SetString("etag", details.etag()); 1700 dict->SetString("etag", details.etag());
1705 dict->SetString("missing", details.missing() ? "true" : "false"); 1701 dict->SetString("missing", details.missing() ? "true" : "false");
1706 dict->SetString("change_id", base::Int64ToString(details.change_id())); 1702 dict->SetString("change_id", base::Int64ToString(details.change_id()));
1707 } 1703 }
1708 trackers->Append(dict); 1704 trackers->Append(dict);
1709 } 1705 }
1710 return trackers; 1706 return trackers;
1711 } 1707 }
1712 1708
1713 scoped_ptr<base::ListValue> MetadataDatabase::DumpMetadata() { 1709 std::unique_ptr<base::ListValue> MetadataDatabase::DumpMetadata() {
1714 scoped_ptr<base::ListValue> files(new base::ListValue); 1710 std::unique_ptr<base::ListValue> files(new base::ListValue);
1715 1711
1716 // Append the first element for metadata. 1712 // Append the first element for metadata.
1717 base::DictionaryValue* metadata = new base::DictionaryValue; 1713 base::DictionaryValue* metadata = new base::DictionaryValue;
1718 const char *fileKeys[] = { 1714 const char *fileKeys[] = {
1719 "file_id", "title", "type", "md5", "etag", "missing", 1715 "file_id", "title", "type", "md5", "etag", "missing",
1720 "change_id", "parents" 1716 "change_id", "parents"
1721 }; 1717 };
1722 std::vector<std::string> key_strings( 1718 std::vector<std::string> key_strings(
1723 fileKeys, fileKeys + arraysize(fileKeys)); 1719 fileKeys, fileKeys + arraysize(fileKeys));
1724 base::ListValue* keys = new base::ListValue; 1720 base::ListValue* keys = new base::ListValue;
(...skipping 29 matching lines...) Expand all
1754 parents.push_back(details.parent_folder_ids(i)); 1750 parents.push_back(details.parent_folder_ids(i));
1755 dict->SetString("parents", base::JoinString(parents, ",")); 1751 dict->SetString("parents", base::JoinString(parents, ","));
1756 } 1752 }
1757 files->Append(dict); 1753 files->Append(dict);
1758 } 1754 }
1759 return files; 1755 return files;
1760 } 1756 }
1761 1757
1762 void MetadataDatabase::AttachSyncRoot( 1758 void MetadataDatabase::AttachSyncRoot(
1763 const google_apis::FileResource& sync_root_folder) { 1759 const google_apis::FileResource& sync_root_folder) {
1764 scoped_ptr<FileMetadata> sync_root_metadata = 1760 std::unique_ptr<FileMetadata> sync_root_metadata =
1765 CreateFileMetadataFromFileResource( 1761 CreateFileMetadataFromFileResource(GetLargestKnownChangeID(),
1766 GetLargestKnownChangeID(), sync_root_folder); 1762 sync_root_folder);
1767 scoped_ptr<FileTracker> sync_root_tracker = 1763 std::unique_ptr<FileTracker> sync_root_tracker =
1768 CreateSyncRootTracker(IncrementTrackerID(), *sync_root_metadata); 1764 CreateSyncRootTracker(IncrementTrackerID(), *sync_root_metadata);
1769 1765
1770 index_->SetSyncRootTrackerID(sync_root_tracker->tracker_id()); 1766 index_->SetSyncRootTrackerID(sync_root_tracker->tracker_id());
1771 index_->StoreFileMetadata(std::move(sync_root_metadata)); 1767 index_->StoreFileMetadata(std::move(sync_root_metadata));
1772 index_->StoreFileTracker(std::move(sync_root_tracker)); 1768 index_->StoreFileTracker(std::move(sync_root_tracker));
1773 } 1769 }
1774 1770
1775 void MetadataDatabase::AttachInitialAppRoot( 1771 void MetadataDatabase::AttachInitialAppRoot(
1776 const google_apis::FileResource& app_root_folder) { 1772 const google_apis::FileResource& app_root_folder) {
1777 scoped_ptr<FileMetadata> app_root_metadata = 1773 std::unique_ptr<FileMetadata> app_root_metadata =
1778 CreateFileMetadataFromFileResource( 1774 CreateFileMetadataFromFileResource(GetLargestKnownChangeID(),
1779 GetLargestKnownChangeID(), app_root_folder); 1775 app_root_folder);
1780 scoped_ptr<FileTracker> app_root_tracker = 1776 std::unique_ptr<FileTracker> app_root_tracker = CreateInitialAppRootTracker(
1781 CreateInitialAppRootTracker(IncrementTrackerID(), 1777 IncrementTrackerID(), GetSyncRootTrackerID(), *app_root_metadata);
1782 GetSyncRootTrackerID(),
1783 *app_root_metadata);
1784 1778
1785 index_->StoreFileMetadata(std::move(app_root_metadata)); 1779 index_->StoreFileMetadata(std::move(app_root_metadata));
1786 index_->StoreFileTracker(std::move(app_root_tracker)); 1780 index_->StoreFileTracker(std::move(app_root_tracker));
1787 } 1781 }
1788 1782
1789 bool MetadataDatabase::CanClearDirty(const FileTracker& tracker) { 1783 bool MetadataDatabase::CanClearDirty(const FileTracker& tracker) {
1790 FileMetadata metadata; 1784 FileMetadata metadata;
1791 if (!index_->GetFileMetadata(tracker.file_id(), &metadata) || 1785 if (!index_->GetFileMetadata(tracker.file_id(), &metadata) ||
1792 !tracker.active() || !tracker.dirty() || 1786 !tracker.active() || !tracker.dirty() ||
1793 !tracker.has_synced_details() || 1787 !tracker.has_synced_details() ||
(...skipping 16 matching lines...) Expand all
1810 return false; 1804 return false;
1811 1805
1812 if (!parents.empty()) 1806 if (!parents.empty())
1813 return false; 1807 return false;
1814 1808
1815 return true; 1809 return true;
1816 } 1810 }
1817 1811
1818 } // namespace drive_backend 1812 } // namespace drive_backend
1819 } // namespace sync_file_system 1813 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698