summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.cc35
-rw-r--r--chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.h10
-rw-r--r--chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk_unittest.cc13
3 files changed, 53 insertions, 5 deletions
diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.cc
index a5b7163..ae40a2b 100644
--- a/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.cc
+++ b/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.cc
@@ -680,7 +680,9 @@ MetadataDatabaseIndexOnDisk::GetAllMetadataIDs() const {
return file_ids;
}
-void MetadataDatabaseIndexOnDisk::BuildTrackerIndexes() {
+int64 MetadataDatabaseIndexOnDisk::BuildTrackerIndexes() {
+ int64 num_puts_before = db_->num_puts();
+
scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator());
for (itr->Seek(kFileTrackerKeyPrefix); itr->Valid(); itr->Next()) {
if (!RemovePrefix(itr->key().ToString(), kFileTrackerKeyPrefix, NULL))
@@ -698,6 +700,23 @@ void MetadataDatabaseIndexOnDisk::BuildTrackerIndexes() {
AddToPathIndexes(tracker);
AddToDirtyTrackerIndexes(tracker);
}
+
+ return db_->num_puts() - num_puts_before;
+}
+
+int64 MetadataDatabaseIndexOnDisk::DeleteTrackerIndexes() {
+ const char* kIndexPrefixes[] = {
+ kAppRootIDByAppIDKeyPrefix, kActiveTrackerIDByFileIDKeyPrefix,
+ kTrackerIDByFileIDKeyPrefix, kMultiTrackerByFileIDKeyPrefix,
+ kActiveTrackerIDByParentAndTitleKeyPrefix,
+ kTrackerIDByParentAndTitleKeyPrefix, kMultiBackingParentAndTitleKeyPrefix,
+ kDirtyIDKeyPrefix, kDemotedDirtyIDKeyPrefix
+ };
+
+ int64 num_deletes_before = db_->num_deletes();
+ for (size_t i = 0; i < arraysize(kIndexPrefixes); ++i)
+ DeleteKeyStartsWith(kIndexPrefixes[i]);
+ return db_->num_deletes() - num_deletes_before;
}
LevelDBWrapper* MetadataDatabaseIndexOnDisk::GetDBForTesting() {
@@ -772,8 +791,7 @@ void MetadataDatabaseIndexOnDisk::AddToFileIDIndexes(
DVLOG(1) << " Add to trackers by file ID: " << file_id;
const std::string prefix = GenerateTrackerIDByFileIDKeyPrefix(file_id);
AddToTrackerIDSetWithPrefix(
- GenerateActiveTrackerIDByFileIDKey(file_id),
- prefix, new_tracker);
+ GenerateActiveTrackerIDByFileIDKey(file_id), prefix, new_tracker);
const std::string multi_tracker_key = GenerateMultiTrackerKey(file_id);
if (!DBHasKey(multi_tracker_key) &&
@@ -1125,5 +1143,16 @@ MetadataDatabaseIndexOnDisk::CountWithPrefix(
return count == 0 ? NONE : SINGLE;
}
+void MetadataDatabaseIndexOnDisk::DeleteKeyStartsWith(
+ const std::string& prefix) {
+ scoped_ptr<LevelDBWrapper::Iterator> itr(db_->NewIterator());
+ for (itr->Seek(prefix); itr->Valid();) {
+ const std::string key = itr->key().ToString();
+ if (!StartsWithASCII(key, prefix, true))
+ break;
+ itr->Delete();
+ }
+}
+
} // namespace drive_backend
} // namespace sync_file_system
diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.h b/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.h
index 12f757a..8dae9ce 100644
--- a/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.h
+++ b/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk.h
@@ -69,7 +69,12 @@ class MetadataDatabaseIndexOnDisk : public MetadataDatabaseIndexInterface {
virtual std::vector<std::string> GetAllMetadataIDs() const OVERRIDE;
// Builds on-disk indexes from FileTracker entries on disk.
- void BuildTrackerIndexes();
+ // Returns the number of newly added entries for indexing.
+ int64 BuildTrackerIndexes();
+
+ // Deletes entries used for indexes on on-disk database.
+ // Returns the number of the deleted entries.
+ int64 DeleteTrackerIndexes();
LevelDBWrapper* GetDBForTesting();
@@ -150,6 +155,9 @@ class MetadataDatabaseIndexOnDisk : public MetadataDatabaseIndexInterface {
// Entries for |ignored_id| are not counted in.
NumEntries CountWithPrefix(const std::string& prefix, int64 ignored_id);
+ // Deletes entries whose keys start from |prefix|.
+ void DeleteKeyStartsWith(const std::string& prefix);
+
LevelDBWrapper* db_; // Not owned.
scoped_ptr<ServiceMetadata> service_metadata_;
diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk_unittest.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk_unittest.cc
index f40e6f2..1ce143f 100644
--- a/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk_unittest.cc
+++ b/chrome/browser/sync_file_system/drive_backend/metadata_database_index_on_disk_unittest.cc
@@ -237,7 +237,7 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, BuildIndexTest) {
EXPECT_TRUE(tracker_ids.empty());
EXPECT_EQ(0U, index()->CountDirtyTracker());
- index()->BuildTrackerIndexes();
+ EXPECT_EQ(16, index()->BuildTrackerIndexes());
WriteToDB();
// After building indexes, we should have correct indexes.
@@ -252,6 +252,17 @@ TEST_F(MetadataDatabaseIndexOnDiskTest, BuildIndexTest) {
EXPECT_EQ(1U, index()->CountDirtyTracker());
}
+TEST_F(MetadataDatabaseIndexOnDiskTest, BuildAndDeleteIndexTest) {
+ CreateTestDatabase(false, NULL);
+ int64 answer = index()->BuildTrackerIndexes();
+ WriteToDB();
+ ASSERT_EQ(16, answer);
+ EXPECT_EQ(answer, index()->DeleteTrackerIndexes());
+ WriteToDB();
+ EXPECT_EQ(answer, index()->BuildTrackerIndexes());
+ WriteToDB();
+}
+
TEST_F(MetadataDatabaseIndexOnDiskTest, AllEntriesTest) {
CreateTestDatabase(true, NULL);