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

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: 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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698