OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/sync_file_system/drive_metadata_store.h" | 5 #include "chrome/browser/sync_file_system/drive_metadata_store.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 const char kDatabaseVersionKey[] = "VERSION"; | 45 const char kDatabaseVersionKey[] = "VERSION"; |
46 const int64 kCurrentDatabaseVersion = 2; | 46 const int64 kCurrentDatabaseVersion = 2; |
47 const char kChangeStampKey[] = "CHANGE_STAMP"; | 47 const char kChangeStampKey[] = "CHANGE_STAMP"; |
48 const char kSyncRootDirectoryKey[] = "SYNC_ROOT_DIR"; | 48 const char kSyncRootDirectoryKey[] = "SYNC_ROOT_DIR"; |
49 const char kDriveMetadataKeyPrefix[] = "METADATA: "; | 49 const char kDriveMetadataKeyPrefix[] = "METADATA: "; |
50 const char kMetadataKeySeparator = ' '; | 50 const char kMetadataKeySeparator = ' '; |
51 const char kDriveIncrementalSyncOriginKeyPrefix[] = "ISYNC_ORIGIN: "; | 51 const char kDriveIncrementalSyncOriginKeyPrefix[] = "ISYNC_ORIGIN: "; |
52 const char kDriveDisabledOriginKeyPrefix[] = "DISABLED_ORIGIN: "; | 52 const char kDriveDisabledOriginKeyPrefix[] = "DISABLED_ORIGIN: "; |
53 const size_t kDriveMetadataKeyPrefixLength = arraysize(kDriveMetadataKeyPrefix); | 53 const size_t kDriveMetadataKeyPrefixLength = arraysize(kDriveMetadataKeyPrefix); |
54 | 54 |
| 55 enum OriginSyncType { |
| 56 INCREMENTAL_SYNC_ORIGIN, |
| 57 DISABLED_ORIGIN |
| 58 }; |
| 59 |
55 std::string RemovePrefix(const std::string& str, const std::string& prefix) { | 60 std::string RemovePrefix(const std::string& str, const std::string& prefix) { |
56 if (StartsWithASCII(str, prefix, true)) | 61 if (StartsWithASCII(str, prefix, true)) |
57 return str.substr(prefix.size()); | 62 return str.substr(prefix.size()); |
58 return str; | 63 return str; |
59 } | 64 } |
60 | 65 |
61 std::string FileSystemURLToMetadataKey(const FileSystemURL& url) { | 66 std::string FileSystemURLToMetadataKey(const FileSystemURL& url) { |
62 return kDriveMetadataKeyPrefix + url.origin().spec() + | 67 return kDriveMetadataKeyPrefix + url.origin().spec() + |
63 kMetadataKeySeparator + url.path().AsUTF8Unsafe(); | 68 kMetadataKeySeparator + url.path().AsUTF8Unsafe(); |
64 } | 69 } |
(...skipping 19 matching lines...) Expand all Loading... |
84 reverse_map->insert(std::make_pair(resource_id, origin)); | 89 reverse_map->insert(std::make_pair(resource_id, origin)); |
85 | 90 |
86 found->second = resource_id; | 91 found->second = resource_id; |
87 return true; | 92 return true; |
88 } | 93 } |
89 | 94 |
90 } // namespace | 95 } // namespace |
91 | 96 |
92 class DriveMetadataDB { | 97 class DriveMetadataDB { |
93 public: | 98 public: |
94 enum OriginSyncType { | |
95 INCREMENTAL_SYNC_ORIGIN, | |
96 DISABLED_ORIGIN | |
97 }; | |
98 | |
99 typedef DriveMetadataStore::MetadataMap MetadataMap; | 99 typedef DriveMetadataStore::MetadataMap MetadataMap; |
100 | 100 |
101 DriveMetadataDB(const base::FilePath& base_dir, | 101 DriveMetadataDB(const base::FilePath& base_dir, |
102 base::SequencedTaskRunner* task_runner); | 102 base::SequencedTaskRunner* task_runner); |
103 ~DriveMetadataDB(); | 103 ~DriveMetadataDB(); |
104 | 104 |
105 SyncStatusCode Initialize(bool* created); | 105 SyncStatusCode Initialize(bool* created); |
106 SyncStatusCode ReadContents(DriveMetadataDBContents* contents); | 106 SyncStatusCode ReadContents(DriveMetadataDBContents* contents); |
107 | 107 |
108 SyncStatusCode MigrateDatabaseIfNeeded(); | 108 SyncStatusCode MigrateDatabaseIfNeeded(); |
109 | 109 |
110 SyncStatusCode SetLargestChangestamp(int64 largest_changestamp); | |
111 SyncStatusCode SetSyncRootDirectory(const std::string& resource_id); | |
112 SyncStatusCode GetSyncRootDirectory(std::string* resource_id); | 110 SyncStatusCode GetSyncRootDirectory(std::string* resource_id); |
113 SyncStatusCode SetOriginRootDirectory(const GURL& origin, | |
114 OriginSyncType sync_type, | |
115 const std::string& resource_id); | |
116 SyncStatusCode UpdateEntry(const FileSystemURL& url, | |
117 DriveMetadata metadata); | |
118 | 111 |
119 // TODO(calvinlo): consolidate these state transition functions for sync | |
120 // origins like "UpdateOrigin(GURL, SyncStatusEnum)". And manage origins in | |
121 // just one map like "Map<SyncStatusEnum, ResourceIDMap>". | |
122 // http://crbug.com/211600 | |
123 SyncStatusCode UpdateOriginAsIncrementalSync(const GURL& origin, | |
124 const std::string& resource_id); | |
125 SyncStatusCode EnableOrigin(const GURL& origin, | |
126 const std::string& resource_id); | |
127 SyncStatusCode DisableOrigin(const GURL& origin, | 112 SyncStatusCode DisableOrigin(const GURL& origin, |
128 const std::string& resource_id); | 113 const std::string& resource_id); |
129 SyncStatusCode RemoveOrigin(const GURL& origin); | 114 SyncStatusCode RemoveOrigin(const GURL& origin); |
130 | 115 |
131 SyncStatusCode GetOrigins(ResourceIdByOrigin* incremental_sync_origins, | 116 SyncStatusCode GetOrigins(ResourceIdByOrigin* incremental_sync_origins, |
132 ResourceIdByOrigin* disabled_origins); | 117 ResourceIdByOrigin* disabled_origins); |
133 | 118 |
134 SyncStatusCode WriteToDB(leveldb::WriteBatch* batch) { | 119 SyncStatusCode WriteToDB(leveldb::WriteBatch* batch) { |
135 return LevelDBStatusToSyncStatusCode(db_->Write( | 120 return LevelDBStatusToSyncStatusCode(db_->Write( |
136 leveldb::WriteOptions(), batch)); | 121 leveldb::WriteOptions(), batch)); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 } | 171 } |
187 } | 172 } |
188 | 173 |
189 return db->ReadContents(contents); | 174 return db->ReadContents(contents); |
190 } | 175 } |
191 | 176 |
192 // Returns a key string for the given origin. | 177 // Returns a key string for the given origin. |
193 // For example, when |origin| is "http://www.example.com" and |sync_type| is | 178 // For example, when |origin| is "http://www.example.com" and |sync_type| is |
194 // BATCH_SYNC_ORIGIN, returns "BSYNC_ORIGIN: http://www.example.com". | 179 // BATCH_SYNC_ORIGIN, returns "BSYNC_ORIGIN: http://www.example.com". |
195 std::string CreateKeyForOriginRoot(const GURL& origin, | 180 std::string CreateKeyForOriginRoot(const GURL& origin, |
196 DriveMetadataDB::OriginSyncType sync_type) { | 181 OriginSyncType sync_type) { |
197 DCHECK(origin.is_valid()); | 182 DCHECK(origin.is_valid()); |
198 switch (sync_type) { | 183 switch (sync_type) { |
199 case DriveMetadataDB::INCREMENTAL_SYNC_ORIGIN: | 184 case INCREMENTAL_SYNC_ORIGIN: |
200 return kDriveIncrementalSyncOriginKeyPrefix + origin.spec(); | 185 return kDriveIncrementalSyncOriginKeyPrefix + origin.spec(); |
201 case DriveMetadataDB::DISABLED_ORIGIN: | 186 case DISABLED_ORIGIN: |
202 return kDriveDisabledOriginKeyPrefix + origin.spec(); | 187 return kDriveDisabledOriginKeyPrefix + origin.spec(); |
203 } | 188 } |
204 NOTREACHED(); | 189 NOTREACHED(); |
205 return std::string(); | 190 return std::string(); |
206 } | 191 } |
207 | 192 |
208 void AddOriginsToVector(std::vector<GURL>* all_origins, | 193 void AddOriginsToVector(std::vector<GURL>* all_origins, |
209 const ResourceIdByOrigin& resource_map) { | 194 const ResourceIdByOrigin& resource_map) { |
210 for (ResourceIdByOrigin::const_iterator itr = resource_map.begin(); | 195 for (ResourceIdByOrigin::const_iterator itr = resource_map.begin(); |
211 itr != resource_map.end(); | 196 itr != resource_map.end(); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 leveldb::DB* DriveMetadataStore::GetDBInstanceForTesting() { | 354 leveldb::DB* DriveMetadataStore::GetDBInstanceForTesting() { |
370 return db_->db_.get(); | 355 return db_->db_.get(); |
371 } | 356 } |
372 | 357 |
373 void DriveMetadataStore::SetLargestChangeStamp( | 358 void DriveMetadataStore::SetLargestChangeStamp( |
374 int64 largest_changestamp, | 359 int64 largest_changestamp, |
375 const SyncStatusCallback& callback) { | 360 const SyncStatusCallback& callback) { |
376 DCHECK(CalledOnValidThread()); | 361 DCHECK(CalledOnValidThread()); |
377 DCHECK_EQ(SYNC_STATUS_OK, db_status_); | 362 DCHECK_EQ(SYNC_STATUS_OK, db_status_); |
378 largest_changestamp_ = largest_changestamp; | 363 largest_changestamp_ = largest_changestamp; |
379 base::PostTaskAndReplyWithResult( | 364 |
380 file_task_runner_.get(), | 365 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
381 FROM_HERE, | 366 batch->Put(kChangeStampKey, base::Int64ToString(largest_changestamp)); |
382 base::Bind(&DriveMetadataDB::SetLargestChangestamp, | 367 return WriteToDB(batch.Pass(), callback); |
383 base::Unretained(db_.get()), | |
384 largest_changestamp), | |
385 base::Bind(&DriveMetadataStore::UpdateDBStatusAndInvokeCallback, | |
386 AsWeakPtr(), | |
387 callback)); | |
388 } | 368 } |
389 | 369 |
390 int64 DriveMetadataStore::GetLargestChangeStamp() const { | 370 int64 DriveMetadataStore::GetLargestChangeStamp() const { |
391 DCHECK(CalledOnValidThread()); | 371 DCHECK(CalledOnValidThread()); |
392 DCHECK_EQ(SYNC_STATUS_OK, db_status_); | 372 DCHECK_EQ(SYNC_STATUS_OK, db_status_); |
393 return largest_changestamp_; | 373 return largest_changestamp_; |
394 } | 374 } |
395 | 375 |
396 void DriveMetadataStore::UpdateEntry( | 376 void DriveMetadataStore::UpdateEntry( |
397 const FileSystemURL& url, | 377 const FileSystemURL& url, |
398 const DriveMetadata& metadata, | 378 const DriveMetadata& metadata, |
399 const SyncStatusCallback& callback) { | 379 const SyncStatusCallback& callback) { |
400 DCHECK(CalledOnValidThread()); | 380 DCHECK(CalledOnValidThread()); |
401 DCHECK_EQ(SYNC_STATUS_OK, db_status_); | 381 DCHECK_EQ(SYNC_STATUS_OK, db_status_); |
402 DCHECK(!metadata.conflicted() || !metadata.to_be_fetched()); | 382 DCHECK(!metadata.conflicted() || !metadata.to_be_fetched()); |
403 | 383 |
404 std::pair<PathToMetadata::iterator, bool> result = | 384 std::pair<PathToMetadata::iterator, bool> result = |
405 metadata_map_[url.origin()].insert(std::make_pair(url.path(), metadata)); | 385 metadata_map_[url.origin()].insert(std::make_pair(url.path(), metadata)); |
406 if (!result.second) | 386 if (!result.second) |
407 result.first->second = metadata; | 387 result.first->second = metadata; |
408 | 388 |
409 base::PostTaskAndReplyWithResult( | 389 std::string value; |
410 file_task_runner_.get(), | 390 if (!IsDriveAPIEnabled()) { |
411 FROM_HERE, | 391 DriveMetadata metadata_in_db(metadata); |
412 base::Bind(&DriveMetadataDB::UpdateEntry, | 392 metadata_in_db.set_resource_id( |
413 base::Unretained(db_.get()), | 393 drive::RemoveWapiIdPrefix(metadata.resource_id())); |
414 url, | 394 bool success = metadata_in_db.SerializeToString(&value); |
415 metadata), | 395 DCHECK(success); |
416 base::Bind(&DriveMetadataStore::UpdateDBStatusAndInvokeCallback, | 396 } else { |
417 AsWeakPtr(), | 397 bool success = metadata.SerializeToString(&value); |
418 callback)); | 398 DCHECK(success); |
| 399 } |
| 400 |
| 401 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
| 402 batch->Put(FileSystemURLToMetadataKey(url), value); |
| 403 WriteToDB(batch.Pass(), callback); |
419 } | 404 } |
420 | 405 |
421 void DriveMetadataStore::DeleteEntry( | 406 void DriveMetadataStore::DeleteEntry( |
422 const FileSystemURL& url, | 407 const FileSystemURL& url, |
423 const SyncStatusCallback& callback) { | 408 const SyncStatusCallback& callback) { |
424 DCHECK(CalledOnValidThread()); | 409 DCHECK(CalledOnValidThread()); |
425 MetadataMap::iterator found = metadata_map_.find(url.origin()); | 410 MetadataMap::iterator found = metadata_map_.find(url.origin()); |
426 if (found == metadata_map_.end()) { | 411 if (found == metadata_map_.end()) { |
427 base::MessageLoopProxy::current()->PostTask( | 412 base::MessageLoopProxy::current()->PostTask( |
428 FROM_HERE, | 413 FROM_HERE, |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 const GURL& origin, | 448 const GURL& origin, |
464 const std::string& resource_id) { | 449 const std::string& resource_id) { |
465 DCHECK(CalledOnValidThread()); | 450 DCHECK(CalledOnValidThread()); |
466 DCHECK(!IsIncrementalSyncOrigin(origin)); | 451 DCHECK(!IsIncrementalSyncOrigin(origin)); |
467 DCHECK(!IsOriginDisabled(origin)); | 452 DCHECK(!IsOriginDisabled(origin)); |
468 DCHECK_EQ(SYNC_STATUS_OK, db_status_); | 453 DCHECK_EQ(SYNC_STATUS_OK, db_status_); |
469 | 454 |
470 incremental_sync_origins_.insert(std::make_pair(origin, resource_id)); | 455 incremental_sync_origins_.insert(std::make_pair(origin, resource_id)); |
471 origin_by_resource_id_.insert(std::make_pair(resource_id, origin)); | 456 origin_by_resource_id_.insert(std::make_pair(resource_id, origin)); |
472 | 457 |
473 // Store a pair of |origin| and |resource_id| in the DB. | 458 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
474 base::PostTaskAndReplyWithResult( | 459 batch->Delete(CreateKeyForOriginRoot(origin, DISABLED_ORIGIN)); |
475 file_task_runner_.get(), | 460 batch->Put(CreateKeyForOriginRoot(origin, INCREMENTAL_SYNC_ORIGIN), |
476 FROM_HERE, | 461 drive::RemoveWapiIdPrefix(resource_id)); |
477 base::Bind(&DriveMetadataDB::UpdateOriginAsIncrementalSync, | 462 WriteToDB(batch.Pass(), |
478 base::Unretained(db_.get()), | 463 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); |
479 origin, | |
480 resource_id), | |
481 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); | |
482 } | 464 } |
483 | 465 |
484 void DriveMetadataStore::SetSyncRootDirectory(const std::string& resource_id) { | 466 void DriveMetadataStore::SetSyncRootDirectory(const std::string& resource_id) { |
485 DCHECK(CalledOnValidThread()); | 467 DCHECK(CalledOnValidThread()); |
486 | 468 |
487 sync_root_directory_resource_id_ = resource_id; | 469 sync_root_directory_resource_id_ = resource_id; |
488 | 470 |
489 // Set the resource ID for the sync root directory in the DB. | 471 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
490 base::PostTaskAndReplyWithResult( | 472 batch->Put(kSyncRootDirectoryKey, drive::RemoveWapiIdPrefix(resource_id)); |
491 file_task_runner_.get(), | 473 return WriteToDB(batch.Pass(), |
492 FROM_HERE, | 474 base::Bind(&DriveMetadataStore::UpdateDBStatus, |
493 base::Bind(&DriveMetadataDB::SetSyncRootDirectory, | 475 AsWeakPtr())); |
494 base::Unretained(db_.get()), | |
495 resource_id), | |
496 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); | |
497 } | 476 } |
498 | 477 |
499 void DriveMetadataStore::SetOriginRootDirectory( | 478 void DriveMetadataStore::SetOriginRootDirectory( |
500 const GURL& origin, | 479 const GURL& origin, |
501 const std::string& resource_id) { | 480 const std::string& resource_id) { |
502 DCHECK(CalledOnValidThread()); | 481 DCHECK(CalledOnValidThread()); |
503 DCHECK(IsKnownOrigin(origin)); | 482 DCHECK(IsKnownOrigin(origin)); |
504 | 483 |
505 DriveMetadataDB::OriginSyncType sync_type; | 484 OriginSyncType sync_type; |
506 if (UpdateResourceIdMap( | 485 if (UpdateResourceIdMap( |
507 &incremental_sync_origins_, &origin_by_resource_id_, | 486 &incremental_sync_origins_, &origin_by_resource_id_, |
508 origin, resource_id)) { | 487 origin, resource_id)) { |
509 sync_type = DriveMetadataDB::INCREMENTAL_SYNC_ORIGIN; | 488 sync_type = INCREMENTAL_SYNC_ORIGIN; |
510 } else if (UpdateResourceIdMap(&disabled_origins_, &origin_by_resource_id_, | 489 } else if (UpdateResourceIdMap(&disabled_origins_, &origin_by_resource_id_, |
511 origin, resource_id)) { | 490 origin, resource_id)) { |
512 sync_type = DriveMetadataDB::DISABLED_ORIGIN; | 491 sync_type = DISABLED_ORIGIN; |
513 } else { | 492 } else { |
514 return; | 493 return; |
515 } | 494 } |
516 base::PostTaskAndReplyWithResult( | 495 |
517 file_task_runner_.get(), | 496 std::string key = CreateKeyForOriginRoot(origin, sync_type); |
518 FROM_HERE, | 497 DCHECK(!key.empty()); |
519 base::Bind(&DriveMetadataDB::SetOriginRootDirectory, | 498 |
520 base::Unretained(db_.get()), | 499 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
521 origin, | 500 batch->Put(key, drive::RemoveWapiIdPrefix(resource_id)); |
522 sync_type, | 501 WriteToDB(batch.Pass(), |
523 resource_id), | 502 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); |
524 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); | |
525 } | 503 } |
526 | 504 |
527 bool DriveMetadataStore::IsKnownOrigin(const GURL& origin) const { | 505 bool DriveMetadataStore::IsKnownOrigin(const GURL& origin) const { |
528 DCHECK(CalledOnValidThread()); | 506 DCHECK(CalledOnValidThread()); |
529 return IsIncrementalSyncOrigin(origin) || IsOriginDisabled(origin); | 507 return IsIncrementalSyncOrigin(origin) || IsOriginDisabled(origin); |
530 } | 508 } |
531 | 509 |
532 bool DriveMetadataStore::IsIncrementalSyncOrigin(const GURL& origin) const { | 510 bool DriveMetadataStore::IsIncrementalSyncOrigin(const GURL& origin) const { |
533 DCHECK(CalledOnValidThread()); | 511 DCHECK(CalledOnValidThread()); |
534 return ContainsKey(incremental_sync_origins_, origin); | 512 return ContainsKey(incremental_sync_origins_, origin); |
(...skipping 16 matching lines...) Expand all Loading... |
551 } | 529 } |
552 std::string resource_id = found->second; | 530 std::string resource_id = found->second; |
553 disabled_origins_.erase(found); | 531 disabled_origins_.erase(found); |
554 | 532 |
555 // |origin| goes back to DriveFileSyncService::pending_batch_sync_origins_ | 533 // |origin| goes back to DriveFileSyncService::pending_batch_sync_origins_ |
556 // only and is not stored in drive_metadata_store. | 534 // only and is not stored in drive_metadata_store. |
557 found = incremental_sync_origins_.find(origin); | 535 found = incremental_sync_origins_.find(origin); |
558 if (found != incremental_sync_origins_.end()) | 536 if (found != incremental_sync_origins_.end()) |
559 incremental_sync_origins_.erase(found); | 537 incremental_sync_origins_.erase(found); |
560 | 538 |
561 // Store a pair of |origin| and |resource_id| in the DB. | 539 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
562 base::PostTaskAndReplyWithResult( | 540 batch->Delete(CreateKeyForOriginRoot(origin, INCREMENTAL_SYNC_ORIGIN)); |
563 file_task_runner_.get(), | 541 batch->Delete(CreateKeyForOriginRoot(origin, DISABLED_ORIGIN)); |
564 FROM_HERE, | 542 WriteToDB(batch.Pass(), callback); |
565 base::Bind(&DriveMetadataDB::EnableOrigin, | |
566 base::Unretained(db_.get()), | |
567 origin, | |
568 resource_id), | |
569 base::Bind(&DriveMetadataStore::DidUpdateOrigin, AsWeakPtr(), callback)); | |
570 } | 543 } |
571 | 544 |
572 void DriveMetadataStore::DisableOrigin( | 545 void DriveMetadataStore::DisableOrigin( |
573 const GURL& origin, | 546 const GURL& origin, |
574 const SyncStatusCallback& callback) { | 547 const SyncStatusCallback& callback) { |
575 DCHECK(CalledOnValidThread()); | 548 DCHECK(CalledOnValidThread()); |
576 | 549 |
577 std::string resource_id; | 550 std::string resource_id; |
578 std::map<GURL, std::string>::iterator found = | 551 std::map<GURL, std::string>::iterator found = |
579 incremental_sync_origins_.find(origin); | 552 incremental_sync_origins_.find(origin); |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
865 case 0: | 838 case 0: |
866 drive::MigrateDatabaseFromV0ToV1(db_.get()); | 839 drive::MigrateDatabaseFromV0ToV1(db_.get()); |
867 // fall-through | 840 // fall-through |
868 case 1: | 841 case 1: |
869 drive::MigrateDatabaseFromV1ToV2(db_.get()); | 842 drive::MigrateDatabaseFromV1ToV2(db_.get()); |
870 return SYNC_STATUS_OK; | 843 return SYNC_STATUS_OK; |
871 } | 844 } |
872 return SYNC_DATABASE_ERROR_FAILED; | 845 return SYNC_DATABASE_ERROR_FAILED; |
873 } | 846 } |
874 | 847 |
875 SyncStatusCode DriveMetadataDB::SetLargestChangestamp( | |
876 int64 largest_changestamp) { | |
877 DCHECK(CalledOnValidThread()); | |
878 DCHECK(db_.get()); | |
879 | |
880 leveldb::WriteBatch batch; | |
881 batch.Put(kChangeStampKey, base::Int64ToString(largest_changestamp)); | |
882 return WriteToDB(&batch); | |
883 } | |
884 | |
885 SyncStatusCode DriveMetadataDB::SetSyncRootDirectory( | |
886 const std::string& resource_id) { | |
887 DCHECK(CalledOnValidThread()); | |
888 DCHECK(db_.get()); | |
889 | |
890 leveldb::WriteBatch batch; | |
891 batch.Put(kSyncRootDirectoryKey, drive::RemoveWapiIdPrefix(resource_id)); | |
892 return WriteToDB(&batch); | |
893 } | |
894 | |
895 SyncStatusCode DriveMetadataDB::SetOriginRootDirectory( | |
896 const GURL& origin, | |
897 OriginSyncType sync_type, | |
898 const std::string& resource_id) { | |
899 DCHECK(CalledOnValidThread()); | |
900 DCHECK(db_.get()); | |
901 | |
902 std::string key = CreateKeyForOriginRoot(origin, sync_type); | |
903 if (key.empty()) | |
904 return SYNC_DATABASE_ERROR_FAILED; | |
905 | |
906 leveldb::WriteBatch batch; | |
907 batch.Put(key, drive::RemoveWapiIdPrefix(resource_id)); | |
908 return WriteToDB(&batch); | |
909 } | |
910 | |
911 SyncStatusCode DriveMetadataDB::GetSyncRootDirectory(std::string* resource_id) { | 848 SyncStatusCode DriveMetadataDB::GetSyncRootDirectory(std::string* resource_id) { |
912 DCHECK(CalledOnValidThread()); | 849 DCHECK(CalledOnValidThread()); |
913 DCHECK(db_.get()); | 850 DCHECK(db_.get()); |
914 | 851 |
915 leveldb::Status status = db_->Get( | 852 leveldb::Status status = db_->Get( |
916 leveldb::ReadOptions(), kSyncRootDirectoryKey, resource_id); | 853 leveldb::ReadOptions(), kSyncRootDirectoryKey, resource_id); |
917 | 854 |
918 if (!IsDriveAPIEnabled() && status.ok()) | 855 if (!IsDriveAPIEnabled() && status.ok()) |
919 *resource_id = drive::AddWapiFolderPrefix(*resource_id); | 856 *resource_id = drive::AddWapiFolderPrefix(*resource_id); |
920 | 857 |
921 return LevelDBStatusToSyncStatusCode(status); | 858 return LevelDBStatusToSyncStatusCode(status); |
922 } | 859 } |
923 | 860 |
924 SyncStatusCode DriveMetadataDB::UpdateEntry(const FileSystemURL& url, | |
925 DriveMetadata metadata) { | |
926 DCHECK(CalledOnValidThread()); | |
927 DCHECK(db_.get()); | |
928 | |
929 if (!IsDriveAPIEnabled()) { | |
930 metadata.set_resource_id( | |
931 drive::RemoveWapiIdPrefix(metadata.resource_id())); | |
932 } | |
933 | |
934 std::string metadata_key = FileSystemURLToMetadataKey(url); | |
935 std::string value; | |
936 bool success = metadata.SerializeToString(&value); | |
937 DCHECK(success); | |
938 | |
939 leveldb::WriteBatch batch; | |
940 batch.Put(metadata_key, value); | |
941 return WriteToDB(&batch); | |
942 } | |
943 | |
944 SyncStatusCode DriveMetadataDB::UpdateOriginAsIncrementalSync( | |
945 const GURL& origin, const std::string& resource_id) { | |
946 DCHECK(CalledOnValidThread()); | |
947 DCHECK(db_.get()); | |
948 | |
949 leveldb::WriteBatch batch; | |
950 batch.Delete(CreateKeyForOriginRoot(origin, DISABLED_ORIGIN)); | |
951 batch.Put(CreateKeyForOriginRoot(origin, INCREMENTAL_SYNC_ORIGIN), | |
952 drive::RemoveWapiIdPrefix(resource_id)); | |
953 return WriteToDB(&batch); | |
954 } | |
955 | |
956 SyncStatusCode DriveMetadataDB::EnableOrigin( | |
957 const GURL& origin, const std::string& resource_id) { | |
958 DCHECK(CalledOnValidThread()); | |
959 DCHECK(db_.get()); | |
960 | |
961 // No DB entry as enabled origins go back to | |
962 // DriveFileSyncService::pending_batch_sync_origins only. | |
963 leveldb::WriteBatch batch; | |
964 batch.Delete(CreateKeyForOriginRoot(origin, INCREMENTAL_SYNC_ORIGIN)); | |
965 batch.Delete(CreateKeyForOriginRoot(origin, DISABLED_ORIGIN)); | |
966 | |
967 return WriteToDB(&batch); | |
968 } | |
969 | |
970 SyncStatusCode DriveMetadataDB::DisableOrigin( | 861 SyncStatusCode DriveMetadataDB::DisableOrigin( |
971 const GURL& origin_to_disable, const std::string& resource_id) { | 862 const GURL& origin_to_disable, const std::string& resource_id) { |
972 DCHECK(CalledOnValidThread()); | 863 DCHECK(CalledOnValidThread()); |
973 DCHECK(db_.get()); | 864 DCHECK(db_.get()); |
974 | 865 |
975 leveldb::WriteBatch batch; | 866 leveldb::WriteBatch batch; |
976 batch.Delete(CreateKeyForOriginRoot(origin_to_disable, | 867 batch.Delete(CreateKeyForOriginRoot(origin_to_disable, |
977 INCREMENTAL_SYNC_ORIGIN)); | 868 INCREMENTAL_SYNC_ORIGIN)); |
978 batch.Put(CreateKeyForOriginRoot(origin_to_disable, DISABLED_ORIGIN), | 869 batch.Put(CreateKeyForOriginRoot(origin_to_disable, DISABLED_ORIGIN), |
979 drive::RemoveWapiIdPrefix(resource_id)); | 870 drive::RemoveWapiIdPrefix(resource_id)); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1062 | 953 |
1063 bool result = disabled_origins->insert( | 954 bool result = disabled_origins->insert( |
1064 std::make_pair(origin, origin_resource_id)).second; | 955 std::make_pair(origin, origin_resource_id)).second; |
1065 DCHECK(result); | 956 DCHECK(result); |
1066 } | 957 } |
1067 | 958 |
1068 return SYNC_STATUS_OK; | 959 return SYNC_STATUS_OK; |
1069 } | 960 } |
1070 | 961 |
1071 } // namespace sync_file_system | 962 } // namespace sync_file_system |
OLD | NEW |