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

Side by Side Diff: chrome/browser/sync_file_system/drive_metadata_store.cc

Issue 12744008: SyncFS: store disabled origins in DriveMetadataStore (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: unit tests and review fix Created 7 years, 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
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,
111 const DriveMetadata& metadata); 112 const DriveMetadata& metadata);
112 SyncStatusCode DeleteEntry(const FileSystemURL& url); 113 SyncStatusCode DeleteEntry(const FileSystemURL& url);
113 114
115 // TODO(calvinlo): consolidate these state transition functions for sync
116 // origins like "UpdateSyncOrigin(GURL, SyncStatusEnum)". And manage origins
117 // in just one map like "Map<SyncStatusEnum, ResourceIDMap>".
kinuko 2013/03/16 23:16:51 Can we file a bug for this?
nhiroki 2013/03/18 09:40:18 Done.
114 SyncStatusCode UpdateSyncOriginAsBatch(const GURL& origin, 118 SyncStatusCode UpdateSyncOriginAsBatch(const GURL& origin,
115 const std::string& resource_id); 119 const std::string& resource_id);
116 SyncStatusCode UpdateSyncOriginAsIncremental(const GURL& origin, 120 SyncStatusCode UpdateSyncOriginAsIncremental(const GURL& origin,
117 const std::string& resource_id); 121 const std::string& resource_id);
122 SyncStatusCode EnableOriginSync(const GURL& origin,
123 const std::string& resource_id);
124 SyncStatusCode DisableOriginSync(const GURL& origin,
125 const std::string& resource_id);
118 SyncStatusCode RemoveOrigin(const GURL& origin); 126 SyncStatusCode RemoveOrigin(const GURL& origin);
119 127
120 SyncStatusCode GetSyncOrigins(ResourceIDMap* batch_sync_origins, 128 SyncStatusCode GetSyncOrigins(ResourceIDMap* batch_sync_origins,
121 ResourceIDMap* incremental_sync_origins); 129 ResourceIDMap* incremental_sync_origins,
130 ResourceIDMap* disabled_sync_origins);
kinuko 2013/03/16 23:16:51 Hmm, ok so we seem to use the term 'SyncOrigin' a
nhiroki 2013/03/18 09:40:18 Looks good. (hopefully) I replaced them without an
122 131
123 private: 132 private:
124 bool CalledOnValidThread() const { 133 bool CalledOnValidThread() const {
125 return task_runner_->RunsTasksOnCurrentThread(); 134 return task_runner_->RunsTasksOnCurrentThread();
126 } 135 }
127 136
128 scoped_refptr<base::SequencedTaskRunner> task_runner_; 137 scoped_refptr<base::SequencedTaskRunner> task_runner_;
129 138
130 std::string db_path_; 139 std::string db_path_;
131 scoped_ptr<leveldb::DB> db_; 140 scoped_ptr<leveldb::DB> db_;
132 141
133 DISALLOW_COPY_AND_ASSIGN(DriveMetadataDB); 142 DISALLOW_COPY_AND_ASSIGN(DriveMetadataDB);
134 }; 143 };
135 144
136 struct DriveMetadataDBContents { 145 struct DriveMetadataDBContents {
137 int64 largest_changestamp; 146 int64 largest_changestamp;
138 DriveMetadataStore::MetadataMap metadata_map; 147 DriveMetadataStore::MetadataMap metadata_map;
139 std::string sync_root_directory_resource_id; 148 std::string sync_root_directory_resource_id;
140 DriveMetadataStore::ResourceIDMap batch_sync_origins; 149 DriveMetadataStore::ResourceIDMap batch_sync_origins;
141 DriveMetadataStore::ResourceIDMap incremental_sync_origins; 150 DriveMetadataStore::ResourceIDMap incremental_sync_origins;
151 DriveMetadataStore::ResourceIDMap disabled_sync_origins;
142 }; 152 };
143 153
144 namespace { 154 namespace {
145 155
146 SyncStatusCode InitializeDBOnFileThread(DriveMetadataDB* db, 156 SyncStatusCode InitializeDBOnFileThread(DriveMetadataDB* db,
147 DriveMetadataDBContents* contents) { 157 DriveMetadataDBContents* contents) {
148 DCHECK(db); 158 DCHECK(db);
149 DCHECK(contents); 159 DCHECK(contents);
150 160
151 contents->largest_changestamp = 0; 161 contents->largest_changestamp = 0;
152 contents->metadata_map.clear(); 162 contents->metadata_map.clear();
153 contents->batch_sync_origins.clear(); 163 contents->batch_sync_origins.clear();
154 contents->incremental_sync_origins.clear(); 164 contents->incremental_sync_origins.clear();
165 contents->disabled_sync_origins.clear();
155 166
156 bool created = false; 167 bool created = false;
157 SyncStatusCode status = db->Initialize(&created); 168 SyncStatusCode status = db->Initialize(&created);
158 if (status != SYNC_STATUS_OK) 169 if (status != SYNC_STATUS_OK)
159 return status; 170 return status;
160 171
161 if (!created) { 172 if (!created) {
162 status = db->MigrateDatabaseIfNeeded(); 173 status = db->MigrateDatabaseIfNeeded();
163 if (status != SYNC_STATUS_OK) { 174 if (status != SYNC_STATUS_OK) {
164 LOG(WARNING) << "Failed to migrate DriveMetadataStore to latest version."; 175 LOG(WARNING) << "Failed to migrate DriveMetadataStore to latest version.";
165 return status; 176 return status;
166 } 177 }
167 } 178 }
168 179
169 return db->ReadContents(contents); 180 return db->ReadContents(contents);
170 } 181 }
171 182
183
172 // Returns a key string for the given batch sync origin. 184 // Returns a key string for the given batch sync origin.
173 // For example, when |origin| is "http://www.example.com", 185 // For example, when |origin| is "http://www.example.com",
174 // returns "BSYNC_ORIGIN: http://www.example.com". 186 // returns "BSYNC_ORIGIN: http://www.example.com".
187 // TODO(calvinlo): consolidate these CreateKeyFor* functions.
175 std::string CreateKeyForBatchSyncOrigin(const GURL& origin) { 188 std::string CreateKeyForBatchSyncOrigin(const GURL& origin) {
176 DCHECK(origin.is_valid()); 189 DCHECK(origin.is_valid());
177 return kDriveBatchSyncOriginKeyPrefix + origin.spec(); 190 return kDriveBatchSyncOriginKeyPrefix + origin.spec();
178 } 191 }
179 192
180 // Returns a key string for the given incremental sync origin. 193 // Returns a key string for the given incremental sync origin.
181 // For example, when |origin| is "http://www.example.com", 194 // For example, when |origin| is "http://www.example.com",
182 // returns "ISYNC_ORIGIN: http://www.example.com". 195 // returns "ISYNC_ORIGIN: http://www.example.com".
183 std::string CreateKeyForIncrementalSyncOrigin(const GURL& origin) { 196 std::string CreateKeyForIncrementalSyncOrigin(const GURL& origin) {
184 DCHECK(origin.is_valid()); 197 DCHECK(origin.is_valid());
185 return kDriveIncrementalSyncOriginKeyPrefix + origin.spec(); 198 return kDriveIncrementalSyncOriginKeyPrefix + origin.spec();
186 } 199 }
187 200
201 // Returns a key string for the given disabled sync origin.
202 // For example, when |origin| is "http://www.example.com",
203 // returns "DSYNC_ORIGIN: http://www.example.com".
204 std::string CreateKeyForDisabledSyncOrigin(const GURL& origin) {
205 DCHECK(origin.is_valid());
206 return kDriveDisabledSyncOriginKeyPrefix + origin.spec();
207 }
208
188 void AddOriginsToVector(std::vector<GURL>* all_origins, 209 void AddOriginsToVector(std::vector<GURL>* all_origins,
189 const DriveMetadataStore::ResourceIDMap& resource_map) { 210 const DriveMetadataStore::ResourceIDMap& resource_map) {
190 typedef DriveMetadataStore::ResourceIDMap::const_iterator itr; 211 typedef DriveMetadataStore::ResourceIDMap::const_iterator itr;
191 for (std::map<GURL, std::string>::const_iterator itr = resource_map.begin(); 212 for (std::map<GURL, std::string>::const_iterator itr = resource_map.begin();
192 itr != resource_map.end(); 213 itr != resource_map.end();
193 ++itr) { 214 ++itr) {
194 all_origins->push_back(itr->first); 215 all_origins->push_back(itr->first);
195 } 216 }
196 } 217 }
197 218
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 if (status != SYNC_STATUS_OK) { 254 if (status != SYNC_STATUS_OK) {
234 callback.Run(status, false); 255 callback.Run(status, false);
235 return; 256 return;
236 } 257 }
237 258
238 largest_changestamp_ = contents->largest_changestamp; 259 largest_changestamp_ = contents->largest_changestamp;
239 metadata_map_.swap(contents->metadata_map); 260 metadata_map_.swap(contents->metadata_map);
240 sync_root_directory_resource_id_ = contents->sync_root_directory_resource_id; 261 sync_root_directory_resource_id_ = contents->sync_root_directory_resource_id;
241 batch_sync_origins_.swap(contents->batch_sync_origins); 262 batch_sync_origins_.swap(contents->batch_sync_origins);
242 incremental_sync_origins_.swap(contents->incremental_sync_origins); 263 incremental_sync_origins_.swap(contents->incremental_sync_origins);
264 disabled_sync_origins_.swap(contents->disabled_sync_origins);
243 // |largest_changestamp_| is set to 0 for a fresh empty database. 265 // |largest_changestamp_| is set to 0 for a fresh empty database.
244 callback.Run(status, largest_changestamp_ <= 0); 266 callback.Run(status, largest_changestamp_ <= 0);
245 } 267 }
246 268
247 void DriveMetadataStore::RestoreSyncRootDirectory( 269 void DriveMetadataStore::RestoreSyncRootDirectory(
248 const SyncStatusCallback& callback) { 270 const SyncStatusCallback& callback) {
249 DCHECK(CalledOnValidThread()); 271 DCHECK(CalledOnValidThread());
250 std::string* sync_root_directory_resource_id = new std::string; 272 std::string* sync_root_directory_resource_id = new std::string;
251 base::PostTaskAndReplyWithResult( 273 base::PostTaskAndReplyWithResult(
252 file_task_runner_, FROM_HERE, 274 file_task_runner_, FROM_HERE,
(...skipping 20 matching lines...) Expand all
273 295
274 sync_root_directory_resource_id_.swap(*sync_root_directory_resource_id); 296 sync_root_directory_resource_id_.swap(*sync_root_directory_resource_id);
275 callback.Run(status); 297 callback.Run(status);
276 } 298 }
277 299
278 void DriveMetadataStore::RestoreSyncOrigins( 300 void DriveMetadataStore::RestoreSyncOrigins(
279 const SyncStatusCallback& callback) { 301 const SyncStatusCallback& callback) {
280 DCHECK(CalledOnValidThread()); 302 DCHECK(CalledOnValidThread());
281 ResourceIDMap* batch_sync_origins = new ResourceIDMap; 303 ResourceIDMap* batch_sync_origins = new ResourceIDMap;
282 ResourceIDMap* incremental_sync_origins = new ResourceIDMap; 304 ResourceIDMap* incremental_sync_origins = new ResourceIDMap;
305 ResourceIDMap* disabled_sync_origins = new ResourceIDMap;
283 base::PostTaskAndReplyWithResult( 306 base::PostTaskAndReplyWithResult(
284 file_task_runner_, FROM_HERE, 307 file_task_runner_, FROM_HERE,
285 base::Bind(&DriveMetadataDB::GetSyncOrigins, 308 base::Bind(&DriveMetadataDB::GetSyncOrigins,
286 base::Unretained(db_.get()), 309 base::Unretained(db_.get()),
287 batch_sync_origins, 310 batch_sync_origins,
288 incremental_sync_origins), 311 incremental_sync_origins,
312 disabled_sync_origins),
289 base::Bind(&DriveMetadataStore::DidRestoreSyncOrigins, 313 base::Bind(&DriveMetadataStore::DidRestoreSyncOrigins,
290 AsWeakPtr(), callback, 314 AsWeakPtr(), callback,
291 base::Owned(batch_sync_origins), 315 base::Owned(batch_sync_origins),
292 base::Owned(incremental_sync_origins))); 316 base::Owned(incremental_sync_origins),
317 base::Owned(disabled_sync_origins)));
293 } 318 }
294 319
295 void DriveMetadataStore::DidRestoreSyncOrigins( 320 void DriveMetadataStore::DidRestoreSyncOrigins(
296 const SyncStatusCallback& callback, 321 const SyncStatusCallback& callback,
297 ResourceIDMap* batch_sync_origins, 322 ResourceIDMap* batch_sync_origins,
298 ResourceIDMap* incremental_sync_origins, 323 ResourceIDMap* incremental_sync_origins,
324 ResourceIDMap* disabled_sync_origins,
299 SyncStatusCode status) { 325 SyncStatusCode status) {
300 DCHECK(CalledOnValidThread()); 326 DCHECK(CalledOnValidThread());
301 DCHECK(batch_sync_origins); 327 DCHECK(batch_sync_origins);
302 DCHECK(incremental_sync_origins); 328 DCHECK(incremental_sync_origins);
329 DCHECK(disabled_sync_origins);
303 330
304 db_status_ = status; 331 db_status_ = status;
305 if (status != SYNC_STATUS_OK) { 332 if (status != SYNC_STATUS_OK) {
306 callback.Run(status); 333 callback.Run(status);
307 return; 334 return;
308 } 335 }
309 336
310 batch_sync_origins_.swap(*batch_sync_origins); 337 batch_sync_origins_.swap(*batch_sync_origins);
311 incremental_sync_origins_.swap(*incremental_sync_origins); 338 incremental_sync_origins_.swap(*incremental_sync_origins);
339 disabled_sync_origins_.swap(*disabled_sync_origins);
312 callback.Run(status); 340 callback.Run(status);
313 } 341 }
314 342
315 void DriveMetadataStore::SetLargestChangeStamp( 343 void DriveMetadataStore::SetLargestChangeStamp(
316 int64 largest_changestamp, 344 int64 largest_changestamp,
317 const SyncStatusCallback& callback) { 345 const SyncStatusCallback& callback) {
318 DCHECK(CalledOnValidThread()); 346 DCHECK(CalledOnValidThread());
319 DCHECK_EQ(SYNC_STATUS_OK, db_status_); 347 DCHECK_EQ(SYNC_STATUS_OK, db_status_);
320 largest_changestamp_ = largest_changestamp; 348 largest_changestamp_ = largest_changestamp;
321 base::PostTaskAndReplyWithResult( 349 base::PostTaskAndReplyWithResult(
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 bool DriveMetadataStore::IsBatchSyncOrigin(const GURL& origin) const { 441 bool DriveMetadataStore::IsBatchSyncOrigin(const GURL& origin) const {
414 DCHECK(CalledOnValidThread()); 442 DCHECK(CalledOnValidThread());
415 return ContainsKey(batch_sync_origins_, origin); 443 return ContainsKey(batch_sync_origins_, origin);
416 } 444 }
417 445
418 bool DriveMetadataStore::IsIncrementalSyncOrigin(const GURL& origin) const { 446 bool DriveMetadataStore::IsIncrementalSyncOrigin(const GURL& origin) const {
419 DCHECK(CalledOnValidThread()); 447 DCHECK(CalledOnValidThread());
420 return ContainsKey(incremental_sync_origins_, origin); 448 return ContainsKey(incremental_sync_origins_, origin);
421 } 449 }
422 450
451 bool DriveMetadataStore::IsDisabledSyncOrigin(const GURL& origin) const {
452 DCHECK(CalledOnValidThread());
453 return ContainsKey(disabled_sync_origins_, origin);
454 }
455
423 void DriveMetadataStore::AddBatchSyncOrigin(const GURL& origin, 456 void DriveMetadataStore::AddBatchSyncOrigin(const GURL& origin,
424 const std::string& resource_id) { 457 const std::string& resource_id) {
425 DCHECK(CalledOnValidThread()); 458 DCHECK(CalledOnValidThread());
426 DCHECK(!IsBatchSyncOrigin(origin)); 459 DCHECK(!IsBatchSyncOrigin(origin));
427 DCHECK(!IsIncrementalSyncOrigin(origin)); 460 DCHECK(!IsIncrementalSyncOrigin(origin));
461 DCHECK(!IsDisabledSyncOrigin(origin));
428 DCHECK_EQ(SYNC_STATUS_OK, db_status_); 462 DCHECK_EQ(SYNC_STATUS_OK, db_status_);
429 463
430 batch_sync_origins_.insert(std::make_pair(origin, resource_id)); 464 batch_sync_origins_.insert(std::make_pair(origin, resource_id));
431 465
432 // Store a pair of |origin| and |resource_id| in the DB. 466 // Store a pair of |origin| and |resource_id| in the DB.
433 base::PostTaskAndReplyWithResult( 467 base::PostTaskAndReplyWithResult(
434 file_task_runner_, FROM_HERE, 468 file_task_runner_, FROM_HERE,
435 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsBatch, 469 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsBatch,
436 base::Unretained(db_.get()), origin, resource_id), 470 base::Unretained(db_.get()), origin, resource_id),
437 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); 471 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr()));
438 } 472 }
439 473
440 void DriveMetadataStore::MoveBatchSyncOriginToIncremental(const GURL& origin) { 474 void DriveMetadataStore::MoveBatchSyncOriginToIncremental(const GURL& origin) {
441 DCHECK(CalledOnValidThread()); 475 DCHECK(CalledOnValidThread());
442 DCHECK(IsBatchSyncOrigin(origin)); 476 DCHECK(IsBatchSyncOrigin(origin));
443 DCHECK(!IsIncrementalSyncOrigin(origin)); 477 DCHECK(!IsIncrementalSyncOrigin(origin));
478 DCHECK(!IsDisabledSyncOrigin(origin));
444 DCHECK_EQ(SYNC_STATUS_OK, db_status_); 479 DCHECK_EQ(SYNC_STATUS_OK, db_status_);
445 480
446 std::map<GURL, std::string>::iterator found = 481 std::map<GURL, std::string>::iterator found =
447 batch_sync_origins_.find(origin); 482 batch_sync_origins_.find(origin);
448 incremental_sync_origins_.insert(std::make_pair(origin, found->second)); 483 incremental_sync_origins_.insert(std::make_pair(origin, found->second));
449 484
450 // Store a pair of |origin| and |resource_id| in the DB. 485 // Store a pair of |origin| and |resource_id| in the DB.
451 base::PostTaskAndReplyWithResult( 486 base::PostTaskAndReplyWithResult(
452 file_task_runner_, FROM_HERE, 487 file_task_runner_, FROM_HERE,
453 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsIncremental, 488 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsIncremental,
454 base::Unretained(db_.get()), origin, found->second), 489 base::Unretained(db_.get()), origin, found->second),
455 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); 490 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr()));
456 491
457 batch_sync_origins_.erase(found); 492 batch_sync_origins_.erase(found);
458 } 493 }
459 494
495 void DriveMetadataStore::EnableOriginSync(
496 const GURL& origin,
497 const SyncStatusCallback& callback) {
498 DCHECK(CalledOnValidThread());
499 DCHECK(IsDisabledSyncOrigin(origin));
500 DCHECK(!IsBatchSyncOrigin(origin));
501 DCHECK(!IsIncrementalSyncOrigin(origin));
kinuko 2013/03/16 23:16:51 Nit-picky comment: If we had a crash after an exte
nhiroki 2013/03/18 09:40:18 You are right. I think it's not needed to check th
502
503 std::map<GURL, std::string>::iterator found =
504 disabled_sync_origins_.find(origin);
505 batch_sync_origins_.insert(std::make_pair(origin, found->second));
506
507 // Store a pair of |origin| and |resource_id| in the DB.
508 base::PostTaskAndReplyWithResult(
509 file_task_runner_, FROM_HERE,
510 base::Bind(&DriveMetadataDB::EnableOriginSync,
511 base::Unretained(db_.get()), origin, found->second),
512 base::Bind(&DriveMetadataStore::DidChangeOrigin, AsWeakPtr(), callback));
513
514 disabled_sync_origins_.erase(found);
515 }
516
517 void DriveMetadataStore::DisableOriginSync(
518 const GURL& origin,
519 const SyncStatusCallback& callback) {
520 DCHECK(CalledOnValidThread());
521 DCHECK(IsBatchSyncOrigin(origin) || IsIncrementalSyncOrigin(origin));
522 DCHECK(!IsDisabledSyncOrigin(origin));
kinuko 2013/03/16 23:16:51 Ditto.
nhiroki 2013/03/18 09:40:18 Done.
523
524 std::string resource_id;
525 std::map<GURL, std::string>::iterator found =
526 batch_sync_origins_.find(origin);
527 if (found != batch_sync_origins_.end()) {
528 resource_id = found->second;
529 batch_sync_origins_.erase(found);
530 }
531
532 found = incremental_sync_origins_.find(origin);
533 if (found != incremental_sync_origins_.end()) {
534 resource_id = found->second;
535 incremental_sync_origins_.erase(found);
536 }
537
538 DCHECK(!resource_id.empty());
539 disabled_sync_origins_.insert(std::make_pair(origin, resource_id));
540
541 // Store a pair of |origin| and |resource_id| in the DB.
542 base::PostTaskAndReplyWithResult(
543 file_task_runner_, FROM_HERE,
544 base::Bind(&DriveMetadataDB::DisableOriginSync,
545 base::Unretained(db_.get()), origin, resource_id),
546 base::Bind(&DriveMetadataStore::DidChangeOrigin, AsWeakPtr(), callback));
547 }
548
460 void DriveMetadataStore::RemoveOrigin( 549 void DriveMetadataStore::RemoveOrigin(
461 const GURL& origin, 550 const GURL& origin,
462 const SyncStatusCallback& callback) { 551 const SyncStatusCallback& callback) {
463 DCHECK(CalledOnValidThread()); 552 DCHECK(CalledOnValidThread());
464 553
465 metadata_map_.erase(origin); 554 metadata_map_.erase(origin);
466 batch_sync_origins_.erase(origin); 555 batch_sync_origins_.erase(origin);
467 incremental_sync_origins_.erase(origin); 556 incremental_sync_origins_.erase(origin);
557 disabled_sync_origins_.erase(origin);
468 558
469 base::PostTaskAndReplyWithResult( 559 base::PostTaskAndReplyWithResult(
470 file_task_runner_, FROM_HERE, 560 file_task_runner_, FROM_HERE,
471 base::Bind(&DriveMetadataDB::RemoveOrigin, 561 base::Bind(&DriveMetadataDB::RemoveOrigin,
472 base::Unretained(db_.get()), origin), 562 base::Unretained(db_.get()), origin),
473 base::Bind(&DriveMetadataStore::DidRemoveOrigin, AsWeakPtr(), callback)); 563 base::Bind(&DriveMetadataStore::DidChangeOrigin, AsWeakPtr(), callback));
474 } 564 }
475 565
476 void DriveMetadataStore::DidRemoveOrigin( 566 void DriveMetadataStore::DidChangeOrigin(
477 const SyncStatusCallback& callback, 567 const SyncStatusCallback& callback,
478 SyncStatusCode status) { 568 SyncStatusCode status) {
479 UpdateDBStatus(status); 569 UpdateDBStatus(status);
480 callback.Run(status); 570 callback.Run(status);
481 } 571 }
482 572
483 void DriveMetadataStore::UpdateDBStatus(SyncStatusCode status) { 573 void DriveMetadataStore::UpdateDBStatus(SyncStatusCode status) {
484 DCHECK(CalledOnValidThread()); 574 DCHECK(CalledOnValidThread());
485 if (db_status_ != SYNC_STATUS_OK && 575 if (db_status_ != SYNC_STATUS_OK &&
486 db_status_ != SYNC_DATABASE_ERROR_NOT_FOUND) { 576 db_status_ != SYNC_DATABASE_ERROR_NOT_FOUND) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 list->push_back(std::make_pair(url, itr->second.resource_id())); 628 list->push_back(std::make_pair(url, itr->second.resource_id()));
539 } 629 }
540 } 630 }
541 } 631 }
542 return SYNC_STATUS_OK; 632 return SYNC_STATUS_OK;
543 } 633 }
544 634
545 std::string DriveMetadataStore::GetResourceIdForOrigin( 635 std::string DriveMetadataStore::GetResourceIdForOrigin(
546 const GURL& origin) const { 636 const GURL& origin) const {
547 DCHECK(CalledOnValidThread()); 637 DCHECK(CalledOnValidThread());
548 DCHECK(IsBatchSyncOrigin(origin) || IsIncrementalSyncOrigin(origin)); 638 DCHECK(IsBatchSyncOrigin(origin) ||
639 IsIncrementalSyncOrigin(origin) ||
640 IsDisabledSyncOrigin(origin));
549 641
550 ResourceIDMap::const_iterator found = incremental_sync_origins_.find(origin); 642 ResourceIDMap::const_iterator found = incremental_sync_origins_.find(origin);
551 if (found != incremental_sync_origins_.end()) 643 if (found != incremental_sync_origins_.end())
552 return found->second; 644 return found->second;
553 645
554 found = batch_sync_origins_.find(origin); 646 found = batch_sync_origins_.find(origin);
555 if (found != batch_sync_origins_.end()) 647 if (found != batch_sync_origins_.end())
556 return found->second; 648 return found->second;
557 649
650 found = disabled_sync_origins_.find(origin);
651 if (found != disabled_sync_origins_.end())
652 return found->second;
653
558 NOTREACHED(); 654 NOTREACHED();
559 return std::string(); 655 return std::string();
560 } 656 }
561 657
562 void DriveMetadataStore::GetAllOrigins(std::vector<GURL>* origins) { 658 void DriveMetadataStore::GetEnabledOrigins(std::vector<GURL>* origins) {
659 origins->clear();
563 origins->reserve(batch_sync_origins_.size() + 660 origins->reserve(batch_sync_origins_.size() +
564 incremental_sync_origins_.size()); 661 incremental_sync_origins_.size());
565 AddOriginsToVector(origins, batch_sync_origins_); 662 AddOriginsToVector(origins, batch_sync_origins_);
566 AddOriginsToVector(origins, incremental_sync_origins_); 663 AddOriginsToVector(origins, incremental_sync_origins_);
567 } 664 }
568 665
666 void DriveMetadataStore::GetDisabledOrigins(std::vector<GURL>* origins) {
667 origins->clear();
668 origins->reserve(disabled_sync_origins_.size());
669 AddOriginsToVector(origins, disabled_sync_origins_);
670 }
671
569 //////////////////////////////////////////////////////////////////////////////// 672 ////////////////////////////////////////////////////////////////////////////////
570 673
571 DriveMetadataDB::DriveMetadataDB(const base::FilePath& base_dir, 674 DriveMetadataDB::DriveMetadataDB(const base::FilePath& base_dir,
572 base::SequencedTaskRunner* task_runner) 675 base::SequencedTaskRunner* task_runner)
573 : task_runner_(task_runner), 676 : task_runner_(task_runner),
574 db_path_(fileapi::FilePathToString( 677 db_path_(fileapi::FilePathToString(
575 base_dir.Append(DriveMetadataStore::kDatabaseName))) { 678 base_dir.Append(DriveMetadataStore::kDatabaseName))) {
576 } 679 }
577 680
578 DriveMetadataDB::~DriveMetadataDB() { 681 DriveMetadataDB::~DriveMetadataDB() {
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 bool success = metadata.ParseFromString(itr->value().ToString()); 742 bool success = metadata.ParseFromString(itr->value().ToString());
640 DCHECK(success); 743 DCHECK(success);
641 744
642 success = contents->metadata_map[origin].insert( 745 success = contents->metadata_map[origin].insert(
643 std::make_pair(path, metadata)).second; 746 std::make_pair(path, metadata)).second;
644 DCHECK(success); 747 DCHECK(success);
645 } 748 }
646 } 749 }
647 750
648 SyncStatusCode status = GetSyncOrigins(&contents->batch_sync_origins, 751 SyncStatusCode status = GetSyncOrigins(&contents->batch_sync_origins,
649 &contents->incremental_sync_origins); 752 &contents->incremental_sync_origins,
753 &contents->disabled_sync_origins);
650 if (status != SYNC_STATUS_OK && 754 if (status != SYNC_STATUS_OK &&
651 status != SYNC_DATABASE_ERROR_NOT_FOUND) 755 status != SYNC_DATABASE_ERROR_NOT_FOUND)
652 return status; 756 return status;
653 757
654 status = GetSyncRootDirectory(&contents->sync_root_directory_resource_id); 758 status = GetSyncRootDirectory(&contents->sync_root_directory_resource_id);
655 if (status != SYNC_STATUS_OK && 759 if (status != SYNC_STATUS_OK &&
656 status != SYNC_DATABASE_ERROR_NOT_FOUND) 760 status != SYNC_DATABASE_ERROR_NOT_FOUND)
657 return status; 761 return status;
658 762
659 return SYNC_STATUS_OK; 763 return SYNC_STATUS_OK;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 // value: <Resource ID of the sync root directory> 815 // value: <Resource ID of the sync root directory>
712 // 816 //
713 // * key: "METADATA: " + <Origin and URL> (changed) 817 // * key: "METADATA: " + <Origin and URL> (changed)
714 // * value: <Serialized DriveMetadata> 818 // * value: <Serialized DriveMetadata>
715 // 819 //
716 // key: "BSYNC_ORIGIN: " + <URL string of a batch sync origin> 820 // key: "BSYNC_ORIGIN: " + <URL string of a batch sync origin>
717 // value: <Resource ID of the drive directory for the origin> 821 // value: <Resource ID of the drive directory for the origin>
718 // 822 //
719 // key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin> 823 // key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin>
720 // value: <Resource ID of the drive directory for the origin> 824 // value: <Resource ID of the drive directory for the origin>
825 //
826 // key: "DSYNC_ORIGIN: " + <URL string of a disabled sync origin>
827 // value: <Resource ID of the drive directory for the origin>
721 828
722 leveldb::WriteBatch write_batch; 829 leveldb::WriteBatch write_batch;
723 write_batch.Put(kDatabaseVersionKey, 830 write_batch.Put(kDatabaseVersionKey,
724 base::Int64ToString(kCurrentDatabaseVersion)); 831 base::Int64ToString(kCurrentDatabaseVersion));
725 832
726 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); 833 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
727 for (itr->Seek(kDriveMetadataKeyPrefix); itr->Valid(); itr->Next()) { 834 for (itr->Seek(kDriveMetadataKeyPrefix); itr->Valid(); itr->Next()) {
728 std::string key = itr->key().ToString(); 835 std::string key = itr->key().ToString();
729 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) 836 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true))
730 break; 837 break;
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 return LevelDBStatusToSyncStatusCode(status); 920 return LevelDBStatusToSyncStatusCode(status);
814 } 921 }
815 922
816 SyncStatusCode DriveMetadataDB::UpdateSyncOriginAsIncremental( 923 SyncStatusCode DriveMetadataDB::UpdateSyncOriginAsIncremental(
817 const GURL& origin, const std::string& resource_id) { 924 const GURL& origin, const std::string& resource_id) {
818 DCHECK(CalledOnValidThread()); 925 DCHECK(CalledOnValidThread());
819 DCHECK(db_.get()); 926 DCHECK(db_.get());
820 927
821 leveldb::WriteBatch batch; 928 leveldb::WriteBatch batch;
822 batch.Delete(CreateKeyForBatchSyncOrigin(origin)); 929 batch.Delete(CreateKeyForBatchSyncOrigin(origin));
930 batch.Delete(CreateKeyForDisabledSyncOrigin(origin));
823 batch.Put(CreateKeyForIncrementalSyncOrigin(origin), resource_id); 931 batch.Put(CreateKeyForIncrementalSyncOrigin(origin), resource_id);
824 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); 932 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
825 933
826 return LevelDBStatusToSyncStatusCode(status); 934 return LevelDBStatusToSyncStatusCode(status);
827 } 935 }
828 936
937 SyncStatusCode DriveMetadataDB::EnableOriginSync(
938 const GURL& origin, const std::string& resource_id) {
939 DCHECK(CalledOnValidThread());
940 DCHECK(db_.get());
941
942 leveldb::WriteBatch batch;
943 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin));
944 batch.Delete(CreateKeyForDisabledSyncOrigin(origin));
945 batch.Put(CreateKeyForBatchSyncOrigin(origin), resource_id);
946 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
947
948 return LevelDBStatusToSyncStatusCode(status);
949 }
950
951 SyncStatusCode DriveMetadataDB::DisableOriginSync(
952 const GURL& origin, const std::string& resource_id) {
953 DCHECK(CalledOnValidThread());
954 DCHECK(db_.get());
955
956 leveldb::WriteBatch batch;
957 batch.Delete(CreateKeyForBatchSyncOrigin(origin));
958 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin));
959 batch.Put(CreateKeyForDisabledSyncOrigin(origin), resource_id);
960 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
961
962 return LevelDBStatusToSyncStatusCode(status);
963 }
964
829 SyncStatusCode DriveMetadataDB::RemoveOrigin(const GURL& origin_to_remove) { 965 SyncStatusCode DriveMetadataDB::RemoveOrigin(const GURL& origin_to_remove) {
830 DCHECK(CalledOnValidThread()); 966 DCHECK(CalledOnValidThread());
831 967
832 leveldb::WriteBatch batch; 968 leveldb::WriteBatch batch;
833 batch.Delete(kDriveBatchSyncOriginKeyPrefix + origin_to_remove.spec()); 969 batch.Delete(CreateKeyForBatchSyncOrigin(origin_to_remove));
834 batch.Delete(kDriveIncrementalSyncOriginKeyPrefix + origin_to_remove.spec()); 970 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin_to_remove));
971 batch.Delete(CreateKeyForDisabledSyncOrigin(origin_to_remove));
835 972
836 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); 973 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
837 std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_remove.spec(); 974 std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_remove.spec();
838 for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) { 975 for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) {
839 std::string key = itr->key().ToString(); 976 std::string key = itr->key().ToString();
840 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) 977 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true))
841 break; 978 break;
842 GURL origin; 979 GURL origin;
843 base::FilePath path; 980 base::FilePath path;
844 MetadataKeyToOriginAndPath(key, &origin, &path); 981 MetadataKeyToOriginAndPath(key, &origin, &path);
845 if (origin != origin_to_remove) 982 if (origin != origin_to_remove)
846 break; 983 break;
847 batch.Delete(key); 984 batch.Delete(key);
848 } 985 }
849 986
850 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); 987 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
851 return LevelDBStatusToSyncStatusCode(status); 988 return LevelDBStatusToSyncStatusCode(status);
852 } 989 }
853 990
854 SyncStatusCode DriveMetadataDB::GetSyncOrigins( 991 SyncStatusCode DriveMetadataDB::GetSyncOrigins(
855 ResourceIDMap* batch_sync_origins, 992 ResourceIDMap* batch_sync_origins,
856 ResourceIDMap* incremental_sync_origins) { 993 ResourceIDMap* incremental_sync_origins,
994 ResourceIDMap* disabled_sync_origins) {
857 DCHECK(CalledOnValidThread()); 995 DCHECK(CalledOnValidThread());
858 DCHECK(db_.get()); 996 DCHECK(db_.get());
859 997
860 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); 998 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
861 999
862 // Get batch sync origins from the DB. 1000 // Get batch sync origins from the DB.
863 for (itr->Seek(kDriveBatchSyncOriginKeyPrefix); 1001 for (itr->Seek(kDriveBatchSyncOriginKeyPrefix);
864 itr->Valid(); itr->Next()) { 1002 itr->Valid(); itr->Next()) {
865 std::string key = itr->key().ToString(); 1003 std::string key = itr->key().ToString();
866 if (!StartsWithASCII(key, kDriveBatchSyncOriginKeyPrefix, true)) 1004 if (!StartsWithASCII(key, kDriveBatchSyncOriginKeyPrefix, true))
(...skipping 15 matching lines...) Expand all
882 break; 1020 break;
883 GURL origin(std::string( 1021 GURL origin(std::string(
884 key.begin() + arraysize(kDriveIncrementalSyncOriginKeyPrefix) - 1, 1022 key.begin() + arraysize(kDriveIncrementalSyncOriginKeyPrefix) - 1,
885 key.end())); 1023 key.end()));
886 DCHECK(origin.is_valid()); 1024 DCHECK(origin.is_valid());
887 bool result = incremental_sync_origins->insert( 1025 bool result = incremental_sync_origins->insert(
888 std::make_pair(origin, itr->value().ToString())).second; 1026 std::make_pair(origin, itr->value().ToString())).second;
889 DCHECK(result); 1027 DCHECK(result);
890 } 1028 }
891 1029
1030 // Get disabled sync origins from the DB.
1031 for (itr->Seek(kDriveDisabledSyncOriginKeyPrefix);
1032 itr->Valid(); itr->Next()) {
1033 std::string key = itr->key().ToString();
1034 if (!StartsWithASCII(key, kDriveDisabledSyncOriginKeyPrefix, true))
1035 break;
1036 GURL origin(std::string(
1037 key.begin() + arraysize(kDriveDisabledSyncOriginKeyPrefix) - 1,
1038 key.end()));
1039 DCHECK(origin.is_valid());
1040 bool result = disabled_sync_origins->insert(
1041 std::make_pair(origin, itr->value().ToString())).second;
1042 DCHECK(result);
1043 }
1044
892 return SYNC_STATUS_OK; 1045 return SYNC_STATUS_OK;
893 } 1046 }
894 1047
895 } // namespace sync_file_system 1048 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698