Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5858)

Unified Diff: chrome/browser/sync_file_system/drive_metadata_store.cc

Issue 15808002: SyncFS: Convert WAPI ResourceID to DriveAPI FileID (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: migrate more fields and address comments Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/sync_file_system/drive_metadata_store.cc
diff --git a/chrome/browser/sync_file_system/drive_metadata_store.cc b/chrome/browser/sync_file_system/drive_metadata_store.cc
index 9c3519abf83b69c409e72c61dab586edc0a1a46b..978a23e74dfa6b17102885c7621d2cc447a540bd 100644
--- a/chrome/browser/sync_file_system/drive_metadata_store.cc
+++ b/chrome/browser/sync_file_system/drive_metadata_store.cc
@@ -18,6 +18,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/task_runner_util.h"
#include "chrome/browser/sync_file_system/drive_file_sync_service.h"
+#include "chrome/browser/sync_file_system/drive_file_sync_util.h"
#include "chrome/browser/sync_file_system/sync_file_system.pb.h"
#include "googleurl/src/gurl.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
@@ -40,7 +41,7 @@ namespace {
const char* const kServiceName = DriveFileSyncService::kServiceName;
const char kDatabaseVersionKey[] = "VERSION";
-const int64 kCurrentDatabaseVersion = 1;
+const int64 kCurrentDatabaseVersion = 2;
const char kChangeStampKey[] = "CHANGE_STAMP";
const char kSyncRootDirectoryKey[] = "SYNC_ROOT_DIR";
const char kDriveMetadataKeyPrefix[] = "METADATA: ";
@@ -50,6 +51,9 @@ const char kDriveIncrementalSyncOriginKeyPrefix[] = "ISYNC_ORIGIN: ";
const char kDriveDisabledOriginKeyPrefix[] = "DISABLED_ORIGIN: ";
const size_t kDriveMetadataKeyPrefixLength = arraysize(kDriveMetadataKeyPrefix);
+const char kWapiFileIdPrefix[] = "file:";
+const char kWapiFolderIdPrefix[] = "folder:";
+
const base::FilePath::CharType kV0FormatPathPrefix[] =
FILE_PATH_LITERAL("drive/");
@@ -105,6 +109,43 @@ bool UpdateResourceIdMap(ResourceIdByOrigin* map,
return true;
}
+std::string AddWapiFilePrefix(const std::string& resource_id) {
+ if (resource_id.empty() ||
+ StartsWithASCII(resource_id, kWapiFileIdPrefix, true))
+ return resource_id;
+ return kWapiFileIdPrefix + resource_id;
+}
+
+std::string AddWapiFolderPrefix(const std::string& resource_id) {
+ if (resource_id.empty() ||
+ StartsWithASCII(resource_id, kWapiFolderIdPrefix, true))
+ return resource_id;
+ return kWapiFolderIdPrefix + resource_id;
+}
+
+std::string AddWapiIdPrefix(const std::string& resource_id,
+ DriveMetadata_ResourceType type) {
+ switch (type) {
+ case DriveMetadata_ResourceType_RESOURCE_TYPE_FILE:
+ return AddWapiFilePrefix(resource_id);
+ case DriveMetadata_ResourceType_RESOURCE_TYPE_FOLDER:
+ return AddWapiFolderPrefix(resource_id);
+ default:
+ NOTREACHED();
+ return resource_id;
+ }
+}
+
+std::string RemoveWapiIdPrefix(const std::string& resource_id) {
+ if (StartsWithASCII(resource_id, kWapiFileIdPrefix, true))
+ return std::string(resource_id.begin() + arraysize(kWapiFileIdPrefix) - 1,
+ resource_id.end());
+ if (StartsWithASCII(resource_id, kWapiFolderIdPrefix, true))
+ return std::string(resource_id.begin() + arraysize(kWapiFolderIdPrefix) - 1,
+ resource_id.end());
+ return resource_id;
+}
+
} // namespace
class DriveMetadataDB {
@@ -125,7 +166,8 @@ class DriveMetadataDB {
SyncStatusCode ReadContents(DriveMetadataDBContents* contents);
SyncStatusCode MigrateDatabaseIfNeeded();
- SyncStatusCode MigrateFromVersion0Database();
+ SyncStatusCode MigrateFromVersion0To1Database();
+ SyncStatusCode MigrateFromVersion1To2Database();
SyncStatusCode SetLargestChangestamp(int64 largest_changestamp);
SyncStatusCode SetSyncRootDirectory(const std::string& resource_id);
@@ -134,7 +176,7 @@ class DriveMetadataDB {
OriginSyncType sync_type,
const std::string& resource_id);
SyncStatusCode UpdateEntry(const FileSystemURL& url,
- const DriveMetadata& metadata);
+ DriveMetadata metadata);
SyncStatusCode DeleteEntry(const FileSystemURL& url);
// TODO(calvinlo): consolidate these state transition functions for sync
@@ -449,6 +491,7 @@ void DriveMetadataStore::DeleteEntry(
AsWeakPtr(), callback));
return;
}
+
base::MessageLoopProxy::current()->PostTask(
FROM_HERE,
base::Bind(callback, SYNC_DATABASE_ERROR_NOT_FOUND));
@@ -857,6 +900,11 @@ SyncStatusCode DriveMetadataDB::ReadContents(
bool success = metadata.ParseFromString(itr->value().ToString());
DCHECK(success);
+ if (!IsDriveAPIEnabled()) {
+ metadata.set_resource_id(
+ AddWapiIdPrefix(metadata.resource_id(), metadata.type()));
+ }
+
success = contents->metadata_map[origin].insert(
std::make_pair(path, metadata)).second;
DCHECK(success);
@@ -894,14 +942,18 @@ SyncStatusCode DriveMetadataDB::MigrateDatabaseIfNeeded() {
return SYNC_STATUS_OK;
}
- if (database_version == 0) {
- MigrateFromVersion0Database();
- return SYNC_STATUS_OK;
+ switch (database_version) {
+ case 0:
+ MigrateFromVersion0To1Database();
+ // fall-through
+ case 1:
+ MigrateFromVersion1To2Database();
+ return SYNC_STATUS_OK;
}
return SYNC_DATABASE_ERROR_FAILED;
}
-SyncStatusCode DriveMetadataDB::MigrateFromVersion0Database() {
+SyncStatusCode DriveMetadataDB::MigrateFromVersion0To1Database() {
// Version 0 database format:
// key: "CHANGE_STAMP"
// value: <Largest Changestamp>
@@ -942,8 +994,7 @@ SyncStatusCode DriveMetadataDB::MigrateFromVersion0Database() {
// value: <Resource ID of the drive directory for the origin>
leveldb::WriteBatch write_batch;
- write_batch.Put(kDatabaseVersionKey,
- base::Int64ToString(kCurrentDatabaseVersion));
+ write_batch.Put(kDatabaseVersionKey, "1");
scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
for (itr->Seek(kDriveMetadataKeyPrefix); itr->Valid(); itr->Next()) {
@@ -968,6 +1019,110 @@ SyncStatusCode DriveMetadataDB::MigrateFromVersion0Database() {
db_->Write(leveldb::WriteOptions(), &write_batch));
}
+SyncStatusCode DriveMetadataDB::MigrateFromVersion1To2Database() {
+ // Strips prefix of WAPI resource ID.
+ // (i.e. "file:xxxx" => "xxxx", "folder:yyyy" => "yyyy")
+ //
+ // Version 2 database format (changed keys/fields are marked with '*'):
+ // key: "VERSION"
+ // * value: 2
+ //
+ // key: "CHANGE_STAMP"
+ // value: <Largest Changestamp>
+ //
+ // key: "SYNC_ROOT_DIR"
+ // * value: <Resource ID of the sync root directory> (striped)
+ //
+ // key: "METADATA: " + <Origin and URL>
+ // * value: <Serialized DriveMetadata> (striped)
+ //
+ // key: "BSYNC_ORIGIN: " + <URL string of a batch sync origin>
+ // * value: <Resource ID of the drive directory for the origin> (striped)
+ //
+ // key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin>
+ // * value: <Resource ID of the drive directory for the origin> (striped)
+ //
+ // key: "DISABLED_ORIGIN: " + <URL string of a disabled origin>
+ // * value: <Resource ID of the drive directory for the origin> (striped)
+
+ leveldb::WriteBatch write_batch;
+ write_batch.Put(kDatabaseVersionKey, "2");
+
+ // Strip resource id for the sync root directory.
+ std::string sync_root_resource_id;
+ leveldb::Status status = db_->Get(
+ leveldb::ReadOptions(), kSyncRootDirectoryKey, &sync_root_resource_id);
+ write_batch.Put(kSyncRootDirectoryKey,
+ RemoveWapiIdPrefix(sync_root_resource_id));
+
+ // Strip resource ids in the drive metadata.
+ scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
+ for (itr->Seek(kDriveMetadataKeyPrefix); itr->Valid(); itr->Next()) {
+ std::string key = itr->key().ToString();
+ if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true))
+ break;
+
+ DriveMetadata metadata;
+ bool success = metadata.ParseFromString(itr->value().ToString());
+ DCHECK(success);
+
+ metadata.set_resource_id(RemoveWapiIdPrefix(metadata.resource_id()));
+
+ write_batch.Put(key, itr->value());
+ }
+
+ // Strip resource ids of the batch sync origins.
+ for (itr->Seek(kDriveBatchSyncOriginKeyPrefix);
+ itr->Valid(); itr->Next()) {
+ std::string key = itr->key().ToString();
+ if (!StartsWithASCII(key, kDriveBatchSyncOriginKeyPrefix, true))
+ break;
+
+ GURL origin(std::string(
+ key.begin() + arraysize(kDriveBatchSyncOriginKeyPrefix) - 1,
+ key.end()));
+ DCHECK(origin.is_valid());
+
+ write_batch.Put(CreateKeyForOriginRoot(origin, BATCH_SYNC_ORIGIN),
+ RemoveWapiIdPrefix(itr->value().ToString()));
+ }
+
+ // Strip resource ids of the incremental sync origins.
+ for (itr->Seek(kDriveIncrementalSyncOriginKeyPrefix);
+ itr->Valid(); itr->Next()) {
+ std::string key = itr->key().ToString();
+ if (!StartsWithASCII(key, kDriveIncrementalSyncOriginKeyPrefix, true))
+ break;
+
+ GURL origin(std::string(
+ key.begin() + arraysize(kDriveIncrementalSyncOriginKeyPrefix) - 1,
+ key.end()));
+ DCHECK(origin.is_valid());
+
+ write_batch.Put(CreateKeyForOriginRoot(origin, INCREMENTAL_SYNC_ORIGIN),
+ RemoveWapiIdPrefix(itr->value().ToString()));
+ }
+
+ // Strip resource ids of the disabled sync origins.
+ for (itr->Seek(kDriveDisabledOriginKeyPrefix);
+ itr->Valid(); itr->Next()) {
+ std::string key = itr->key().ToString();
+ if (!StartsWithASCII(key, kDriveDisabledOriginKeyPrefix, true))
+ break;
+
+ GURL origin(std::string(
+ key.begin() + arraysize(kDriveDisabledOriginKeyPrefix) - 1,
+ key.end()));
+ DCHECK(origin.is_valid());
+
+ write_batch.Put(CreateKeyForOriginRoot(origin, DISABLED_ORIGIN),
+ RemoveWapiIdPrefix(itr->value().ToString()));
+ }
+
+ return LevelDBStatusToSyncStatusCode(
+ db_->Write(leveldb::WriteOptions(), &write_batch));
+}
+
SyncStatusCode DriveMetadataDB::SetLargestChangestamp(
int64 largest_changestamp) {
DCHECK(CalledOnValidThread());
@@ -984,8 +1139,9 @@ SyncStatusCode DriveMetadataDB::SetSyncRootDirectory(
DCHECK(CalledOnValidThread());
DCHECK(db_.get());
- leveldb::Status status = db_->Put(
- leveldb::WriteOptions(), kSyncRootDirectoryKey, resource_id);
+ leveldb::Status status = db_->Put(leveldb::WriteOptions(),
+ kSyncRootDirectoryKey,
+ RemoveWapiIdPrefix(resource_id));
return LevelDBStatusToSyncStatusCode(status);
}
@@ -1000,7 +1156,8 @@ SyncStatusCode DriveMetadataDB::SetOriginRootDirectory(
if (key.empty())
return SYNC_DATABASE_ERROR_FAILED;
- leveldb::Status status = db_->Put(leveldb::WriteOptions(), key, resource_id);
+ leveldb::Status status = db_->Put(
+ leveldb::WriteOptions(), key, RemoveWapiIdPrefix(resource_id));
return LevelDBStatusToSyncStatusCode(status);
}
@@ -1010,14 +1167,21 @@ SyncStatusCode DriveMetadataDB::GetSyncRootDirectory(std::string* resource_id) {
leveldb::Status status = db_->Get(
leveldb::ReadOptions(), kSyncRootDirectoryKey, resource_id);
+
+ if (!IsDriveAPIEnabled() && status.ok())
+ *resource_id = AddWapiFolderPrefix(*resource_id);
+
return LevelDBStatusToSyncStatusCode(status);
}
SyncStatusCode DriveMetadataDB::UpdateEntry(const FileSystemURL& url,
- const DriveMetadata& metadata) {
+ DriveMetadata metadata) {
DCHECK(CalledOnValidThread());
DCHECK(db_.get());
+ if (!IsDriveAPIEnabled())
+ metadata.set_resource_id(RemoveWapiIdPrefix(metadata.resource_id()));
+
std::string metadata_key = FileSystemURLToMetadataKey(url);
std::string value;
bool success = metadata.SerializeToString(&value);
@@ -1046,7 +1210,7 @@ SyncStatusCode DriveMetadataDB::UpdateOriginAsBatchSync(
leveldb::Status status = db_->Put(
leveldb::WriteOptions(),
CreateKeyForOriginRoot(origin, BATCH_SYNC_ORIGIN),
- resource_id);
+ RemoveWapiIdPrefix(resource_id));
return LevelDBStatusToSyncStatusCode(status);
}
@@ -1059,7 +1223,7 @@ SyncStatusCode DriveMetadataDB::UpdateOriginAsIncrementalSync(
batch.Delete(CreateKeyForOriginRoot(origin, BATCH_SYNC_ORIGIN));
batch.Delete(CreateKeyForOriginRoot(origin, DISABLED_ORIGIN));
batch.Put(CreateKeyForOriginRoot(origin, INCREMENTAL_SYNC_ORIGIN),
- resource_id);
+ RemoveWapiIdPrefix(resource_id));
leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
return LevelDBStatusToSyncStatusCode(status);
@@ -1073,7 +1237,8 @@ SyncStatusCode DriveMetadataDB::EnableOrigin(
leveldb::WriteBatch batch;
batch.Delete(CreateKeyForOriginRoot(origin, INCREMENTAL_SYNC_ORIGIN));
batch.Delete(CreateKeyForOriginRoot(origin, DISABLED_ORIGIN));
- batch.Put(CreateKeyForOriginRoot(origin, BATCH_SYNC_ORIGIN), resource_id);
+ batch.Put(CreateKeyForOriginRoot(origin, BATCH_SYNC_ORIGIN),
+ RemoveWapiIdPrefix(resource_id));
leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
return LevelDBStatusToSyncStatusCode(status);
@@ -1089,7 +1254,7 @@ SyncStatusCode DriveMetadataDB::DisableOrigin(
batch.Delete(CreateKeyForOriginRoot(origin_to_disable,
INCREMENTAL_SYNC_ORIGIN));
batch.Put(CreateKeyForOriginRoot(origin_to_disable, DISABLED_ORIGIN),
- resource_id);
+ RemoveWapiIdPrefix(resource_id));
// Remove entries specified by |origin_to_disable|.
scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
@@ -1156,8 +1321,13 @@ SyncStatusCode DriveMetadataDB::GetOrigins(
key.begin() + arraysize(kDriveBatchSyncOriginKeyPrefix) - 1,
key.end()));
DCHECK(origin.is_valid());
+
+ std::string origin_resource_id =
+ IsDriveAPIEnabled() ? itr->value().ToString()
+ : AddWapiFolderPrefix(itr->value().ToString());
+
bool result = batch_sync_origins->insert(
- std::make_pair(origin, itr->value().ToString())).second;
+ std::make_pair(origin, origin_resource_id)).second;
DCHECK(result);
}
@@ -1171,8 +1341,13 @@ SyncStatusCode DriveMetadataDB::GetOrigins(
key.begin() + arraysize(kDriveIncrementalSyncOriginKeyPrefix) - 1,
key.end()));
DCHECK(origin.is_valid());
+
+ std::string origin_resource_id =
+ IsDriveAPIEnabled() ? itr->value().ToString()
+ : AddWapiFolderPrefix(itr->value().ToString());
+
bool result = incremental_sync_origins->insert(
- std::make_pair(origin, itr->value().ToString())).second;
+ std::make_pair(origin, origin_resource_id)).second;
DCHECK(result);
}
@@ -1186,8 +1361,13 @@ SyncStatusCode DriveMetadataDB::GetOrigins(
key.begin() + arraysize(kDriveDisabledOriginKeyPrefix) - 1,
key.end()));
DCHECK(origin.is_valid());
+
+ std::string origin_resource_id =
+ IsDriveAPIEnabled() ? itr->value().ToString()
+ : AddWapiFolderPrefix(itr->value().ToString());
+
bool result = disabled_origins->insert(
- std::make_pair(origin, itr->value().ToString())).second;
+ std::make_pair(origin, origin_resource_id)).second;
DCHECK(result);
}

Powered by Google App Engine
This is Rietveld 408576698