| Index: chrome/browser/sync_file_system/drive_backend/metadata_db_migration_util.cc
|
| diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_db_migration_util.cc b/chrome/browser/sync_file_system/drive_backend/metadata_db_migration_util.cc
|
| index d33e0c6c7c01c7a0a49d660fe115d985fe88562a..d2df813460071df8326efc87152d7ffe6f3e656d 100644
|
| --- a/chrome/browser/sync_file_system/drive_backend/metadata_db_migration_util.cc
|
| +++ b/chrome/browser/sync_file_system/drive_backend/metadata_db_migration_util.cc
|
| @@ -244,5 +244,61 @@ SyncStatusCode MigrateDatabaseFromV1ToV2(leveldb::DB* db) {
|
| db->Write(leveldb::WriteOptions(), &write_batch));
|
| }
|
|
|
| +SyncStatusCode MigrateDatabaseFromV4ToV3(leveldb::DB* db) {
|
| + // Rollback from version 4 to version 3.
|
| + // Please see metadata_database_index.cc for version 3 format, and
|
| + // metadata_database_index_on_disk.cc for version 4 format.
|
| +
|
| + const char kDatabaseVersionKey[] = "VERSION";
|
| + const char kServiceMetadataKey[] = "SERVICE";
|
| + const char kFileMetadataKeyPrefix[] = "FILE: ";
|
| + const char kFileTrackerKeyPrefix[] = "TRACKER: ";
|
| +
|
| + // Key prefixes used in version 4.
|
| + const char kAppRootIDByAppIDKeyPrefix[] = "APP_ROOT: ";
|
| + const char kActiveTrackerIDByFileIDKeyPrefix[] = "ACTIVE_FILE: ";
|
| + const char kTrackerIDByFileIDKeyPrefix[] = "TRACKER_FILE: ";
|
| + const char kMultiTrackerByFileIDKeyPrefix[] = "MULTI_FILE: ";
|
| + const char kActiveTrackerIDByParentAndTitleKeyPrefix[] = "ACTIVE_PATH: ";
|
| + const char kTrackerIDByParentAndTitleKeyPrefix[] = "TRACKER_PATH: ";
|
| + const char kMultiBackingParentAndTitleKeyPrefix[] = "MULTI_PATH: ";
|
| + const char kDirtyIDKeyPrefix[] = "DIRTY: ";
|
| + const char kDemotedDirtyIDKeyPrefix[] = "DEMOTED_DIRTY: ";
|
| +
|
| + leveldb::WriteBatch write_batch;
|
| + write_batch.Put(kDatabaseVersionKey, "3");
|
| +
|
| + scoped_ptr<leveldb::Iterator> itr(db->NewIterator(leveldb::ReadOptions()));
|
| + for (itr->SeekToFirst(); itr->Valid(); itr->Next()) {
|
| + std::string key = itr->key().ToString();
|
| +
|
| + // Do nothing for valid entries in both versions.
|
| + if (StartsWithASCII(key, kServiceMetadataKey, true) ||
|
| + StartsWithASCII(key, kFileMetadataKeyPrefix, true) ||
|
| + StartsWithASCII(key, kFileTrackerKeyPrefix, true)) {
|
| + continue;
|
| + }
|
| +
|
| + // Drop entries used in version 4 only.
|
| + if (StartsWithASCII(key, kAppRootIDByAppIDKeyPrefix, true) ||
|
| + StartsWithASCII(key, kActiveTrackerIDByFileIDKeyPrefix, true) ||
|
| + StartsWithASCII(key, kTrackerIDByFileIDKeyPrefix, true) ||
|
| + StartsWithASCII(key, kMultiTrackerByFileIDKeyPrefix, true) ||
|
| + StartsWithASCII(key, kActiveTrackerIDByParentAndTitleKeyPrefix, true) ||
|
| + StartsWithASCII(key, kTrackerIDByParentAndTitleKeyPrefix, true) ||
|
| + StartsWithASCII(key, kMultiBackingParentAndTitleKeyPrefix, true) ||
|
| + StartsWithASCII(key, kDirtyIDKeyPrefix, true) ||
|
| + StartsWithASCII(key, kDemotedDirtyIDKeyPrefix, true)) {
|
| + write_batch.Delete(key);
|
| + continue;
|
| + }
|
| +
|
| + DVLOG(3) << "Unknown key: " << key << " was found.";
|
| + }
|
| +
|
| + return LevelDBStatusToSyncStatusCode(
|
| + db->Write(leveldb::WriteOptions(), &write_batch));
|
| +}
|
| +
|
| } // namespace drive_backend
|
| } // namespace sync_file_system
|
|
|