| 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 #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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |