Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync_file_system/drive_metadata_store.h" | 5 #include "chrome/browser/sync_file_system/drive_metadata_store.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 37 | 37 |
| 38 const char* const kServiceName = DriveFileSyncService::kServiceName; | 38 const char* const kServiceName = DriveFileSyncService::kServiceName; |
| 39 const char kDatabaseVersionKey[] = "VERSION"; | 39 const char kDatabaseVersionKey[] = "VERSION"; |
| 40 const int64 kCurrentDatabaseVersion = 1; | 40 const int64 kCurrentDatabaseVersion = 1; |
| 41 const char kChangeStampKey[] = "CHANGE_STAMP"; | 41 const char kChangeStampKey[] = "CHANGE_STAMP"; |
| 42 const char kSyncRootDirectoryKey[] = "SYNC_ROOT_DIR"; | 42 const char kSyncRootDirectoryKey[] = "SYNC_ROOT_DIR"; |
| 43 const char kDriveMetadataKeyPrefix[] = "METADATA: "; | 43 const char kDriveMetadataKeyPrefix[] = "METADATA: "; |
| 44 const char kMetadataKeySeparator = ' '; | 44 const char kMetadataKeySeparator = ' '; |
| 45 const char kDriveBatchSyncOriginKeyPrefix[] = "BSYNC_ORIGIN: "; | 45 const char kDriveBatchSyncOriginKeyPrefix[] = "BSYNC_ORIGIN: "; |
| 46 const char kDriveIncrementalSyncOriginKeyPrefix[] = "ISYNC_ORIGIN: "; | 46 const char kDriveIncrementalSyncOriginKeyPrefix[] = "ISYNC_ORIGIN: "; |
| 47 const char kDriveDisabledSyncOriginKeyPrefix[] = "DSYNC_ORIGIN: "; | |
| 47 const size_t kDriveMetadataKeyPrefixLength = arraysize(kDriveMetadataKeyPrefix); | 48 const size_t kDriveMetadataKeyPrefixLength = arraysize(kDriveMetadataKeyPrefix); |
| 48 | 49 |
| 49 const base::FilePath::CharType kV0FormatPathPrefix[] = | 50 const base::FilePath::CharType kV0FormatPathPrefix[] = |
| 50 FILE_PATH_LITERAL("drive/"); | 51 FILE_PATH_LITERAL("drive/"); |
| 51 | 52 |
| 52 bool ParseV0FormatFileSystemURLString(const GURL& url, | 53 bool ParseV0FormatFileSystemURLString(const GURL& url, |
| 53 GURL* origin, | 54 GURL* origin, |
| 54 base::FilePath* path) { | 55 base::FilePath* path) { |
| 55 fileapi::FileSystemType mount_type; | 56 fileapi::FileSystemType mount_type; |
| 56 base::FilePath virtual_path; | 57 base::FilePath virtual_path; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 100 | 101 |
| 101 SyncStatusCode Initialize(bool* created); | 102 SyncStatusCode Initialize(bool* created); |
| 102 SyncStatusCode ReadContents(DriveMetadataDBContents* contents); | 103 SyncStatusCode ReadContents(DriveMetadataDBContents* contents); |
| 103 | 104 |
| 104 SyncStatusCode MigrateDatabaseIfNeeded(); | 105 SyncStatusCode MigrateDatabaseIfNeeded(); |
| 105 SyncStatusCode MigrateFromVersion0Database(); | 106 SyncStatusCode MigrateFromVersion0Database(); |
| 106 | 107 |
| 107 SyncStatusCode SetLargestChangestamp(int64 largest_changestamp); | 108 SyncStatusCode SetLargestChangestamp(int64 largest_changestamp); |
| 108 SyncStatusCode SetSyncRootDirectory(const std::string& resource_id); | 109 SyncStatusCode SetSyncRootDirectory(const std::string& resource_id); |
| 109 SyncStatusCode GetSyncRootDirectory(std::string* resource_id); | 110 SyncStatusCode GetSyncRootDirectory(std::string* resource_id); |
| 110 SyncStatusCode UpdateEntry(const FileSystemURL& url, | 111 SyncStatusCode UpdateEntry(const FileSystemURL& url, |
|
calvinlo
2013/03/15 03:37:48
I don't think it's needed now at all, but I think
nhiroki
2013/03/15 12:08:56
I wouldn't think there are many functions here, bu
| |
| 111 const DriveMetadata& metadata); | 112 const DriveMetadata& metadata); |
| 112 SyncStatusCode DeleteEntry(const FileSystemURL& url); | 113 SyncStatusCode DeleteEntry(const FileSystemURL& url); |
| 113 | 114 |
| 114 SyncStatusCode UpdateSyncOriginAsBatch(const GURL& origin, | 115 SyncStatusCode UpdateSyncOriginAsBatch(const GURL& origin, |
| 115 const std::string& resource_id); | 116 const std::string& resource_id); |
| 116 SyncStatusCode UpdateSyncOriginAsIncremental(const GURL& origin, | 117 SyncStatusCode UpdateSyncOriginAsIncremental(const GURL& origin, |
| 117 const std::string& resource_id); | 118 const std::string& resource_id); |
| 119 SyncStatusCode EnableSyncOrigin(const GURL& origin, | |
| 120 const std::string& resource_id); | |
| 121 SyncStatusCode DisableSyncOrigin(const GURL& origin, | |
| 122 const std::string& resource_id); | |
| 118 SyncStatusCode RemoveOrigin(const GURL& origin); | 123 SyncStatusCode RemoveOrigin(const GURL& origin); |
| 119 | 124 |
| 120 SyncStatusCode GetSyncOrigins(ResourceIDMap* batch_sync_origins, | 125 SyncStatusCode GetSyncOrigins(ResourceIDMap* batch_sync_origins, |
| 121 ResourceIDMap* incremental_sync_origins); | 126 ResourceIDMap* incremental_sync_origins, |
| 127 ResourceIDMap* disabled_sync_origins); | |
| 122 | 128 |
| 123 private: | 129 private: |
| 124 bool CalledOnValidThread() const { | 130 bool CalledOnValidThread() const { |
| 125 return task_runner_->RunsTasksOnCurrentThread(); | 131 return task_runner_->RunsTasksOnCurrentThread(); |
| 126 } | 132 } |
| 127 | 133 |
| 128 scoped_refptr<base::SequencedTaskRunner> task_runner_; | 134 scoped_refptr<base::SequencedTaskRunner> task_runner_; |
| 129 | 135 |
| 130 std::string db_path_; | 136 std::string db_path_; |
| 131 scoped_ptr<leveldb::DB> db_; | 137 scoped_ptr<leveldb::DB> db_; |
| 132 | 138 |
| 133 DISALLOW_COPY_AND_ASSIGN(DriveMetadataDB); | 139 DISALLOW_COPY_AND_ASSIGN(DriveMetadataDB); |
| 134 }; | 140 }; |
| 135 | 141 |
| 136 struct DriveMetadataDBContents { | 142 struct DriveMetadataDBContents { |
| 137 int64 largest_changestamp; | 143 int64 largest_changestamp; |
| 138 DriveMetadataStore::MetadataMap metadata_map; | 144 DriveMetadataStore::MetadataMap metadata_map; |
| 139 std::string sync_root_directory_resource_id; | 145 std::string sync_root_directory_resource_id; |
| 140 DriveMetadataStore::ResourceIDMap batch_sync_origins; | 146 DriveMetadataStore::ResourceIDMap batch_sync_origins; |
| 141 DriveMetadataStore::ResourceIDMap incremental_sync_origins; | 147 DriveMetadataStore::ResourceIDMap incremental_sync_origins; |
| 148 DriveMetadataStore::ResourceIDMap disabled_sync_origins; | |
| 142 }; | 149 }; |
| 143 | 150 |
| 144 namespace { | 151 namespace { |
| 145 | 152 |
| 146 SyncStatusCode InitializeDBOnFileThread(DriveMetadataDB* db, | 153 SyncStatusCode InitializeDBOnFileThread(DriveMetadataDB* db, |
| 147 DriveMetadataDBContents* contents) { | 154 DriveMetadataDBContents* contents) { |
| 148 DCHECK(db); | 155 DCHECK(db); |
| 149 DCHECK(contents); | 156 DCHECK(contents); |
| 150 | 157 |
| 151 contents->largest_changestamp = 0; | 158 contents->largest_changestamp = 0; |
| 152 contents->metadata_map.clear(); | 159 contents->metadata_map.clear(); |
| 153 contents->batch_sync_origins.clear(); | 160 contents->batch_sync_origins.clear(); |
| 154 contents->incremental_sync_origins.clear(); | 161 contents->incremental_sync_origins.clear(); |
| 162 contents->disabled_sync_origins.clear(); | |
| 155 | 163 |
| 156 bool created = false; | 164 bool created = false; |
| 157 SyncStatusCode status = db->Initialize(&created); | 165 SyncStatusCode status = db->Initialize(&created); |
| 158 if (status != SYNC_STATUS_OK) | 166 if (status != SYNC_STATUS_OK) |
| 159 return status; | 167 return status; |
| 160 | 168 |
| 161 if (!created) { | 169 if (!created) { |
| 162 status = db->MigrateDatabaseIfNeeded(); | 170 status = db->MigrateDatabaseIfNeeded(); |
| 163 if (status != SYNC_STATUS_OK) { | 171 if (status != SYNC_STATUS_OK) { |
| 164 LOG(WARNING) << "Failed to migrate DriveMetadataStore to latest version."; | 172 LOG(WARNING) << "Failed to migrate DriveMetadataStore to latest version."; |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 178 } | 186 } |
| 179 | 187 |
| 180 // Returns a key string for the given incremental sync origin. | 188 // Returns a key string for the given incremental sync origin. |
| 181 // For example, when |origin| is "http://www.example.com", | 189 // For example, when |origin| is "http://www.example.com", |
| 182 // returns "ISYNC_ORIGIN: http://www.example.com". | 190 // returns "ISYNC_ORIGIN: http://www.example.com". |
| 183 std::string CreateKeyForIncrementalSyncOrigin(const GURL& origin) { | 191 std::string CreateKeyForIncrementalSyncOrigin(const GURL& origin) { |
| 184 DCHECK(origin.is_valid()); | 192 DCHECK(origin.is_valid()); |
| 185 return kDriveIncrementalSyncOriginKeyPrefix + origin.spec(); | 193 return kDriveIncrementalSyncOriginKeyPrefix + origin.spec(); |
| 186 } | 194 } |
| 187 | 195 |
| 196 // Returns a key string for the given disabled sync origin. | |
| 197 // For example, when |origin| is "http://www.example.com", | |
| 198 // returns "DSYNC_ORIGIN: http://www.example.com". | |
| 199 std::string CreateKeyForDisabledSyncOrigin(const GURL& origin) { | |
|
calvinlo
2013/03/15 03:37:48
Same thing with these CreateKeyFor* functions. The
nhiroki
2013/03/15 12:08:56
Done.
| |
| 200 DCHECK(origin.is_valid()); | |
| 201 return kDriveDisabledSyncOriginKeyPrefix + origin.spec(); | |
| 202 } | |
| 203 | |
| 188 void AddOriginsToVector(std::vector<GURL>* all_origins, | 204 void AddOriginsToVector(std::vector<GURL>* all_origins, |
| 189 const DriveMetadataStore::ResourceIDMap& resource_map) { | 205 const DriveMetadataStore::ResourceIDMap& resource_map) { |
| 190 typedef DriveMetadataStore::ResourceIDMap::const_iterator itr; | 206 typedef DriveMetadataStore::ResourceIDMap::const_iterator itr; |
| 191 for (std::map<GURL, std::string>::const_iterator itr = resource_map.begin(); | 207 for (std::map<GURL, std::string>::const_iterator itr = resource_map.begin(); |
| 192 itr != resource_map.end(); | 208 itr != resource_map.end(); |
| 193 ++itr) { | 209 ++itr) { |
| 194 all_origins->push_back(itr->first); | 210 all_origins->push_back(itr->first); |
| 195 } | 211 } |
| 196 } | 212 } |
| 197 | 213 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 233 if (status != SYNC_STATUS_OK) { | 249 if (status != SYNC_STATUS_OK) { |
| 234 callback.Run(status, false); | 250 callback.Run(status, false); |
| 235 return; | 251 return; |
| 236 } | 252 } |
| 237 | 253 |
| 238 largest_changestamp_ = contents->largest_changestamp; | 254 largest_changestamp_ = contents->largest_changestamp; |
| 239 metadata_map_.swap(contents->metadata_map); | 255 metadata_map_.swap(contents->metadata_map); |
| 240 sync_root_directory_resource_id_ = contents->sync_root_directory_resource_id; | 256 sync_root_directory_resource_id_ = contents->sync_root_directory_resource_id; |
| 241 batch_sync_origins_.swap(contents->batch_sync_origins); | 257 batch_sync_origins_.swap(contents->batch_sync_origins); |
| 242 incremental_sync_origins_.swap(contents->incremental_sync_origins); | 258 incremental_sync_origins_.swap(contents->incremental_sync_origins); |
| 259 disabled_sync_origins_.swap(contents->disabled_sync_origins); | |
| 243 // |largest_changestamp_| is set to 0 for a fresh empty database. | 260 // |largest_changestamp_| is set to 0 for a fresh empty database. |
| 244 callback.Run(status, largest_changestamp_ <= 0); | 261 callback.Run(status, largest_changestamp_ <= 0); |
| 245 } | 262 } |
| 246 | 263 |
| 247 void DriveMetadataStore::RestoreSyncRootDirectory( | 264 void DriveMetadataStore::RestoreSyncRootDirectory( |
| 248 const SyncStatusCallback& callback) { | 265 const SyncStatusCallback& callback) { |
| 249 DCHECK(CalledOnValidThread()); | 266 DCHECK(CalledOnValidThread()); |
| 250 std::string* sync_root_directory_resource_id = new std::string; | 267 std::string* sync_root_directory_resource_id = new std::string; |
| 251 base::PostTaskAndReplyWithResult( | 268 base::PostTaskAndReplyWithResult( |
| 252 file_task_runner_, FROM_HERE, | 269 file_task_runner_, FROM_HERE, |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 273 | 290 |
| 274 sync_root_directory_resource_id_.swap(*sync_root_directory_resource_id); | 291 sync_root_directory_resource_id_.swap(*sync_root_directory_resource_id); |
| 275 callback.Run(status); | 292 callback.Run(status); |
| 276 } | 293 } |
| 277 | 294 |
| 278 void DriveMetadataStore::RestoreSyncOrigins( | 295 void DriveMetadataStore::RestoreSyncOrigins( |
| 279 const SyncStatusCallback& callback) { | 296 const SyncStatusCallback& callback) { |
| 280 DCHECK(CalledOnValidThread()); | 297 DCHECK(CalledOnValidThread()); |
| 281 ResourceIDMap* batch_sync_origins = new ResourceIDMap; | 298 ResourceIDMap* batch_sync_origins = new ResourceIDMap; |
| 282 ResourceIDMap* incremental_sync_origins = new ResourceIDMap; | 299 ResourceIDMap* incremental_sync_origins = new ResourceIDMap; |
| 300 ResourceIDMap* disabled_sync_origins = new ResourceIDMap; | |
| 283 base::PostTaskAndReplyWithResult( | 301 base::PostTaskAndReplyWithResult( |
| 284 file_task_runner_, FROM_HERE, | 302 file_task_runner_, FROM_HERE, |
| 285 base::Bind(&DriveMetadataDB::GetSyncOrigins, | 303 base::Bind(&DriveMetadataDB::GetSyncOrigins, |
| 286 base::Unretained(db_.get()), | 304 base::Unretained(db_.get()), |
| 287 batch_sync_origins, | 305 batch_sync_origins, |
| 288 incremental_sync_origins), | 306 incremental_sync_origins, |
| 307 disabled_sync_origins), | |
| 289 base::Bind(&DriveMetadataStore::DidRestoreSyncOrigins, | 308 base::Bind(&DriveMetadataStore::DidRestoreSyncOrigins, |
| 290 AsWeakPtr(), callback, | 309 AsWeakPtr(), callback, |
| 291 base::Owned(batch_sync_origins), | 310 base::Owned(batch_sync_origins), |
| 292 base::Owned(incremental_sync_origins))); | 311 base::Owned(incremental_sync_origins), |
| 312 base::Owned(disabled_sync_origins))); | |
| 293 } | 313 } |
| 294 | 314 |
| 295 void DriveMetadataStore::DidRestoreSyncOrigins( | 315 void DriveMetadataStore::DidRestoreSyncOrigins( |
| 296 const SyncStatusCallback& callback, | 316 const SyncStatusCallback& callback, |
| 297 ResourceIDMap* batch_sync_origins, | 317 ResourceIDMap* batch_sync_origins, |
| 298 ResourceIDMap* incremental_sync_origins, | 318 ResourceIDMap* incremental_sync_origins, |
| 319 ResourceIDMap* disabled_sync_origins, | |
| 299 SyncStatusCode status) { | 320 SyncStatusCode status) { |
| 300 DCHECK(CalledOnValidThread()); | 321 DCHECK(CalledOnValidThread()); |
| 301 DCHECK(batch_sync_origins); | 322 DCHECK(batch_sync_origins); |
| 302 DCHECK(incremental_sync_origins); | 323 DCHECK(incremental_sync_origins); |
| 324 DCHECK(disabled_sync_origins); | |
| 303 | 325 |
| 304 db_status_ = status; | 326 db_status_ = status; |
| 305 if (status != SYNC_STATUS_OK) { | 327 if (status != SYNC_STATUS_OK) { |
| 306 callback.Run(status); | 328 callback.Run(status); |
| 307 return; | 329 return; |
| 308 } | 330 } |
| 309 | 331 |
| 310 batch_sync_origins_.swap(*batch_sync_origins); | 332 batch_sync_origins_.swap(*batch_sync_origins); |
| 311 incremental_sync_origins_.swap(*incremental_sync_origins); | 333 incremental_sync_origins_.swap(*incremental_sync_origins); |
| 334 disabled_sync_origins_.swap(*disabled_sync_origins); | |
| 312 callback.Run(status); | 335 callback.Run(status); |
| 313 } | 336 } |
| 314 | 337 |
| 315 void DriveMetadataStore::SetLargestChangeStamp( | 338 void DriveMetadataStore::SetLargestChangeStamp( |
| 316 int64 largest_changestamp, | 339 int64 largest_changestamp, |
| 317 const SyncStatusCallback& callback) { | 340 const SyncStatusCallback& callback) { |
| 318 DCHECK(CalledOnValidThread()); | 341 DCHECK(CalledOnValidThread()); |
| 319 DCHECK_EQ(SYNC_STATUS_OK, db_status_); | 342 DCHECK_EQ(SYNC_STATUS_OK, db_status_); |
| 320 largest_changestamp_ = largest_changestamp; | 343 largest_changestamp_ = largest_changestamp; |
| 321 base::PostTaskAndReplyWithResult( | 344 base::PostTaskAndReplyWithResult( |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 413 bool DriveMetadataStore::IsBatchSyncOrigin(const GURL& origin) const { | 436 bool DriveMetadataStore::IsBatchSyncOrigin(const GURL& origin) const { |
| 414 DCHECK(CalledOnValidThread()); | 437 DCHECK(CalledOnValidThread()); |
| 415 return ContainsKey(batch_sync_origins_, origin); | 438 return ContainsKey(batch_sync_origins_, origin); |
| 416 } | 439 } |
| 417 | 440 |
| 418 bool DriveMetadataStore::IsIncrementalSyncOrigin(const GURL& origin) const { | 441 bool DriveMetadataStore::IsIncrementalSyncOrigin(const GURL& origin) const { |
| 419 DCHECK(CalledOnValidThread()); | 442 DCHECK(CalledOnValidThread()); |
| 420 return ContainsKey(incremental_sync_origins_, origin); | 443 return ContainsKey(incremental_sync_origins_, origin); |
| 421 } | 444 } |
| 422 | 445 |
| 446 bool DriveMetadataStore::IsDisabledSyncOrigin(const GURL& origin) const { | |
| 447 DCHECK(CalledOnValidThread()); | |
| 448 return ContainsKey(disabled_sync_origins_, origin); | |
| 449 } | |
| 450 | |
| 423 void DriveMetadataStore::AddBatchSyncOrigin(const GURL& origin, | 451 void DriveMetadataStore::AddBatchSyncOrigin(const GURL& origin, |
| 424 const std::string& resource_id) { | 452 const std::string& resource_id) { |
| 425 DCHECK(CalledOnValidThread()); | 453 DCHECK(CalledOnValidThread()); |
| 426 DCHECK(!IsBatchSyncOrigin(origin)); | 454 DCHECK(!IsBatchSyncOrigin(origin)); |
| 427 DCHECK(!IsIncrementalSyncOrigin(origin)); | 455 DCHECK(!IsIncrementalSyncOrigin(origin)); |
| 456 DCHECK(!IsDisabledSyncOrigin(origin)); | |
| 428 DCHECK_EQ(SYNC_STATUS_OK, db_status_); | 457 DCHECK_EQ(SYNC_STATUS_OK, db_status_); |
| 429 | 458 |
| 430 batch_sync_origins_.insert(std::make_pair(origin, resource_id)); | 459 batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
| 431 | 460 |
| 432 // Store a pair of |origin| and |resource_id| in the DB. | 461 // Store a pair of |origin| and |resource_id| in the DB. |
| 433 base::PostTaskAndReplyWithResult( | 462 base::PostTaskAndReplyWithResult( |
| 434 file_task_runner_, FROM_HERE, | 463 file_task_runner_, FROM_HERE, |
| 435 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsBatch, | 464 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsBatch, |
| 436 base::Unretained(db_.get()), origin, resource_id), | 465 base::Unretained(db_.get()), origin, resource_id), |
| 437 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); | 466 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); |
| 438 } | 467 } |
| 439 | 468 |
| 440 void DriveMetadataStore::MoveBatchSyncOriginToIncremental(const GURL& origin) { | 469 void DriveMetadataStore::MoveBatchSyncOriginToIncremental(const GURL& origin) { |
| 441 DCHECK(CalledOnValidThread()); | 470 DCHECK(CalledOnValidThread()); |
| 442 DCHECK(IsBatchSyncOrigin(origin)); | 471 DCHECK(IsBatchSyncOrigin(origin)); |
| 443 DCHECK(!IsIncrementalSyncOrigin(origin)); | 472 DCHECK(!IsIncrementalSyncOrigin(origin)); |
| 473 DCHECK(!IsDisabledSyncOrigin(origin)); | |
| 444 DCHECK_EQ(SYNC_STATUS_OK, db_status_); | 474 DCHECK_EQ(SYNC_STATUS_OK, db_status_); |
| 445 | 475 |
| 446 std::map<GURL, std::string>::iterator found = | 476 std::map<GURL, std::string>::iterator found = |
| 447 batch_sync_origins_.find(origin); | 477 batch_sync_origins_.find(origin); |
| 448 incremental_sync_origins_.insert(std::make_pair(origin, found->second)); | 478 incremental_sync_origins_.insert(std::make_pair(origin, found->second)); |
| 449 | 479 |
| 450 // Store a pair of |origin| and |resource_id| in the DB. | 480 // Store a pair of |origin| and |resource_id| in the DB. |
| 451 base::PostTaskAndReplyWithResult( | 481 base::PostTaskAndReplyWithResult( |
| 452 file_task_runner_, FROM_HERE, | 482 file_task_runner_, FROM_HERE, |
| 453 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsIncremental, | 483 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsIncremental, |
| 454 base::Unretained(db_.get()), origin, found->second), | 484 base::Unretained(db_.get()), origin, found->second), |
| 455 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); | 485 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); |
| 456 | 486 |
| 457 batch_sync_origins_.erase(found); | 487 batch_sync_origins_.erase(found); |
| 458 } | 488 } |
| 459 | 489 |
| 490 void DriveMetadataStore::EnableSyncOrigin( | |
| 491 const GURL& origin, | |
| 492 const SyncStatusCallback& callback) { | |
| 493 DCHECK(CalledOnValidThread()); | |
| 494 DCHECK(IsDisabledSyncOrigin(origin)); | |
| 495 DCHECK(!IsBatchSyncOrigin(origin)); | |
| 496 DCHECK(!IsIncrementalSyncOrigin(origin)); | |
| 497 | |
| 498 std::map<GURL, std::string>::iterator found = | |
| 499 disabled_sync_origins_.find(origin); | |
| 500 batch_sync_origins_.insert(std::make_pair(origin, found->second)); | |
| 501 | |
| 502 // Store a pair of |origin| and |resource_id| in the DB. | |
| 503 base::PostTaskAndReplyWithResult( | |
| 504 file_task_runner_, FROM_HERE, | |
| 505 base::Bind(&DriveMetadataDB::EnableSyncOrigin, | |
| 506 base::Unretained(db_.get()), origin, found->second), | |
| 507 base::Bind(&DriveMetadataStore::DidChangeOrigin, AsWeakPtr(), callback)); | |
| 508 | |
| 509 disabled_sync_origins_.erase(found); | |
| 510 } | |
| 511 | |
| 512 void DriveMetadataStore::DisableSyncOrigin( | |
| 513 const GURL& origin, | |
| 514 const SyncStatusCallback& callback) { | |
| 515 DCHECK(CalledOnValidThread()); | |
| 516 DCHECK(IsBatchSyncOrigin(origin) || IsIncrementalSyncOrigin(origin)); | |
| 517 DCHECK(!IsDisabledSyncOrigin(origin)); | |
| 518 | |
| 519 std::map<GURL, std::string>::iterator found; | |
|
tzik
2013/03/14 12:50:54
How about doing like this, or making another helpe
nhiroki
2013/03/15 12:08:56
Done.
| |
| 520 if (IsBatchSyncOrigin(origin)) | |
| 521 found = batch_sync_origins_.find(origin); | |
| 522 else | |
| 523 found = incremental_sync_origins_.find(origin); | |
| 524 disabled_sync_origins_.insert(std::make_pair(origin, found->second)); | |
| 525 | |
| 526 // Store a pair of |origin| and |resource_id| in the DB. | |
| 527 base::PostTaskAndReplyWithResult( | |
| 528 file_task_runner_, FROM_HERE, | |
| 529 base::Bind(&DriveMetadataDB::DisableSyncOrigin, | |
| 530 base::Unretained(db_.get()), origin, found->second), | |
| 531 base::Bind(&DriveMetadataStore::DidChangeOrigin, AsWeakPtr(), callback)); | |
| 532 | |
| 533 if (IsBatchSyncOrigin(origin)) | |
| 534 batch_sync_origins_.erase(origin); | |
| 535 else | |
| 536 incremental_sync_origins_.erase(origin); | |
| 537 } | |
| 538 | |
| 460 void DriveMetadataStore::RemoveOrigin( | 539 void DriveMetadataStore::RemoveOrigin( |
| 461 const GURL& origin, | 540 const GURL& origin, |
| 462 const SyncStatusCallback& callback) { | 541 const SyncStatusCallback& callback) { |
| 463 DCHECK(CalledOnValidThread()); | 542 DCHECK(CalledOnValidThread()); |
| 464 | 543 |
| 465 metadata_map_.erase(origin); | 544 metadata_map_.erase(origin); |
| 466 batch_sync_origins_.erase(origin); | 545 batch_sync_origins_.erase(origin); |
| 467 incremental_sync_origins_.erase(origin); | 546 incremental_sync_origins_.erase(origin); |
| 468 | 547 |
| 469 base::PostTaskAndReplyWithResult( | 548 base::PostTaskAndReplyWithResult( |
| 470 file_task_runner_, FROM_HERE, | 549 file_task_runner_, FROM_HERE, |
| 471 base::Bind(&DriveMetadataDB::RemoveOrigin, | 550 base::Bind(&DriveMetadataDB::RemoveOrigin, |
| 472 base::Unretained(db_.get()), origin), | 551 base::Unretained(db_.get()), origin), |
| 473 base::Bind(&DriveMetadataStore::DidRemoveOrigin, AsWeakPtr(), callback)); | 552 base::Bind(&DriveMetadataStore::DidChangeOrigin, AsWeakPtr(), callback)); |
| 474 } | 553 } |
| 475 | 554 |
| 476 void DriveMetadataStore::DidRemoveOrigin( | 555 void DriveMetadataStore::DidChangeOrigin( |
| 477 const SyncStatusCallback& callback, | 556 const SyncStatusCallback& callback, |
| 478 SyncStatusCode status) { | 557 SyncStatusCode status) { |
| 479 UpdateDBStatus(status); | 558 UpdateDBStatus(status); |
| 480 callback.Run(status); | 559 callback.Run(status); |
| 481 } | 560 } |
| 482 | 561 |
| 483 void DriveMetadataStore::UpdateDBStatus(SyncStatusCode status) { | 562 void DriveMetadataStore::UpdateDBStatus(SyncStatusCode status) { |
| 484 DCHECK(CalledOnValidThread()); | 563 DCHECK(CalledOnValidThread()); |
| 485 if (db_status_ != SYNC_STATUS_OK && | 564 if (db_status_ != SYNC_STATUS_OK && |
| 486 db_status_ != SYNC_DATABASE_ERROR_NOT_FOUND) { | 565 db_status_ != SYNC_DATABASE_ERROR_NOT_FOUND) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 538 list->push_back(std::make_pair(url, itr->second.resource_id())); | 617 list->push_back(std::make_pair(url, itr->second.resource_id())); |
| 539 } | 618 } |
| 540 } | 619 } |
| 541 } | 620 } |
| 542 return SYNC_STATUS_OK; | 621 return SYNC_STATUS_OK; |
| 543 } | 622 } |
| 544 | 623 |
| 545 std::string DriveMetadataStore::GetResourceIdForOrigin( | 624 std::string DriveMetadataStore::GetResourceIdForOrigin( |
| 546 const GURL& origin) const { | 625 const GURL& origin) const { |
| 547 DCHECK(CalledOnValidThread()); | 626 DCHECK(CalledOnValidThread()); |
| 548 DCHECK(IsBatchSyncOrigin(origin) || IsIncrementalSyncOrigin(origin)); | 627 DCHECK(IsBatchSyncOrigin(origin) || |
| 628 IsIncrementalSyncOrigin(origin) || | |
| 629 IsDisabledSyncOrigin(origin)); | |
| 549 | 630 |
| 550 ResourceIDMap::const_iterator found = incremental_sync_origins_.find(origin); | 631 ResourceIDMap::const_iterator found = incremental_sync_origins_.find(origin); |
| 551 if (found != incremental_sync_origins_.end()) | 632 if (found != incremental_sync_origins_.end()) |
| 552 return found->second; | 633 return found->second; |
| 553 | 634 |
| 554 found = batch_sync_origins_.find(origin); | 635 found = batch_sync_origins_.find(origin); |
| 555 if (found != batch_sync_origins_.end()) | 636 if (found != batch_sync_origins_.end()) |
| 556 return found->second; | 637 return found->second; |
| 557 | 638 |
| 639 found = disabled_sync_origins_.find(origin); | |
| 640 if (found != disabled_sync_origins_.end()) | |
| 641 return found->second; | |
| 642 | |
| 558 NOTREACHED(); | 643 NOTREACHED(); |
| 559 return std::string(); | 644 return std::string(); |
| 560 } | 645 } |
| 561 | 646 |
| 562 void DriveMetadataStore::GetAllOrigins(std::vector<GURL>* origins) { | 647 void DriveMetadataStore::GetEnabledOrigins(std::vector<GURL>* origins) { |
| 648 origins->clear(); | |
| 563 origins->reserve(batch_sync_origins_.size() + | 649 origins->reserve(batch_sync_origins_.size() + |
| 564 incremental_sync_origins_.size()); | 650 incremental_sync_origins_.size()); |
| 565 AddOriginsToVector(origins, batch_sync_origins_); | 651 AddOriginsToVector(origins, batch_sync_origins_); |
| 566 AddOriginsToVector(origins, incremental_sync_origins_); | 652 AddOriginsToVector(origins, incremental_sync_origins_); |
| 567 } | 653 } |
| 568 | 654 |
| 655 void DriveMetadataStore::GetDisabledOrigins(std::vector<GURL>* origins) { | |
| 656 origins->clear(); | |
| 657 origins->reserve(disabled_sync_origins_.size()); | |
| 658 AddOriginsToVector(origins, disabled_sync_origins_); | |
| 659 } | |
| 660 | |
| 569 //////////////////////////////////////////////////////////////////////////////// | 661 //////////////////////////////////////////////////////////////////////////////// |
| 570 | 662 |
| 571 DriveMetadataDB::DriveMetadataDB(const base::FilePath& base_dir, | 663 DriveMetadataDB::DriveMetadataDB(const base::FilePath& base_dir, |
| 572 base::SequencedTaskRunner* task_runner) | 664 base::SequencedTaskRunner* task_runner) |
| 573 : task_runner_(task_runner), | 665 : task_runner_(task_runner), |
| 574 db_path_(fileapi::FilePathToString( | 666 db_path_(fileapi::FilePathToString( |
| 575 base_dir.Append(DriveMetadataStore::kDatabaseName))) { | 667 base_dir.Append(DriveMetadataStore::kDatabaseName))) { |
| 576 } | 668 } |
| 577 | 669 |
| 578 DriveMetadataDB::~DriveMetadataDB() { | 670 DriveMetadataDB::~DriveMetadataDB() { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 639 bool success = metadata.ParseFromString(itr->value().ToString()); | 731 bool success = metadata.ParseFromString(itr->value().ToString()); |
| 640 DCHECK(success); | 732 DCHECK(success); |
| 641 | 733 |
| 642 success = contents->metadata_map[origin].insert( | 734 success = contents->metadata_map[origin].insert( |
| 643 std::make_pair(path, metadata)).second; | 735 std::make_pair(path, metadata)).second; |
| 644 DCHECK(success); | 736 DCHECK(success); |
| 645 } | 737 } |
| 646 } | 738 } |
| 647 | 739 |
| 648 SyncStatusCode status = GetSyncOrigins(&contents->batch_sync_origins, | 740 SyncStatusCode status = GetSyncOrigins(&contents->batch_sync_origins, |
| 649 &contents->incremental_sync_origins); | 741 &contents->incremental_sync_origins, |
| 742 &contents->disabled_sync_origins); | |
| 650 if (status != SYNC_STATUS_OK && | 743 if (status != SYNC_STATUS_OK && |
| 651 status != SYNC_DATABASE_ERROR_NOT_FOUND) | 744 status != SYNC_DATABASE_ERROR_NOT_FOUND) |
| 652 return status; | 745 return status; |
| 653 | 746 |
| 654 status = GetSyncRootDirectory(&contents->sync_root_directory_resource_id); | 747 status = GetSyncRootDirectory(&contents->sync_root_directory_resource_id); |
| 655 if (status != SYNC_STATUS_OK && | 748 if (status != SYNC_STATUS_OK && |
| 656 status != SYNC_DATABASE_ERROR_NOT_FOUND) | 749 status != SYNC_DATABASE_ERROR_NOT_FOUND) |
| 657 return status; | 750 return status; |
| 658 | 751 |
| 659 return SYNC_STATUS_OK; | 752 return SYNC_STATUS_OK; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 711 // value: <Resource ID of the sync root directory> | 804 // value: <Resource ID of the sync root directory> |
| 712 // | 805 // |
| 713 // * key: "METADATA: " + <Origin and URL> (changed) | 806 // * key: "METADATA: " + <Origin and URL> (changed) |
| 714 // * value: <Serialized DriveMetadata> | 807 // * value: <Serialized DriveMetadata> |
| 715 // | 808 // |
| 716 // key: "BSYNC_ORIGIN: " + <URL string of a batch sync origin> | 809 // key: "BSYNC_ORIGIN: " + <URL string of a batch sync origin> |
| 717 // value: <Resource ID of the drive directory for the origin> | 810 // value: <Resource ID of the drive directory for the origin> |
| 718 // | 811 // |
| 719 // key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin> | 812 // key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin> |
| 720 // value: <Resource ID of the drive directory for the origin> | 813 // value: <Resource ID of the drive directory for the origin> |
| 814 // | |
| 815 // key: "DSYNC_ORIGIN: " + <URL string of a disabled sync origin> | |
| 816 // value: <Resource ID of the drive directory for the origin> | |
| 721 | 817 |
| 722 leveldb::WriteBatch write_batch; | 818 leveldb::WriteBatch write_batch; |
| 723 write_batch.Put(kDatabaseVersionKey, | 819 write_batch.Put(kDatabaseVersionKey, |
| 724 base::Int64ToString(kCurrentDatabaseVersion)); | 820 base::Int64ToString(kCurrentDatabaseVersion)); |
| 725 | 821 |
| 726 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); | 822 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); |
| 727 for (itr->Seek(kDriveMetadataKeyPrefix); itr->Valid(); itr->Next()) { | 823 for (itr->Seek(kDriveMetadataKeyPrefix); itr->Valid(); itr->Next()) { |
| 728 std::string key = itr->key().ToString(); | 824 std::string key = itr->key().ToString(); |
| 729 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) | 825 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) |
| 730 break; | 826 break; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 813 return LevelDBStatusToSyncStatusCode(status); | 909 return LevelDBStatusToSyncStatusCode(status); |
| 814 } | 910 } |
| 815 | 911 |
| 816 SyncStatusCode DriveMetadataDB::UpdateSyncOriginAsIncremental( | 912 SyncStatusCode DriveMetadataDB::UpdateSyncOriginAsIncremental( |
| 817 const GURL& origin, const std::string& resource_id) { | 913 const GURL& origin, const std::string& resource_id) { |
| 818 DCHECK(CalledOnValidThread()); | 914 DCHECK(CalledOnValidThread()); |
| 819 DCHECK(db_.get()); | 915 DCHECK(db_.get()); |
| 820 | 916 |
| 821 leveldb::WriteBatch batch; | 917 leveldb::WriteBatch batch; |
| 822 batch.Delete(CreateKeyForBatchSyncOrigin(origin)); | 918 batch.Delete(CreateKeyForBatchSyncOrigin(origin)); |
| 919 batch.Delete(CreateKeyForDisabledSyncOrigin(origin)); | |
| 823 batch.Put(CreateKeyForIncrementalSyncOrigin(origin), resource_id); | 920 batch.Put(CreateKeyForIncrementalSyncOrigin(origin), resource_id); |
| 824 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); | 921 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); |
| 825 | 922 |
| 826 return LevelDBStatusToSyncStatusCode(status); | 923 return LevelDBStatusToSyncStatusCode(status); |
| 827 } | 924 } |
| 828 | 925 |
| 926 SyncStatusCode DriveMetadataDB::EnableSyncOrigin( | |
| 927 const GURL& origin, const std::string& resource_id) { | |
| 928 DCHECK(CalledOnValidThread()); | |
| 929 DCHECK(db_.get()); | |
| 930 | |
| 931 leveldb::WriteBatch batch; | |
| 932 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin)); | |
| 933 batch.Delete(CreateKeyForDisabledSyncOrigin(origin)); | |
| 934 batch.Put(CreateKeyForBatchSyncOrigin(origin), resource_id); | |
| 935 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); | |
| 936 | |
| 937 return LevelDBStatusToSyncStatusCode(status); | |
| 938 } | |
| 939 | |
| 940 SyncStatusCode DriveMetadataDB::DisableSyncOrigin( | |
| 941 const GURL& origin, const std::string& resource_id) { | |
| 942 DCHECK(CalledOnValidThread()); | |
| 943 DCHECK(db_.get()); | |
| 944 | |
| 945 leveldb::WriteBatch batch; | |
| 946 batch.Delete(CreateKeyForBatchSyncOrigin(origin)); | |
| 947 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin)); | |
| 948 batch.Put(CreateKeyForDisabledSyncOrigin(origin), resource_id); | |
| 949 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); | |
| 950 | |
| 951 return LevelDBStatusToSyncStatusCode(status); | |
| 952 } | |
| 953 | |
| 829 SyncStatusCode DriveMetadataDB::RemoveOrigin(const GURL& origin_to_remove) { | 954 SyncStatusCode DriveMetadataDB::RemoveOrigin(const GURL& origin_to_remove) { |
| 830 DCHECK(CalledOnValidThread()); | 955 DCHECK(CalledOnValidThread()); |
| 831 | 956 |
| 832 leveldb::WriteBatch batch; | 957 leveldb::WriteBatch batch; |
| 833 batch.Delete(kDriveBatchSyncOriginKeyPrefix + origin_to_remove.spec()); | 958 batch.Delete(CreateKeyForBatchSyncOrigin(origin_to_remove)); |
| 834 batch.Delete(kDriveIncrementalSyncOriginKeyPrefix + origin_to_remove.spec()); | 959 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin_to_remove)); |
| 960 batch.Delete(CreateKeyForDisabledSyncOrigin(origin_to_remove)); | |
| 835 | 961 |
| 836 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); | 962 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); |
| 837 std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_remove.spec(); | 963 std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_remove.spec(); |
| 838 for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) { | 964 for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) { |
| 839 std::string key = itr->key().ToString(); | 965 std::string key = itr->key().ToString(); |
| 840 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) | 966 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) |
| 841 break; | 967 break; |
| 842 GURL origin; | 968 GURL origin; |
| 843 base::FilePath path; | 969 base::FilePath path; |
| 844 MetadataKeyToOriginAndPath(key, &origin, &path); | 970 MetadataKeyToOriginAndPath(key, &origin, &path); |
| 845 if (origin != origin_to_remove) | 971 if (origin != origin_to_remove) |
| 846 break; | 972 break; |
| 847 batch.Delete(key); | 973 batch.Delete(key); |
| 848 } | 974 } |
| 849 | 975 |
| 850 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); | 976 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); |
| 851 return LevelDBStatusToSyncStatusCode(status); | 977 return LevelDBStatusToSyncStatusCode(status); |
| 852 } | 978 } |
| 853 | 979 |
| 854 SyncStatusCode DriveMetadataDB::GetSyncOrigins( | 980 SyncStatusCode DriveMetadataDB::GetSyncOrigins( |
| 855 ResourceIDMap* batch_sync_origins, | 981 ResourceIDMap* batch_sync_origins, |
| 856 ResourceIDMap* incremental_sync_origins) { | 982 ResourceIDMap* incremental_sync_origins, |
| 983 ResourceIDMap* disabled_sync_origins) { | |
| 857 DCHECK(CalledOnValidThread()); | 984 DCHECK(CalledOnValidThread()); |
| 858 DCHECK(db_.get()); | 985 DCHECK(db_.get()); |
| 859 | 986 |
| 860 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); | 987 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); |
| 861 | 988 |
| 862 // Get batch sync origins from the DB. | 989 // Get batch sync origins from the DB. |
| 863 for (itr->Seek(kDriveBatchSyncOriginKeyPrefix); | 990 for (itr->Seek(kDriveBatchSyncOriginKeyPrefix); |
| 864 itr->Valid(); itr->Next()) { | 991 itr->Valid(); itr->Next()) { |
| 865 std::string key = itr->key().ToString(); | 992 std::string key = itr->key().ToString(); |
| 866 if (!StartsWithASCII(key, kDriveBatchSyncOriginKeyPrefix, true)) | 993 if (!StartsWithASCII(key, kDriveBatchSyncOriginKeyPrefix, true)) |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 882 break; | 1009 break; |
| 883 GURL origin(std::string( | 1010 GURL origin(std::string( |
| 884 key.begin() + arraysize(kDriveIncrementalSyncOriginKeyPrefix) - 1, | 1011 key.begin() + arraysize(kDriveIncrementalSyncOriginKeyPrefix) - 1, |
| 885 key.end())); | 1012 key.end())); |
| 886 DCHECK(origin.is_valid()); | 1013 DCHECK(origin.is_valid()); |
| 887 bool result = incremental_sync_origins->insert( | 1014 bool result = incremental_sync_origins->insert( |
| 888 std::make_pair(origin, itr->value().ToString())).second; | 1015 std::make_pair(origin, itr->value().ToString())).second; |
| 889 DCHECK(result); | 1016 DCHECK(result); |
| 890 } | 1017 } |
| 891 | 1018 |
| 1019 // Get disabled sync origins from the DB. | |
| 1020 for (itr->Seek(kDriveDisabledSyncOriginKeyPrefix); | |
| 1021 itr->Valid(); itr->Next()) { | |
| 1022 std::string key = itr->key().ToString(); | |
| 1023 if (!StartsWithASCII(key, kDriveDisabledSyncOriginKeyPrefix, true)) | |
| 1024 break; | |
| 1025 GURL origin(std::string( | |
| 1026 key.begin() + arraysize(kDriveDisabledSyncOriginKeyPrefix) - 1, | |
| 1027 key.end())); | |
| 1028 DCHECK(origin.is_valid()); | |
| 1029 bool result = disabled_sync_origins->insert( | |
| 1030 std::make_pair(origin, itr->value().ToString())).second; | |
| 1031 DCHECK(result); | |
| 1032 } | |
| 1033 | |
| 892 return SYNC_STATUS_OK; | 1034 return SYNC_STATUS_OK; |
| 893 } | 1035 } |
| 894 | 1036 |
| 895 } // namespace sync_file_system | 1037 } // namespace sync_file_system |
| OLD | NEW |