metadata_db_migration_util.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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 3// found in the LICENSE file. 4 5#include "chrome/browser/sync_file_system/drive_backend/metadata_db_migration_util.h" 6 7#include "base/files/file_path.h" 8#include "base/memory/scoped_ptr.h" 9#include "base/strings/string_util.h" 10#include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h" 11#include "storage/common/fileapi/file_system_types.h" 12#include "storage/common/fileapi/file_system_util.h" 13#include "third_party/leveldatabase/src/include/leveldb/db.h" 14#include "third_party/leveldatabase/src/include/leveldb/write_batch.h" 15#include "url/gurl.h" 16 17namespace sync_file_system { 18namespace drive_backend { 19 20SyncStatusCode MigrateDatabaseFromV4ToV3(leveldb::DB* db) { 21 // Rollback from version 4 to version 3. 22 // Please see metadata_database_index.cc for version 3 format, and 23 // metadata_database_index_on_disk.cc for version 4 format. 24 25 const char kDatabaseVersionKey[] = "VERSION"; 26 const char kServiceMetadataKey[] = "SERVICE"; 27 const char kFileMetadataKeyPrefix[] = "FILE: "; 28 const char kFileTrackerKeyPrefix[] = "TRACKER: "; 29 30 // Key prefixes used in version 4. 31 const char kAppRootIDByAppIDKeyPrefix[] = "APP_ROOT: "; 32 const char kActiveTrackerIDByFileIDKeyPrefix[] = "ACTIVE_FILE: "; 33 const char kTrackerIDByFileIDKeyPrefix[] = "TRACKER_FILE: "; 34 const char kMultiTrackerByFileIDKeyPrefix[] = "MULTI_FILE: "; 35 const char kActiveTrackerIDByParentAndTitleKeyPrefix[] = "ACTIVE_PATH: "; 36 const char kTrackerIDByParentAndTitleKeyPrefix[] = "TRACKER_PATH: "; 37 const char kMultiBackingParentAndTitleKeyPrefix[] = "MULTI_PATH: "; 38 const char kDirtyIDKeyPrefix[] = "DIRTY: "; 39 const char kDemotedDirtyIDKeyPrefix[] = "DEMOTED_DIRTY: "; 40 41 leveldb::WriteBatch write_batch; 42 write_batch.Put(kDatabaseVersionKey, "3"); 43 44 scoped_ptr<leveldb::Iterator> itr(db->NewIterator(leveldb::ReadOptions())); 45 for (itr->SeekToFirst(); itr->Valid(); itr->Next()) { 46 std::string key = itr->key().ToString(); 47 48 // Do nothing for valid entries in both versions. 49 if (StartsWithASCII(key, kServiceMetadataKey, true) || 50 StartsWithASCII(key, kFileMetadataKeyPrefix, true) || 51 StartsWithASCII(key, kFileTrackerKeyPrefix, true)) { 52 continue; 53 } 54 55 // Drop entries used in version 4 only. 56 if (StartsWithASCII(key, kAppRootIDByAppIDKeyPrefix, true) || 57 StartsWithASCII(key, kActiveTrackerIDByFileIDKeyPrefix, true) || 58 StartsWithASCII(key, kTrackerIDByFileIDKeyPrefix, true) || 59 StartsWithASCII(key, kMultiTrackerByFileIDKeyPrefix, true) || 60 StartsWithASCII(key, kActiveTrackerIDByParentAndTitleKeyPrefix, true) || 61 StartsWithASCII(key, kTrackerIDByParentAndTitleKeyPrefix, true) || 62 StartsWithASCII(key, kMultiBackingParentAndTitleKeyPrefix, true) || 63 StartsWithASCII(key, kDirtyIDKeyPrefix, true) || 64 StartsWithASCII(key, kDemotedDirtyIDKeyPrefix, true)) { 65 write_batch.Delete(key); 66 continue; 67 } 68 69 DVLOG(3) << "Unknown key: " << key << " was found."; 70 } 71 72 return LevelDBStatusToSyncStatusCode( 73 db->Write(leveldb::WriteOptions(), &write_batch)); 74} 75 76} // namespace drive_backend 77} // namespace sync_file_system 78