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

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: rebase 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 29 matching lines...) Expand all
40 40
41 const char* const kServiceName = DriveFileSyncService::kServiceName; 41 const char* const kServiceName = DriveFileSyncService::kServiceName;
42 const char kDatabaseVersionKey[] = "VERSION"; 42 const char kDatabaseVersionKey[] = "VERSION";
43 const int64 kCurrentDatabaseVersion = 1; 43 const int64 kCurrentDatabaseVersion = 1;
44 const char kChangeStampKey[] = "CHANGE_STAMP"; 44 const char kChangeStampKey[] = "CHANGE_STAMP";
45 const char kSyncRootDirectoryKey[] = "SYNC_ROOT_DIR"; 45 const char kSyncRootDirectoryKey[] = "SYNC_ROOT_DIR";
46 const char kDriveMetadataKeyPrefix[] = "METADATA: "; 46 const char kDriveMetadataKeyPrefix[] = "METADATA: ";
47 const char kMetadataKeySeparator = ' '; 47 const char kMetadataKeySeparator = ' ';
48 const char kDriveBatchSyncOriginKeyPrefix[] = "BSYNC_ORIGIN: "; 48 const char kDriveBatchSyncOriginKeyPrefix[] = "BSYNC_ORIGIN: ";
49 const char kDriveIncrementalSyncOriginKeyPrefix[] = "ISYNC_ORIGIN: "; 49 const char kDriveIncrementalSyncOriginKeyPrefix[] = "ISYNC_ORIGIN: ";
50 const char kDriveDisabledOriginKeyPrefix[] = "DISABLED_ORIGIN: ";
50 const size_t kDriveMetadataKeyPrefixLength = arraysize(kDriveMetadataKeyPrefix); 51 const size_t kDriveMetadataKeyPrefixLength = arraysize(kDriveMetadataKeyPrefix);
51 52
52 const base::FilePath::CharType kV0FormatPathPrefix[] = 53 const base::FilePath::CharType kV0FormatPathPrefix[] =
53 FILE_PATH_LITERAL("drive/"); 54 FILE_PATH_LITERAL("drive/");
54 55
55 bool ParseV0FormatFileSystemURLString(const GURL& url, 56 bool ParseV0FormatFileSystemURLString(const GURL& url,
56 GURL* origin, 57 GURL* origin,
57 base::FilePath* path) { 58 base::FilePath* path) {
58 fileapi::FileSystemType mount_type; 59 fileapi::FileSystemType mount_type;
59 base::FilePath virtual_path; 60 base::FilePath virtual_path;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 SyncStatusCode MigrateDatabaseIfNeeded(); 107 SyncStatusCode MigrateDatabaseIfNeeded();
107 SyncStatusCode MigrateFromVersion0Database(); 108 SyncStatusCode MigrateFromVersion0Database();
108 109
109 SyncStatusCode SetLargestChangestamp(int64 largest_changestamp); 110 SyncStatusCode SetLargestChangestamp(int64 largest_changestamp);
110 SyncStatusCode SetSyncRootDirectory(const std::string& resource_id); 111 SyncStatusCode SetSyncRootDirectory(const std::string& resource_id);
111 SyncStatusCode GetSyncRootDirectory(std::string* resource_id); 112 SyncStatusCode GetSyncRootDirectory(std::string* resource_id);
112 SyncStatusCode UpdateEntry(const FileSystemURL& url, 113 SyncStatusCode UpdateEntry(const FileSystemURL& url,
113 const DriveMetadata& metadata); 114 const DriveMetadata& metadata);
114 SyncStatusCode DeleteEntry(const FileSystemURL& url); 115 SyncStatusCode DeleteEntry(const FileSystemURL& url);
115 116
116 SyncStatusCode UpdateSyncOriginAsBatch(const GURL& origin, 117 // TODO(calvinlo): consolidate these state transition functions for sync
118 // origins like "UpdateOrigin(GURL, SyncStatusEnum)". And manage origins in
119 // just one map like "Map<SyncStatusEnum, ResourceIDMap>".
120 // http://crbug.com/211600
121 SyncStatusCode UpdateOriginAsBatchSync(const GURL& origin,
117 const std::string& resource_id); 122 const std::string& resource_id);
118 SyncStatusCode UpdateSyncOriginAsIncremental(const GURL& origin, 123 SyncStatusCode UpdateOriginAsIncrementalSync(const GURL& origin,
119 const std::string& resource_id); 124 const std::string& resource_id);
125 SyncStatusCode EnableOrigin(const GURL& origin,
126 const std::string& resource_id);
127 SyncStatusCode DisableOrigin(const GURL& origin,
128 const std::string& resource_id);
120 SyncStatusCode RemoveOrigin(const GURL& origin); 129 SyncStatusCode RemoveOrigin(const GURL& origin);
121 130
122 SyncStatusCode GetSyncOrigins(ResourceIdByOrigin* batch_sync_origins, 131 SyncStatusCode GetOrigins(ResourceIdByOrigin* batch_sync_origins,
123 ResourceIdByOrigin* incremental_sync_origins); 132 ResourceIdByOrigin* incremental_sync_origins,
133 ResourceIdByOrigin* disabled_origins);
124 134
125 private: 135 private:
126 bool CalledOnValidThread() const { 136 bool CalledOnValidThread() const {
127 return task_runner_->RunsTasksOnCurrentThread(); 137 return task_runner_->RunsTasksOnCurrentThread();
128 } 138 }
129 139
130 scoped_refptr<base::SequencedTaskRunner> task_runner_; 140 scoped_refptr<base::SequencedTaskRunner> task_runner_;
131 141
132 std::string db_path_; 142 std::string db_path_;
133 scoped_ptr<leveldb::DB> db_; 143 scoped_ptr<leveldb::DB> db_;
134 144
135 DISALLOW_COPY_AND_ASSIGN(DriveMetadataDB); 145 DISALLOW_COPY_AND_ASSIGN(DriveMetadataDB);
136 }; 146 };
137 147
138 struct DriveMetadataDBContents { 148 struct DriveMetadataDBContents {
139 int64 largest_changestamp; 149 int64 largest_changestamp;
140 DriveMetadataStore::MetadataMap metadata_map; 150 DriveMetadataStore::MetadataMap metadata_map;
141 std::string sync_root_directory_resource_id; 151 std::string sync_root_directory_resource_id;
142 ResourceIdByOrigin batch_sync_origins; 152 ResourceIdByOrigin batch_sync_origins;
143 ResourceIdByOrigin incremental_sync_origins; 153 ResourceIdByOrigin incremental_sync_origins;
154 ResourceIdByOrigin disabled_origins;
144 }; 155 };
145 156
146 namespace { 157 namespace {
147 158
148 SyncStatusCode InitializeDBOnFileThread(DriveMetadataDB* db, 159 SyncStatusCode InitializeDBOnFileThread(DriveMetadataDB* db,
149 DriveMetadataDBContents* contents) { 160 DriveMetadataDBContents* contents) {
150 DCHECK(db); 161 DCHECK(db);
151 DCHECK(contents); 162 DCHECK(contents);
152 163
153 contents->largest_changestamp = 0; 164 contents->largest_changestamp = 0;
154 contents->metadata_map.clear(); 165 contents->metadata_map.clear();
155 contents->batch_sync_origins.clear(); 166 contents->batch_sync_origins.clear();
156 contents->incremental_sync_origins.clear(); 167 contents->incremental_sync_origins.clear();
168 contents->disabled_origins.clear();
157 169
158 bool created = false; 170 bool created = false;
159 SyncStatusCode status = db->Initialize(&created); 171 SyncStatusCode status = db->Initialize(&created);
160 if (status != SYNC_STATUS_OK) 172 if (status != SYNC_STATUS_OK)
161 return status; 173 return status;
162 174
163 if (!created) { 175 if (!created) {
164 status = db->MigrateDatabaseIfNeeded(); 176 status = db->MigrateDatabaseIfNeeded();
165 if (status != SYNC_STATUS_OK) { 177 if (status != SYNC_STATUS_OK) {
166 LOG(WARNING) << "Failed to migrate DriveMetadataStore to latest version."; 178 LOG(WARNING) << "Failed to migrate DriveMetadataStore to latest version.";
167 return status; 179 return status;
168 } 180 }
169 } 181 }
170 182
171 return db->ReadContents(contents); 183 return db->ReadContents(contents);
172 } 184 }
173 185
174 // Returns a key string for the given batch sync origin. 186 // Returns a key string for the given batch sync origin.
175 // For example, when |origin| is "http://www.example.com", 187 // For example, when |origin| is "http://www.example.com",
176 // returns "BSYNC_ORIGIN: http://www.example.com". 188 // returns "BSYNC_ORIGIN: http://www.example.com".
189 // TODO(calvinlo): consolidate these CreateKeyFor* functions.
190 // http://crbug.com/211600
177 std::string CreateKeyForBatchSyncOrigin(const GURL& origin) { 191 std::string CreateKeyForBatchSyncOrigin(const GURL& origin) {
178 DCHECK(origin.is_valid()); 192 DCHECK(origin.is_valid());
179 return kDriveBatchSyncOriginKeyPrefix + origin.spec(); 193 return kDriveBatchSyncOriginKeyPrefix + origin.spec();
180 } 194 }
181 195
182 // Returns a key string for the given incremental sync origin. 196 // Returns a key string for the given incremental sync origin.
183 // For example, when |origin| is "http://www.example.com", 197 // For example, when |origin| is "http://www.example.com",
184 // returns "ISYNC_ORIGIN: http://www.example.com". 198 // returns "ISYNC_ORIGIN: http://www.example.com".
185 std::string CreateKeyForIncrementalSyncOrigin(const GURL& origin) { 199 std::string CreateKeyForIncrementalSyncOrigin(const GURL& origin) {
186 DCHECK(origin.is_valid()); 200 DCHECK(origin.is_valid());
187 return kDriveIncrementalSyncOriginKeyPrefix + origin.spec(); 201 return kDriveIncrementalSyncOriginKeyPrefix + origin.spec();
188 } 202 }
189 203
204 // Returns a key string for the given disabled origin.
205 // For example, when |origin| is "http://www.example.com",
206 // returns "DISABLED_ORIGIN: http://www.example.com".
207 std::string CreateKeyForDisabledOrigin(const GURL& origin) {
208 DCHECK(origin.is_valid());
209 return kDriveDisabledOriginKeyPrefix + origin.spec();
210 }
211
190 void AddOriginsToVector(std::vector<GURL>* all_origins, 212 void AddOriginsToVector(std::vector<GURL>* all_origins,
191 const ResourceIdByOrigin& resource_map) { 213 const ResourceIdByOrigin& resource_map) {
192 for (ResourceIdByOrigin::const_iterator itr = resource_map.begin(); 214 for (ResourceIdByOrigin::const_iterator itr = resource_map.begin();
193 itr != resource_map.end(); 215 itr != resource_map.end();
194 ++itr) { 216 ++itr) {
195 all_origins->push_back(itr->first); 217 all_origins->push_back(itr->first);
196 } 218 }
197 } 219 }
198 220
199 void InsertReverseMap(const ResourceIdByOrigin& forward_map, 221 void InsertReverseMap(const ResourceIdByOrigin& forward_map,
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 if (status != SYNC_STATUS_OK) { 274 if (status != SYNC_STATUS_OK) {
253 callback.Run(status, false); 275 callback.Run(status, false);
254 return; 276 return;
255 } 277 }
256 278
257 largest_changestamp_ = contents->largest_changestamp; 279 largest_changestamp_ = contents->largest_changestamp;
258 metadata_map_.swap(contents->metadata_map); 280 metadata_map_.swap(contents->metadata_map);
259 sync_root_directory_resource_id_ = contents->sync_root_directory_resource_id; 281 sync_root_directory_resource_id_ = contents->sync_root_directory_resource_id;
260 batch_sync_origins_.swap(contents->batch_sync_origins); 282 batch_sync_origins_.swap(contents->batch_sync_origins);
261 incremental_sync_origins_.swap(contents->incremental_sync_origins); 283 incremental_sync_origins_.swap(contents->incremental_sync_origins);
284 disabled_origins_.swap(contents->disabled_origins);
262 // |largest_changestamp_| is set to 0 for a fresh empty database. 285 // |largest_changestamp_| is set to 0 for a fresh empty database.
263 286
264 origin_by_resource_id_.clear(); 287 origin_by_resource_id_.clear();
265 InsertReverseMap(batch_sync_origins_, &origin_by_resource_id_); 288 InsertReverseMap(batch_sync_origins_, &origin_by_resource_id_);
266 InsertReverseMap(incremental_sync_origins_, &origin_by_resource_id_); 289 InsertReverseMap(incremental_sync_origins_, &origin_by_resource_id_);
290 InsertReverseMap(disabled_origins_, &origin_by_resource_id_);
267 291
268 callback.Run(status, largest_changestamp_ <= 0); 292 callback.Run(status, largest_changestamp_ <= 0);
269 } 293 }
270 294
271 void DriveMetadataStore::RestoreSyncRootDirectory( 295 void DriveMetadataStore::RestoreSyncRootDirectory(
272 const SyncStatusCallback& callback) { 296 const SyncStatusCallback& callback) {
273 DCHECK(CalledOnValidThread()); 297 DCHECK(CalledOnValidThread());
274 std::string* sync_root_directory_resource_id = new std::string; 298 std::string* sync_root_directory_resource_id = new std::string;
275 base::PostTaskAndReplyWithResult( 299 base::PostTaskAndReplyWithResult(
276 file_task_runner_, FROM_HERE, 300 file_task_runner_, FROM_HERE,
(...skipping 15 matching lines...) Expand all
292 db_status_ = status; 316 db_status_ = status;
293 if (status != SYNC_STATUS_OK) { 317 if (status != SYNC_STATUS_OK) {
294 callback.Run(status); 318 callback.Run(status);
295 return; 319 return;
296 } 320 }
297 321
298 sync_root_directory_resource_id_.swap(*sync_root_directory_resource_id); 322 sync_root_directory_resource_id_.swap(*sync_root_directory_resource_id);
299 callback.Run(status); 323 callback.Run(status);
300 } 324 }
301 325
302 void DriveMetadataStore::RestoreSyncOrigins( 326 void DriveMetadataStore::RestoreOrigins(
303 const SyncStatusCallback& callback) { 327 const SyncStatusCallback& callback) {
304 DCHECK(CalledOnValidThread()); 328 DCHECK(CalledOnValidThread());
305 ResourceIdByOrigin* batch_sync_origins = new ResourceIdByOrigin; 329 ResourceIdByOrigin* batch_sync_origins = new ResourceIdByOrigin;
306 ResourceIdByOrigin* incremental_sync_origins = new ResourceIdByOrigin; 330 ResourceIdByOrigin* incremental_sync_origins = new ResourceIdByOrigin;
331 ResourceIdByOrigin* disabled_origins = new ResourceIdByOrigin;
307 base::PostTaskAndReplyWithResult( 332 base::PostTaskAndReplyWithResult(
308 file_task_runner_, FROM_HERE, 333 file_task_runner_, FROM_HERE,
309 base::Bind(&DriveMetadataDB::GetSyncOrigins, 334 base::Bind(&DriveMetadataDB::GetOrigins,
310 base::Unretained(db_.get()), 335 base::Unretained(db_.get()),
311 batch_sync_origins, 336 batch_sync_origins,
312 incremental_sync_origins), 337 incremental_sync_origins,
313 base::Bind(&DriveMetadataStore::DidRestoreSyncOrigins, 338 disabled_origins),
339 base::Bind(&DriveMetadataStore::DidRestoreOrigins,
314 AsWeakPtr(), callback, 340 AsWeakPtr(), callback,
315 base::Owned(batch_sync_origins), 341 base::Owned(batch_sync_origins),
316 base::Owned(incremental_sync_origins))); 342 base::Owned(incremental_sync_origins),
343 base::Owned(disabled_origins)));
317 } 344 }
318 345
319 void DriveMetadataStore::DidRestoreSyncOrigins( 346 void DriveMetadataStore::DidRestoreOrigins(
320 const SyncStatusCallback& callback, 347 const SyncStatusCallback& callback,
321 ResourceIdByOrigin* batch_sync_origins, 348 ResourceIdByOrigin* batch_sync_origins,
322 ResourceIdByOrigin* incremental_sync_origins, 349 ResourceIdByOrigin* incremental_sync_origins,
350 ResourceIdByOrigin* disabled_origins,
323 SyncStatusCode status) { 351 SyncStatusCode status) {
324 DCHECK(CalledOnValidThread()); 352 DCHECK(CalledOnValidThread());
325 DCHECK(batch_sync_origins); 353 DCHECK(batch_sync_origins);
326 DCHECK(incremental_sync_origins); 354 DCHECK(incremental_sync_origins);
355 DCHECK(disabled_origins);
327 356
328 db_status_ = status; 357 db_status_ = status;
329 if (status != SYNC_STATUS_OK) { 358 if (status != SYNC_STATUS_OK) {
330 callback.Run(status); 359 callback.Run(status);
331 return; 360 return;
332 } 361 }
333 362
334 batch_sync_origins_.swap(*batch_sync_origins); 363 batch_sync_origins_.swap(*batch_sync_origins);
335 incremental_sync_origins_.swap(*incremental_sync_origins); 364 incremental_sync_origins_.swap(*incremental_sync_origins);
365 disabled_origins_.swap(*disabled_origins);
336 366
337 origin_by_resource_id_.clear(); 367 origin_by_resource_id_.clear();
338 InsertReverseMap(batch_sync_origins_, &origin_by_resource_id_); 368 InsertReverseMap(batch_sync_origins_, &origin_by_resource_id_);
339 InsertReverseMap(incremental_sync_origins_, &origin_by_resource_id_); 369 InsertReverseMap(incremental_sync_origins_, &origin_by_resource_id_);
370 InsertReverseMap(disabled_origins_, &origin_by_resource_id_);
340 371
341 callback.Run(status); 372 callback.Run(status);
342 } 373 }
343 374
344 void DriveMetadataStore::SetLargestChangeStamp( 375 void DriveMetadataStore::SetLargestChangeStamp(
345 int64 largest_changestamp, 376 int64 largest_changestamp,
346 const SyncStatusCallback& callback) { 377 const SyncStatusCallback& callback) {
347 DCHECK(CalledOnValidThread()); 378 DCHECK(CalledOnValidThread());
348 DCHECK_EQ(SYNC_STATUS_OK, db_status_); 379 DCHECK_EQ(SYNC_STATUS_OK, db_status_);
349 largest_changestamp_ = largest_changestamp; 380 largest_changestamp_ = largest_changestamp;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 bool DriveMetadataStore::IsBatchSyncOrigin(const GURL& origin) const { 473 bool DriveMetadataStore::IsBatchSyncOrigin(const GURL& origin) const {
443 DCHECK(CalledOnValidThread()); 474 DCHECK(CalledOnValidThread());
444 return ContainsKey(batch_sync_origins_, origin); 475 return ContainsKey(batch_sync_origins_, origin);
445 } 476 }
446 477
447 bool DriveMetadataStore::IsIncrementalSyncOrigin(const GURL& origin) const { 478 bool DriveMetadataStore::IsIncrementalSyncOrigin(const GURL& origin) const {
448 DCHECK(CalledOnValidThread()); 479 DCHECK(CalledOnValidThread());
449 return ContainsKey(incremental_sync_origins_, origin); 480 return ContainsKey(incremental_sync_origins_, origin);
450 } 481 }
451 482
483 bool DriveMetadataStore::IsOriginDisabled(const GURL& origin) const {
484 DCHECK(CalledOnValidThread());
485 return ContainsKey(disabled_origins_, origin);
486 }
487
452 void DriveMetadataStore::AddBatchSyncOrigin(const GURL& origin, 488 void DriveMetadataStore::AddBatchSyncOrigin(const GURL& origin,
453 const std::string& resource_id) { 489 const std::string& resource_id) {
454 DCHECK(CalledOnValidThread()); 490 DCHECK(CalledOnValidThread());
455 DCHECK(!IsBatchSyncOrigin(origin)); 491 DCHECK(!IsBatchSyncOrigin(origin));
456 DCHECK(!IsIncrementalSyncOrigin(origin)); 492 DCHECK(!IsIncrementalSyncOrigin(origin));
493 DCHECK(!IsOriginDisabled(origin));
457 DCHECK_EQ(SYNC_STATUS_OK, db_status_); 494 DCHECK_EQ(SYNC_STATUS_OK, db_status_);
458 495
459 batch_sync_origins_.insert(std::make_pair(origin, resource_id)); 496 batch_sync_origins_.insert(std::make_pair(origin, resource_id));
460 origin_by_resource_id_.insert(std::make_pair(resource_id, origin)); 497 origin_by_resource_id_.insert(std::make_pair(resource_id, origin));
461 498
462 // Store a pair of |origin| and |resource_id| in the DB. 499 // Store a pair of |origin| and |resource_id| in the DB.
463 base::PostTaskAndReplyWithResult( 500 base::PostTaskAndReplyWithResult(
464 file_task_runner_, FROM_HERE, 501 file_task_runner_, FROM_HERE,
465 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsBatch, 502 base::Bind(&DriveMetadataDB::UpdateOriginAsBatchSync,
466 base::Unretained(db_.get()), origin, resource_id), 503 base::Unretained(db_.get()), origin, resource_id),
467 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); 504 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr()));
468 } 505 }
469 506
470 void DriveMetadataStore::MoveBatchSyncOriginToIncremental(const GURL& origin) { 507 void DriveMetadataStore::MoveBatchSyncOriginToIncremental(const GURL& origin) {
471 DCHECK(CalledOnValidThread()); 508 DCHECK(CalledOnValidThread());
472 DCHECK(IsBatchSyncOrigin(origin)); 509 DCHECK(IsBatchSyncOrigin(origin));
473 DCHECK(!IsIncrementalSyncOrigin(origin)); 510 DCHECK(!IsIncrementalSyncOrigin(origin));
511 DCHECK(!IsOriginDisabled(origin));
474 DCHECK_EQ(SYNC_STATUS_OK, db_status_); 512 DCHECK_EQ(SYNC_STATUS_OK, db_status_);
475 513
476 std::map<GURL, std::string>::iterator found = 514 std::map<GURL, std::string>::iterator found =
477 batch_sync_origins_.find(origin); 515 batch_sync_origins_.find(origin);
478 incremental_sync_origins_.insert(std::make_pair(origin, found->second)); 516 incremental_sync_origins_.insert(std::make_pair(origin, found->second));
479 517
480 // Store a pair of |origin| and |resource_id| in the DB. 518 // Store a pair of |origin| and |resource_id| in the DB.
481 base::PostTaskAndReplyWithResult( 519 base::PostTaskAndReplyWithResult(
482 file_task_runner_, FROM_HERE, 520 file_task_runner_, FROM_HERE,
483 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsIncremental, 521 base::Bind(&DriveMetadataDB::UpdateOriginAsIncrementalSync,
484 base::Unretained(db_.get()), origin, found->second), 522 base::Unretained(db_.get()), origin, found->second),
485 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); 523 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr()));
486 524
487 batch_sync_origins_.erase(found); 525 batch_sync_origins_.erase(found);
488 } 526 }
489 527
528 void DriveMetadataStore::EnableOrigin(
529 const GURL& origin,
530 const SyncStatusCallback& callback) {
531 DCHECK(CalledOnValidThread());
532
533 std::map<GURL, std::string>::iterator found = disabled_origins_.find(origin);
534 if (found == disabled_origins_.end()) {
535 // |origin| has not been registered yet.
536 return;
537 }
538 std::string resource_id = found->second;
539 disabled_origins_.erase(found);
540
541 // Ensure |origin| is marked as a batch sync origin.
542 batch_sync_origins_.insert(std::make_pair(origin, resource_id));
543 found = incremental_sync_origins_.find(origin);
544 if (found != incremental_sync_origins_.end())
545 incremental_sync_origins_.erase(found);
546
547 // Store a pair of |origin| and |resource_id| in the DB.
548 base::PostTaskAndReplyWithResult(
549 file_task_runner_, FROM_HERE,
550 base::Bind(&DriveMetadataDB::EnableOrigin,
551 base::Unretained(db_.get()), origin, resource_id),
552 base::Bind(&DriveMetadataStore::DidUpdateOrigin, AsWeakPtr(), callback));
553 }
554
555 void DriveMetadataStore::DisableOrigin(
556 const GURL& origin,
557 const SyncStatusCallback& callback) {
558 DCHECK(CalledOnValidThread());
559
560 std::string resource_id;
561 std::map<GURL, std::string>::iterator found =
562 batch_sync_origins_.find(origin);
563 if (found != batch_sync_origins_.end()) {
564 resource_id = found->second;
565 batch_sync_origins_.erase(found);
566 }
567
568 found = incremental_sync_origins_.find(origin);
569 if (found != incremental_sync_origins_.end()) {
570 resource_id = found->second;
571 incremental_sync_origins_.erase(found);
572 }
573
574 if (resource_id.empty()) {
575 // |origin| has not been registered yet.
576 return;
577 }
578
579 disabled_origins_.insert(std::make_pair(origin, resource_id));
580
581 // Store a pair of |origin| and |resource_id| in the DB.
582 base::PostTaskAndReplyWithResult(
583 file_task_runner_, FROM_HERE,
584 base::Bind(&DriveMetadataDB::DisableOrigin,
585 base::Unretained(db_.get()), origin, resource_id),
586 base::Bind(&DriveMetadataStore::DidUpdateOrigin, AsWeakPtr(), callback));
587 }
588
490 void DriveMetadataStore::RemoveOrigin( 589 void DriveMetadataStore::RemoveOrigin(
491 const GURL& origin, 590 const GURL& origin,
492 const SyncStatusCallback& callback) { 591 const SyncStatusCallback& callback) {
493 DCHECK(CalledOnValidThread()); 592 DCHECK(CalledOnValidThread());
494 593
495 metadata_map_.erase(origin); 594 metadata_map_.erase(origin);
496 595
497 std::string resource_id; 596 std::string resource_id;
498 if (EraseIfExists(&batch_sync_origins_, origin, &resource_id) || 597 if (EraseIfExists(&batch_sync_origins_, origin, &resource_id) ||
499 EraseIfExists(&incremental_sync_origins_, origin, &resource_id)) { 598 EraseIfExists(&incremental_sync_origins_, origin, &resource_id) ||
599 EraseIfExists(&disabled_origins_, origin, &resource_id)) {
500 origin_by_resource_id_.erase(resource_id); 600 origin_by_resource_id_.erase(resource_id);
501 } 601 }
502 602
503 base::PostTaskAndReplyWithResult( 603 base::PostTaskAndReplyWithResult(
504 file_task_runner_, FROM_HERE, 604 file_task_runner_, FROM_HERE,
505 base::Bind(&DriveMetadataDB::RemoveOrigin, 605 base::Bind(&DriveMetadataDB::RemoveOrigin,
506 base::Unretained(db_.get()), origin), 606 base::Unretained(db_.get()), origin),
507 base::Bind(&DriveMetadataStore::DidRemoveOrigin, AsWeakPtr(), callback)); 607 base::Bind(&DriveMetadataStore::DidUpdateOrigin, AsWeakPtr(), callback));
508 } 608 }
509 609
510 void DriveMetadataStore::DidRemoveOrigin( 610 void DriveMetadataStore::DidUpdateOrigin(
511 const SyncStatusCallback& callback, 611 const SyncStatusCallback& callback,
512 SyncStatusCode status) { 612 SyncStatusCode status) {
513 UpdateDBStatus(status); 613 UpdateDBStatus(status);
514 callback.Run(status); 614 callback.Run(status);
515 } 615 }
516 616
517 void DriveMetadataStore::UpdateDBStatus(SyncStatusCode status) { 617 void DriveMetadataStore::UpdateDBStatus(SyncStatusCode status) {
518 DCHECK(CalledOnValidThread()); 618 DCHECK(CalledOnValidThread());
519 if (db_status_ != SYNC_STATUS_OK && 619 if (db_status_ != SYNC_STATUS_OK &&
520 db_status_ != SYNC_DATABASE_ERROR_NOT_FOUND) { 620 db_status_ != SYNC_DATABASE_ERROR_NOT_FOUND) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
572 list->push_back(std::make_pair(url, itr->second.resource_id())); 672 list->push_back(std::make_pair(url, itr->second.resource_id()));
573 } 673 }
574 } 674 }
575 } 675 }
576 return SYNC_STATUS_OK; 676 return SYNC_STATUS_OK;
577 } 677 }
578 678
579 std::string DriveMetadataStore::GetResourceIdForOrigin( 679 std::string DriveMetadataStore::GetResourceIdForOrigin(
580 const GURL& origin) const { 680 const GURL& origin) const {
581 DCHECK(CalledOnValidThread()); 681 DCHECK(CalledOnValidThread());
582 DCHECK(IsBatchSyncOrigin(origin) || IsIncrementalSyncOrigin(origin)); 682 DCHECK(IsBatchSyncOrigin(origin) ||
683 IsIncrementalSyncOrigin(origin) ||
684 IsOriginDisabled(origin));
583 685
584 ResourceIdByOrigin::const_iterator found = 686 ResourceIdByOrigin::const_iterator found =
585 incremental_sync_origins_.find(origin); 687 incremental_sync_origins_.find(origin);
586 if (found != incremental_sync_origins_.end()) 688 if (found != incremental_sync_origins_.end())
587 return found->second; 689 return found->second;
588 690
589 found = batch_sync_origins_.find(origin); 691 found = batch_sync_origins_.find(origin);
590 if (found != batch_sync_origins_.end()) 692 if (found != batch_sync_origins_.end())
591 return found->second; 693 return found->second;
592 694
695 found = disabled_origins_.find(origin);
696 if (found != disabled_origins_.end())
697 return found->second;
698
593 NOTREACHED(); 699 NOTREACHED();
594 return std::string(); 700 return std::string();
595 } 701 }
596 702
597 void DriveMetadataStore::GetAllOrigins(std::vector<GURL>* origins) { 703 void DriveMetadataStore::GetEnabledOrigins(std::vector<GURL>* origins) {
598 DCHECK(CalledOnValidThread()); 704 DCHECK(CalledOnValidThread());
705 origins->clear();
599 origins->reserve(batch_sync_origins_.size() + 706 origins->reserve(batch_sync_origins_.size() +
600 incremental_sync_origins_.size()); 707 incremental_sync_origins_.size());
601 AddOriginsToVector(origins, batch_sync_origins_); 708 AddOriginsToVector(origins, batch_sync_origins_);
602 AddOriginsToVector(origins, incremental_sync_origins_); 709 AddOriginsToVector(origins, incremental_sync_origins_);
603 } 710 }
604 711
712 void DriveMetadataStore::GetDisabledOrigins(std::vector<GURL>* origins) {
713 DCHECK(CalledOnValidThread());
714 origins->clear();
715 origins->reserve(disabled_origins_.size());
716 AddOriginsToVector(origins, disabled_origins_);
717 }
718
605 bool DriveMetadataStore::GetOriginByOriginRootDirectoryId( 719 bool DriveMetadataStore::GetOriginByOriginRootDirectoryId(
606 const std::string& resource_id, 720 const std::string& resource_id,
607 GURL* origin) { 721 GURL* origin) {
608 DCHECK(CalledOnValidThread()); 722 DCHECK(CalledOnValidThread());
609 DCHECK(origin); 723 DCHECK(origin);
610 724
611 OriginByResourceId::iterator found = origin_by_resource_id_.find(resource_id); 725 OriginByResourceId::iterator found = origin_by_resource_id_.find(resource_id);
612 if (found == origin_by_resource_id_.end()) 726 if (found == origin_by_resource_id_.end())
613 return false; 727 return false;
614 *origin = found->second; 728 *origin = found->second;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 DriveMetadata metadata; 801 DriveMetadata metadata;
688 bool success = metadata.ParseFromString(itr->value().ToString()); 802 bool success = metadata.ParseFromString(itr->value().ToString());
689 DCHECK(success); 803 DCHECK(success);
690 804
691 success = contents->metadata_map[origin].insert( 805 success = contents->metadata_map[origin].insert(
692 std::make_pair(path, metadata)).second; 806 std::make_pair(path, metadata)).second;
693 DCHECK(success); 807 DCHECK(success);
694 } 808 }
695 } 809 }
696 810
697 SyncStatusCode status = GetSyncOrigins(&contents->batch_sync_origins, 811 SyncStatusCode status = GetOrigins(&contents->batch_sync_origins,
698 &contents->incremental_sync_origins); 812 &contents->incremental_sync_origins,
813 &contents->disabled_origins);
699 if (status != SYNC_STATUS_OK && 814 if (status != SYNC_STATUS_OK &&
700 status != SYNC_DATABASE_ERROR_NOT_FOUND) 815 status != SYNC_DATABASE_ERROR_NOT_FOUND)
701 return status; 816 return status;
702 817
703 status = GetSyncRootDirectory(&contents->sync_root_directory_resource_id); 818 status = GetSyncRootDirectory(&contents->sync_root_directory_resource_id);
704 if (status != SYNC_STATUS_OK && 819 if (status != SYNC_STATUS_OK &&
705 status != SYNC_DATABASE_ERROR_NOT_FOUND) 820 status != SYNC_DATABASE_ERROR_NOT_FOUND)
706 return status; 821 return status;
707 822
708 return SYNC_STATUS_OK; 823 return SYNC_STATUS_OK;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
760 // value: <Resource ID of the sync root directory> 875 // value: <Resource ID of the sync root directory>
761 // 876 //
762 // * key: "METADATA: " + <Origin and URL> (changed) 877 // * key: "METADATA: " + <Origin and URL> (changed)
763 // * value: <Serialized DriveMetadata> 878 // * value: <Serialized DriveMetadata>
764 // 879 //
765 // key: "BSYNC_ORIGIN: " + <URL string of a batch sync origin> 880 // key: "BSYNC_ORIGIN: " + <URL string of a batch sync origin>
766 // value: <Resource ID of the drive directory for the origin> 881 // value: <Resource ID of the drive directory for the origin>
767 // 882 //
768 // key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin> 883 // key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin>
769 // value: <Resource ID of the drive directory for the origin> 884 // value: <Resource ID of the drive directory for the origin>
885 //
886 // key: "DISABLED_ORIGIN: " + <URL string of a disabled origin>
887 // value: <Resource ID of the drive directory for the origin>
770 888
771 leveldb::WriteBatch write_batch; 889 leveldb::WriteBatch write_batch;
772 write_batch.Put(kDatabaseVersionKey, 890 write_batch.Put(kDatabaseVersionKey,
773 base::Int64ToString(kCurrentDatabaseVersion)); 891 base::Int64ToString(kCurrentDatabaseVersion));
774 892
775 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); 893 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
776 for (itr->Seek(kDriveMetadataKeyPrefix); itr->Valid(); itr->Next()) { 894 for (itr->Seek(kDriveMetadataKeyPrefix); itr->Valid(); itr->Next()) {
777 std::string key = itr->key().ToString(); 895 std::string key = itr->key().ToString();
778 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) 896 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true))
779 break; 897 break;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
843 SyncStatusCode DriveMetadataDB::DeleteEntry(const FileSystemURL& url) { 961 SyncStatusCode DriveMetadataDB::DeleteEntry(const FileSystemURL& url) {
844 DCHECK(CalledOnValidThread()); 962 DCHECK(CalledOnValidThread());
845 DCHECK(db_.get()); 963 DCHECK(db_.get());
846 964
847 std::string metadata_key = FileSystemURLToMetadataKey(url); 965 std::string metadata_key = FileSystemURLToMetadataKey(url);
848 leveldb::Status status = db_->Delete( 966 leveldb::Status status = db_->Delete(
849 leveldb::WriteOptions(), metadata_key); 967 leveldb::WriteOptions(), metadata_key);
850 return LevelDBStatusToSyncStatusCode(status); 968 return LevelDBStatusToSyncStatusCode(status);
851 } 969 }
852 970
853 SyncStatusCode DriveMetadataDB::UpdateSyncOriginAsBatch( 971 SyncStatusCode DriveMetadataDB::UpdateOriginAsBatchSync(
854 const GURL& origin, const std::string& resource_id) { 972 const GURL& origin, const std::string& resource_id) {
855 DCHECK(CalledOnValidThread()); 973 DCHECK(CalledOnValidThread());
856 DCHECK(db_.get()); 974 DCHECK(db_.get());
857 975
858 leveldb::Status status = db_->Put( 976 leveldb::Status status = db_->Put(
859 leveldb::WriteOptions(), 977 leveldb::WriteOptions(),
860 CreateKeyForBatchSyncOrigin(origin), 978 CreateKeyForBatchSyncOrigin(origin),
861 resource_id); 979 resource_id);
862 return LevelDBStatusToSyncStatusCode(status); 980 return LevelDBStatusToSyncStatusCode(status);
863 } 981 }
864 982
865 SyncStatusCode DriveMetadataDB::UpdateSyncOriginAsIncremental( 983 SyncStatusCode DriveMetadataDB::UpdateOriginAsIncrementalSync(
866 const GURL& origin, const std::string& resource_id) { 984 const GURL& origin, const std::string& resource_id) {
867 DCHECK(CalledOnValidThread()); 985 DCHECK(CalledOnValidThread());
868 DCHECK(db_.get()); 986 DCHECK(db_.get());
869 987
870 leveldb::WriteBatch batch; 988 leveldb::WriteBatch batch;
871 batch.Delete(CreateKeyForBatchSyncOrigin(origin)); 989 batch.Delete(CreateKeyForBatchSyncOrigin(origin));
990 batch.Delete(CreateKeyForDisabledOrigin(origin));
872 batch.Put(CreateKeyForIncrementalSyncOrigin(origin), resource_id); 991 batch.Put(CreateKeyForIncrementalSyncOrigin(origin), resource_id);
873 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); 992 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
874 993
875 return LevelDBStatusToSyncStatusCode(status); 994 return LevelDBStatusToSyncStatusCode(status);
876 } 995 }
877 996
997 SyncStatusCode DriveMetadataDB::EnableOrigin(
998 const GURL& origin, const std::string& resource_id) {
999 DCHECK(CalledOnValidThread());
1000 DCHECK(db_.get());
1001
1002 leveldb::WriteBatch batch;
1003 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin));
1004 batch.Delete(CreateKeyForDisabledOrigin(origin));
1005 batch.Put(CreateKeyForBatchSyncOrigin(origin), resource_id);
1006 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
1007
1008 return LevelDBStatusToSyncStatusCode(status);
1009 }
1010
1011 SyncStatusCode DriveMetadataDB::DisableOrigin(
1012 const GURL& origin_to_disable, const std::string& resource_id) {
1013 DCHECK(CalledOnValidThread());
1014 DCHECK(db_.get());
1015
1016 leveldb::WriteBatch batch;
1017 batch.Delete(CreateKeyForBatchSyncOrigin(origin_to_disable));
1018 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin_to_disable));
1019 batch.Put(CreateKeyForDisabledOrigin(origin_to_disable), resource_id);
1020
1021 // Remove entries specified by |origin_to_disable|.
1022 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
1023 std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_disable.spec();
1024 for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) {
1025 std::string key = itr->key().ToString();
1026 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true))
1027 break;
1028 GURL origin;
1029 base::FilePath path;
1030 MetadataKeyToOriginAndPath(key, &origin, &path);
1031 if (origin != origin_to_disable)
1032 break;
1033 batch.Delete(key);
1034 }
1035 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
1036
1037 return LevelDBStatusToSyncStatusCode(status);
1038 }
1039
878 SyncStatusCode DriveMetadataDB::RemoveOrigin(const GURL& origin_to_remove) { 1040 SyncStatusCode DriveMetadataDB::RemoveOrigin(const GURL& origin_to_remove) {
879 DCHECK(CalledOnValidThread()); 1041 DCHECK(CalledOnValidThread());
880 1042
881 leveldb::WriteBatch batch; 1043 leveldb::WriteBatch batch;
882 batch.Delete(kDriveBatchSyncOriginKeyPrefix + origin_to_remove.spec()); 1044 batch.Delete(CreateKeyForBatchSyncOrigin(origin_to_remove));
883 batch.Delete(kDriveIncrementalSyncOriginKeyPrefix + origin_to_remove.spec()); 1045 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin_to_remove));
1046 batch.Delete(CreateKeyForDisabledOrigin(origin_to_remove));
884 1047
885 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); 1048 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
886 std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_remove.spec(); 1049 std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_remove.spec();
887 for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) { 1050 for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) {
888 std::string key = itr->key().ToString(); 1051 std::string key = itr->key().ToString();
889 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) 1052 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true))
890 break; 1053 break;
891 GURL origin; 1054 GURL origin;
892 base::FilePath path; 1055 base::FilePath path;
893 MetadataKeyToOriginAndPath(key, &origin, &path); 1056 MetadataKeyToOriginAndPath(key, &origin, &path);
894 if (origin != origin_to_remove) 1057 if (origin != origin_to_remove)
895 break; 1058 break;
896 batch.Delete(key); 1059 batch.Delete(key);
897 } 1060 }
898 1061
899 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); 1062 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
900 return LevelDBStatusToSyncStatusCode(status); 1063 return LevelDBStatusToSyncStatusCode(status);
901 } 1064 }
902 1065
903 SyncStatusCode DriveMetadataDB::GetSyncOrigins( 1066 SyncStatusCode DriveMetadataDB::GetOrigins(
904 ResourceIdByOrigin* batch_sync_origins, 1067 ResourceIdByOrigin* batch_sync_origins,
905 ResourceIdByOrigin* incremental_sync_origins) { 1068 ResourceIdByOrigin* incremental_sync_origins,
1069 ResourceIdByOrigin* disabled_origins) {
906 DCHECK(CalledOnValidThread()); 1070 DCHECK(CalledOnValidThread());
907 DCHECK(db_.get()); 1071 DCHECK(db_.get());
908 1072
909 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); 1073 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
910 1074
911 // Get batch sync origins from the DB. 1075 // Get batch sync origins from the DB.
912 for (itr->Seek(kDriveBatchSyncOriginKeyPrefix); 1076 for (itr->Seek(kDriveBatchSyncOriginKeyPrefix);
913 itr->Valid(); itr->Next()) { 1077 itr->Valid(); itr->Next()) {
914 std::string key = itr->key().ToString(); 1078 std::string key = itr->key().ToString();
915 if (!StartsWithASCII(key, kDriveBatchSyncOriginKeyPrefix, true)) 1079 if (!StartsWithASCII(key, kDriveBatchSyncOriginKeyPrefix, true))
(...skipping 15 matching lines...) Expand all
931 break; 1095 break;
932 GURL origin(std::string( 1096 GURL origin(std::string(
933 key.begin() + arraysize(kDriveIncrementalSyncOriginKeyPrefix) - 1, 1097 key.begin() + arraysize(kDriveIncrementalSyncOriginKeyPrefix) - 1,
934 key.end())); 1098 key.end()));
935 DCHECK(origin.is_valid()); 1099 DCHECK(origin.is_valid());
936 bool result = incremental_sync_origins->insert( 1100 bool result = incremental_sync_origins->insert(
937 std::make_pair(origin, itr->value().ToString())).second; 1101 std::make_pair(origin, itr->value().ToString())).second;
938 DCHECK(result); 1102 DCHECK(result);
939 } 1103 }
940 1104
1105 // Get disabled origins from the DB.
1106 for (itr->Seek(kDriveDisabledOriginKeyPrefix);
1107 itr->Valid(); itr->Next()) {
1108 std::string key = itr->key().ToString();
1109 if (!StartsWithASCII(key, kDriveDisabledOriginKeyPrefix, true))
1110 break;
1111 GURL origin(std::string(
1112 key.begin() + arraysize(kDriveDisabledOriginKeyPrefix) - 1,
1113 key.end()));
1114 DCHECK(origin.is_valid());
1115 bool result = disabled_origins->insert(
1116 std::make_pair(origin, itr->value().ToString())).second;
1117 DCHECK(result);
1118 }
1119
941 return SYNC_STATUS_OK; 1120 return SYNC_STATUS_OK;
942 } 1121 }
943 1122
944 } // namespace sync_file_system 1123 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698