| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_index_
on_disk.h" | 5 #include "chrome/browser/sync_file_system/drive_backend/metadata_database_index_
on_disk.h" |
| 6 | 6 |
| 7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 | 151 |
| 152 void RemoveUnreachableItemsFromDB(LevelDBWrapper* db, | 152 void RemoveUnreachableItemsFromDB(LevelDBWrapper* db, |
| 153 int64_t sync_root_tracker_id) { | 153 int64_t sync_root_tracker_id) { |
| 154 DCHECK(db); | 154 DCHECK(db); |
| 155 | 155 |
| 156 typedef std::map<int64_t, std::set<int64_t>> ChildTrackersByParent; | 156 typedef std::map<int64_t, std::set<int64_t>> ChildTrackersByParent; |
| 157 ChildTrackersByParent trackers_by_parent; | 157 ChildTrackersByParent trackers_by_parent; |
| 158 { | 158 { |
| 159 // Set up links from parent tracker to child trackers. | 159 // Set up links from parent tracker to child trackers. |
| 160 std::set<int64_t> inactive_trackers; | 160 std::set<int64_t> inactive_trackers; |
| 161 scoped_ptr<LevelDBWrapper::Iterator> itr = db->NewIterator(); | 161 std::unique_ptr<LevelDBWrapper::Iterator> itr = db->NewIterator(); |
| 162 for (itr->Seek(kFileTrackerKeyPrefix); itr->Valid(); itr->Next()) { | 162 for (itr->Seek(kFileTrackerKeyPrefix); itr->Valid(); itr->Next()) { |
| 163 if (!RemovePrefix(itr->key().ToString(), kFileTrackerKeyPrefix, nullptr)) | 163 if (!RemovePrefix(itr->key().ToString(), kFileTrackerKeyPrefix, nullptr)) |
| 164 break; | 164 break; |
| 165 | 165 |
| 166 scoped_ptr<FileTracker> tracker(new FileTracker); | 166 std::unique_ptr<FileTracker> tracker(new FileTracker); |
| 167 if (!tracker->ParseFromString(itr->value().ToString())) { | 167 if (!tracker->ParseFromString(itr->value().ToString())) { |
| 168 util::Log(logging::LOG_WARNING, FROM_HERE, | 168 util::Log(logging::LOG_WARNING, FROM_HERE, |
| 169 "Failed to parse a Tracker"); | 169 "Failed to parse a Tracker"); |
| 170 continue; | 170 continue; |
| 171 } | 171 } |
| 172 | 172 |
| 173 int64_t parent_tracker_id = tracker->parent_tracker_id(); | 173 int64_t parent_tracker_id = tracker->parent_tracker_id(); |
| 174 int64_t tracker_id = tracker->tracker_id(); | 174 int64_t tracker_id = tracker->tracker_id(); |
| 175 trackers_by_parent[parent_tracker_id].insert(tracker_id); | 175 trackers_by_parent[parent_tracker_id].insert(tracker_id); |
| 176 if (!tracker->active()) | 176 if (!tracker->active()) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 204 AppendContents( | 204 AppendContents( |
| 205 LookUpMap(trackers_by_parent, tracker_id, std::set<int64_t>()), | 205 LookUpMap(trackers_by_parent, tracker_id, std::set<int64_t>()), |
| 206 &pending); | 206 &pending); |
| 207 } | 207 } |
| 208 } | 208 } |
| 209 | 209 |
| 210 // Delete all unreachable trackers, and list all |file_id| referred by | 210 // Delete all unreachable trackers, and list all |file_id| referred by |
| 211 // remained trackers. | 211 // remained trackers. |
| 212 base::hash_set<std::string> referred_file_ids; | 212 base::hash_set<std::string> referred_file_ids; |
| 213 { | 213 { |
| 214 scoped_ptr<LevelDBWrapper::Iterator> itr = db->NewIterator(); | 214 std::unique_ptr<LevelDBWrapper::Iterator> itr = db->NewIterator(); |
| 215 for (itr->Seek(kFileTrackerKeyPrefix); itr->Valid(); itr->Next()) { | 215 for (itr->Seek(kFileTrackerKeyPrefix); itr->Valid(); itr->Next()) { |
| 216 if (!RemovePrefix(itr->key().ToString(), kFileTrackerKeyPrefix, nullptr)) | 216 if (!RemovePrefix(itr->key().ToString(), kFileTrackerKeyPrefix, nullptr)) |
| 217 break; | 217 break; |
| 218 | 218 |
| 219 scoped_ptr<FileTracker> tracker(new FileTracker); | 219 std::unique_ptr<FileTracker> tracker(new FileTracker); |
| 220 if (!tracker->ParseFromString(itr->value().ToString())) { | 220 if (!tracker->ParseFromString(itr->value().ToString())) { |
| 221 util::Log(logging::LOG_WARNING, FROM_HERE, | 221 util::Log(logging::LOG_WARNING, FROM_HERE, |
| 222 "Failed to parse a Tracker"); | 222 "Failed to parse a Tracker"); |
| 223 continue; | 223 continue; |
| 224 } | 224 } |
| 225 | 225 |
| 226 if (ContainsKey(visited_trackers, tracker->tracker_id())) { | 226 if (ContainsKey(visited_trackers, tracker->tracker_id())) { |
| 227 referred_file_ids.insert(tracker->file_id()); | 227 referred_file_ids.insert(tracker->file_id()); |
| 228 } else { | 228 } else { |
| 229 PutFileTrackerDeletionToDB(tracker->tracker_id(), db); | 229 PutFileTrackerDeletionToDB(tracker->tracker_id(), db); |
| 230 } | 230 } |
| 231 } | 231 } |
| 232 } | 232 } |
| 233 | 233 |
| 234 // Delete all unreferred metadata. | 234 // Delete all unreferred metadata. |
| 235 { | 235 { |
| 236 scoped_ptr<LevelDBWrapper::Iterator> itr = db->NewIterator(); | 236 std::unique_ptr<LevelDBWrapper::Iterator> itr = db->NewIterator(); |
| 237 for (itr->Seek(kFileMetadataKeyPrefix); itr->Valid(); itr->Next()) { | 237 for (itr->Seek(kFileMetadataKeyPrefix); itr->Valid(); itr->Next()) { |
| 238 if (!RemovePrefix(itr->key().ToString(), kFileMetadataKeyPrefix, nullptr)) | 238 if (!RemovePrefix(itr->key().ToString(), kFileMetadataKeyPrefix, nullptr)) |
| 239 break; | 239 break; |
| 240 | 240 |
| 241 scoped_ptr<FileMetadata> metadata(new FileMetadata); | 241 std::unique_ptr<FileMetadata> metadata(new FileMetadata); |
| 242 if (!metadata->ParseFromString(itr->value().ToString())) { | 242 if (!metadata->ParseFromString(itr->value().ToString())) { |
| 243 util::Log(logging::LOG_WARNING, FROM_HERE, | 243 util::Log(logging::LOG_WARNING, FROM_HERE, |
| 244 "Failed to parse a Tracker"); | 244 "Failed to parse a Tracker"); |
| 245 continue; | 245 continue; |
| 246 } | 246 } |
| 247 | 247 |
| 248 if (!ContainsKey(referred_file_ids, metadata->file_id())) | 248 if (!ContainsKey(referred_file_ids, metadata->file_id())) |
| 249 PutFileMetadataDeletionToDB(metadata->file_id(), db); | 249 PutFileMetadataDeletionToDB(metadata->file_id(), db); |
| 250 } | 250 } |
| 251 } | 251 } |
| 252 } | 252 } |
| 253 | 253 |
| 254 } // namespace | 254 } // namespace |
| 255 | 255 |
| 256 // static | 256 // static |
| 257 scoped_ptr<MetadataDatabaseIndexOnDisk> | 257 std::unique_ptr<MetadataDatabaseIndexOnDisk> |
| 258 MetadataDatabaseIndexOnDisk::Create(LevelDBWrapper* db) { | 258 MetadataDatabaseIndexOnDisk::Create(LevelDBWrapper* db) { |
| 259 DCHECK(db); | 259 DCHECK(db); |
| 260 | 260 |
| 261 scoped_ptr<ServiceMetadata> service_metadata = InitializeServiceMetadata(db); | 261 std::unique_ptr<ServiceMetadata> service_metadata = |
| 262 InitializeServiceMetadata(db); |
| 262 if (!service_metadata) | 263 if (!service_metadata) |
| 263 return nullptr; | 264 return nullptr; |
| 264 | 265 |
| 265 PutVersionToDB(kDatabaseOnDiskVersion, db); | 266 PutVersionToDB(kDatabaseOnDiskVersion, db); |
| 266 RemoveUnreachableItemsFromDB(db, service_metadata->sync_root_tracker_id()); | 267 RemoveUnreachableItemsFromDB(db, service_metadata->sync_root_tracker_id()); |
| 267 scoped_ptr<MetadataDatabaseIndexOnDisk> | 268 std::unique_ptr<MetadataDatabaseIndexOnDisk> index( |
| 268 index(new MetadataDatabaseIndexOnDisk(db)); | 269 new MetadataDatabaseIndexOnDisk(db)); |
| 269 | 270 |
| 270 return index; | 271 return index; |
| 271 } | 272 } |
| 272 | 273 |
| 273 MetadataDatabaseIndexOnDisk::~MetadataDatabaseIndexOnDisk() {} | 274 MetadataDatabaseIndexOnDisk::~MetadataDatabaseIndexOnDisk() {} |
| 274 | 275 |
| 275 void MetadataDatabaseIndexOnDisk::RemoveUnreachableItems() { | 276 void MetadataDatabaseIndexOnDisk::RemoveUnreachableItems() { |
| 276 RemoveUnreachableItemsFromDB( | 277 RemoveUnreachableItemsFromDB( |
| 277 db_, service_metadata_->sync_root_tracker_id()); | 278 db_, service_metadata_->sync_root_tracker_id()); |
| 278 DeleteTrackerIndexes(); | 279 DeleteTrackerIndexes(); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 tracker_id); | 335 tracker_id); |
| 335 return false; | 336 return false; |
| 336 } | 337 } |
| 337 if (tracker) | 338 if (tracker) |
| 338 tracker->CopyFrom(tmp_tracker); | 339 tracker->CopyFrom(tmp_tracker); |
| 339 | 340 |
| 340 return true; | 341 return true; |
| 341 } | 342 } |
| 342 | 343 |
| 343 void MetadataDatabaseIndexOnDisk::StoreFileMetadata( | 344 void MetadataDatabaseIndexOnDisk::StoreFileMetadata( |
| 344 scoped_ptr<FileMetadata> metadata) { | 345 std::unique_ptr<FileMetadata> metadata) { |
| 345 DCHECK(metadata); | 346 DCHECK(metadata); |
| 346 PutFileMetadataToDB(*metadata, db_); | 347 PutFileMetadataToDB(*metadata, db_); |
| 347 } | 348 } |
| 348 | 349 |
| 349 void MetadataDatabaseIndexOnDisk::StoreFileTracker( | 350 void MetadataDatabaseIndexOnDisk::StoreFileTracker( |
| 350 scoped_ptr<FileTracker> tracker) { | 351 std::unique_ptr<FileTracker> tracker) { |
| 351 DCHECK(tracker); | 352 DCHECK(tracker); |
| 352 | 353 |
| 353 int64_t tracker_id = tracker->tracker_id(); | 354 int64_t tracker_id = tracker->tracker_id(); |
| 354 FileTracker old_tracker; | 355 FileTracker old_tracker; |
| 355 if (!GetFileTracker(tracker_id, &old_tracker)) { | 356 if (!GetFileTracker(tracker_id, &old_tracker)) { |
| 356 DVLOG(3) << "Adding new tracker: " << tracker->tracker_id() | 357 DVLOG(3) << "Adding new tracker: " << tracker->tracker_id() |
| 357 << " " << GetTrackerTitle(*tracker); | 358 << " " << GetTrackerTitle(*tracker); |
| 358 AddToAppIDIndex(*tracker); | 359 AddToAppIDIndex(*tracker); |
| 359 AddToFileIDIndexes(*tracker); | 360 AddToFileIDIndexes(*tracker); |
| 360 AddToPathIndexes(*tracker); | 361 AddToPathIndexes(*tracker); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 return GetTrackerIDSetByPrefix( | 436 return GetTrackerIDSetByPrefix( |
| 436 GenerateActiveTrackerIDByParentAndTitleKey(parent_tracker_id, title), | 437 GenerateActiveTrackerIDByParentAndTitleKey(parent_tracker_id, title), |
| 437 GenerateTrackerIDByParentAndTitleKeyPrefix(parent_tracker_id, title)); | 438 GenerateTrackerIDByParentAndTitleKeyPrefix(parent_tracker_id, title)); |
| 438 } | 439 } |
| 439 | 440 |
| 440 std::vector<int64_t> MetadataDatabaseIndexOnDisk::GetFileTrackerIDsByParent( | 441 std::vector<int64_t> MetadataDatabaseIndexOnDisk::GetFileTrackerIDsByParent( |
| 441 int64_t parent_id) const { | 442 int64_t parent_id) const { |
| 442 std::vector<int64_t> result; | 443 std::vector<int64_t> result; |
| 443 | 444 |
| 444 const std::string prefix = GenerateTrackerIDsByParentIDKeyPrefix(parent_id); | 445 const std::string prefix = GenerateTrackerIDsByParentIDKeyPrefix(parent_id); |
| 445 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 446 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 446 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { | 447 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { |
| 447 const std::string& key(itr->key().ToString()); | 448 const std::string& key(itr->key().ToString()); |
| 448 std::string title_and_id; | 449 std::string title_and_id; |
| 449 if (!RemovePrefix(key, prefix, &title_and_id)) | 450 if (!RemovePrefix(key, prefix, &title_and_id)) |
| 450 break; | 451 break; |
| 451 | 452 |
| 452 size_t pos = title_and_id.rfind('\0'); | 453 size_t pos = title_and_id.rfind('\0'); |
| 453 DCHECK(pos != std::string::npos); | 454 DCHECK(pos != std::string::npos); |
| 454 | 455 |
| 455 int64_t tracker_id; | 456 int64_t tracker_id; |
| 456 if (!base::StringToInt64(title_and_id.substr(pos + 1), &tracker_id)) | 457 if (!base::StringToInt64(title_and_id.substr(pos + 1), &tracker_id)) |
| 457 continue; | 458 continue; |
| 458 result.push_back(tracker_id); | 459 result.push_back(tracker_id); |
| 459 } | 460 } |
| 460 return result; | 461 return result; |
| 461 } | 462 } |
| 462 | 463 |
| 463 std::string MetadataDatabaseIndexOnDisk::PickMultiTrackerFileID() const { | 464 std::string MetadataDatabaseIndexOnDisk::PickMultiTrackerFileID() const { |
| 464 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 465 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 465 itr->Seek(kMultiTrackerByFileIDKeyPrefix); | 466 itr->Seek(kMultiTrackerByFileIDKeyPrefix); |
| 466 if (!itr->Valid()) | 467 if (!itr->Valid()) |
| 467 return std::string(); | 468 return std::string(); |
| 468 | 469 |
| 469 std::string file_id; | 470 std::string file_id; |
| 470 if (!RemovePrefix(itr->key().ToString(), | 471 if (!RemovePrefix(itr->key().ToString(), |
| 471 kMultiTrackerByFileIDKeyPrefix, &file_id)) | 472 kMultiTrackerByFileIDKeyPrefix, &file_id)) |
| 472 return std::string(); | 473 return std::string(); |
| 473 | 474 |
| 474 return file_id; | 475 return file_id; |
| 475 } | 476 } |
| 476 | 477 |
| 477 ParentIDAndTitle MetadataDatabaseIndexOnDisk::PickMultiBackingFilePath() const { | 478 ParentIDAndTitle MetadataDatabaseIndexOnDisk::PickMultiBackingFilePath() const { |
| 478 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 479 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 479 itr->Seek(kMultiBackingParentAndTitleKeyPrefix); | 480 itr->Seek(kMultiBackingParentAndTitleKeyPrefix); |
| 480 if (!itr->Valid()) | 481 if (!itr->Valid()) |
| 481 return ParentIDAndTitle(); | 482 return ParentIDAndTitle(); |
| 482 | 483 |
| 483 std::string value; | 484 std::string value; |
| 484 if (!RemovePrefix(itr->key().ToString(), | 485 if (!RemovePrefix(itr->key().ToString(), |
| 485 kMultiBackingParentAndTitleKeyPrefix, &value)) | 486 kMultiBackingParentAndTitleKeyPrefix, &value)) |
| 486 return ParentIDAndTitle(); | 487 return ParentIDAndTitle(); |
| 487 | 488 |
| 488 size_t pos = value.find('\0'); // '\0' is a separator. | 489 size_t pos = value.find('\0'); // '\0' is a separator. |
| 489 if (pos == std::string::npos) | 490 if (pos == std::string::npos) |
| 490 return ParentIDAndTitle(); | 491 return ParentIDAndTitle(); |
| 491 | 492 |
| 492 int64_t parent_id; | 493 int64_t parent_id; |
| 493 return base::StringToInt64(value.substr(0, pos), &parent_id) ? | 494 return base::StringToInt64(value.substr(0, pos), &parent_id) ? |
| 494 ParentIDAndTitle(parent_id, value.substr(pos + 1)) : ParentIDAndTitle(); | 495 ParentIDAndTitle(parent_id, value.substr(pos + 1)) : ParentIDAndTitle(); |
| 495 } | 496 } |
| 496 | 497 |
| 497 int64_t MetadataDatabaseIndexOnDisk::PickDirtyTracker() const { | 498 int64_t MetadataDatabaseIndexOnDisk::PickDirtyTracker() const { |
| 498 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 499 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 499 itr->Seek(kDirtyIDKeyPrefix); | 500 itr->Seek(kDirtyIDKeyPrefix); |
| 500 if (!itr->Valid()) | 501 if (!itr->Valid()) |
| 501 return kInvalidTrackerID; | 502 return kInvalidTrackerID; |
| 502 | 503 |
| 503 std::string id_str; | 504 std::string id_str; |
| 504 if (!RemovePrefix(itr->key().ToString(), kDirtyIDKeyPrefix, &id_str)) | 505 if (!RemovePrefix(itr->key().ToString(), kDirtyIDKeyPrefix, &id_str)) |
| 505 return kInvalidTrackerID; | 506 return kInvalidTrackerID; |
| 506 | 507 |
| 507 int64_t tracker_id; | 508 int64_t tracker_id; |
| 508 if (!base::StringToInt64(id_str, &tracker_id)) | 509 if (!base::StringToInt64(id_str, &tracker_id)) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 525 tracker_id); | 526 tracker_id); |
| 526 return; | 527 return; |
| 527 } | 528 } |
| 528 | 529 |
| 529 db_->Delete(key); | 530 db_->Delete(key); |
| 530 db_->Put(GenerateDemotedDirtyIDKey(tracker_id), std::string()); | 531 db_->Put(GenerateDemotedDirtyIDKey(tracker_id), std::string()); |
| 531 --num_dirty_trackers_; | 532 --num_dirty_trackers_; |
| 532 } | 533 } |
| 533 | 534 |
| 534 bool MetadataDatabaseIndexOnDisk::HasDemotedDirtyTracker() const { | 535 bool MetadataDatabaseIndexOnDisk::HasDemotedDirtyTracker() const { |
| 535 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 536 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 536 itr->Seek(kDemotedDirtyIDKeyPrefix); | 537 itr->Seek(kDemotedDirtyIDKeyPrefix); |
| 537 if (!itr->Valid()) | 538 if (!itr->Valid()) |
| 538 return false; | 539 return false; |
| 539 return base::StartsWith(itr->key().ToString(), kDemotedDirtyIDKeyPrefix, | 540 return base::StartsWith(itr->key().ToString(), kDemotedDirtyIDKeyPrefix, |
| 540 base::CompareCase::SENSITIVE); | 541 base::CompareCase::SENSITIVE); |
| 541 } | 542 } |
| 542 | 543 |
| 543 bool MetadataDatabaseIndexOnDisk::IsDemotedDirtyTracker( | 544 bool MetadataDatabaseIndexOnDisk::IsDemotedDirtyTracker( |
| 544 int64_t tracker_id) const { | 545 int64_t tracker_id) const { |
| 545 return DBHasKey(GenerateDemotedDirtyIDKey(tracker_id)); | 546 return DBHasKey(GenerateDemotedDirtyIDKey(tracker_id)); |
| 546 } | 547 } |
| 547 | 548 |
| 548 void MetadataDatabaseIndexOnDisk::PromoteDemotedDirtyTracker( | 549 void MetadataDatabaseIndexOnDisk::PromoteDemotedDirtyTracker( |
| 549 int64_t tracker_id) { | 550 int64_t tracker_id) { |
| 550 std::string demoted_key = GenerateDemotedDirtyIDKey(tracker_id); | 551 std::string demoted_key = GenerateDemotedDirtyIDKey(tracker_id); |
| 551 | 552 |
| 552 std::string empty; | 553 std::string empty; |
| 553 if (db_->Get(demoted_key, &empty).ok()) { | 554 if (db_->Get(demoted_key, &empty).ok()) { |
| 554 db_->Delete(demoted_key); | 555 db_->Delete(demoted_key); |
| 555 db_->Put(GenerateDirtyIDKey(tracker_id), std::string()); | 556 db_->Put(GenerateDirtyIDKey(tracker_id), std::string()); |
| 556 ++num_dirty_trackers_; | 557 ++num_dirty_trackers_; |
| 557 } | 558 } |
| 558 } | 559 } |
| 559 | 560 |
| 560 bool MetadataDatabaseIndexOnDisk::PromoteDemotedDirtyTrackers() { | 561 bool MetadataDatabaseIndexOnDisk::PromoteDemotedDirtyTrackers() { |
| 561 bool promoted = false; | 562 bool promoted = false; |
| 562 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 563 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 563 for (itr->Seek(kDemotedDirtyIDKeyPrefix); itr->Valid(); itr->Next()) { | 564 for (itr->Seek(kDemotedDirtyIDKeyPrefix); itr->Valid(); itr->Next()) { |
| 564 std::string id_str; | 565 std::string id_str; |
| 565 if (!RemovePrefix(itr->key().ToString(), kDemotedDirtyIDKeyPrefix, &id_str)) | 566 if (!RemovePrefix(itr->key().ToString(), kDemotedDirtyIDKeyPrefix, &id_str)) |
| 566 break; | 567 break; |
| 567 | 568 |
| 568 int64_t tracker_id; | 569 int64_t tracker_id; |
| 569 if (!base::StringToInt64(id_str, &tracker_id)) | 570 if (!base::StringToInt64(id_str, &tracker_id)) |
| 570 continue; | 571 continue; |
| 571 | 572 |
| 572 db_->Delete(itr->key().ToString()); | 573 db_->Delete(itr->key().ToString()); |
| 573 db_->Put(GenerateDirtyIDKey(tracker_id), std::string()); | 574 db_->Put(GenerateDirtyIDKey(tracker_id), std::string()); |
| 574 ++num_dirty_trackers_; | 575 ++num_dirty_trackers_; |
| 575 promoted = true; | 576 promoted = true; |
| 576 } | 577 } |
| 577 return promoted; | 578 return promoted; |
| 578 } | 579 } |
| 579 | 580 |
| 580 size_t MetadataDatabaseIndexOnDisk::CountDirtyTracker() const { | 581 size_t MetadataDatabaseIndexOnDisk::CountDirtyTracker() const { |
| 581 return num_dirty_trackers_; | 582 return num_dirty_trackers_; |
| 582 } | 583 } |
| 583 | 584 |
| 584 size_t MetadataDatabaseIndexOnDisk::CountFileMetadata() const { | 585 size_t MetadataDatabaseIndexOnDisk::CountFileMetadata() const { |
| 585 // TODO(peria): Cache the number of FileMetadata in the DB. | 586 // TODO(peria): Cache the number of FileMetadata in the DB. |
| 586 size_t count = 0; | 587 size_t count = 0; |
| 587 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 588 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 588 for (itr->Seek(kFileMetadataKeyPrefix); itr->Valid(); itr->Next()) { | 589 for (itr->Seek(kFileMetadataKeyPrefix); itr->Valid(); itr->Next()) { |
| 589 if (!base::StartsWith(itr->key().ToString(), kFileMetadataKeyPrefix, | 590 if (!base::StartsWith(itr->key().ToString(), kFileMetadataKeyPrefix, |
| 590 base::CompareCase::SENSITIVE)) | 591 base::CompareCase::SENSITIVE)) |
| 591 break; | 592 break; |
| 592 ++count; | 593 ++count; |
| 593 } | 594 } |
| 594 return count; | 595 return count; |
| 595 } | 596 } |
| 596 | 597 |
| 597 size_t MetadataDatabaseIndexOnDisk::CountFileTracker() const { | 598 size_t MetadataDatabaseIndexOnDisk::CountFileTracker() const { |
| 598 // TODO(peria): Cache the number of FileTracker in the DB. | 599 // TODO(peria): Cache the number of FileTracker in the DB. |
| 599 size_t count = 0; | 600 size_t count = 0; |
| 600 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 601 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 601 for (itr->Seek(kFileTrackerKeyPrefix); itr->Valid(); itr->Next()) { | 602 for (itr->Seek(kFileTrackerKeyPrefix); itr->Valid(); itr->Next()) { |
| 602 if (!base::StartsWith(itr->key().ToString(), kFileTrackerKeyPrefix, | 603 if (!base::StartsWith(itr->key().ToString(), kFileTrackerKeyPrefix, |
| 603 base::CompareCase::SENSITIVE)) | 604 base::CompareCase::SENSITIVE)) |
| 604 break; | 605 break; |
| 605 ++count; | 606 ++count; |
| 606 } | 607 } |
| 607 return count; | 608 return count; |
| 608 } | 609 } |
| 609 | 610 |
| 610 void MetadataDatabaseIndexOnDisk::SetSyncRootRevalidated() const { | 611 void MetadataDatabaseIndexOnDisk::SetSyncRootRevalidated() const { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 649 | 650 |
| 650 int64_t MetadataDatabaseIndexOnDisk::GetNextTrackerID() const { | 651 int64_t MetadataDatabaseIndexOnDisk::GetNextTrackerID() const { |
| 651 if (!service_metadata_->has_next_tracker_id()) | 652 if (!service_metadata_->has_next_tracker_id()) |
| 652 return kInvalidTrackerID; | 653 return kInvalidTrackerID; |
| 653 return service_metadata_->next_tracker_id(); | 654 return service_metadata_->next_tracker_id(); |
| 654 } | 655 } |
| 655 | 656 |
| 656 std::vector<std::string> | 657 std::vector<std::string> |
| 657 MetadataDatabaseIndexOnDisk::GetRegisteredAppIDs() const { | 658 MetadataDatabaseIndexOnDisk::GetRegisteredAppIDs() const { |
| 658 std::vector<std::string> result; | 659 std::vector<std::string> result; |
| 659 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 660 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 660 for (itr->Seek(kAppRootIDByAppIDKeyPrefix); itr->Valid(); itr->Next()) { | 661 for (itr->Seek(kAppRootIDByAppIDKeyPrefix); itr->Valid(); itr->Next()) { |
| 661 std::string id; | 662 std::string id; |
| 662 if (!RemovePrefix(itr->key().ToString(), kAppRootIDByAppIDKeyPrefix, &id)) | 663 if (!RemovePrefix(itr->key().ToString(), kAppRootIDByAppIDKeyPrefix, &id)) |
| 663 break; | 664 break; |
| 664 result.push_back(id); | 665 result.push_back(id); |
| 665 } | 666 } |
| 666 return result; | 667 return result; |
| 667 } | 668 } |
| 668 | 669 |
| 669 std::vector<int64_t> MetadataDatabaseIndexOnDisk::GetAllTrackerIDs() const { | 670 std::vector<int64_t> MetadataDatabaseIndexOnDisk::GetAllTrackerIDs() const { |
| 670 std::vector<int64_t> tracker_ids; | 671 std::vector<int64_t> tracker_ids; |
| 671 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 672 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 672 for (itr->Seek(kFileTrackerKeyPrefix); itr->Valid(); itr->Next()) { | 673 for (itr->Seek(kFileTrackerKeyPrefix); itr->Valid(); itr->Next()) { |
| 673 std::string id_str; | 674 std::string id_str; |
| 674 if (!RemovePrefix(itr->key().ToString(), kFileTrackerKeyPrefix, &id_str)) | 675 if (!RemovePrefix(itr->key().ToString(), kFileTrackerKeyPrefix, &id_str)) |
| 675 break; | 676 break; |
| 676 | 677 |
| 677 int64_t tracker_id; | 678 int64_t tracker_id; |
| 678 if (!base::StringToInt64(id_str, &tracker_id)) | 679 if (!base::StringToInt64(id_str, &tracker_id)) |
| 679 continue; | 680 continue; |
| 680 tracker_ids.push_back(tracker_id); | 681 tracker_ids.push_back(tracker_id); |
| 681 } | 682 } |
| 682 return tracker_ids; | 683 return tracker_ids; |
| 683 } | 684 } |
| 684 | 685 |
| 685 std::vector<std::string> | 686 std::vector<std::string> |
| 686 MetadataDatabaseIndexOnDisk::GetAllMetadataIDs() const { | 687 MetadataDatabaseIndexOnDisk::GetAllMetadataIDs() const { |
| 687 std::vector<std::string> file_ids; | 688 std::vector<std::string> file_ids; |
| 688 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 689 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 689 for (itr->Seek(kFileMetadataKeyPrefix); itr->Valid(); itr->Next()) { | 690 for (itr->Seek(kFileMetadataKeyPrefix); itr->Valid(); itr->Next()) { |
| 690 std::string file_id; | 691 std::string file_id; |
| 691 if (!RemovePrefix(itr->key().ToString(), kFileMetadataKeyPrefix, &file_id)) | 692 if (!RemovePrefix(itr->key().ToString(), kFileMetadataKeyPrefix, &file_id)) |
| 692 break; | 693 break; |
| 693 file_ids.push_back(file_id); | 694 file_ids.push_back(file_id); |
| 694 } | 695 } |
| 695 return file_ids; | 696 return file_ids; |
| 696 } | 697 } |
| 697 | 698 |
| 698 int64_t MetadataDatabaseIndexOnDisk::BuildTrackerIndexes() { | 699 int64_t MetadataDatabaseIndexOnDisk::BuildTrackerIndexes() { |
| 699 int64_t num_puts_before = db_->num_puts(); | 700 int64_t num_puts_before = db_->num_puts(); |
| 700 | 701 |
| 701 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 702 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 702 for (itr->Seek(kFileTrackerKeyPrefix); itr->Valid(); itr->Next()) { | 703 for (itr->Seek(kFileTrackerKeyPrefix); itr->Valid(); itr->Next()) { |
| 703 if (!RemovePrefix(itr->key().ToString(), kFileTrackerKeyPrefix, nullptr)) | 704 if (!RemovePrefix(itr->key().ToString(), kFileTrackerKeyPrefix, nullptr)) |
| 704 break; | 705 break; |
| 705 | 706 |
| 706 FileTracker tracker; | 707 FileTracker tracker; |
| 707 if (!tracker.ParseFromString(itr->value().ToString())) { | 708 if (!tracker.ParseFromString(itr->value().ToString())) { |
| 708 util::Log(logging::LOG_WARNING, FROM_HERE, | 709 util::Log(logging::LOG_WARNING, FROM_HERE, |
| 709 "Failed to parse a Tracker"); | 710 "Failed to parse a Tracker"); |
| 710 continue; | 711 continue; |
| 711 } | 712 } |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 885 const FileTracker& new_tracker) { | 886 const FileTracker& new_tracker) { |
| 886 int64_t parent_id = new_tracker.parent_tracker_id(); | 887 int64_t parent_id = new_tracker.parent_tracker_id(); |
| 887 std::string title = GetTrackerTitle(new_tracker); | 888 std::string title = GetTrackerTitle(new_tracker); |
| 888 | 889 |
| 889 DVLOG(1) << " Add to trackers by parent and title: " | 890 DVLOG(1) << " Add to trackers by parent and title: " |
| 890 << parent_id << " " << title; | 891 << parent_id << " " << title; |
| 891 | 892 |
| 892 const std::string prefix = | 893 const std::string prefix = |
| 893 GenerateTrackerIDByParentAndTitleKeyPrefix(parent_id, title); | 894 GenerateTrackerIDByParentAndTitleKeyPrefix(parent_id, title); |
| 894 if (!title.empty()) { | 895 if (!title.empty()) { |
| 895 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 896 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 896 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { | 897 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { |
| 897 std::string id_str; | 898 std::string id_str; |
| 898 if (!RemovePrefix(itr->key().ToString(), prefix, &id_str)) | 899 if (!RemovePrefix(itr->key().ToString(), prefix, &id_str)) |
| 899 break; | 900 break; |
| 900 | 901 |
| 901 int64_t tracker_id; | 902 int64_t tracker_id; |
| 902 if (!base::StringToInt64(id_str, &tracker_id)) | 903 if (!base::StringToInt64(id_str, &tracker_id)) |
| 903 continue; | 904 continue; |
| 904 if (tracker_id == new_tracker.tracker_id()) { | 905 if (tracker_id == new_tracker.tracker_id()) { |
| 905 NOTREACHED(); | 906 NOTREACHED(); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1067 db_->Delete(demoted_key); | 1068 db_->Delete(demoted_key); |
| 1068 } | 1069 } |
| 1069 } | 1070 } |
| 1070 | 1071 |
| 1071 TrackerIDSet MetadataDatabaseIndexOnDisk::GetTrackerIDSetByPrefix( | 1072 TrackerIDSet MetadataDatabaseIndexOnDisk::GetTrackerIDSetByPrefix( |
| 1072 const std::string& active_tracker_key, | 1073 const std::string& active_tracker_key, |
| 1073 const std::string& ids_prefix) const { | 1074 const std::string& ids_prefix) const { |
| 1074 TrackerIDSet trackers; | 1075 TrackerIDSet trackers; |
| 1075 | 1076 |
| 1076 // Seek IDs. | 1077 // Seek IDs. |
| 1077 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 1078 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 1078 for (itr->Seek(ids_prefix); itr->Valid(); itr->Next()) { | 1079 for (itr->Seek(ids_prefix); itr->Valid(); itr->Next()) { |
| 1079 const std::string& key(itr->key().ToString()); | 1080 const std::string& key(itr->key().ToString()); |
| 1080 std::string id_str; | 1081 std::string id_str; |
| 1081 if (!RemovePrefix(key, ids_prefix, &id_str)) | 1082 if (!RemovePrefix(key, ids_prefix, &id_str)) |
| 1082 break; | 1083 break; |
| 1083 | 1084 |
| 1084 int64_t tracker_id; | 1085 int64_t tracker_id; |
| 1085 if (!base::StringToInt64(id_str, &tracker_id)) | 1086 if (!base::StringToInt64(id_str, &tracker_id)) |
| 1086 continue; | 1087 continue; |
| 1087 trackers.InsertInactiveTracker(tracker_id); | 1088 trackers.InsertInactiveTracker(tracker_id); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1157 std::string value; | 1158 std::string value; |
| 1158 leveldb::Status status = db_->Get(active_tracker_key, &value); | 1159 leveldb::Status status = db_->Get(active_tracker_key, &value); |
| 1159 int64_t active_tracker_id; | 1160 int64_t active_tracker_id; |
| 1160 if (status.ok() && base::StringToInt64(value, &active_tracker_id)) { | 1161 if (status.ok() && base::StringToInt64(value, &active_tracker_id)) { |
| 1161 DCHECK(active_tracker_id == tracker_id); | 1162 DCHECK(active_tracker_id == tracker_id); |
| 1162 db_->Delete(active_tracker_key); | 1163 db_->Delete(active_tracker_key); |
| 1163 } | 1164 } |
| 1164 } | 1165 } |
| 1165 | 1166 |
| 1166 bool MetadataDatabaseIndexOnDisk::DBHasKey(const std::string& key) const { | 1167 bool MetadataDatabaseIndexOnDisk::DBHasKey(const std::string& key) const { |
| 1167 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 1168 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 1168 itr->Seek(key); | 1169 itr->Seek(key); |
| 1169 return itr->Valid() && (itr->key() == key); | 1170 return itr->Valid() && (itr->key() == key); |
| 1170 } | 1171 } |
| 1171 | 1172 |
| 1172 size_t MetadataDatabaseIndexOnDisk::CountDirtyTrackerInternal() const { | 1173 size_t MetadataDatabaseIndexOnDisk::CountDirtyTrackerInternal() const { |
| 1173 size_t num_dirty_trackers = 0; | 1174 size_t num_dirty_trackers = 0; |
| 1174 | 1175 |
| 1175 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 1176 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 1176 for (itr->Seek(kDirtyIDKeyPrefix); itr->Valid(); itr->Next()) { | 1177 for (itr->Seek(kDirtyIDKeyPrefix); itr->Valid(); itr->Next()) { |
| 1177 if (!base::StartsWith(itr->key().ToString(), kDirtyIDKeyPrefix, | 1178 if (!base::StartsWith(itr->key().ToString(), kDirtyIDKeyPrefix, |
| 1178 base::CompareCase::SENSITIVE)) | 1179 base::CompareCase::SENSITIVE)) |
| 1179 break; | 1180 break; |
| 1180 ++num_dirty_trackers; | 1181 ++num_dirty_trackers; |
| 1181 } | 1182 } |
| 1182 | 1183 |
| 1183 return num_dirty_trackers; | 1184 return num_dirty_trackers; |
| 1184 } | 1185 } |
| 1185 | 1186 |
| 1186 MetadataDatabaseIndexOnDisk::NumEntries | 1187 MetadataDatabaseIndexOnDisk::NumEntries |
| 1187 MetadataDatabaseIndexOnDisk::CountWithPrefix(const std::string& prefix, | 1188 MetadataDatabaseIndexOnDisk::CountWithPrefix(const std::string& prefix, |
| 1188 int64_t ignored_id) { | 1189 int64_t ignored_id) { |
| 1189 const std::string ignored = base::Int64ToString(ignored_id); | 1190 const std::string ignored = base::Int64ToString(ignored_id); |
| 1190 | 1191 |
| 1191 size_t count = 0; | 1192 size_t count = 0; |
| 1192 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 1193 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 1193 for (itr->Seek(prefix); itr->Valid() && count <= 1; itr->Next()) { | 1194 for (itr->Seek(prefix); itr->Valid() && count <= 1; itr->Next()) { |
| 1194 std::string value; | 1195 std::string value; |
| 1195 if (!RemovePrefix(itr->key().ToString(), prefix, &value)) | 1196 if (!RemovePrefix(itr->key().ToString(), prefix, &value)) |
| 1196 break; | 1197 break; |
| 1197 if (value == ignored) | 1198 if (value == ignored) |
| 1198 continue; | 1199 continue; |
| 1199 | 1200 |
| 1200 ++count; | 1201 ++count; |
| 1201 } | 1202 } |
| 1202 | 1203 |
| 1203 if (count >= 2) | 1204 if (count >= 2) |
| 1204 return MULTIPLE; | 1205 return MULTIPLE; |
| 1205 return count == 0 ? NONE : SINGLE; | 1206 return count == 0 ? NONE : SINGLE; |
| 1206 } | 1207 } |
| 1207 | 1208 |
| 1208 void MetadataDatabaseIndexOnDisk::DeleteKeyStartsWith( | 1209 void MetadataDatabaseIndexOnDisk::DeleteKeyStartsWith( |
| 1209 const std::string& prefix) { | 1210 const std::string& prefix) { |
| 1210 scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); | 1211 std::unique_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator()); |
| 1211 for (itr->Seek(prefix); itr->Valid();) { | 1212 for (itr->Seek(prefix); itr->Valid();) { |
| 1212 const std::string key = itr->key().ToString(); | 1213 const std::string key = itr->key().ToString(); |
| 1213 if (!base::StartsWith(key, prefix, base::CompareCase::SENSITIVE)) | 1214 if (!base::StartsWith(key, prefix, base::CompareCase::SENSITIVE)) |
| 1214 break; | 1215 break; |
| 1215 itr->Delete(); | 1216 itr->Delete(); |
| 1216 } | 1217 } |
| 1217 } | 1218 } |
| 1218 | 1219 |
| 1219 } // namespace drive_backend | 1220 } // namespace drive_backend |
| 1220 } // namespace sync_file_system | 1221 } // namespace sync_file_system |
| OLD | NEW |