| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" | 5 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <stack> | 8 #include <stack> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 12 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
| 13 #include "base/files/file_util.h" | 13 #include "base/files/file_util.h" |
| 14 #include "base/location.h" | 14 #include "base/location.h" |
| 15 #include "base/macros.h" |
| 15 #include "base/memory/scoped_vector.h" | 16 #include "base/memory/scoped_vector.h" |
| 16 #include "base/single_thread_task_runner.h" | 17 #include "base/single_thread_task_runner.h" |
| 17 #include "base/stl_util.h" | 18 #include "base/stl_util.h" |
| 18 #include "base/strings/string_number_conversions.h" | 19 #include "base/strings/string_number_conversions.h" |
| 19 #include "base/strings/string_util.h" | 20 #include "base/strings/string_util.h" |
| 20 #include "base/strings/stringprintf.h" | 21 #include "base/strings/stringprintf.h" |
| 21 #include "base/task_runner_util.h" | 22 #include "base/task_runner_util.h" |
| 22 #include "base/thread_task_runner_handle.h" | 23 #include "base/thread_task_runner_handle.h" |
| 23 #include "base/threading/thread_restrictions.h" | 24 #include "base/threading/thread_restrictions.h" |
| 24 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.
h" | 25 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.
h" |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 | 106 |
| 106 details->set_md5(file_resource.md5_checksum()); | 107 details->set_md5(file_resource.md5_checksum()); |
| 107 details->set_etag(file_resource.etag()); | 108 details->set_etag(file_resource.etag()); |
| 108 details->set_creation_time(file_resource.created_date().ToInternalValue()); | 109 details->set_creation_time(file_resource.created_date().ToInternalValue()); |
| 109 details->set_modification_time( | 110 details->set_modification_time( |
| 110 file_resource.modified_date().ToInternalValue()); | 111 file_resource.modified_date().ToInternalValue()); |
| 111 details->set_missing(file_resource.labels().is_trashed()); | 112 details->set_missing(file_resource.labels().is_trashed()); |
| 112 } | 113 } |
| 113 | 114 |
| 114 scoped_ptr<FileMetadata> CreateFileMetadataFromFileResource( | 115 scoped_ptr<FileMetadata> CreateFileMetadataFromFileResource( |
| 115 int64 change_id, | 116 int64_t change_id, |
| 116 const google_apis::FileResource& resource) { | 117 const google_apis::FileResource& resource) { |
| 117 scoped_ptr<FileMetadata> file(new FileMetadata); | 118 scoped_ptr<FileMetadata> file(new FileMetadata); |
| 118 file->set_file_id(resource.file_id()); | 119 file->set_file_id(resource.file_id()); |
| 119 | 120 |
| 120 FileDetails* details = file->mutable_details(); | 121 FileDetails* details = file->mutable_details(); |
| 121 details->set_change_id(change_id); | 122 details->set_change_id(change_id); |
| 122 | 123 |
| 123 if (resource.labels().is_trashed()) { | 124 if (resource.labels().is_trashed()) { |
| 124 details->set_missing(true); | 125 details->set_missing(true); |
| 125 return file.Pass(); | 126 return file.Pass(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 139 | 140 |
| 140 if (change.is_deleted()) { | 141 if (change.is_deleted()) { |
| 141 details->set_missing(true); | 142 details->set_missing(true); |
| 142 return file.Pass(); | 143 return file.Pass(); |
| 143 } | 144 } |
| 144 | 145 |
| 145 PopulateFileDetailsByFileResource(*change.file(), details); | 146 PopulateFileDetailsByFileResource(*change.file(), details); |
| 146 return file.Pass(); | 147 return file.Pass(); |
| 147 } | 148 } |
| 148 | 149 |
| 149 scoped_ptr<FileMetadata> CreateDeletedFileMetadata( | 150 scoped_ptr<FileMetadata> CreateDeletedFileMetadata(int64_t change_id, |
| 150 int64 change_id, | 151 const std::string& file_id) { |
| 151 const std::string& file_id) { | |
| 152 scoped_ptr<FileMetadata> file(new FileMetadata); | 152 scoped_ptr<FileMetadata> file(new FileMetadata); |
| 153 file->set_file_id(file_id); | 153 file->set_file_id(file_id); |
| 154 | 154 |
| 155 FileDetails* details = file->mutable_details(); | 155 FileDetails* details = file->mutable_details(); |
| 156 details->set_change_id(change_id); | 156 details->set_change_id(change_id); |
| 157 details->set_missing(true); | 157 details->set_missing(true); |
| 158 return file.Pass(); | 158 return file.Pass(); |
| 159 } | 159 } |
| 160 | 160 |
| 161 scoped_ptr<FileTracker> CreateSyncRootTracker( | 161 scoped_ptr<FileTracker> CreateSyncRootTracker( |
| 162 int64 tracker_id, | 162 int64_t tracker_id, |
| 163 const FileMetadata& sync_root_metadata) { | 163 const FileMetadata& sync_root_metadata) { |
| 164 scoped_ptr<FileTracker> sync_root_tracker(new FileTracker); | 164 scoped_ptr<FileTracker> sync_root_tracker(new FileTracker); |
| 165 sync_root_tracker->set_tracker_id(tracker_id); | 165 sync_root_tracker->set_tracker_id(tracker_id); |
| 166 sync_root_tracker->set_file_id(sync_root_metadata.file_id()); | 166 sync_root_tracker->set_file_id(sync_root_metadata.file_id()); |
| 167 sync_root_tracker->set_parent_tracker_id(0); | 167 sync_root_tracker->set_parent_tracker_id(0); |
| 168 sync_root_tracker->set_tracker_kind(TRACKER_KIND_REGULAR); | 168 sync_root_tracker->set_tracker_kind(TRACKER_KIND_REGULAR); |
| 169 sync_root_tracker->set_dirty(false); | 169 sync_root_tracker->set_dirty(false); |
| 170 sync_root_tracker->set_active(true); | 170 sync_root_tracker->set_active(true); |
| 171 sync_root_tracker->set_needs_folder_listing(false); | 171 sync_root_tracker->set_needs_folder_listing(false); |
| 172 *sync_root_tracker->mutable_synced_details() = sync_root_metadata.details(); | 172 *sync_root_tracker->mutable_synced_details() = sync_root_metadata.details(); |
| 173 return sync_root_tracker.Pass(); | 173 return sync_root_tracker.Pass(); |
| 174 } | 174 } |
| 175 | 175 |
| 176 scoped_ptr<FileTracker> CreateInitialAppRootTracker( | 176 scoped_ptr<FileTracker> CreateInitialAppRootTracker( |
| 177 int64 tracker_id, | 177 int64_t tracker_id, |
| 178 int64 parent_tracker_id, | 178 int64_t parent_tracker_id, |
| 179 const FileMetadata& app_root_metadata) { | 179 const FileMetadata& app_root_metadata) { |
| 180 scoped_ptr<FileTracker> app_root_tracker(new FileTracker); | 180 scoped_ptr<FileTracker> app_root_tracker(new FileTracker); |
| 181 app_root_tracker->set_tracker_id(tracker_id); | 181 app_root_tracker->set_tracker_id(tracker_id); |
| 182 app_root_tracker->set_parent_tracker_id(parent_tracker_id); | 182 app_root_tracker->set_parent_tracker_id(parent_tracker_id); |
| 183 app_root_tracker->set_file_id(app_root_metadata.file_id()); | 183 app_root_tracker->set_file_id(app_root_metadata.file_id()); |
| 184 app_root_tracker->set_tracker_kind(TRACKER_KIND_REGULAR); | 184 app_root_tracker->set_tracker_kind(TRACKER_KIND_REGULAR); |
| 185 app_root_tracker->set_dirty(false); | 185 app_root_tracker->set_dirty(false); |
| 186 app_root_tracker->set_active(false); | 186 app_root_tracker->set_active(false); |
| 187 app_root_tracker->set_needs_folder_listing(false); | 187 app_root_tracker->set_needs_folder_listing(false); |
| 188 *app_root_tracker->mutable_synced_details() = app_root_metadata.details(); | 188 *app_root_tracker->mutable_synced_details() = app_root_metadata.details(); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 *created = IsDatabaseEmpty(db_out->get()); | 235 *created = IsDatabaseEmpty(db_out->get()); |
| 236 return status; | 236 return status; |
| 237 } | 237 } |
| 238 | 238 |
| 239 SyncStatusCode MigrateDatabaseIfNeeded(LevelDBWrapper* db) { | 239 SyncStatusCode MigrateDatabaseIfNeeded(LevelDBWrapper* db) { |
| 240 // See metadata_database_index.cc for the database schema. | 240 // See metadata_database_index.cc for the database schema. |
| 241 base::ThreadRestrictions::AssertIOAllowed(); | 241 base::ThreadRestrictions::AssertIOAllowed(); |
| 242 DCHECK(db); | 242 DCHECK(db); |
| 243 std::string value; | 243 std::string value; |
| 244 leveldb::Status status = db->Get(kDatabaseVersionKey, &value); | 244 leveldb::Status status = db->Get(kDatabaseVersionKey, &value); |
| 245 int64 version = 0; | 245 int64_t version = 0; |
| 246 if (status.ok()) { | 246 if (status.ok()) { |
| 247 if (!base::StringToInt64(value, &version)) | 247 if (!base::StringToInt64(value, &version)) |
| 248 return SYNC_DATABASE_ERROR_FAILED; | 248 return SYNC_DATABASE_ERROR_FAILED; |
| 249 } else { | 249 } else { |
| 250 if (!status.IsNotFound()) | 250 if (!status.IsNotFound()) |
| 251 return SYNC_DATABASE_ERROR_FAILED; | 251 return SYNC_DATABASE_ERROR_FAILED; |
| 252 } | 252 } |
| 253 | 253 |
| 254 switch (version) { | 254 switch (version) { |
| 255 case 0: | 255 case 0: |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 itr != trackers.end(); ++itr) { | 287 itr != trackers.end(); ++itr) { |
| 288 scoped_ptr<FileTracker> tracker(new FileTracker); | 288 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 289 index->GetFileTracker(*itr, tracker.get()); | 289 index->GetFileTracker(*itr, tracker.get()); |
| 290 if (tracker->dirty()) | 290 if (tracker->dirty()) |
| 291 continue; | 291 continue; |
| 292 tracker->set_dirty(true); | 292 tracker->set_dirty(true); |
| 293 index->StoreFileTracker(tracker.Pass()); | 293 index->StoreFileTracker(tracker.Pass()); |
| 294 } | 294 } |
| 295 } | 295 } |
| 296 | 296 |
| 297 void MarkTrackersDirtyByPath(int64 parent_tracker_id, | 297 void MarkTrackersDirtyByPath(int64_t parent_tracker_id, |
| 298 const std::string& title, | 298 const std::string& title, |
| 299 MetadataDatabaseIndexInterface* index) { | 299 MetadataDatabaseIndexInterface* index) { |
| 300 if (parent_tracker_id == kInvalidTrackerID || title.empty()) | 300 if (parent_tracker_id == kInvalidTrackerID || title.empty()) |
| 301 return; | 301 return; |
| 302 MarkTrackerSetDirty( | 302 MarkTrackerSetDirty( |
| 303 index->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title), | 303 index->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title), |
| 304 index); | 304 index); |
| 305 } | 305 } |
| 306 | 306 |
| 307 void MarkTrackersDirtyByFileID(const std::string& file_id, | 307 void MarkTrackersDirtyByFileID(const std::string& file_id, |
| 308 MetadataDatabaseIndexInterface* index) { | 308 MetadataDatabaseIndexInterface* index) { |
| 309 MarkTrackerSetDirty(index->GetFileTrackerIDsByFileID(file_id), index); | 309 MarkTrackerSetDirty(index->GetFileTrackerIDsByFileID(file_id), index); |
| 310 } | 310 } |
| 311 | 311 |
| 312 void MarkTrackersDirtyRecursively(int64 root_tracker_id, | 312 void MarkTrackersDirtyRecursively(int64_t root_tracker_id, |
| 313 MetadataDatabaseIndexInterface* index) { | 313 MetadataDatabaseIndexInterface* index) { |
| 314 std::vector<int64> stack; | 314 std::vector<int64_t> stack; |
| 315 stack.push_back(root_tracker_id); | 315 stack.push_back(root_tracker_id); |
| 316 while (!stack.empty()) { | 316 while (!stack.empty()) { |
| 317 int64 tracker_id = stack.back(); | 317 int64_t tracker_id = stack.back(); |
| 318 stack.pop_back(); | 318 stack.pop_back(); |
| 319 AppendContents(index->GetFileTrackerIDsByParent(tracker_id), &stack); | 319 AppendContents(index->GetFileTrackerIDsByParent(tracker_id), &stack); |
| 320 | 320 |
| 321 scoped_ptr<FileTracker> tracker(new FileTracker); | 321 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 322 index->GetFileTracker(tracker_id, tracker.get()); | 322 index->GetFileTracker(tracker_id, tracker.get()); |
| 323 tracker->set_dirty(true); | 323 tracker->set_dirty(true); |
| 324 | 324 |
| 325 index->StoreFileTracker(tracker.Pass()); | 325 index->StoreFileTracker(tracker.Pass()); |
| 326 } | 326 } |
| 327 } | 327 } |
| 328 | 328 |
| 329 void RemoveAllDescendantTrackers(int64 root_tracker_id, | 329 void RemoveAllDescendantTrackers(int64_t root_tracker_id, |
| 330 MetadataDatabaseIndexInterface* index) { | 330 MetadataDatabaseIndexInterface* index) { |
| 331 std::vector<int64> pending_trackers; | 331 std::vector<int64_t> pending_trackers; |
| 332 AppendContents(index->GetFileTrackerIDsByParent(root_tracker_id), | 332 AppendContents(index->GetFileTrackerIDsByParent(root_tracker_id), |
| 333 &pending_trackers); | 333 &pending_trackers); |
| 334 | 334 |
| 335 std::vector<int64> to_be_removed; | 335 std::vector<int64_t> to_be_removed; |
| 336 | 336 |
| 337 // List trackers to remove. | 337 // List trackers to remove. |
| 338 while (!pending_trackers.empty()) { | 338 while (!pending_trackers.empty()) { |
| 339 int64 tracker_id = pending_trackers.back(); | 339 int64_t tracker_id = pending_trackers.back(); |
| 340 pending_trackers.pop_back(); | 340 pending_trackers.pop_back(); |
| 341 AppendContents(index->GetFileTrackerIDsByParent(tracker_id), | 341 AppendContents(index->GetFileTrackerIDsByParent(tracker_id), |
| 342 &pending_trackers); | 342 &pending_trackers); |
| 343 to_be_removed.push_back(tracker_id); | 343 to_be_removed.push_back(tracker_id); |
| 344 } | 344 } |
| 345 | 345 |
| 346 // Remove trackers in the reversed order. | 346 // Remove trackers in the reversed order. |
| 347 base::hash_set<std::string> affected_file_ids; | 347 base::hash_set<std::string> affected_file_ids; |
| 348 for (std::vector<int64>::reverse_iterator itr = to_be_removed.rbegin(); | 348 for (std::vector<int64_t>::reverse_iterator itr = to_be_removed.rbegin(); |
| 349 itr != to_be_removed.rend(); ++itr) { | 349 itr != to_be_removed.rend(); ++itr) { |
| 350 FileTracker tracker; | 350 FileTracker tracker; |
| 351 index->GetFileTracker(*itr, &tracker); | 351 index->GetFileTracker(*itr, &tracker); |
| 352 affected_file_ids.insert(tracker.file_id()); | 352 affected_file_ids.insert(tracker.file_id()); |
| 353 index->RemoveFileTracker(*itr); | 353 index->RemoveFileTracker(*itr); |
| 354 } | 354 } |
| 355 | 355 |
| 356 for (base::hash_set<std::string>::iterator itr = affected_file_ids.begin(); | 356 for (base::hash_set<std::string>::iterator itr = affected_file_ids.begin(); |
| 357 itr != affected_file_ids.end(); ++itr) { | 357 itr != affected_file_ids.end(); ++itr) { |
| 358 TrackerIDSet trackers = index->GetFileTrackerIDsByFileID(*itr); | 358 TrackerIDSet trackers = index->GetFileTrackerIDsByFileID(*itr); |
| 359 if (trackers.empty()) { | 359 if (trackers.empty()) { |
| 360 // Remove metadata that no longer has any tracker. | 360 // Remove metadata that no longer has any tracker. |
| 361 index->RemoveFileMetadata(*itr); | 361 index->RemoveFileMetadata(*itr); |
| 362 } else { | 362 } else { |
| 363 MarkTrackerSetDirty(trackers, index); | 363 MarkTrackerSetDirty(trackers, index); |
| 364 } | 364 } |
| 365 } | 365 } |
| 366 } | 366 } |
| 367 | 367 |
| 368 bool FilterFileTrackersByParent( | 368 bool FilterFileTrackersByParent(const MetadataDatabaseIndexInterface* index, |
| 369 const MetadataDatabaseIndexInterface* index, | 369 const TrackerIDSet& trackers, |
| 370 const TrackerIDSet& trackers, | 370 int64_t parent_tracker_id, |
| 371 int64 parent_tracker_id, | 371 FileTracker* tracker_out) { |
| 372 FileTracker* tracker_out) { | |
| 373 FileTracker tracker; | 372 FileTracker tracker; |
| 374 for (TrackerIDSet::const_iterator itr = trackers.begin(); | 373 for (TrackerIDSet::const_iterator itr = trackers.begin(); |
| 375 itr != trackers.end(); ++itr) { | 374 itr != trackers.end(); ++itr) { |
| 376 if (!index->GetFileTracker(*itr, &tracker)) { | 375 if (!index->GetFileTracker(*itr, &tracker)) { |
| 377 NOTREACHED(); | 376 NOTREACHED(); |
| 378 continue; | 377 continue; |
| 379 } | 378 } |
| 380 | 379 |
| 381 if (tracker.parent_tracker_id() == parent_tracker_id) { | 380 if (tracker.parent_tracker_id() == parent_tracker_id) { |
| 382 if (tracker_out) | 381 if (tracker_out) |
| 383 tracker_out->CopyFrom(tracker); | 382 tracker_out->CopyFrom(tracker); |
| 384 return true; | 383 return true; |
| 385 } | 384 } |
| 386 } | 385 } |
| 387 return false; | 386 return false; |
| 388 } | 387 } |
| 389 | 388 |
| 390 bool FilterFileTrackersByParentAndTitle( | 389 bool FilterFileTrackersByParentAndTitle( |
| 391 const MetadataDatabaseIndexInterface* index, | 390 const MetadataDatabaseIndexInterface* index, |
| 392 const TrackerIDSet& trackers, | 391 const TrackerIDSet& trackers, |
| 393 int64 parent_tracker_id, | 392 int64_t parent_tracker_id, |
| 394 const std::string& title, | 393 const std::string& title, |
| 395 FileTracker* result) { | 394 FileTracker* result) { |
| 396 bool found = false; | 395 bool found = false; |
| 397 for (TrackerIDSet::const_iterator itr = trackers.begin(); | 396 for (TrackerIDSet::const_iterator itr = trackers.begin(); |
| 398 itr != trackers.end(); ++itr) { | 397 itr != trackers.end(); ++itr) { |
| 399 FileTracker tracker; | 398 FileTracker tracker; |
| 400 if (!index->GetFileTracker(*itr, &tracker)) { | 399 if (!index->GetFileTracker(*itr, &tracker)) { |
| 401 NOTREACHED(); | 400 NOTREACHED(); |
| 402 continue; | 401 continue; |
| 403 } | 402 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 return false; | 444 return false; |
| 446 } | 445 } |
| 447 | 446 |
| 448 enum DirtyingOption { | 447 enum DirtyingOption { |
| 449 MARK_NOTHING_DIRTY = 0, | 448 MARK_NOTHING_DIRTY = 0, |
| 450 MARK_ITSELF_DIRTY = 1 << 0, | 449 MARK_ITSELF_DIRTY = 1 << 0, |
| 451 MARK_SAME_FILE_ID_TRACKERS_DIRTY = 1 << 1, | 450 MARK_SAME_FILE_ID_TRACKERS_DIRTY = 1 << 1, |
| 452 MARK_SAME_PATH_TRACKERS_DIRTY = 1 << 2, | 451 MARK_SAME_PATH_TRACKERS_DIRTY = 1 << 2, |
| 453 }; | 452 }; |
| 454 | 453 |
| 455 void ActivateFileTracker(int64 tracker_id, | 454 void ActivateFileTracker(int64_t tracker_id, |
| 456 int dirtying_options, | 455 int dirtying_options, |
| 457 MetadataDatabaseIndexInterface* index) { | 456 MetadataDatabaseIndexInterface* index) { |
| 458 DCHECK(dirtying_options == MARK_NOTHING_DIRTY || | 457 DCHECK(dirtying_options == MARK_NOTHING_DIRTY || |
| 459 dirtying_options == MARK_ITSELF_DIRTY); | 458 dirtying_options == MARK_ITSELF_DIRTY); |
| 460 | 459 |
| 461 scoped_ptr<FileTracker> tracker(new FileTracker); | 460 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 462 index->GetFileTracker(tracker_id, tracker.get()); | 461 index->GetFileTracker(tracker_id, tracker.get()); |
| 463 tracker->set_active(true); | 462 tracker->set_active(true); |
| 464 if (dirtying_options & MARK_ITSELF_DIRTY) { | 463 if (dirtying_options & MARK_ITSELF_DIRTY) { |
| 465 tracker->set_dirty(true); | 464 tracker->set_dirty(true); |
| 466 tracker->set_needs_folder_listing( | 465 tracker->set_needs_folder_listing( |
| 467 tracker->has_synced_details() && | 466 tracker->has_synced_details() && |
| 468 tracker->synced_details().file_kind() == FILE_KIND_FOLDER); | 467 tracker->synced_details().file_kind() == FILE_KIND_FOLDER); |
| 469 } else { | 468 } else { |
| 470 tracker->set_dirty(false); | 469 tracker->set_dirty(false); |
| 471 tracker->set_needs_folder_listing(false); | 470 tracker->set_needs_folder_listing(false); |
| 472 } | 471 } |
| 473 | 472 |
| 474 index->StoreFileTracker(tracker.Pass()); | 473 index->StoreFileTracker(tracker.Pass()); |
| 475 } | 474 } |
| 476 | 475 |
| 477 void DeactivateFileTracker(int64 tracker_id, | 476 void DeactivateFileTracker(int64_t tracker_id, |
| 478 int dirtying_options, | 477 int dirtying_options, |
| 479 MetadataDatabaseIndexInterface* index) { | 478 MetadataDatabaseIndexInterface* index) { |
| 480 RemoveAllDescendantTrackers(tracker_id, index); | 479 RemoveAllDescendantTrackers(tracker_id, index); |
| 481 | 480 |
| 482 scoped_ptr<FileTracker> tracker(new FileTracker); | 481 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 483 index->GetFileTracker(tracker_id, tracker.get()); | 482 index->GetFileTracker(tracker_id, tracker.get()); |
| 484 | 483 |
| 485 if (dirtying_options & MARK_SAME_FILE_ID_TRACKERS_DIRTY) | 484 if (dirtying_options & MARK_SAME_FILE_ID_TRACKERS_DIRTY) |
| 486 MarkTrackersDirtyByFileID(tracker->file_id(), index); | 485 MarkTrackersDirtyByFileID(tracker->file_id(), index); |
| 487 if (dirtying_options & MARK_SAME_PATH_TRACKERS_DIRTY) { | 486 if (dirtying_options & MARK_SAME_PATH_TRACKERS_DIRTY) { |
| 488 MarkTrackersDirtyByPath(tracker->parent_tracker_id(), | 487 MarkTrackersDirtyByPath(tracker->parent_tracker_id(), |
| 489 GetTrackerTitle(*tracker), index); | 488 GetTrackerTitle(*tracker), index); |
| 490 } | 489 } |
| 491 | 490 |
| 492 tracker->set_dirty(dirtying_options & MARK_ITSELF_DIRTY); | 491 tracker->set_dirty(dirtying_options & MARK_ITSELF_DIRTY); |
| 493 tracker->set_active(false); | 492 tracker->set_active(false); |
| 494 index->StoreFileTracker(tracker.Pass()); | 493 index->StoreFileTracker(tracker.Pass()); |
| 495 } | 494 } |
| 496 | 495 |
| 497 void RemoveFileTracker(int64 tracker_id, | 496 void RemoveFileTracker(int64_t tracker_id, |
| 498 int dirtying_options, | 497 int dirtying_options, |
| 499 MetadataDatabaseIndexInterface* index) { | 498 MetadataDatabaseIndexInterface* index) { |
| 500 DCHECK(!(dirtying_options & MARK_ITSELF_DIRTY)); | 499 DCHECK(!(dirtying_options & MARK_ITSELF_DIRTY)); |
| 501 | 500 |
| 502 FileTracker tracker; | 501 FileTracker tracker; |
| 503 if (!index->GetFileTracker(tracker_id, &tracker)) | 502 if (!index->GetFileTracker(tracker_id, &tracker)) |
| 504 return; | 503 return; |
| 505 | 504 |
| 506 std::string file_id = tracker.file_id(); | 505 std::string file_id = tracker.file_id(); |
| 507 int64 parent_tracker_id = tracker.parent_tracker_id(); | 506 int64_t parent_tracker_id = tracker.parent_tracker_id(); |
| 508 std::string title = GetTrackerTitle(tracker); | 507 std::string title = GetTrackerTitle(tracker); |
| 509 | 508 |
| 510 RemoveAllDescendantTrackers(tracker_id, index); | 509 RemoveAllDescendantTrackers(tracker_id, index); |
| 511 index->RemoveFileTracker(tracker_id); | 510 index->RemoveFileTracker(tracker_id); |
| 512 | 511 |
| 513 if (dirtying_options & MARK_SAME_FILE_ID_TRACKERS_DIRTY) | 512 if (dirtying_options & MARK_SAME_FILE_ID_TRACKERS_DIRTY) |
| 514 MarkTrackersDirtyByFileID(file_id, index); | 513 MarkTrackersDirtyByFileID(file_id, index); |
| 515 if (dirtying_options & MARK_SAME_PATH_TRACKERS_DIRTY) | 514 if (dirtying_options & MARK_SAME_PATH_TRACKERS_DIRTY) |
| 516 MarkTrackersDirtyByPath(parent_tracker_id, title, index); | 515 MarkTrackersDirtyByPath(parent_tracker_id, title, index); |
| 517 | 516 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 588 void MetadataDatabase::ClearDatabase( | 587 void MetadataDatabase::ClearDatabase( |
| 589 scoped_ptr<MetadataDatabase> metadata_database) { | 588 scoped_ptr<MetadataDatabase> metadata_database) { |
| 590 DCHECK(metadata_database); | 589 DCHECK(metadata_database); |
| 591 base::FilePath database_path = metadata_database->database_path_; | 590 base::FilePath database_path = metadata_database->database_path_; |
| 592 DCHECK(!database_path.empty()); | 591 DCHECK(!database_path.empty()); |
| 593 metadata_database.reset(); | 592 metadata_database.reset(); |
| 594 | 593 |
| 595 base::DeleteFile(database_path, true /* recursive */); | 594 base::DeleteFile(database_path, true /* recursive */); |
| 596 } | 595 } |
| 597 | 596 |
| 598 int64 MetadataDatabase::GetLargestFetchedChangeID() const { | 597 int64_t MetadataDatabase::GetLargestFetchedChangeID() const { |
| 599 return index_->GetLargestChangeID(); | 598 return index_->GetLargestChangeID(); |
| 600 } | 599 } |
| 601 | 600 |
| 602 int64 MetadataDatabase::GetSyncRootTrackerID() const { | 601 int64_t MetadataDatabase::GetSyncRootTrackerID() const { |
| 603 return index_->GetSyncRootTrackerID(); | 602 return index_->GetSyncRootTrackerID(); |
| 604 } | 603 } |
| 605 | 604 |
| 606 int64 MetadataDatabase::GetLargestKnownChangeID() const { | 605 int64_t MetadataDatabase::GetLargestKnownChangeID() const { |
| 607 DCHECK_LE(GetLargestFetchedChangeID(), largest_known_change_id_); | 606 DCHECK_LE(GetLargestFetchedChangeID(), largest_known_change_id_); |
| 608 return largest_known_change_id_; | 607 return largest_known_change_id_; |
| 609 } | 608 } |
| 610 | 609 |
| 611 void MetadataDatabase::UpdateLargestKnownChangeID(int64 change_id) { | 610 void MetadataDatabase::UpdateLargestKnownChangeID(int64_t change_id) { |
| 612 if (largest_known_change_id_ < change_id) | 611 if (largest_known_change_id_ < change_id) |
| 613 largest_known_change_id_ = change_id; | 612 largest_known_change_id_ = change_id; |
| 614 } | 613 } |
| 615 | 614 |
| 616 bool MetadataDatabase::NeedsSyncRootRevalidation() const { | 615 bool MetadataDatabase::NeedsSyncRootRevalidation() const { |
| 617 return !index_->IsSyncRootRevalidated(); | 616 return !index_->IsSyncRootRevalidated(); |
| 618 } | 617 } |
| 619 | 618 |
| 620 bool MetadataDatabase::HasSyncRoot() const { | 619 bool MetadataDatabase::HasSyncRoot() const { |
| 621 return index_->GetSyncRootTrackerID() != kInvalidTrackerID; | 620 return index_->GetSyncRootTrackerID() != kInvalidTrackerID; |
| 622 } | 621 } |
| 623 | 622 |
| 624 SyncStatusCode MetadataDatabase::PopulateInitialData( | 623 SyncStatusCode MetadataDatabase::PopulateInitialData( |
| 625 int64 largest_change_id, | 624 int64_t largest_change_id, |
| 626 const google_apis::FileResource& sync_root_folder, | 625 const google_apis::FileResource& sync_root_folder, |
| 627 const ScopedVector<google_apis::FileResource>& app_root_folders) { | 626 const ScopedVector<google_apis::FileResource>& app_root_folders) { |
| 628 index_->SetLargestChangeID(largest_change_id); | 627 index_->SetLargestChangeID(largest_change_id); |
| 629 UpdateLargestKnownChangeID(largest_change_id); | 628 UpdateLargestKnownChangeID(largest_change_id); |
| 630 | 629 |
| 631 AttachSyncRoot(sync_root_folder); | 630 AttachSyncRoot(sync_root_folder); |
| 632 for (size_t i = 0; i < app_root_folders.size(); ++i) | 631 for (size_t i = 0; i < app_root_folders.size(); ++i) |
| 633 AttachInitialAppRoot(*app_root_folders[i]); | 632 AttachInitialAppRoot(*app_root_folders[i]); |
| 634 | 633 |
| 635 if (NeedsSyncRootRevalidation()) { | 634 if (NeedsSyncRootRevalidation()) { |
| 636 index_->RemoveUnreachableItems(); | 635 index_->RemoveUnreachableItems(); |
| 637 index_->SetSyncRootRevalidated(); | 636 index_->SetSyncRootRevalidated(); |
| 638 } | 637 } |
| 639 | 638 |
| 640 return WriteToDatabase(); | 639 return WriteToDatabase(); |
| 641 } | 640 } |
| 642 | 641 |
| 643 bool MetadataDatabase::IsAppEnabled(const std::string& app_id) const { | 642 bool MetadataDatabase::IsAppEnabled(const std::string& app_id) const { |
| 644 int64 tracker_id = index_->GetAppRootTracker(app_id); | 643 int64_t tracker_id = index_->GetAppRootTracker(app_id); |
| 645 if (tracker_id == kInvalidTrackerID) | 644 if (tracker_id == kInvalidTrackerID) |
| 646 return false; | 645 return false; |
| 647 | 646 |
| 648 FileTracker tracker; | 647 FileTracker tracker; |
| 649 if (!index_->GetFileTracker(tracker_id, &tracker)) | 648 if (!index_->GetFileTracker(tracker_id, &tracker)) |
| 650 return false; | 649 return false; |
| 651 return tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; | 650 return tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; |
| 652 } | 651 } |
| 653 | 652 |
| 654 SyncStatusCode MetadataDatabase::RegisterApp(const std::string& app_id, | 653 SyncStatusCode MetadataDatabase::RegisterApp(const std::string& app_id, |
| 655 const std::string& folder_id) { | 654 const std::string& folder_id) { |
| 656 if (index_->GetAppRootTracker(app_id)) { | 655 if (index_->GetAppRootTracker(app_id)) { |
| 657 // The app-root is already registered. | 656 // The app-root is already registered. |
| 658 return SYNC_STATUS_OK; | 657 return SYNC_STATUS_OK; |
| 659 } | 658 } |
| 660 | 659 |
| 661 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(folder_id); | 660 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(folder_id); |
| 662 if (trackers.empty()) { | 661 if (trackers.empty()) { |
| 663 return SYNC_DATABASE_ERROR_NOT_FOUND; | 662 return SYNC_DATABASE_ERROR_NOT_FOUND; |
| 664 } | 663 } |
| 665 | 664 |
| 666 if (trackers.has_active()) { | 665 if (trackers.has_active()) { |
| 667 // The folder is tracked by another tracker. | 666 // The folder is tracked by another tracker. |
| 668 util::Log(logging::LOG_WARNING, FROM_HERE, | 667 util::Log(logging::LOG_WARNING, FROM_HERE, |
| 669 "Failed to register App for %s", app_id.c_str()); | 668 "Failed to register App for %s", app_id.c_str()); |
| 670 return SYNC_STATUS_HAS_CONFLICT; | 669 return SYNC_STATUS_HAS_CONFLICT; |
| 671 } | 670 } |
| 672 | 671 |
| 673 int64 sync_root_tracker_id = index_->GetSyncRootTrackerID(); | 672 int64_t sync_root_tracker_id = index_->GetSyncRootTrackerID(); |
| 674 if (!sync_root_tracker_id) { | 673 if (!sync_root_tracker_id) { |
| 675 util::Log(logging::LOG_WARNING, FROM_HERE, | 674 util::Log(logging::LOG_WARNING, FROM_HERE, |
| 676 "Sync-root needs to be set up before registering app-root"); | 675 "Sync-root needs to be set up before registering app-root"); |
| 677 return SYNC_DATABASE_ERROR_NOT_FOUND; | 676 return SYNC_DATABASE_ERROR_NOT_FOUND; |
| 678 } | 677 } |
| 679 | 678 |
| 680 scoped_ptr<FileTracker> tracker(new FileTracker); | 679 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 681 if (!FilterFileTrackersByParent(index_.get(), trackers, | 680 if (!FilterFileTrackersByParent(index_.get(), trackers, |
| 682 sync_root_tracker_id, tracker.get())) { | 681 sync_root_tracker_id, tracker.get())) { |
| 683 return SYNC_DATABASE_ERROR_NOT_FOUND; | 682 return SYNC_DATABASE_ERROR_NOT_FOUND; |
| 684 } | 683 } |
| 685 | 684 |
| 686 tracker->set_app_id(app_id); | 685 tracker->set_app_id(app_id); |
| 687 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); | 686 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); |
| 688 tracker->set_active(true); | 687 tracker->set_active(true); |
| 689 tracker->set_needs_folder_listing(true); | 688 tracker->set_needs_folder_listing(true); |
| 690 tracker->set_dirty(true); | 689 tracker->set_dirty(true); |
| 691 | 690 |
| 692 index_->StoreFileTracker(tracker.Pass()); | 691 index_->StoreFileTracker(tracker.Pass()); |
| 693 return WriteToDatabase(); | 692 return WriteToDatabase(); |
| 694 } | 693 } |
| 695 | 694 |
| 696 SyncStatusCode MetadataDatabase::DisableApp(const std::string& app_id) { | 695 SyncStatusCode MetadataDatabase::DisableApp(const std::string& app_id) { |
| 697 int64 tracker_id = index_->GetAppRootTracker(app_id); | 696 int64_t tracker_id = index_->GetAppRootTracker(app_id); |
| 698 scoped_ptr<FileTracker> tracker(new FileTracker); | 697 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 699 if (!index_->GetFileTracker(tracker_id, tracker.get())) { | 698 if (!index_->GetFileTracker(tracker_id, tracker.get())) { |
| 700 return SYNC_DATABASE_ERROR_NOT_FOUND; | 699 return SYNC_DATABASE_ERROR_NOT_FOUND; |
| 701 } | 700 } |
| 702 | 701 |
| 703 if (tracker->tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT) { | 702 if (tracker->tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT) { |
| 704 return SYNC_STATUS_OK; | 703 return SYNC_STATUS_OK; |
| 705 } | 704 } |
| 706 | 705 |
| 707 DCHECK_EQ(TRACKER_KIND_APP_ROOT, tracker->tracker_kind()); | 706 DCHECK_EQ(TRACKER_KIND_APP_ROOT, tracker->tracker_kind()); |
| 708 DCHECK(tracker->active()); | 707 DCHECK(tracker->active()); |
| 709 | 708 |
| 710 // Keep the app-root tracker active (but change the tracker_kind) so that | 709 // Keep the app-root tracker active (but change the tracker_kind) so that |
| 711 // other conflicting trackers won't become active. | 710 // other conflicting trackers won't become active. |
| 712 tracker->set_tracker_kind(TRACKER_KIND_DISABLED_APP_ROOT); | 711 tracker->set_tracker_kind(TRACKER_KIND_DISABLED_APP_ROOT); |
| 713 | 712 |
| 714 index_->StoreFileTracker(tracker.Pass()); | 713 index_->StoreFileTracker(tracker.Pass()); |
| 715 return WriteToDatabase(); | 714 return WriteToDatabase(); |
| 716 } | 715 } |
| 717 | 716 |
| 718 SyncStatusCode MetadataDatabase::EnableApp(const std::string& app_id) { | 717 SyncStatusCode MetadataDatabase::EnableApp(const std::string& app_id) { |
| 719 int64 tracker_id = index_->GetAppRootTracker(app_id); | 718 int64_t tracker_id = index_->GetAppRootTracker(app_id); |
| 720 scoped_ptr<FileTracker> tracker(new FileTracker); | 719 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 721 if (!index_->GetFileTracker(tracker_id, tracker.get())) { | 720 if (!index_->GetFileTracker(tracker_id, tracker.get())) { |
| 722 return SYNC_DATABASE_ERROR_NOT_FOUND; | 721 return SYNC_DATABASE_ERROR_NOT_FOUND; |
| 723 } | 722 } |
| 724 | 723 |
| 725 if (tracker->tracker_kind() == TRACKER_KIND_APP_ROOT) { | 724 if (tracker->tracker_kind() == TRACKER_KIND_APP_ROOT) { |
| 726 return SYNC_STATUS_OK; | 725 return SYNC_STATUS_OK; |
| 727 } | 726 } |
| 728 | 727 |
| 729 DCHECK_EQ(TRACKER_KIND_DISABLED_APP_ROOT, tracker->tracker_kind()); | 728 DCHECK_EQ(TRACKER_KIND_DISABLED_APP_ROOT, tracker->tracker_kind()); |
| 730 DCHECK(tracker->active()); | 729 DCHECK(tracker->active()); |
| 731 | 730 |
| 732 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); | 731 tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); |
| 733 index_->StoreFileTracker(tracker.Pass()); | 732 index_->StoreFileTracker(tracker.Pass()); |
| 734 | 733 |
| 735 MarkTrackersDirtyRecursively(tracker_id, index_.get()); | 734 MarkTrackersDirtyRecursively(tracker_id, index_.get()); |
| 736 return WriteToDatabase(); | 735 return WriteToDatabase(); |
| 737 } | 736 } |
| 738 | 737 |
| 739 SyncStatusCode MetadataDatabase::UnregisterApp(const std::string& app_id) { | 738 SyncStatusCode MetadataDatabase::UnregisterApp(const std::string& app_id) { |
| 740 int64 tracker_id = index_->GetAppRootTracker(app_id); | 739 int64_t tracker_id = index_->GetAppRootTracker(app_id); |
| 741 scoped_ptr<FileTracker> tracker(new FileTracker); | 740 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 742 if (!index_->GetFileTracker(tracker_id, tracker.get()) || | 741 if (!index_->GetFileTracker(tracker_id, tracker.get()) || |
| 743 tracker->tracker_kind() == TRACKER_KIND_REGULAR) { | 742 tracker->tracker_kind() == TRACKER_KIND_REGULAR) { |
| 744 return SYNC_STATUS_OK; | 743 return SYNC_STATUS_OK; |
| 745 } | 744 } |
| 746 | 745 |
| 747 RemoveAllDescendantTrackers(tracker_id, index_.get()); | 746 RemoveAllDescendantTrackers(tracker_id, index_.get()); |
| 748 | 747 |
| 749 tracker->clear_app_id(); | 748 tracker->clear_app_id(); |
| 750 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); | 749 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); |
| 751 tracker->set_active(false); | 750 tracker->set_active(false); |
| 752 tracker->set_dirty(true); | 751 tracker->set_dirty(true); |
| 753 | 752 |
| 754 index_->StoreFileTracker(tracker.Pass()); | 753 index_->StoreFileTracker(tracker.Pass()); |
| 755 return WriteToDatabase(); | 754 return WriteToDatabase(); |
| 756 } | 755 } |
| 757 | 756 |
| 758 bool MetadataDatabase::FindAppRootTracker(const std::string& app_id, | 757 bool MetadataDatabase::FindAppRootTracker(const std::string& app_id, |
| 759 FileTracker* tracker_out) const { | 758 FileTracker* tracker_out) const { |
| 760 int64 app_root_tracker_id = index_->GetAppRootTracker(app_id); | 759 int64_t app_root_tracker_id = index_->GetAppRootTracker(app_id); |
| 761 if (!app_root_tracker_id) | 760 if (!app_root_tracker_id) |
| 762 return false; | 761 return false; |
| 763 | 762 |
| 764 if (tracker_out && | 763 if (tracker_out && |
| 765 !index_->GetFileTracker(app_root_tracker_id, tracker_out)) { | 764 !index_->GetFileTracker(app_root_tracker_id, tracker_out)) { |
| 766 NOTREACHED(); | 765 NOTREACHED(); |
| 767 return false; | 766 return false; |
| 768 } | 767 } |
| 769 | 768 |
| 770 return true; | 769 return true; |
| 771 } | 770 } |
| 772 | 771 |
| 773 bool MetadataDatabase::FindFileByFileID(const std::string& file_id, | 772 bool MetadataDatabase::FindFileByFileID(const std::string& file_id, |
| 774 FileMetadata* metadata_out) const { | 773 FileMetadata* metadata_out) const { |
| 775 return index_->GetFileMetadata(file_id, metadata_out); | 774 return index_->GetFileMetadata(file_id, metadata_out); |
| 776 } | 775 } |
| 777 | 776 |
| 778 bool MetadataDatabase::FindTrackersByFileID(const std::string& file_id, | 777 bool MetadataDatabase::FindTrackersByFileID(const std::string& file_id, |
| 779 TrackerIDSet* trackers_out) const { | 778 TrackerIDSet* trackers_out) const { |
| 780 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); | 779 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); |
| 781 if (trackers.empty()) | 780 if (trackers.empty()) |
| 782 return false; | 781 return false; |
| 783 | 782 |
| 784 if (trackers_out) | 783 if (trackers_out) |
| 785 std::swap(trackers, *trackers_out); | 784 std::swap(trackers, *trackers_out); |
| 786 return true; | 785 return true; |
| 787 } | 786 } |
| 788 | 787 |
| 789 bool MetadataDatabase::FindTrackersByParentAndTitle( | 788 bool MetadataDatabase::FindTrackersByParentAndTitle( |
| 790 int64 parent_tracker_id, | 789 int64_t parent_tracker_id, |
| 791 const std::string& title, | 790 const std::string& title, |
| 792 TrackerIDSet* trackers_out) const { | 791 TrackerIDSet* trackers_out) const { |
| 793 TrackerIDSet trackers = | 792 TrackerIDSet trackers = |
| 794 index_->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title); | 793 index_->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title); |
| 795 if (trackers.empty()) | 794 if (trackers.empty()) |
| 796 return false; | 795 return false; |
| 797 | 796 |
| 798 if (trackers_out) | 797 if (trackers_out) |
| 799 std::swap(trackers, *trackers_out); | 798 std::swap(trackers, *trackers_out); |
| 800 return true; | 799 return true; |
| 801 } | 800 } |
| 802 | 801 |
| 803 bool MetadataDatabase::FindTrackerByTrackerID(int64 tracker_id, | 802 bool MetadataDatabase::FindTrackerByTrackerID(int64_t tracker_id, |
| 804 FileTracker* tracker_out) const { | 803 FileTracker* tracker_out) const { |
| 805 return index_->GetFileTracker(tracker_id, tracker_out); | 804 return index_->GetFileTracker(tracker_id, tracker_out); |
| 806 } | 805 } |
| 807 | 806 |
| 808 bool MetadataDatabase::BuildPathForTracker(int64 tracker_id, | 807 bool MetadataDatabase::BuildPathForTracker(int64_t tracker_id, |
| 809 base::FilePath* path) const { | 808 base::FilePath* path) const { |
| 810 FileTracker current; | 809 FileTracker current; |
| 811 if (!FindTrackerByTrackerID(tracker_id, ¤t) || !current.active()) | 810 if (!FindTrackerByTrackerID(tracker_id, ¤t) || !current.active()) |
| 812 return false; | 811 return false; |
| 813 | 812 |
| 814 std::vector<base::FilePath> components; | 813 std::vector<base::FilePath> components; |
| 815 while (!IsAppRoot(current)) { | 814 while (!IsAppRoot(current)) { |
| 816 std::string title = GetTrackerTitle(current); | 815 std::string title = GetTrackerTitle(current); |
| 817 if (title.empty()) | 816 if (title.empty()) |
| 818 return false; | 817 return false; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 883 } | 882 } |
| 884 | 883 |
| 885 tracker_out->CopyFrom(tracker); | 884 tracker_out->CopyFrom(tracker); |
| 886 *path_out = path_out->Append(components[i]); | 885 *path_out = path_out->Append(components[i]); |
| 887 } | 886 } |
| 888 | 887 |
| 889 return true; | 888 return true; |
| 890 } | 889 } |
| 891 | 890 |
| 892 SyncStatusCode MetadataDatabase::UpdateByChangeList( | 891 SyncStatusCode MetadataDatabase::UpdateByChangeList( |
| 893 int64 largest_change_id, | 892 int64_t largest_change_id, |
| 894 ScopedVector<google_apis::ChangeResource> changes) { | 893 ScopedVector<google_apis::ChangeResource> changes) { |
| 895 DCHECK_LE(index_->GetLargestChangeID(), largest_change_id); | 894 DCHECK_LE(index_->GetLargestChangeID(), largest_change_id); |
| 896 | 895 |
| 897 for (size_t i = 0; i < changes.size(); ++i) { | 896 for (size_t i = 0; i < changes.size(); ++i) { |
| 898 const google_apis::ChangeResource& change = *changes[i]; | 897 const google_apis::ChangeResource& change = *changes[i]; |
| 899 if (HasNewerFileMetadata(change.file_id(), change.change_id())) | 898 if (HasNewerFileMetadata(change.file_id(), change.change_id())) |
| 900 continue; | 899 continue; |
| 901 | 900 |
| 902 scoped_ptr<FileMetadata> metadata( | 901 scoped_ptr<FileMetadata> metadata( |
| 903 CreateFileMetadataFromChangeResource(change)); | 902 CreateFileMetadataFromChangeResource(change)); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 947 itr != file_ids.end(); ++itr) { | 946 itr != file_ids.end(); ++itr) { |
| 948 scoped_ptr<FileMetadata> metadata( | 947 scoped_ptr<FileMetadata> metadata( |
| 949 CreateDeletedFileMetadata(GetLargestKnownChangeID(), *itr)); | 948 CreateDeletedFileMetadata(GetLargestKnownChangeID(), *itr)); |
| 950 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), | 949 UpdateByFileMetadata(FROM_HERE, metadata.Pass(), |
| 951 UPDATE_TRACKER_FOR_UNSYNCED_FILE); | 950 UPDATE_TRACKER_FOR_UNSYNCED_FILE); |
| 952 } | 951 } |
| 953 return WriteToDatabase(); | 952 return WriteToDatabase(); |
| 954 } | 953 } |
| 955 | 954 |
| 956 SyncStatusCode MetadataDatabase::ReplaceActiveTrackerWithNewResource( | 955 SyncStatusCode MetadataDatabase::ReplaceActiveTrackerWithNewResource( |
| 957 int64 parent_tracker_id, | 956 int64_t parent_tracker_id, |
| 958 const google_apis::FileResource& resource) { | 957 const google_apis::FileResource& resource) { |
| 959 DCHECK(!index_->GetFileMetadata(resource.file_id(), nullptr)); | 958 DCHECK(!index_->GetFileMetadata(resource.file_id(), nullptr)); |
| 960 DCHECK(index_->GetFileTracker(parent_tracker_id, nullptr)); | 959 DCHECK(index_->GetFileTracker(parent_tracker_id, nullptr)); |
| 961 | 960 |
| 962 UpdateByFileMetadata( | 961 UpdateByFileMetadata( |
| 963 FROM_HERE, | 962 FROM_HERE, |
| 964 CreateFileMetadataFromFileResource(GetLargestKnownChangeID(), resource), | 963 CreateFileMetadataFromFileResource(GetLargestKnownChangeID(), resource), |
| 965 UPDATE_TRACKER_FOR_SYNCED_FILE); | 964 UPDATE_TRACKER_FOR_SYNCED_FILE); |
| 966 | 965 |
| 967 DCHECK(index_->GetFileMetadata(resource.file_id(), nullptr)); | 966 DCHECK(index_->GetFileMetadata(resource.file_id(), nullptr)); |
| 968 DCHECK(!index_->GetFileTrackerIDsByFileID(resource.file_id()).has_active()); | 967 DCHECK(!index_->GetFileTrackerIDsByFileID(resource.file_id()).has_active()); |
| 969 | 968 |
| 970 TrackerIDSet same_path_trackers = | 969 TrackerIDSet same_path_trackers = |
| 971 index_->GetFileTrackerIDsByParentAndTitle( | 970 index_->GetFileTrackerIDsByParentAndTitle( |
| 972 parent_tracker_id, resource.title()); | 971 parent_tracker_id, resource.title()); |
| 973 FileTracker to_be_activated; | 972 FileTracker to_be_activated; |
| 974 if (!FilterFileTrackersByFileID(index_.get(), same_path_trackers, | 973 if (!FilterFileTrackersByFileID(index_.get(), same_path_trackers, |
| 975 resource.file_id(), &to_be_activated)) { | 974 resource.file_id(), &to_be_activated)) { |
| 976 NOTREACHED(); | 975 NOTREACHED(); |
| 977 return SYNC_STATUS_FAILED; | 976 return SYNC_STATUS_FAILED; |
| 978 } | 977 } |
| 979 | 978 |
| 980 int64 tracker_id = to_be_activated.tracker_id(); | 979 int64_t tracker_id = to_be_activated.tracker_id(); |
| 981 if (same_path_trackers.has_active()) { | 980 if (same_path_trackers.has_active()) { |
| 982 DeactivateFileTracker(same_path_trackers.active_tracker(), | 981 DeactivateFileTracker(same_path_trackers.active_tracker(), |
| 983 MARK_ITSELF_DIRTY | | 982 MARK_ITSELF_DIRTY | |
| 984 MARK_SAME_FILE_ID_TRACKERS_DIRTY, | 983 MARK_SAME_FILE_ID_TRACKERS_DIRTY, |
| 985 index_.get()); | 984 index_.get()); |
| 986 } | 985 } |
| 987 | 986 |
| 988 ActivateFileTracker(tracker_id, MARK_NOTHING_DIRTY, index_.get()); | 987 ActivateFileTracker(tracker_id, MARK_NOTHING_DIRTY, index_.get()); |
| 989 return WriteToDatabase(); | 988 return WriteToDatabase(); |
| 990 } | 989 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1002 scoped_ptr<FileTracker> folder_tracker(new FileTracker); | 1001 scoped_ptr<FileTracker> folder_tracker(new FileTracker); |
| 1003 if (!index_->GetFileTracker(trackers.active_tracker(), | 1002 if (!index_->GetFileTracker(trackers.active_tracker(), |
| 1004 folder_tracker.get())) { | 1003 folder_tracker.get())) { |
| 1005 NOTREACHED(); | 1004 NOTREACHED(); |
| 1006 return SYNC_STATUS_FAILED; | 1005 return SYNC_STATUS_FAILED; |
| 1007 } | 1006 } |
| 1008 | 1007 |
| 1009 base::hash_set<std::string> children(child_file_ids.begin(), | 1008 base::hash_set<std::string> children(child_file_ids.begin(), |
| 1010 child_file_ids.end()); | 1009 child_file_ids.end()); |
| 1011 | 1010 |
| 1012 std::vector<int64> known_children = | 1011 std::vector<int64_t> known_children = |
| 1013 index_->GetFileTrackerIDsByParent(folder_tracker->tracker_id()); | 1012 index_->GetFileTrackerIDsByParent(folder_tracker->tracker_id()); |
| 1014 for (size_t i = 0; i < known_children.size(); ++i) { | 1013 for (size_t i = 0; i < known_children.size(); ++i) { |
| 1015 FileTracker tracker; | 1014 FileTracker tracker; |
| 1016 if (!index_->GetFileTracker(known_children[i], &tracker)) { | 1015 if (!index_->GetFileTracker(known_children[i], &tracker)) { |
| 1017 NOTREACHED(); | 1016 NOTREACHED(); |
| 1018 continue; | 1017 continue; |
| 1019 } | 1018 } |
| 1020 children.erase(tracker.file_id()); | 1019 children.erase(tracker.file_id()); |
| 1021 } | 1020 } |
| 1022 | 1021 |
| 1023 for (base::hash_set<std::string>::const_iterator itr = children.begin(); | 1022 for (base::hash_set<std::string>::const_iterator itr = children.begin(); |
| 1024 itr != children.end(); ++itr) | 1023 itr != children.end(); ++itr) |
| 1025 CreateTrackerForParentAndFileID(*folder_tracker, *itr); | 1024 CreateTrackerForParentAndFileID(*folder_tracker, *itr); |
| 1026 folder_tracker->set_needs_folder_listing(false); | 1025 folder_tracker->set_needs_folder_listing(false); |
| 1027 if (folder_tracker->dirty() && !ShouldKeepDirty(*folder_tracker)) | 1026 if (folder_tracker->dirty() && !ShouldKeepDirty(*folder_tracker)) |
| 1028 folder_tracker->set_dirty(false); | 1027 folder_tracker->set_dirty(false); |
| 1029 index_->StoreFileTracker(folder_tracker.Pass()); | 1028 index_->StoreFileTracker(folder_tracker.Pass()); |
| 1030 | 1029 |
| 1031 return WriteToDatabase(); | 1030 return WriteToDatabase(); |
| 1032 } | 1031 } |
| 1033 | 1032 |
| 1034 SyncStatusCode MetadataDatabase::UpdateTracker( | 1033 SyncStatusCode MetadataDatabase::UpdateTracker( |
| 1035 int64 tracker_id, | 1034 int64_t tracker_id, |
| 1036 const FileDetails& updated_details) { | 1035 const FileDetails& updated_details) { |
| 1037 FileTracker tracker; | 1036 FileTracker tracker; |
| 1038 if (!index_->GetFileTracker(tracker_id, &tracker)) { | 1037 if (!index_->GetFileTracker(tracker_id, &tracker)) { |
| 1039 return SYNC_DATABASE_ERROR_NOT_FOUND; | 1038 return SYNC_DATABASE_ERROR_NOT_FOUND; |
| 1040 } | 1039 } |
| 1041 | 1040 |
| 1042 // Check if the tracker is to be deleted. | 1041 // Check if the tracker is to be deleted. |
| 1043 if (updated_details.missing()) { | 1042 if (updated_details.missing()) { |
| 1044 FileMetadata metadata; | 1043 FileMetadata metadata; |
| 1045 if (!index_->GetFileMetadata(tracker.file_id(), &metadata) || | 1044 if (!index_->GetFileMetadata(tracker.file_id(), &metadata) || |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1120 updated_tracker->set_dirty(false); | 1119 updated_tracker->set_dirty(false); |
| 1121 } | 1120 } |
| 1122 index_->StoreFileTracker(updated_tracker.Pass()); | 1121 index_->StoreFileTracker(updated_tracker.Pass()); |
| 1123 if (should_promote) | 1122 if (should_promote) |
| 1124 index_->PromoteDemotedDirtyTracker(tracker_id); | 1123 index_->PromoteDemotedDirtyTracker(tracker_id); |
| 1125 | 1124 |
| 1126 return WriteToDatabase(); | 1125 return WriteToDatabase(); |
| 1127 } | 1126 } |
| 1128 | 1127 |
| 1129 MetadataDatabase::ActivationStatus MetadataDatabase::TryActivateTracker( | 1128 MetadataDatabase::ActivationStatus MetadataDatabase::TryActivateTracker( |
| 1130 int64 parent_tracker_id, | 1129 int64_t parent_tracker_id, |
| 1131 const std::string& file_id, | 1130 const std::string& file_id, |
| 1132 SyncStatusCode* status_out) { | 1131 SyncStatusCode* status_out) { |
| 1133 FileMetadata metadata; | 1132 FileMetadata metadata; |
| 1134 if (!index_->GetFileMetadata(file_id, &metadata)) { | 1133 if (!index_->GetFileMetadata(file_id, &metadata)) { |
| 1135 NOTREACHED(); | 1134 NOTREACHED(); |
| 1136 *status_out = SYNC_STATUS_FAILED; | 1135 *status_out = SYNC_STATUS_FAILED; |
| 1137 return ACTIVATION_PENDING; | 1136 return ACTIVATION_PENDING; |
| 1138 } | 1137 } |
| 1139 std::string title = metadata.details().title(); | 1138 std::string title = metadata.details().title(); |
| 1140 DCHECK(!HasInvalidTitle(title)); | 1139 DCHECK(!HasInvalidTitle(title)); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1184 tracker_to_be_activated->set_needs_folder_listing(true); | 1183 tracker_to_be_activated->set_needs_folder_listing(true); |
| 1185 } | 1184 } |
| 1186 tracker_to_be_activated->set_dirty(false); | 1185 tracker_to_be_activated->set_dirty(false); |
| 1187 | 1186 |
| 1188 index_->StoreFileTracker(tracker_to_be_activated.Pass()); | 1187 index_->StoreFileTracker(tracker_to_be_activated.Pass()); |
| 1189 | 1188 |
| 1190 *status_out = WriteToDatabase(); | 1189 *status_out = WriteToDatabase(); |
| 1191 return ACTIVATION_PENDING; | 1190 return ACTIVATION_PENDING; |
| 1192 } | 1191 } |
| 1193 | 1192 |
| 1194 void MetadataDatabase::DemoteTracker(int64 tracker_id) { | 1193 void MetadataDatabase::DemoteTracker(int64_t tracker_id) { |
| 1195 index_->DemoteDirtyTracker(tracker_id); | 1194 index_->DemoteDirtyTracker(tracker_id); |
| 1196 WriteToDatabase(); | 1195 WriteToDatabase(); |
| 1197 } | 1196 } |
| 1198 | 1197 |
| 1199 bool MetadataDatabase::PromoteDemotedTrackers() { | 1198 bool MetadataDatabase::PromoteDemotedTrackers() { |
| 1200 bool promoted = index_->PromoteDemotedDirtyTrackers(); | 1199 bool promoted = index_->PromoteDemotedDirtyTrackers(); |
| 1201 WriteToDatabase(); | 1200 WriteToDatabase(); |
| 1202 return promoted; | 1201 return promoted; |
| 1203 } | 1202 } |
| 1204 | 1203 |
| 1205 void MetadataDatabase::PromoteDemotedTracker(int64 tracker_id) { | 1204 void MetadataDatabase::PromoteDemotedTracker(int64_t tracker_id) { |
| 1206 index_->PromoteDemotedDirtyTracker(tracker_id); | 1205 index_->PromoteDemotedDirtyTracker(tracker_id); |
| 1207 WriteToDatabase(); | 1206 WriteToDatabase(); |
| 1208 } | 1207 } |
| 1209 | 1208 |
| 1210 bool MetadataDatabase::GetDirtyTracker( | 1209 bool MetadataDatabase::GetDirtyTracker( |
| 1211 FileTracker* tracker_out) const { | 1210 FileTracker* tracker_out) const { |
| 1212 int64 dirty_tracker_id = index_->PickDirtyTracker(); | 1211 int64_t dirty_tracker_id = index_->PickDirtyTracker(); |
| 1213 if (!dirty_tracker_id) | 1212 if (!dirty_tracker_id) |
| 1214 return false; | 1213 return false; |
| 1215 | 1214 |
| 1216 if (tracker_out) { | 1215 if (tracker_out) { |
| 1217 if (!index_->GetFileTracker(dirty_tracker_id, tracker_out)) { | 1216 if (!index_->GetFileTracker(dirty_tracker_id, tracker_out)) { |
| 1218 NOTREACHED(); | 1217 NOTREACHED(); |
| 1219 return false; | 1218 return false; |
| 1220 } | 1219 } |
| 1221 } | 1220 } |
| 1222 return true; | 1221 return true; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1280 return true; | 1279 return true; |
| 1281 } | 1280 } |
| 1282 | 1281 |
| 1283 void MetadataDatabase::GetRegisteredAppIDs(std::vector<std::string>* app_ids) { | 1282 void MetadataDatabase::GetRegisteredAppIDs(std::vector<std::string>* app_ids) { |
| 1284 DCHECK(app_ids); | 1283 DCHECK(app_ids); |
| 1285 *app_ids = index_->GetRegisteredAppIDs(); | 1284 *app_ids = index_->GetRegisteredAppIDs(); |
| 1286 } | 1285 } |
| 1287 | 1286 |
| 1288 SyncStatusCode MetadataDatabase::SweepDirtyTrackers( | 1287 SyncStatusCode MetadataDatabase::SweepDirtyTrackers( |
| 1289 const std::vector<std::string>& file_ids) { | 1288 const std::vector<std::string>& file_ids) { |
| 1290 std::set<int64> tracker_ids; | 1289 std::set<int64_t> tracker_ids; |
| 1291 for (size_t i = 0; i < file_ids.size(); ++i) { | 1290 for (size_t i = 0; i < file_ids.size(); ++i) { |
| 1292 TrackerIDSet trackers_for_file_id = | 1291 TrackerIDSet trackers_for_file_id = |
| 1293 index_->GetFileTrackerIDsByFileID(file_ids[i]); | 1292 index_->GetFileTrackerIDsByFileID(file_ids[i]); |
| 1294 for (TrackerIDSet::iterator itr = trackers_for_file_id.begin(); | 1293 for (TrackerIDSet::iterator itr = trackers_for_file_id.begin(); |
| 1295 itr != trackers_for_file_id.end(); ++itr) | 1294 itr != trackers_for_file_id.end(); ++itr) |
| 1296 tracker_ids.insert(*itr); | 1295 tracker_ids.insert(*itr); |
| 1297 } | 1296 } |
| 1298 | 1297 |
| 1299 for (std::set<int64>::iterator itr = tracker_ids.begin(); | 1298 for (std::set<int64_t>::iterator itr = tracker_ids.begin(); |
| 1300 itr != tracker_ids.end(); ++itr) { | 1299 itr != tracker_ids.end(); ++itr) { |
| 1301 scoped_ptr<FileTracker> tracker(new FileTracker); | 1300 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 1302 if (!index_->GetFileTracker(*itr, tracker.get()) || | 1301 if (!index_->GetFileTracker(*itr, tracker.get()) || |
| 1303 !CanClearDirty(*tracker)) | 1302 !CanClearDirty(*tracker)) |
| 1304 continue; | 1303 continue; |
| 1305 tracker->set_dirty(false); | 1304 tracker->set_dirty(false); |
| 1306 index_->StoreFileTracker(tracker.Pass()); | 1305 index_->StoreFileTracker(tracker.Pass()); |
| 1307 } | 1306 } |
| 1308 | 1307 |
| 1309 return WriteToDatabase(); | 1308 return WriteToDatabase(); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1376 CreateTrackerInternal(parent_tracker, | 1375 CreateTrackerInternal(parent_tracker, |
| 1377 file_metadata.file_id(), | 1376 file_metadata.file_id(), |
| 1378 &file_metadata.details(), | 1377 &file_metadata.details(), |
| 1379 option); | 1378 option); |
| 1380 } | 1379 } |
| 1381 | 1380 |
| 1382 void MetadataDatabase::CreateTrackerInternal(const FileTracker& parent_tracker, | 1381 void MetadataDatabase::CreateTrackerInternal(const FileTracker& parent_tracker, |
| 1383 const std::string& file_id, | 1382 const std::string& file_id, |
| 1384 const FileDetails* details, | 1383 const FileDetails* details, |
| 1385 UpdateOption option) { | 1384 UpdateOption option) { |
| 1386 int64 tracker_id = IncrementTrackerID(); | 1385 int64_t tracker_id = IncrementTrackerID(); |
| 1387 scoped_ptr<FileTracker> tracker(new FileTracker); | 1386 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 1388 tracker->set_tracker_id(tracker_id); | 1387 tracker->set_tracker_id(tracker_id); |
| 1389 tracker->set_parent_tracker_id(parent_tracker.tracker_id()); | 1388 tracker->set_parent_tracker_id(parent_tracker.tracker_id()); |
| 1390 tracker->set_file_id(file_id); | 1389 tracker->set_file_id(file_id); |
| 1391 tracker->set_app_id(parent_tracker.app_id()); | 1390 tracker->set_app_id(parent_tracker.app_id()); |
| 1392 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); | 1391 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); |
| 1393 tracker->set_dirty(true); | 1392 tracker->set_dirty(true); |
| 1394 tracker->set_active(false); | 1393 tracker->set_active(false); |
| 1395 tracker->set_needs_folder_listing(false); | 1394 tracker->set_needs_folder_listing(false); |
| 1396 if (details) { | 1395 if (details) { |
| 1397 *tracker->mutable_synced_details() = *details; | 1396 *tracker->mutable_synced_details() = *details; |
| 1398 if (option == UPDATE_TRACKER_FOR_UNSYNCED_FILE) { | 1397 if (option == UPDATE_TRACKER_FOR_UNSYNCED_FILE) { |
| 1399 tracker->mutable_synced_details()->set_missing(true); | 1398 tracker->mutable_synced_details()->set_missing(true); |
| 1400 tracker->mutable_synced_details()->clear_md5(); | 1399 tracker->mutable_synced_details()->clear_md5(); |
| 1401 } | 1400 } |
| 1402 } | 1401 } |
| 1403 index_->StoreFileTracker(tracker.Pass()); | 1402 index_->StoreFileTracker(tracker.Pass()); |
| 1404 } | 1403 } |
| 1405 | 1404 |
| 1406 void MetadataDatabase::MaybeAddTrackersForNewFile( | 1405 void MetadataDatabase::MaybeAddTrackersForNewFile( |
| 1407 const FileMetadata& metadata, | 1406 const FileMetadata& metadata, |
| 1408 UpdateOption option) { | 1407 UpdateOption option) { |
| 1409 std::set<int64> parents_to_exclude; | 1408 std::set<int64_t> parents_to_exclude; |
| 1410 TrackerIDSet existing_trackers = | 1409 TrackerIDSet existing_trackers = |
| 1411 index_->GetFileTrackerIDsByFileID(metadata.file_id()); | 1410 index_->GetFileTrackerIDsByFileID(metadata.file_id()); |
| 1412 for (TrackerIDSet::const_iterator itr = existing_trackers.begin(); | 1411 for (TrackerIDSet::const_iterator itr = existing_trackers.begin(); |
| 1413 itr != existing_trackers.end(); ++itr) { | 1412 itr != existing_trackers.end(); ++itr) { |
| 1414 FileTracker tracker; | 1413 FileTracker tracker; |
| 1415 if (!index_->GetFileTracker(*itr, &tracker)) { | 1414 if (!index_->GetFileTracker(*itr, &tracker)) { |
| 1416 NOTREACHED(); | 1415 NOTREACHED(); |
| 1417 continue; | 1416 continue; |
| 1418 } | 1417 } |
| 1419 | 1418 |
| 1420 int64 parent_tracker_id = tracker.parent_tracker_id(); | 1419 int64_t parent_tracker_id = tracker.parent_tracker_id(); |
| 1421 if (!parent_tracker_id) | 1420 if (!parent_tracker_id) |
| 1422 continue; | 1421 continue; |
| 1423 | 1422 |
| 1424 // Exclude |parent_tracker_id| if it already has a tracker that has | 1423 // Exclude |parent_tracker_id| if it already has a tracker that has |
| 1425 // unknown title or has the same title with |file|. | 1424 // unknown title or has the same title with |file|. |
| 1426 if (!tracker.has_synced_details() || | 1425 if (!tracker.has_synced_details() || |
| 1427 tracker.synced_details().title() == metadata.details().title()) { | 1426 tracker.synced_details().title() == metadata.details().title()) { |
| 1428 parents_to_exclude.insert(parent_tracker_id); | 1427 parents_to_exclude.insert(parent_tracker_id); |
| 1429 } | 1428 } |
| 1430 } | 1429 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1442 | 1441 |
| 1443 if (ContainsKey(parents_to_exclude, parent_tracker.tracker_id())) | 1442 if (ContainsKey(parents_to_exclude, parent_tracker.tracker_id())) |
| 1444 continue; | 1443 continue; |
| 1445 | 1444 |
| 1446 CreateTrackerForParentAndFileMetadata( | 1445 CreateTrackerForParentAndFileMetadata( |
| 1447 parent_tracker, metadata, option); | 1446 parent_tracker, metadata, option); |
| 1448 } | 1447 } |
| 1449 } | 1448 } |
| 1450 } | 1449 } |
| 1451 | 1450 |
| 1452 int64 MetadataDatabase::IncrementTrackerID() { | 1451 int64_t MetadataDatabase::IncrementTrackerID() { |
| 1453 int64 tracker_id = index_->GetNextTrackerID(); | 1452 int64_t tracker_id = index_->GetNextTrackerID(); |
| 1454 index_->SetNextTrackerID(tracker_id + 1); | 1453 index_->SetNextTrackerID(tracker_id + 1); |
| 1455 DCHECK_GT(tracker_id, 0); | 1454 DCHECK_GT(tracker_id, 0); |
| 1456 return tracker_id; | 1455 return tracker_id; |
| 1457 } | 1456 } |
| 1458 | 1457 |
| 1459 bool MetadataDatabase::CanActivateTracker(const FileTracker& tracker) { | 1458 bool MetadataDatabase::CanActivateTracker(const FileTracker& tracker) { |
| 1460 DCHECK(!tracker.active()); | 1459 DCHECK(!tracker.active()); |
| 1461 DCHECK_NE(index_->GetSyncRootTrackerID(), tracker.tracker_id()); | 1460 DCHECK_NE(index_->GetSyncRootTrackerID(), tracker.tracker_id()); |
| 1462 | 1461 |
| 1463 if (HasActiveTrackerForFileID(tracker.file_id())) | 1462 if (HasActiveTrackerForFileID(tracker.file_id())) |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1505 return true; | 1504 return true; |
| 1506 } | 1505 } |
| 1507 | 1506 |
| 1508 if (local_details.title() != remote_details.title()) | 1507 if (local_details.title() != remote_details.title()) |
| 1509 return true; | 1508 return true; |
| 1510 | 1509 |
| 1511 return false; | 1510 return false; |
| 1512 } | 1511 } |
| 1513 | 1512 |
| 1514 bool MetadataDatabase::HasDisabledAppRoot(const FileTracker& tracker) const { | 1513 bool MetadataDatabase::HasDisabledAppRoot(const FileTracker& tracker) const { |
| 1515 int64 app_root_tracker_id = index_->GetAppRootTracker(tracker.app_id()); | 1514 int64_t app_root_tracker_id = index_->GetAppRootTracker(tracker.app_id()); |
| 1516 if (app_root_tracker_id == kInvalidTrackerID) | 1515 if (app_root_tracker_id == kInvalidTrackerID) |
| 1517 return false; | 1516 return false; |
| 1518 | 1517 |
| 1519 FileTracker app_root_tracker; | 1518 FileTracker app_root_tracker; |
| 1520 if (!index_->GetFileTracker(app_root_tracker_id, &app_root_tracker)) { | 1519 if (!index_->GetFileTracker(app_root_tracker_id, &app_root_tracker)) { |
| 1521 NOTREACHED(); | 1520 NOTREACHED(); |
| 1522 return false; | 1521 return false; |
| 1523 } | 1522 } |
| 1524 return app_root_tracker.tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT; | 1523 return app_root_tracker.tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT; |
| 1525 } | 1524 } |
| 1526 | 1525 |
| 1527 bool MetadataDatabase::HasActiveTrackerForFileID( | 1526 bool MetadataDatabase::HasActiveTrackerForFileID( |
| 1528 const std::string& file_id) const { | 1527 const std::string& file_id) const { |
| 1529 return index_->GetFileTrackerIDsByFileID(file_id).has_active(); | 1528 return index_->GetFileTrackerIDsByFileID(file_id).has_active(); |
| 1530 } | 1529 } |
| 1531 | 1530 |
| 1532 bool MetadataDatabase::HasActiveTrackerForPath(int64 parent_tracker_id, | 1531 bool MetadataDatabase::HasActiveTrackerForPath(int64_t parent_tracker_id, |
| 1533 const std::string& title) const { | 1532 const std::string& title) const { |
| 1534 return index_->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title) | 1533 return index_->GetFileTrackerIDsByParentAndTitle(parent_tracker_id, title) |
| 1535 .has_active(); | 1534 .has_active(); |
| 1536 } | 1535 } |
| 1537 | 1536 |
| 1538 void MetadataDatabase::RemoveUnneededTrackersForMissingFile( | 1537 void MetadataDatabase::RemoveUnneededTrackersForMissingFile( |
| 1539 const std::string& file_id) { | 1538 const std::string& file_id) { |
| 1540 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); | 1539 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); |
| 1541 for (TrackerIDSet::const_iterator itr = trackers.begin(); | 1540 for (TrackerIDSet::const_iterator itr = trackers.begin(); |
| 1542 itr != trackers.end(); ++itr) { | 1541 itr != trackers.end(); ++itr) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1585 } | 1584 } |
| 1586 | 1585 |
| 1587 scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles( | 1586 scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles( |
| 1588 const std::string& app_id) { | 1587 const std::string& app_id) { |
| 1589 scoped_ptr<base::ListValue> files(new base::ListValue); | 1588 scoped_ptr<base::ListValue> files(new base::ListValue); |
| 1590 | 1589 |
| 1591 FileTracker app_root_tracker; | 1590 FileTracker app_root_tracker; |
| 1592 if (!FindAppRootTracker(app_id, &app_root_tracker)) | 1591 if (!FindAppRootTracker(app_id, &app_root_tracker)) |
| 1593 return files.Pass(); | 1592 return files.Pass(); |
| 1594 | 1593 |
| 1595 std::vector<int64> stack; | 1594 std::vector<int64_t> stack; |
| 1596 AppendContents( | 1595 AppendContents( |
| 1597 index_->GetFileTrackerIDsByParent(app_root_tracker.tracker_id()), &stack); | 1596 index_->GetFileTrackerIDsByParent(app_root_tracker.tracker_id()), &stack); |
| 1598 while (!stack.empty()) { | 1597 while (!stack.empty()) { |
| 1599 int64 tracker_id = stack.back(); | 1598 int64_t tracker_id = stack.back(); |
| 1600 stack.pop_back(); | 1599 stack.pop_back(); |
| 1601 AppendContents(index_->GetFileTrackerIDsByParent(tracker_id), &stack); | 1600 AppendContents(index_->GetFileTrackerIDsByParent(tracker_id), &stack); |
| 1602 | 1601 |
| 1603 FileTracker tracker; | 1602 FileTracker tracker; |
| 1604 if (!index_->GetFileTracker(tracker_id, &tracker)) { | 1603 if (!index_->GetFileTracker(tracker_id, &tracker)) { |
| 1605 NOTREACHED(); | 1604 NOTREACHED(); |
| 1606 continue; | 1605 continue; |
| 1607 } | 1606 } |
| 1608 base::DictionaryValue* file = new base::DictionaryValue; | 1607 base::DictionaryValue* file = new base::DictionaryValue; |
| 1609 | 1608 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1632 } | 1631 } |
| 1633 | 1632 |
| 1634 scoped_ptr<base::ListValue> MetadataDatabase::DumpDatabase() { | 1633 scoped_ptr<base::ListValue> MetadataDatabase::DumpDatabase() { |
| 1635 scoped_ptr<base::ListValue> list(new base::ListValue); | 1634 scoped_ptr<base::ListValue> list(new base::ListValue); |
| 1636 list->Append(DumpTrackers().release()); | 1635 list->Append(DumpTrackers().release()); |
| 1637 list->Append(DumpMetadata().release()); | 1636 list->Append(DumpMetadata().release()); |
| 1638 return list.Pass(); | 1637 return list.Pass(); |
| 1639 } | 1638 } |
| 1640 | 1639 |
| 1641 bool MetadataDatabase::HasNewerFileMetadata(const std::string& file_id, | 1640 bool MetadataDatabase::HasNewerFileMetadata(const std::string& file_id, |
| 1642 int64 change_id) { | 1641 int64_t change_id) { |
| 1643 FileMetadata metadata; | 1642 FileMetadata metadata; |
| 1644 if (!index_->GetFileMetadata(file_id, &metadata)) | 1643 if (!index_->GetFileMetadata(file_id, &metadata)) |
| 1645 return false; | 1644 return false; |
| 1646 DCHECK(metadata.has_details()); | 1645 DCHECK(metadata.has_details()); |
| 1647 return metadata.details().change_id() >= change_id; | 1646 return metadata.details().change_id() >= change_id; |
| 1648 } | 1647 } |
| 1649 | 1648 |
| 1650 scoped_ptr<base::ListValue> MetadataDatabase::DumpTrackers() { | 1649 scoped_ptr<base::ListValue> MetadataDatabase::DumpTrackers() { |
| 1651 scoped_ptr<base::ListValue> trackers(new base::ListValue); | 1650 scoped_ptr<base::ListValue> trackers(new base::ListValue); |
| 1652 | 1651 |
| 1653 // Append the first element for metadata. | 1652 // Append the first element for metadata. |
| 1654 base::DictionaryValue* metadata = new base::DictionaryValue; | 1653 base::DictionaryValue* metadata = new base::DictionaryValue; |
| 1655 const char *trackerKeys[] = { | 1654 const char *trackerKeys[] = { |
| 1656 "tracker_id", "path", "file_id", "tracker_kind", "app_id", | 1655 "tracker_id", "path", "file_id", "tracker_kind", "app_id", |
| 1657 "active", "dirty", "folder_listing", "demoted", | 1656 "active", "dirty", "folder_listing", "demoted", |
| 1658 "title", "kind", "md5", "etag", "missing", "change_id", | 1657 "title", "kind", "md5", "etag", "missing", "change_id", |
| 1659 }; | 1658 }; |
| 1660 std::vector<std::string> key_strings( | 1659 std::vector<std::string> key_strings( |
| 1661 trackerKeys, trackerKeys + arraysize(trackerKeys)); | 1660 trackerKeys, trackerKeys + arraysize(trackerKeys)); |
| 1662 base::ListValue* keys = new base::ListValue; | 1661 base::ListValue* keys = new base::ListValue; |
| 1663 keys->AppendStrings(key_strings); | 1662 keys->AppendStrings(key_strings); |
| 1664 metadata->SetString("title", "Trackers"); | 1663 metadata->SetString("title", "Trackers"); |
| 1665 metadata->Set("keys", keys); | 1664 metadata->Set("keys", keys); |
| 1666 trackers->Append(metadata); | 1665 trackers->Append(metadata); |
| 1667 | 1666 |
| 1668 // Append tracker data. | 1667 // Append tracker data. |
| 1669 std::vector<int64> tracker_ids(index_->GetAllTrackerIDs()); | 1668 std::vector<int64_t> tracker_ids(index_->GetAllTrackerIDs()); |
| 1670 for (std::vector<int64>::const_iterator itr = tracker_ids.begin(); | 1669 for (std::vector<int64_t>::const_iterator itr = tracker_ids.begin(); |
| 1671 itr != tracker_ids.end(); ++itr) { | 1670 itr != tracker_ids.end(); ++itr) { |
| 1672 const int64 tracker_id = *itr; | 1671 const int64_t tracker_id = *itr; |
| 1673 FileTracker tracker; | 1672 FileTracker tracker; |
| 1674 if (!index_->GetFileTracker(tracker_id, &tracker)) { | 1673 if (!index_->GetFileTracker(tracker_id, &tracker)) { |
| 1675 NOTREACHED(); | 1674 NOTREACHED(); |
| 1676 continue; | 1675 continue; |
| 1677 } | 1676 } |
| 1678 | 1677 |
| 1679 base::DictionaryValue* dict = new base::DictionaryValue; | 1678 base::DictionaryValue* dict = new base::DictionaryValue; |
| 1680 base::FilePath path = BuildDisplayPathForTracker(tracker); | 1679 base::FilePath path = BuildDisplayPathForTracker(tracker); |
| 1681 dict->SetString("tracker_id", base::Int64ToString(tracker_id)); | 1680 dict->SetString("tracker_id", base::Int64ToString(tracker_id)); |
| 1682 dict->SetString("path", path.AsUTF8Unsafe()); | 1681 dict->SetString("path", path.AsUTF8Unsafe()); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1810 return false; | 1809 return false; |
| 1811 | 1810 |
| 1812 if (!parents.empty()) | 1811 if (!parents.empty()) |
| 1813 return false; | 1812 return false; |
| 1814 | 1813 |
| 1815 return true; | 1814 return true; |
| 1816 } | 1815 } |
| 1817 | 1816 |
| 1818 } // namespace drive_backend | 1817 } // namespace drive_backend |
| 1819 } // namespace sync_file_system | 1818 } // namespace sync_file_system |
| OLD | NEW |