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 3831c43c5f96d026873c4346129f9d57baaf95fe..bc76f997f8d43d3928f5c2ee95153d1df248dbb1 100644 |
--- a/chrome/browser/sync_file_system/drive_metadata_store.cc |
+++ b/chrome/browser/sync_file_system/drive_metadata_store.cc |
@@ -44,6 +44,7 @@ const char kDriveMetadataKeyPrefix[] = "METADATA: "; |
const char kMetadataKeySeparator = ' '; |
const char kDriveBatchSyncOriginKeyPrefix[] = "BSYNC_ORIGIN: "; |
const char kDriveIncrementalSyncOriginKeyPrefix[] = "ISYNC_ORIGIN: "; |
+const char kDriveDisabledOriginKeyPrefix[] = "DISABLED_ORIGIN: "; |
const size_t kDriveMetadataKeyPrefixLength = arraysize(kDriveMetadataKeyPrefix); |
const base::FilePath::CharType kV0FormatPathPrefix[] = |
@@ -111,14 +112,23 @@ class DriveMetadataDB { |
const DriveMetadata& metadata); |
SyncStatusCode DeleteEntry(const FileSystemURL& url); |
- SyncStatusCode UpdateSyncOriginAsBatch(const GURL& origin, |
+ // TODO(calvinlo): consolidate these state transition functions for sync |
+ // origins like "UpdateOrigin(GURL, SyncStatusEnum)". And manage origins in |
+ // just one map like "Map<SyncStatusEnum, ResourceIDMap>". |
+ // http://crbug.com/211600 |
+ SyncStatusCode UpdateOriginAsBatchSync(const GURL& origin, |
const std::string& resource_id); |
- SyncStatusCode UpdateSyncOriginAsIncremental(const GURL& origin, |
+ SyncStatusCode UpdateOriginAsIncrementalSync(const GURL& origin, |
const std::string& resource_id); |
+ SyncStatusCode EnableOrigin(const GURL& origin, |
+ const std::string& resource_id); |
+ SyncStatusCode DisableOrigin(const GURL& origin, |
+ const std::string& resource_id); |
SyncStatusCode RemoveOrigin(const GURL& origin); |
- SyncStatusCode GetSyncOrigins(ResourceIDMap* batch_sync_origins, |
- ResourceIDMap* incremental_sync_origins); |
+ SyncStatusCode GetOrigins(ResourceIDMap* batch_sync_origins, |
+ ResourceIDMap* incremental_sync_origins, |
+ ResourceIDMap* disabled_origins); |
private: |
bool CalledOnValidThread() const { |
@@ -139,6 +149,7 @@ struct DriveMetadataDBContents { |
std::string sync_root_directory_resource_id; |
DriveMetadataStore::ResourceIDMap batch_sync_origins; |
DriveMetadataStore::ResourceIDMap incremental_sync_origins; |
+ DriveMetadataStore::ResourceIDMap disabled_origins; |
}; |
namespace { |
@@ -152,6 +163,7 @@ SyncStatusCode InitializeDBOnFileThread(DriveMetadataDB* db, |
contents->metadata_map.clear(); |
contents->batch_sync_origins.clear(); |
contents->incremental_sync_origins.clear(); |
+ contents->disabled_origins.clear(); |
bool created = false; |
SyncStatusCode status = db->Initialize(&created); |
@@ -172,6 +184,8 @@ SyncStatusCode InitializeDBOnFileThread(DriveMetadataDB* db, |
// Returns a key string for the given batch sync origin. |
// For example, when |origin| is "http://www.example.com", |
// returns "BSYNC_ORIGIN: http://www.example.com". |
+// TODO(calvinlo): consolidate these CreateKeyFor* functions. |
+// http://crbug.com/211600 |
std::string CreateKeyForBatchSyncOrigin(const GURL& origin) { |
DCHECK(origin.is_valid()); |
return kDriveBatchSyncOriginKeyPrefix + origin.spec(); |
@@ -185,6 +199,14 @@ std::string CreateKeyForIncrementalSyncOrigin(const GURL& origin) { |
return kDriveIncrementalSyncOriginKeyPrefix + origin.spec(); |
} |
+// Returns a key string for the given disabled origin. |
+// For example, when |origin| is "http://www.example.com", |
+// returns "DISABLED_ORIGIN: http://www.example.com". |
+std::string CreateKeyForDisabledOrigin(const GURL& origin) { |
+ DCHECK(origin.is_valid()); |
+ return kDriveDisabledOriginKeyPrefix + origin.spec(); |
+} |
+ |
void AddOriginsToVector(std::vector<GURL>* all_origins, |
const DriveMetadataStore::ResourceIDMap& resource_map) { |
typedef DriveMetadataStore::ResourceIDMap::const_iterator itr; |
@@ -240,6 +262,7 @@ void DriveMetadataStore::DidInitialize(const InitializationCallback& callback, |
sync_root_directory_resource_id_ = contents->sync_root_directory_resource_id; |
batch_sync_origins_.swap(contents->batch_sync_origins); |
incremental_sync_origins_.swap(contents->incremental_sync_origins); |
+ disabled_origins_.swap(contents->disabled_origins); |
// |largest_changestamp_| is set to 0 for a fresh empty database. |
callback.Run(status, largest_changestamp_ <= 0); |
} |
@@ -275,31 +298,36 @@ void DriveMetadataStore::DidRestoreSyncRootDirectory( |
callback.Run(status); |
} |
-void DriveMetadataStore::RestoreSyncOrigins( |
+void DriveMetadataStore::RestoreOrigins( |
const SyncStatusCallback& callback) { |
DCHECK(CalledOnValidThread()); |
ResourceIDMap* batch_sync_origins = new ResourceIDMap; |
ResourceIDMap* incremental_sync_origins = new ResourceIDMap; |
+ ResourceIDMap* disabled_origins = new ResourceIDMap; |
base::PostTaskAndReplyWithResult( |
file_task_runner_, FROM_HERE, |
- base::Bind(&DriveMetadataDB::GetSyncOrigins, |
+ base::Bind(&DriveMetadataDB::GetOrigins, |
base::Unretained(db_.get()), |
batch_sync_origins, |
- incremental_sync_origins), |
- base::Bind(&DriveMetadataStore::DidRestoreSyncOrigins, |
+ incremental_sync_origins, |
+ disabled_origins), |
+ base::Bind(&DriveMetadataStore::DidRestoreOrigins, |
AsWeakPtr(), callback, |
base::Owned(batch_sync_origins), |
- base::Owned(incremental_sync_origins))); |
+ base::Owned(incremental_sync_origins), |
+ base::Owned(disabled_origins))); |
} |
-void DriveMetadataStore::DidRestoreSyncOrigins( |
+void DriveMetadataStore::DidRestoreOrigins( |
const SyncStatusCallback& callback, |
ResourceIDMap* batch_sync_origins, |
ResourceIDMap* incremental_sync_origins, |
+ ResourceIDMap* disabled_origins, |
SyncStatusCode status) { |
DCHECK(CalledOnValidThread()); |
DCHECK(batch_sync_origins); |
DCHECK(incremental_sync_origins); |
+ DCHECK(disabled_origins); |
db_status_ = status; |
if (status != SYNC_STATUS_OK) { |
@@ -309,6 +337,7 @@ void DriveMetadataStore::DidRestoreSyncOrigins( |
batch_sync_origins_.swap(*batch_sync_origins); |
incremental_sync_origins_.swap(*incremental_sync_origins); |
+ disabled_origins_.swap(*disabled_origins); |
callback.Run(status); |
} |
@@ -420,11 +449,17 @@ bool DriveMetadataStore::IsIncrementalSyncOrigin(const GURL& origin) const { |
return ContainsKey(incremental_sync_origins_, origin); |
} |
+bool DriveMetadataStore::IsOriginDisabled(const GURL& origin) const { |
+ DCHECK(CalledOnValidThread()); |
+ return ContainsKey(disabled_origins_, origin); |
+} |
+ |
void DriveMetadataStore::AddBatchSyncOrigin(const GURL& origin, |
const std::string& resource_id) { |
DCHECK(CalledOnValidThread()); |
DCHECK(!IsBatchSyncOrigin(origin)); |
DCHECK(!IsIncrementalSyncOrigin(origin)); |
+ DCHECK(!IsOriginDisabled(origin)); |
DCHECK_EQ(SYNC_STATUS_OK, db_status_); |
batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
@@ -432,7 +467,7 @@ void DriveMetadataStore::AddBatchSyncOrigin(const GURL& origin, |
// Store a pair of |origin| and |resource_id| in the DB. |
base::PostTaskAndReplyWithResult( |
file_task_runner_, FROM_HERE, |
- base::Bind(&DriveMetadataDB::UpdateSyncOriginAsBatch, |
+ base::Bind(&DriveMetadataDB::UpdateOriginAsBatchSync, |
base::Unretained(db_.get()), origin, resource_id), |
base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); |
} |
@@ -441,6 +476,7 @@ void DriveMetadataStore::MoveBatchSyncOriginToIncremental(const GURL& origin) { |
DCHECK(CalledOnValidThread()); |
DCHECK(IsBatchSyncOrigin(origin)); |
DCHECK(!IsIncrementalSyncOrigin(origin)); |
+ DCHECK(!IsOriginDisabled(origin)); |
DCHECK_EQ(SYNC_STATUS_OK, db_status_); |
std::map<GURL, std::string>::iterator found = |
@@ -450,13 +486,74 @@ void DriveMetadataStore::MoveBatchSyncOriginToIncremental(const GURL& origin) { |
// Store a pair of |origin| and |resource_id| in the DB. |
base::PostTaskAndReplyWithResult( |
file_task_runner_, FROM_HERE, |
- base::Bind(&DriveMetadataDB::UpdateSyncOriginAsIncremental, |
+ base::Bind(&DriveMetadataDB::UpdateOriginAsIncrementalSync, |
base::Unretained(db_.get()), origin, found->second), |
base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); |
batch_sync_origins_.erase(found); |
} |
+void DriveMetadataStore::EnableOrigin( |
+ const GURL& origin, |
+ const SyncStatusCallback& callback) { |
+ DCHECK(CalledOnValidThread()); |
+ |
+ std::map<GURL, std::string>::iterator found = disabled_origins_.find(origin); |
+ if (found == disabled_origins_.end()) { |
+ // |origin| has not been registered yet. |
+ return; |
+ } |
+ std::string resource_id = found->second; |
+ disabled_origins_.erase(found); |
+ |
+ // Ensure |origin| is marked as a batch sync origin. |
+ batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
+ found = incremental_sync_origins_.find(origin); |
+ if (found != incremental_sync_origins_.end()) |
+ incremental_sync_origins_.erase(found); |
+ |
+ // Store a pair of |origin| and |resource_id| in the DB. |
+ base::PostTaskAndReplyWithResult( |
+ file_task_runner_, FROM_HERE, |
+ base::Bind(&DriveMetadataDB::EnableOrigin, |
+ base::Unretained(db_.get()), origin, resource_id), |
+ base::Bind(&DriveMetadataStore::DidUpdateOrigin, AsWeakPtr(), callback)); |
+} |
+ |
+void DriveMetadataStore::DisableOrigin( |
+ const GURL& origin, |
+ const SyncStatusCallback& callback) { |
+ DCHECK(CalledOnValidThread()); |
+ |
+ std::string resource_id; |
+ std::map<GURL, std::string>::iterator found = |
+ batch_sync_origins_.find(origin); |
+ if (found != batch_sync_origins_.end()) { |
+ resource_id = found->second; |
+ batch_sync_origins_.erase(found); |
+ } |
+ |
+ found = incremental_sync_origins_.find(origin); |
+ if (found != incremental_sync_origins_.end()) { |
+ resource_id = found->second; |
+ incremental_sync_origins_.erase(found); |
+ } |
+ |
+ if (resource_id.empty()) { |
+ // |origin| has not been registered yet. |
+ return; |
+ } |
+ |
+ disabled_origins_.insert(std::make_pair(origin, resource_id)); |
+ |
+ // Store a pair of |origin| and |resource_id| in the DB. |
+ base::PostTaskAndReplyWithResult( |
+ file_task_runner_, FROM_HERE, |
+ base::Bind(&DriveMetadataDB::DisableOrigin, |
+ base::Unretained(db_.get()), origin, resource_id), |
+ base::Bind(&DriveMetadataStore::DidUpdateOrigin, AsWeakPtr(), callback)); |
+} |
+ |
void DriveMetadataStore::RemoveOrigin( |
const GURL& origin, |
const SyncStatusCallback& callback) { |
@@ -465,15 +562,16 @@ void DriveMetadataStore::RemoveOrigin( |
metadata_map_.erase(origin); |
batch_sync_origins_.erase(origin); |
incremental_sync_origins_.erase(origin); |
+ disabled_origins_.erase(origin); |
base::PostTaskAndReplyWithResult( |
file_task_runner_, FROM_HERE, |
base::Bind(&DriveMetadataDB::RemoveOrigin, |
base::Unretained(db_.get()), origin), |
- base::Bind(&DriveMetadataStore::DidRemoveOrigin, AsWeakPtr(), callback)); |
+ base::Bind(&DriveMetadataStore::DidUpdateOrigin, AsWeakPtr(), callback)); |
} |
-void DriveMetadataStore::DidRemoveOrigin( |
+void DriveMetadataStore::DidUpdateOrigin( |
const SyncStatusCallback& callback, |
SyncStatusCode status) { |
UpdateDBStatus(status); |
@@ -545,7 +643,9 @@ SyncStatusCode DriveMetadataStore::GetToBeFetchedFiles( |
std::string DriveMetadataStore::GetResourceIdForOrigin( |
const GURL& origin) const { |
DCHECK(CalledOnValidThread()); |
- DCHECK(IsBatchSyncOrigin(origin) || IsIncrementalSyncOrigin(origin)); |
+ DCHECK(IsBatchSyncOrigin(origin) || |
+ IsIncrementalSyncOrigin(origin) || |
+ IsOriginDisabled(origin)); |
ResourceIDMap::const_iterator found = incremental_sync_origins_.find(origin); |
if (found != incremental_sync_origins_.end()) |
@@ -555,17 +655,28 @@ std::string DriveMetadataStore::GetResourceIdForOrigin( |
if (found != batch_sync_origins_.end()) |
return found->second; |
+ found = disabled_origins_.find(origin); |
+ if (found != disabled_origins_.end()) |
+ return found->second; |
+ |
NOTREACHED(); |
return std::string(); |
} |
-void DriveMetadataStore::GetAllOrigins(std::vector<GURL>* origins) { |
+void DriveMetadataStore::GetEnabledOrigins(std::vector<GURL>* origins) { |
+ origins->clear(); |
origins->reserve(batch_sync_origins_.size() + |
incremental_sync_origins_.size()); |
AddOriginsToVector(origins, batch_sync_origins_); |
AddOriginsToVector(origins, incremental_sync_origins_); |
} |
+void DriveMetadataStore::GetDisabledOrigins(std::vector<GURL>* origins) { |
+ origins->clear(); |
+ origins->reserve(disabled_origins_.size()); |
+ AddOriginsToVector(origins, disabled_origins_); |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
DriveMetadataDB::DriveMetadataDB(const base::FilePath& base_dir, |
@@ -645,8 +756,9 @@ SyncStatusCode DriveMetadataDB::ReadContents( |
} |
} |
- SyncStatusCode status = GetSyncOrigins(&contents->batch_sync_origins, |
- &contents->incremental_sync_origins); |
+ SyncStatusCode status = GetOrigins(&contents->batch_sync_origins, |
+ &contents->incremental_sync_origins, |
+ &contents->disabled_origins); |
if (status != SYNC_STATUS_OK && |
status != SYNC_DATABASE_ERROR_NOT_FOUND) |
return status; |
@@ -718,6 +830,9 @@ SyncStatusCode DriveMetadataDB::MigrateFromVersion0Database() { |
// |
// key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin> |
// value: <Resource ID of the drive directory for the origin> |
+ // |
+ // key: "DISABLED_ORIGIN: " + <URL string of a disabled origin> |
+ // value: <Resource ID of the drive directory for the origin> |
leveldb::WriteBatch write_batch; |
write_batch.Put(kDatabaseVersionKey, |
@@ -801,7 +916,7 @@ SyncStatusCode DriveMetadataDB::DeleteEntry(const FileSystemURL& url) { |
return LevelDBStatusToSyncStatusCode(status); |
} |
-SyncStatusCode DriveMetadataDB::UpdateSyncOriginAsBatch( |
+SyncStatusCode DriveMetadataDB::UpdateOriginAsBatchSync( |
const GURL& origin, const std::string& resource_id) { |
DCHECK(CalledOnValidThread()); |
DCHECK(db_.get()); |
@@ -813,25 +928,70 @@ SyncStatusCode DriveMetadataDB::UpdateSyncOriginAsBatch( |
return LevelDBStatusToSyncStatusCode(status); |
} |
-SyncStatusCode DriveMetadataDB::UpdateSyncOriginAsIncremental( |
+SyncStatusCode DriveMetadataDB::UpdateOriginAsIncrementalSync( |
const GURL& origin, const std::string& resource_id) { |
DCHECK(CalledOnValidThread()); |
DCHECK(db_.get()); |
leveldb::WriteBatch batch; |
batch.Delete(CreateKeyForBatchSyncOrigin(origin)); |
+ batch.Delete(CreateKeyForDisabledOrigin(origin)); |
batch.Put(CreateKeyForIncrementalSyncOrigin(origin), resource_id); |
leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); |
return LevelDBStatusToSyncStatusCode(status); |
} |
+SyncStatusCode DriveMetadataDB::EnableOrigin( |
+ const GURL& origin, const std::string& resource_id) { |
+ DCHECK(CalledOnValidThread()); |
+ DCHECK(db_.get()); |
+ |
+ leveldb::WriteBatch batch; |
+ batch.Delete(CreateKeyForIncrementalSyncOrigin(origin)); |
+ batch.Delete(CreateKeyForDisabledOrigin(origin)); |
+ batch.Put(CreateKeyForBatchSyncOrigin(origin), resource_id); |
+ leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); |
+ |
+ return LevelDBStatusToSyncStatusCode(status); |
+} |
+ |
+SyncStatusCode DriveMetadataDB::DisableOrigin( |
+ const GURL& origin_to_disable, const std::string& resource_id) { |
+ DCHECK(CalledOnValidThread()); |
+ DCHECK(db_.get()); |
+ |
+ leveldb::WriteBatch batch; |
+ batch.Delete(CreateKeyForBatchSyncOrigin(origin_to_disable)); |
+ batch.Delete(CreateKeyForIncrementalSyncOrigin(origin_to_disable)); |
+ batch.Put(CreateKeyForDisabledOrigin(origin_to_disable), resource_id); |
+ |
+ // Remove entries specified by |origin_to_disable|. |
+ scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); |
+ std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_disable.spec(); |
+ for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) { |
+ std::string key = itr->key().ToString(); |
+ if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) |
+ break; |
+ GURL origin; |
+ base::FilePath path; |
+ MetadataKeyToOriginAndPath(key, &origin, &path); |
+ if (origin != origin_to_disable) |
+ break; |
+ batch.Delete(key); |
+ } |
+ leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); |
+ |
+ return LevelDBStatusToSyncStatusCode(status); |
+} |
+ |
SyncStatusCode DriveMetadataDB::RemoveOrigin(const GURL& origin_to_remove) { |
DCHECK(CalledOnValidThread()); |
leveldb::WriteBatch batch; |
- batch.Delete(kDriveBatchSyncOriginKeyPrefix + origin_to_remove.spec()); |
- batch.Delete(kDriveIncrementalSyncOriginKeyPrefix + origin_to_remove.spec()); |
+ batch.Delete(CreateKeyForBatchSyncOrigin(origin_to_remove)); |
+ batch.Delete(CreateKeyForIncrementalSyncOrigin(origin_to_remove)); |
+ batch.Delete(CreateKeyForDisabledOrigin(origin_to_remove)); |
scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); |
std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_remove.spec(); |
@@ -851,9 +1011,10 @@ SyncStatusCode DriveMetadataDB::RemoveOrigin(const GURL& origin_to_remove) { |
return LevelDBStatusToSyncStatusCode(status); |
} |
-SyncStatusCode DriveMetadataDB::GetSyncOrigins( |
+SyncStatusCode DriveMetadataDB::GetOrigins( |
ResourceIDMap* batch_sync_origins, |
- ResourceIDMap* incremental_sync_origins) { |
+ ResourceIDMap* incremental_sync_origins, |
+ ResourceIDMap* disabled_origins) { |
DCHECK(CalledOnValidThread()); |
DCHECK(db_.get()); |
@@ -889,6 +1050,21 @@ SyncStatusCode DriveMetadataDB::GetSyncOrigins( |
DCHECK(result); |
} |
+ // Get disabled origins from the DB. |
+ 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()); |
+ bool result = disabled_origins->insert( |
+ std::make_pair(origin, itr->value().ToString())).second; |
+ DCHECK(result); |
+ } |
+ |
return SYNC_STATUS_OK; |
} |