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

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: 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 kDriveDisabledOriginKeyPrefix[] = "DISABLED_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
114 SyncStatusCode UpdateSyncOriginAsBatch(const GURL& origin, 115 // TODO(calvinlo): consolidate these state transition functions for sync
116 // origins like "UpdateOrigin(GURL, SyncStatusEnum)". And manage origins in
117 // just one map like "Map<SyncStatusEnum, ResourceIDMap>".
118 // http://crbug.com/211600
119 SyncStatusCode UpdateOriginAsBatchSync(const GURL& origin,
115 const std::string& resource_id); 120 const std::string& resource_id);
116 SyncStatusCode UpdateSyncOriginAsIncremental(const GURL& origin, 121 SyncStatusCode UpdateOriginAsIncrementalSync(const GURL& origin,
117 const std::string& resource_id); 122 const std::string& resource_id);
123 SyncStatusCode EnableOrigin(const GURL& origin,
124 const std::string& resource_id);
125 SyncStatusCode DisableOrigin(const GURL& origin,
126 const std::string& resource_id);
118 SyncStatusCode RemoveOrigin(const GURL& origin); 127 SyncStatusCode RemoveOrigin(const GURL& origin);
119 128
120 SyncStatusCode GetSyncOrigins(ResourceIDMap* batch_sync_origins, 129 SyncStatusCode GetOrigins(ResourceIDMap* batch_sync_origins,
121 ResourceIDMap* incremental_sync_origins); 130 ResourceIDMap* incremental_sync_origins,
131 ResourceIDMap* disabled_origins);
122 132
123 private: 133 private:
124 bool CalledOnValidThread() const { 134 bool CalledOnValidThread() const {
125 return task_runner_->RunsTasksOnCurrentThread(); 135 return task_runner_->RunsTasksOnCurrentThread();
126 } 136 }
127 137
128 scoped_refptr<base::SequencedTaskRunner> task_runner_; 138 scoped_refptr<base::SequencedTaskRunner> task_runner_;
129 139
130 std::string db_path_; 140 std::string db_path_;
131 scoped_ptr<leveldb::DB> db_; 141 scoped_ptr<leveldb::DB> db_;
132 142
133 DISALLOW_COPY_AND_ASSIGN(DriveMetadataDB); 143 DISALLOW_COPY_AND_ASSIGN(DriveMetadataDB);
134 }; 144 };
135 145
136 struct DriveMetadataDBContents { 146 struct DriveMetadataDBContents {
137 int64 largest_changestamp; 147 int64 largest_changestamp;
138 DriveMetadataStore::MetadataMap metadata_map; 148 DriveMetadataStore::MetadataMap metadata_map;
139 std::string sync_root_directory_resource_id; 149 std::string sync_root_directory_resource_id;
140 DriveMetadataStore::ResourceIDMap batch_sync_origins; 150 DriveMetadataStore::ResourceIDMap batch_sync_origins;
141 DriveMetadataStore::ResourceIDMap incremental_sync_origins; 151 DriveMetadataStore::ResourceIDMap incremental_sync_origins;
152 DriveMetadataStore::ResourceIDMap disabled_origins;
142 }; 153 };
143 154
144 namespace { 155 namespace {
145 156
146 SyncStatusCode InitializeDBOnFileThread(DriveMetadataDB* db, 157 SyncStatusCode InitializeDBOnFileThread(DriveMetadataDB* db,
147 DriveMetadataDBContents* contents) { 158 DriveMetadataDBContents* contents) {
148 DCHECK(db); 159 DCHECK(db);
149 DCHECK(contents); 160 DCHECK(contents);
150 161
151 contents->largest_changestamp = 0; 162 contents->largest_changestamp = 0;
152 contents->metadata_map.clear(); 163 contents->metadata_map.clear();
153 contents->batch_sync_origins.clear(); 164 contents->batch_sync_origins.clear();
154 contents->incremental_sync_origins.clear(); 165 contents->incremental_sync_origins.clear();
166 contents->disabled_origins.clear();
155 167
156 bool created = false; 168 bool created = false;
157 SyncStatusCode status = db->Initialize(&created); 169 SyncStatusCode status = db->Initialize(&created);
158 if (status != SYNC_STATUS_OK) 170 if (status != SYNC_STATUS_OK)
159 return status; 171 return status;
160 172
161 if (!created) { 173 if (!created) {
162 status = db->MigrateDatabaseIfNeeded(); 174 status = db->MigrateDatabaseIfNeeded();
163 if (status != SYNC_STATUS_OK) { 175 if (status != SYNC_STATUS_OK) {
164 LOG(WARNING) << "Failed to migrate DriveMetadataStore to latest version."; 176 LOG(WARNING) << "Failed to migrate DriveMetadataStore to latest version.";
165 return status; 177 return status;
166 } 178 }
167 } 179 }
168 180
169 return db->ReadContents(contents); 181 return db->ReadContents(contents);
170 } 182 }
171 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.
188 // http://crbug.com/211600
175 std::string CreateKeyForBatchSyncOrigin(const GURL& origin) { 189 std::string CreateKeyForBatchSyncOrigin(const GURL& origin) {
176 DCHECK(origin.is_valid()); 190 DCHECK(origin.is_valid());
177 return kDriveBatchSyncOriginKeyPrefix + origin.spec(); 191 return kDriveBatchSyncOriginKeyPrefix + origin.spec();
178 } 192 }
179 193
180 // Returns a key string for the given incremental sync origin. 194 // Returns a key string for the given incremental sync origin.
181 // For example, when |origin| is "http://www.example.com", 195 // For example, when |origin| is "http://www.example.com",
182 // returns "ISYNC_ORIGIN: http://www.example.com". 196 // returns "ISYNC_ORIGIN: http://www.example.com".
183 std::string CreateKeyForIncrementalSyncOrigin(const GURL& origin) { 197 std::string CreateKeyForIncrementalSyncOrigin(const GURL& origin) {
184 DCHECK(origin.is_valid()); 198 DCHECK(origin.is_valid());
185 return kDriveIncrementalSyncOriginKeyPrefix + origin.spec(); 199 return kDriveIncrementalSyncOriginKeyPrefix + origin.spec();
186 } 200 }
187 201
202 // Returns a key string for the given disabled origin.
203 // For example, when |origin| is "http://www.example.com",
204 // returns "DISABLED_ORIGIN: http://www.example.com".
205 std::string CreateKeyForDisabledOrigin(const GURL& origin) {
206 DCHECK(origin.is_valid());
207 return kDriveDisabledOriginKeyPrefix + origin.spec();
208 }
209
188 void AddOriginsToVector(std::vector<GURL>* all_origins, 210 void AddOriginsToVector(std::vector<GURL>* all_origins,
189 const DriveMetadataStore::ResourceIDMap& resource_map) { 211 const DriveMetadataStore::ResourceIDMap& resource_map) {
190 typedef DriveMetadataStore::ResourceIDMap::const_iterator itr; 212 typedef DriveMetadataStore::ResourceIDMap::const_iterator itr;
191 for (std::map<GURL, std::string>::const_iterator itr = resource_map.begin(); 213 for (std::map<GURL, std::string>::const_iterator itr = resource_map.begin();
192 itr != resource_map.end(); 214 itr != resource_map.end();
193 ++itr) { 215 ++itr) {
194 all_origins->push_back(itr->first); 216 all_origins->push_back(itr->first);
195 } 217 }
196 } 218 }
197 219
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 if (status != SYNC_STATUS_OK) { 255 if (status != SYNC_STATUS_OK) {
234 callback.Run(status, false); 256 callback.Run(status, false);
235 return; 257 return;
236 } 258 }
237 259
238 largest_changestamp_ = contents->largest_changestamp; 260 largest_changestamp_ = contents->largest_changestamp;
239 metadata_map_.swap(contents->metadata_map); 261 metadata_map_.swap(contents->metadata_map);
240 sync_root_directory_resource_id_ = contents->sync_root_directory_resource_id; 262 sync_root_directory_resource_id_ = contents->sync_root_directory_resource_id;
241 batch_sync_origins_.swap(contents->batch_sync_origins); 263 batch_sync_origins_.swap(contents->batch_sync_origins);
242 incremental_sync_origins_.swap(contents->incremental_sync_origins); 264 incremental_sync_origins_.swap(contents->incremental_sync_origins);
265 disabled_origins_.swap(contents->disabled_origins);
243 // |largest_changestamp_| is set to 0 for a fresh empty database. 266 // |largest_changestamp_| is set to 0 for a fresh empty database.
244 callback.Run(status, largest_changestamp_ <= 0); 267 callback.Run(status, largest_changestamp_ <= 0);
245 } 268 }
246 269
247 void DriveMetadataStore::RestoreSyncRootDirectory( 270 void DriveMetadataStore::RestoreSyncRootDirectory(
248 const SyncStatusCallback& callback) { 271 const SyncStatusCallback& callback) {
249 DCHECK(CalledOnValidThread()); 272 DCHECK(CalledOnValidThread());
250 std::string* sync_root_directory_resource_id = new std::string; 273 std::string* sync_root_directory_resource_id = new std::string;
251 base::PostTaskAndReplyWithResult( 274 base::PostTaskAndReplyWithResult(
252 file_task_runner_, FROM_HERE, 275 file_task_runner_, FROM_HERE,
(...skipping 15 matching lines...) Expand all
268 db_status_ = status; 291 db_status_ = status;
269 if (status != SYNC_STATUS_OK) { 292 if (status != SYNC_STATUS_OK) {
270 callback.Run(status); 293 callback.Run(status);
271 return; 294 return;
272 } 295 }
273 296
274 sync_root_directory_resource_id_.swap(*sync_root_directory_resource_id); 297 sync_root_directory_resource_id_.swap(*sync_root_directory_resource_id);
275 callback.Run(status); 298 callback.Run(status);
276 } 299 }
277 300
278 void DriveMetadataStore::RestoreSyncOrigins( 301 void DriveMetadataStore::RestoreOrigins(
279 const SyncStatusCallback& callback) { 302 const SyncStatusCallback& callback) {
280 DCHECK(CalledOnValidThread()); 303 DCHECK(CalledOnValidThread());
281 ResourceIDMap* batch_sync_origins = new ResourceIDMap; 304 ResourceIDMap* batch_sync_origins = new ResourceIDMap;
282 ResourceIDMap* incremental_sync_origins = new ResourceIDMap; 305 ResourceIDMap* incremental_sync_origins = new ResourceIDMap;
306 ResourceIDMap* disabled_origins = new ResourceIDMap;
283 base::PostTaskAndReplyWithResult( 307 base::PostTaskAndReplyWithResult(
284 file_task_runner_, FROM_HERE, 308 file_task_runner_, FROM_HERE,
285 base::Bind(&DriveMetadataDB::GetSyncOrigins, 309 base::Bind(&DriveMetadataDB::GetOrigins,
286 base::Unretained(db_.get()), 310 base::Unretained(db_.get()),
287 batch_sync_origins, 311 batch_sync_origins,
288 incremental_sync_origins), 312 incremental_sync_origins,
289 base::Bind(&DriveMetadataStore::DidRestoreSyncOrigins, 313 disabled_origins),
314 base::Bind(&DriveMetadataStore::DidRestoreOrigins,
290 AsWeakPtr(), callback, 315 AsWeakPtr(), callback,
291 base::Owned(batch_sync_origins), 316 base::Owned(batch_sync_origins),
292 base::Owned(incremental_sync_origins))); 317 base::Owned(incremental_sync_origins),
318 base::Owned(disabled_origins)));
293 } 319 }
294 320
295 void DriveMetadataStore::DidRestoreSyncOrigins( 321 void DriveMetadataStore::DidRestoreOrigins(
296 const SyncStatusCallback& callback, 322 const SyncStatusCallback& callback,
297 ResourceIDMap* batch_sync_origins, 323 ResourceIDMap* batch_sync_origins,
298 ResourceIDMap* incremental_sync_origins, 324 ResourceIDMap* incremental_sync_origins,
325 ResourceIDMap* disabled_origins,
299 SyncStatusCode status) { 326 SyncStatusCode status) {
300 DCHECK(CalledOnValidThread()); 327 DCHECK(CalledOnValidThread());
301 DCHECK(batch_sync_origins); 328 DCHECK(batch_sync_origins);
302 DCHECK(incremental_sync_origins); 329 DCHECK(incremental_sync_origins);
330 DCHECK(disabled_origins);
303 331
304 db_status_ = status; 332 db_status_ = status;
305 if (status != SYNC_STATUS_OK) { 333 if (status != SYNC_STATUS_OK) {
306 callback.Run(status); 334 callback.Run(status);
307 return; 335 return;
308 } 336 }
309 337
310 batch_sync_origins_.swap(*batch_sync_origins); 338 batch_sync_origins_.swap(*batch_sync_origins);
311 incremental_sync_origins_.swap(*incremental_sync_origins); 339 incremental_sync_origins_.swap(*incremental_sync_origins);
340 disabled_origins_.swap(*disabled_origins);
312 callback.Run(status); 341 callback.Run(status);
313 } 342 }
314 343
315 void DriveMetadataStore::SetLargestChangeStamp( 344 void DriveMetadataStore::SetLargestChangeStamp(
316 int64 largest_changestamp, 345 int64 largest_changestamp,
317 const SyncStatusCallback& callback) { 346 const SyncStatusCallback& callback) {
318 DCHECK(CalledOnValidThread()); 347 DCHECK(CalledOnValidThread());
319 DCHECK_EQ(SYNC_STATUS_OK, db_status_); 348 DCHECK_EQ(SYNC_STATUS_OK, db_status_);
320 largest_changestamp_ = largest_changestamp; 349 largest_changestamp_ = largest_changestamp;
321 base::PostTaskAndReplyWithResult( 350 base::PostTaskAndReplyWithResult(
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 bool DriveMetadataStore::IsBatchSyncOrigin(const GURL& origin) const { 442 bool DriveMetadataStore::IsBatchSyncOrigin(const GURL& origin) const {
414 DCHECK(CalledOnValidThread()); 443 DCHECK(CalledOnValidThread());
415 return ContainsKey(batch_sync_origins_, origin); 444 return ContainsKey(batch_sync_origins_, origin);
416 } 445 }
417 446
418 bool DriveMetadataStore::IsIncrementalSyncOrigin(const GURL& origin) const { 447 bool DriveMetadataStore::IsIncrementalSyncOrigin(const GURL& origin) const {
419 DCHECK(CalledOnValidThread()); 448 DCHECK(CalledOnValidThread());
420 return ContainsKey(incremental_sync_origins_, origin); 449 return ContainsKey(incremental_sync_origins_, origin);
421 } 450 }
422 451
452 bool DriveMetadataStore::IsOriginDisabled(const GURL& origin) const {
453 DCHECK(CalledOnValidThread());
454 return ContainsKey(disabled_origins_, origin);
455 }
456
423 void DriveMetadataStore::AddBatchSyncOrigin(const GURL& origin, 457 void DriveMetadataStore::AddBatchSyncOrigin(const GURL& origin,
424 const std::string& resource_id) { 458 const std::string& resource_id) {
425 DCHECK(CalledOnValidThread()); 459 DCHECK(CalledOnValidThread());
426 DCHECK(!IsBatchSyncOrigin(origin)); 460 DCHECK(!IsBatchSyncOrigin(origin));
427 DCHECK(!IsIncrementalSyncOrigin(origin)); 461 DCHECK(!IsIncrementalSyncOrigin(origin));
462 DCHECK(!IsOriginDisabled(origin));
428 DCHECK_EQ(SYNC_STATUS_OK, db_status_); 463 DCHECK_EQ(SYNC_STATUS_OK, db_status_);
429 464
430 batch_sync_origins_.insert(std::make_pair(origin, resource_id)); 465 batch_sync_origins_.insert(std::make_pair(origin, resource_id));
431 466
432 // Store a pair of |origin| and |resource_id| in the DB. 467 // Store a pair of |origin| and |resource_id| in the DB.
433 base::PostTaskAndReplyWithResult( 468 base::PostTaskAndReplyWithResult(
434 file_task_runner_, FROM_HERE, 469 file_task_runner_, FROM_HERE,
435 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsBatch, 470 base::Bind(&DriveMetadataDB::UpdateOriginAsBatchSync,
436 base::Unretained(db_.get()), origin, resource_id), 471 base::Unretained(db_.get()), origin, resource_id),
437 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); 472 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr()));
438 } 473 }
439 474
440 void DriveMetadataStore::MoveBatchSyncOriginToIncremental(const GURL& origin) { 475 void DriveMetadataStore::MoveBatchSyncOriginToIncremental(const GURL& origin) {
441 DCHECK(CalledOnValidThread()); 476 DCHECK(CalledOnValidThread());
442 DCHECK(IsBatchSyncOrigin(origin)); 477 DCHECK(IsBatchSyncOrigin(origin));
443 DCHECK(!IsIncrementalSyncOrigin(origin)); 478 DCHECK(!IsIncrementalSyncOrigin(origin));
479 DCHECK(!IsOriginDisabled(origin));
444 DCHECK_EQ(SYNC_STATUS_OK, db_status_); 480 DCHECK_EQ(SYNC_STATUS_OK, db_status_);
445 481
446 std::map<GURL, std::string>::iterator found = 482 std::map<GURL, std::string>::iterator found =
447 batch_sync_origins_.find(origin); 483 batch_sync_origins_.find(origin);
448 incremental_sync_origins_.insert(std::make_pair(origin, found->second)); 484 incremental_sync_origins_.insert(std::make_pair(origin, found->second));
449 485
450 // Store a pair of |origin| and |resource_id| in the DB. 486 // Store a pair of |origin| and |resource_id| in the DB.
451 base::PostTaskAndReplyWithResult( 487 base::PostTaskAndReplyWithResult(
452 file_task_runner_, FROM_HERE, 488 file_task_runner_, FROM_HERE,
453 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsIncremental, 489 base::Bind(&DriveMetadataDB::UpdateOriginAsIncrementalSync,
454 base::Unretained(db_.get()), origin, found->second), 490 base::Unretained(db_.get()), origin, found->second),
455 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); 491 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr()));
456 492
457 batch_sync_origins_.erase(found); 493 batch_sync_origins_.erase(found);
458 } 494 }
459 495
496 void DriveMetadataStore::EnableOrigin(
497 const GURL& origin,
498 const SyncStatusCallback& callback) {
499 DCHECK(CalledOnValidThread());
500
501 std::map<GURL, std::string>::iterator found = disabled_origins_.find(origin);
502 if (found == disabled_origins_.end()) {
503 // |origin| has not been registered yet.
504 return;
505 }
506 std::string resource_id = found->second;
507 disabled_origins_.erase(found);
508
509 // Ensure |origin| is marked as a batch sync origin.
510 batch_sync_origins_.insert(std::make_pair(origin, resource_id));
511 found = incremental_sync_origins_.find(origin);
512 if (found != incremental_sync_origins_.end())
513 incremental_sync_origins_.erase(found);
514
515 // Store a pair of |origin| and |resource_id| in the DB.
516 base::PostTaskAndReplyWithResult(
517 file_task_runner_, FROM_HERE,
518 base::Bind(&DriveMetadataDB::EnableOrigin,
519 base::Unretained(db_.get()), origin, resource_id),
520 base::Bind(&DriveMetadataStore::DidUpdateOrigin, AsWeakPtr(), callback));
521 }
522
523 void DriveMetadataStore::DisableOrigin(
524 const GURL& origin,
525 const SyncStatusCallback& callback) {
526 DCHECK(CalledOnValidThread());
527
528 std::string resource_id;
529 std::map<GURL, std::string>::iterator found =
530 batch_sync_origins_.find(origin);
531 if (found != batch_sync_origins_.end()) {
532 resource_id = found->second;
533 batch_sync_origins_.erase(found);
534 }
535
536 found = incremental_sync_origins_.find(origin);
537 if (found != incremental_sync_origins_.end()) {
538 resource_id = found->second;
539 incremental_sync_origins_.erase(found);
540 }
541
542 if (resource_id.empty()) {
543 // |origin| has not been registered yet.
544 return;
545 }
546
547 disabled_origins_.insert(std::make_pair(origin, resource_id));
548
549 // Store a pair of |origin| and |resource_id| in the DB.
550 base::PostTaskAndReplyWithResult(
551 file_task_runner_, FROM_HERE,
552 base::Bind(&DriveMetadataDB::DisableOrigin,
553 base::Unretained(db_.get()), origin, resource_id),
554 base::Bind(&DriveMetadataStore::DidUpdateOrigin, AsWeakPtr(), callback));
555 }
556
460 void DriveMetadataStore::RemoveOrigin( 557 void DriveMetadataStore::RemoveOrigin(
461 const GURL& origin, 558 const GURL& origin,
462 const SyncStatusCallback& callback) { 559 const SyncStatusCallback& callback) {
463 DCHECK(CalledOnValidThread()); 560 DCHECK(CalledOnValidThread());
464 561
465 metadata_map_.erase(origin); 562 metadata_map_.erase(origin);
466 batch_sync_origins_.erase(origin); 563 batch_sync_origins_.erase(origin);
467 incremental_sync_origins_.erase(origin); 564 incremental_sync_origins_.erase(origin);
565 disabled_origins_.erase(origin);
468 566
469 base::PostTaskAndReplyWithResult( 567 base::PostTaskAndReplyWithResult(
470 file_task_runner_, FROM_HERE, 568 file_task_runner_, FROM_HERE,
471 base::Bind(&DriveMetadataDB::RemoveOrigin, 569 base::Bind(&DriveMetadataDB::RemoveOrigin,
472 base::Unretained(db_.get()), origin), 570 base::Unretained(db_.get()), origin),
473 base::Bind(&DriveMetadataStore::DidRemoveOrigin, AsWeakPtr(), callback)); 571 base::Bind(&DriveMetadataStore::DidUpdateOrigin, AsWeakPtr(), callback));
474 } 572 }
475 573
476 void DriveMetadataStore::DidRemoveOrigin( 574 void DriveMetadataStore::DidUpdateOrigin(
477 const SyncStatusCallback& callback, 575 const SyncStatusCallback& callback,
478 SyncStatusCode status) { 576 SyncStatusCode status) {
479 UpdateDBStatus(status); 577 UpdateDBStatus(status);
480 callback.Run(status); 578 callback.Run(status);
481 } 579 }
482 580
483 void DriveMetadataStore::UpdateDBStatus(SyncStatusCode status) { 581 void DriveMetadataStore::UpdateDBStatus(SyncStatusCode status) {
484 DCHECK(CalledOnValidThread()); 582 DCHECK(CalledOnValidThread());
485 if (db_status_ != SYNC_STATUS_OK && 583 if (db_status_ != SYNC_STATUS_OK &&
486 db_status_ != SYNC_DATABASE_ERROR_NOT_FOUND) { 584 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())); 636 list->push_back(std::make_pair(url, itr->second.resource_id()));
539 } 637 }
540 } 638 }
541 } 639 }
542 return SYNC_STATUS_OK; 640 return SYNC_STATUS_OK;
543 } 641 }
544 642
545 std::string DriveMetadataStore::GetResourceIdForOrigin( 643 std::string DriveMetadataStore::GetResourceIdForOrigin(
546 const GURL& origin) const { 644 const GURL& origin) const {
547 DCHECK(CalledOnValidThread()); 645 DCHECK(CalledOnValidThread());
548 DCHECK(IsBatchSyncOrigin(origin) || IsIncrementalSyncOrigin(origin)); 646 DCHECK(IsBatchSyncOrigin(origin) ||
647 IsIncrementalSyncOrigin(origin) ||
648 IsOriginDisabled(origin));
549 649
550 ResourceIDMap::const_iterator found = incremental_sync_origins_.find(origin); 650 ResourceIDMap::const_iterator found = incremental_sync_origins_.find(origin);
551 if (found != incremental_sync_origins_.end()) 651 if (found != incremental_sync_origins_.end())
552 return found->second; 652 return found->second;
553 653
554 found = batch_sync_origins_.find(origin); 654 found = batch_sync_origins_.find(origin);
555 if (found != batch_sync_origins_.end()) 655 if (found != batch_sync_origins_.end())
556 return found->second; 656 return found->second;
557 657
658 found = disabled_origins_.find(origin);
659 if (found != disabled_origins_.end())
660 return found->second;
661
558 NOTREACHED(); 662 NOTREACHED();
559 return std::string(); 663 return std::string();
560 } 664 }
561 665
562 void DriveMetadataStore::GetAllOrigins(std::vector<GURL>* origins) { 666 void DriveMetadataStore::GetEnabledOrigins(std::vector<GURL>* origins) {
667 origins->clear();
563 origins->reserve(batch_sync_origins_.size() + 668 origins->reserve(batch_sync_origins_.size() +
564 incremental_sync_origins_.size()); 669 incremental_sync_origins_.size());
565 AddOriginsToVector(origins, batch_sync_origins_); 670 AddOriginsToVector(origins, batch_sync_origins_);
566 AddOriginsToVector(origins, incremental_sync_origins_); 671 AddOriginsToVector(origins, incremental_sync_origins_);
567 } 672 }
568 673
674 void DriveMetadataStore::GetDisabledOrigins(std::vector<GURL>* origins) {
675 origins->clear();
676 origins->reserve(disabled_origins_.size());
677 AddOriginsToVector(origins, disabled_origins_);
678 }
679
569 //////////////////////////////////////////////////////////////////////////////// 680 ////////////////////////////////////////////////////////////////////////////////
570 681
571 DriveMetadataDB::DriveMetadataDB(const base::FilePath& base_dir, 682 DriveMetadataDB::DriveMetadataDB(const base::FilePath& base_dir,
572 base::SequencedTaskRunner* task_runner) 683 base::SequencedTaskRunner* task_runner)
573 : task_runner_(task_runner), 684 : task_runner_(task_runner),
574 db_path_(fileapi::FilePathToString( 685 db_path_(fileapi::FilePathToString(
575 base_dir.Append(DriveMetadataStore::kDatabaseName))) { 686 base_dir.Append(DriveMetadataStore::kDatabaseName))) {
576 } 687 }
577 688
578 DriveMetadataDB::~DriveMetadataDB() { 689 DriveMetadataDB::~DriveMetadataDB() {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 DriveMetadata metadata; 749 DriveMetadata metadata;
639 bool success = metadata.ParseFromString(itr->value().ToString()); 750 bool success = metadata.ParseFromString(itr->value().ToString());
640 DCHECK(success); 751 DCHECK(success);
641 752
642 success = contents->metadata_map[origin].insert( 753 success = contents->metadata_map[origin].insert(
643 std::make_pair(path, metadata)).second; 754 std::make_pair(path, metadata)).second;
644 DCHECK(success); 755 DCHECK(success);
645 } 756 }
646 } 757 }
647 758
648 SyncStatusCode status = GetSyncOrigins(&contents->batch_sync_origins, 759 SyncStatusCode status = GetOrigins(&contents->batch_sync_origins,
649 &contents->incremental_sync_origins); 760 &contents->incremental_sync_origins,
761 &contents->disabled_origins);
650 if (status != SYNC_STATUS_OK && 762 if (status != SYNC_STATUS_OK &&
651 status != SYNC_DATABASE_ERROR_NOT_FOUND) 763 status != SYNC_DATABASE_ERROR_NOT_FOUND)
652 return status; 764 return status;
653 765
654 status = GetSyncRootDirectory(&contents->sync_root_directory_resource_id); 766 status = GetSyncRootDirectory(&contents->sync_root_directory_resource_id);
655 if (status != SYNC_STATUS_OK && 767 if (status != SYNC_STATUS_OK &&
656 status != SYNC_DATABASE_ERROR_NOT_FOUND) 768 status != SYNC_DATABASE_ERROR_NOT_FOUND)
657 return status; 769 return status;
658 770
659 return SYNC_STATUS_OK; 771 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> 823 // value: <Resource ID of the sync root directory>
712 // 824 //
713 // * key: "METADATA: " + <Origin and URL> (changed) 825 // * key: "METADATA: " + <Origin and URL> (changed)
714 // * value: <Serialized DriveMetadata> 826 // * value: <Serialized DriveMetadata>
715 // 827 //
716 // key: "BSYNC_ORIGIN: " + <URL string of a batch sync origin> 828 // key: "BSYNC_ORIGIN: " + <URL string of a batch sync origin>
717 // value: <Resource ID of the drive directory for the origin> 829 // value: <Resource ID of the drive directory for the origin>
718 // 830 //
719 // key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin> 831 // key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin>
720 // value: <Resource ID of the drive directory for the origin> 832 // value: <Resource ID of the drive directory for the origin>
833 //
834 // key: "DISABLED_ORIGIN: " + <URL string of a disabled origin>
835 // value: <Resource ID of the drive directory for the origin>
721 836
722 leveldb::WriteBatch write_batch; 837 leveldb::WriteBatch write_batch;
723 write_batch.Put(kDatabaseVersionKey, 838 write_batch.Put(kDatabaseVersionKey,
724 base::Int64ToString(kCurrentDatabaseVersion)); 839 base::Int64ToString(kCurrentDatabaseVersion));
725 840
726 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); 841 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
727 for (itr->Seek(kDriveMetadataKeyPrefix); itr->Valid(); itr->Next()) { 842 for (itr->Seek(kDriveMetadataKeyPrefix); itr->Valid(); itr->Next()) {
728 std::string key = itr->key().ToString(); 843 std::string key = itr->key().ToString();
729 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) 844 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true))
730 break; 845 break;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 SyncStatusCode DriveMetadataDB::DeleteEntry(const FileSystemURL& url) { 909 SyncStatusCode DriveMetadataDB::DeleteEntry(const FileSystemURL& url) {
795 DCHECK(CalledOnValidThread()); 910 DCHECK(CalledOnValidThread());
796 DCHECK(db_.get()); 911 DCHECK(db_.get());
797 912
798 std::string metadata_key = FileSystemURLToMetadataKey(url); 913 std::string metadata_key = FileSystemURLToMetadataKey(url);
799 leveldb::Status status = db_->Delete( 914 leveldb::Status status = db_->Delete(
800 leveldb::WriteOptions(), metadata_key); 915 leveldb::WriteOptions(), metadata_key);
801 return LevelDBStatusToSyncStatusCode(status); 916 return LevelDBStatusToSyncStatusCode(status);
802 } 917 }
803 918
804 SyncStatusCode DriveMetadataDB::UpdateSyncOriginAsBatch( 919 SyncStatusCode DriveMetadataDB::UpdateOriginAsBatchSync(
805 const GURL& origin, const std::string& resource_id) { 920 const GURL& origin, const std::string& resource_id) {
806 DCHECK(CalledOnValidThread()); 921 DCHECK(CalledOnValidThread());
807 DCHECK(db_.get()); 922 DCHECK(db_.get());
808 923
809 leveldb::Status status = db_->Put( 924 leveldb::Status status = db_->Put(
810 leveldb::WriteOptions(), 925 leveldb::WriteOptions(),
811 CreateKeyForBatchSyncOrigin(origin), 926 CreateKeyForBatchSyncOrigin(origin),
812 resource_id); 927 resource_id);
813 return LevelDBStatusToSyncStatusCode(status); 928 return LevelDBStatusToSyncStatusCode(status);
814 } 929 }
815 930
816 SyncStatusCode DriveMetadataDB::UpdateSyncOriginAsIncremental( 931 SyncStatusCode DriveMetadataDB::UpdateOriginAsIncrementalSync(
817 const GURL& origin, const std::string& resource_id) { 932 const GURL& origin, const std::string& resource_id) {
818 DCHECK(CalledOnValidThread()); 933 DCHECK(CalledOnValidThread());
819 DCHECK(db_.get()); 934 DCHECK(db_.get());
820 935
821 leveldb::WriteBatch batch; 936 leveldb::WriteBatch batch;
822 batch.Delete(CreateKeyForBatchSyncOrigin(origin)); 937 batch.Delete(CreateKeyForBatchSyncOrigin(origin));
938 batch.Delete(CreateKeyForDisabledOrigin(origin));
823 batch.Put(CreateKeyForIncrementalSyncOrigin(origin), resource_id); 939 batch.Put(CreateKeyForIncrementalSyncOrigin(origin), resource_id);
824 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); 940 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
825 941
826 return LevelDBStatusToSyncStatusCode(status); 942 return LevelDBStatusToSyncStatusCode(status);
827 } 943 }
828 944
945 SyncStatusCode DriveMetadataDB::EnableOrigin(
946 const GURL& origin, const std::string& resource_id) {
947 DCHECK(CalledOnValidThread());
948 DCHECK(db_.get());
949
950 leveldb::WriteBatch batch;
951 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin));
952 batch.Delete(CreateKeyForDisabledOrigin(origin));
953 batch.Put(CreateKeyForBatchSyncOrigin(origin), resource_id);
954 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
955
956 return LevelDBStatusToSyncStatusCode(status);
957 }
958
959 SyncStatusCode DriveMetadataDB::DisableOrigin(
960 const GURL& origin_to_disable, const std::string& resource_id) {
961 DCHECK(CalledOnValidThread());
962 DCHECK(db_.get());
963
964 leveldb::WriteBatch batch;
965 batch.Delete(CreateKeyForBatchSyncOrigin(origin_to_disable));
966 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin_to_disable));
967 batch.Put(CreateKeyForDisabledOrigin(origin_to_disable), resource_id);
968
969 // Remove entries specified by |origin_to_disable|.
970 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
971 std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_disable.spec();
972 for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) {
973 std::string key = itr->key().ToString();
974 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true))
975 break;
976 GURL origin;
977 base::FilePath path;
978 MetadataKeyToOriginAndPath(key, &origin, &path);
979 if (origin != origin_to_disable)
980 break;
981 batch.Delete(key);
982 }
983 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
984
985 return LevelDBStatusToSyncStatusCode(status);
986 }
987
829 SyncStatusCode DriveMetadataDB::RemoveOrigin(const GURL& origin_to_remove) { 988 SyncStatusCode DriveMetadataDB::RemoveOrigin(const GURL& origin_to_remove) {
830 DCHECK(CalledOnValidThread()); 989 DCHECK(CalledOnValidThread());
831 990
832 leveldb::WriteBatch batch; 991 leveldb::WriteBatch batch;
833 batch.Delete(kDriveBatchSyncOriginKeyPrefix + origin_to_remove.spec()); 992 batch.Delete(CreateKeyForBatchSyncOrigin(origin_to_remove));
834 batch.Delete(kDriveIncrementalSyncOriginKeyPrefix + origin_to_remove.spec()); 993 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin_to_remove));
994 batch.Delete(CreateKeyForDisabledOrigin(origin_to_remove));
835 995
836 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); 996 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
837 std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_remove.spec(); 997 std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_remove.spec();
838 for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) { 998 for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) {
839 std::string key = itr->key().ToString(); 999 std::string key = itr->key().ToString();
840 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) 1000 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true))
841 break; 1001 break;
842 GURL origin; 1002 GURL origin;
843 base::FilePath path; 1003 base::FilePath path;
844 MetadataKeyToOriginAndPath(key, &origin, &path); 1004 MetadataKeyToOriginAndPath(key, &origin, &path);
845 if (origin != origin_to_remove) 1005 if (origin != origin_to_remove)
846 break; 1006 break;
847 batch.Delete(key); 1007 batch.Delete(key);
848 } 1008 }
849 1009
850 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); 1010 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
851 return LevelDBStatusToSyncStatusCode(status); 1011 return LevelDBStatusToSyncStatusCode(status);
852 } 1012 }
853 1013
854 SyncStatusCode DriveMetadataDB::GetSyncOrigins( 1014 SyncStatusCode DriveMetadataDB::GetOrigins(
855 ResourceIDMap* batch_sync_origins, 1015 ResourceIDMap* batch_sync_origins,
856 ResourceIDMap* incremental_sync_origins) { 1016 ResourceIDMap* incremental_sync_origins,
1017 ResourceIDMap* disabled_origins) {
857 DCHECK(CalledOnValidThread()); 1018 DCHECK(CalledOnValidThread());
858 DCHECK(db_.get()); 1019 DCHECK(db_.get());
859 1020
860 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); 1021 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
861 1022
862 // Get batch sync origins from the DB. 1023 // Get batch sync origins from the DB.
863 for (itr->Seek(kDriveBatchSyncOriginKeyPrefix); 1024 for (itr->Seek(kDriveBatchSyncOriginKeyPrefix);
864 itr->Valid(); itr->Next()) { 1025 itr->Valid(); itr->Next()) {
865 std::string key = itr->key().ToString(); 1026 std::string key = itr->key().ToString();
866 if (!StartsWithASCII(key, kDriveBatchSyncOriginKeyPrefix, true)) 1027 if (!StartsWithASCII(key, kDriveBatchSyncOriginKeyPrefix, true))
(...skipping 15 matching lines...) Expand all
882 break; 1043 break;
883 GURL origin(std::string( 1044 GURL origin(std::string(
884 key.begin() + arraysize(kDriveIncrementalSyncOriginKeyPrefix) - 1, 1045 key.begin() + arraysize(kDriveIncrementalSyncOriginKeyPrefix) - 1,
885 key.end())); 1046 key.end()));
886 DCHECK(origin.is_valid()); 1047 DCHECK(origin.is_valid());
887 bool result = incremental_sync_origins->insert( 1048 bool result = incremental_sync_origins->insert(
888 std::make_pair(origin, itr->value().ToString())).second; 1049 std::make_pair(origin, itr->value().ToString())).second;
889 DCHECK(result); 1050 DCHECK(result);
890 } 1051 }
891 1052
1053 // Get disabled origins from the DB.
1054 for (itr->Seek(kDriveDisabledOriginKeyPrefix);
1055 itr->Valid(); itr->Next()) {
1056 std::string key = itr->key().ToString();
1057 if (!StartsWithASCII(key, kDriveDisabledOriginKeyPrefix, true))
1058 break;
1059 GURL origin(std::string(
1060 key.begin() + arraysize(kDriveDisabledOriginKeyPrefix) - 1,
1061 key.end()));
1062 DCHECK(origin.is_valid());
1063 bool result = disabled_origins->insert(
1064 std::make_pair(origin, itr->value().ToString())).second;
1065 DCHECK(result);
1066 }
1067
892 return SYNC_STATUS_OK; 1068 return SYNC_STATUS_OK;
893 } 1069 }
894 1070
895 } // namespace sync_file_system 1071 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698