Chromium Code Reviews| 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" |
| 11 #include "base/callback.h" | 11 #include "base/callback.h" |
| 12 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
| 13 #include "base/location.h" | 13 #include "base/location.h" |
| 14 #include "base/message_loop/message_loop_proxy.h" | 14 #include "base/message_loop/message_loop_proxy.h" |
| 15 #include "base/sequenced_task_runner.h" | 15 #include "base/sequenced_task_runner.h" |
| 16 #include "base/stl_util.h" | 16 #include "base/stl_util.h" |
| 17 #include "base/string_util.h" | 17 #include "base/string_util.h" |
| 18 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
| 19 #include "base/task_runner_util.h" | 19 #include "base/task_runner_util.h" |
| 20 #include "chrome/browser/sync_file_system/drive/metadata_db_migration_util.h" | |
| 20 #include "chrome/browser/sync_file_system/drive_file_sync_service.h" | 21 #include "chrome/browser/sync_file_system/drive_file_sync_service.h" |
| 22 #include "chrome/browser/sync_file_system/drive_file_sync_util.h" | |
| 21 #include "chrome/browser/sync_file_system/logger.h" | 23 #include "chrome/browser/sync_file_system/logger.h" |
| 22 #include "chrome/browser/sync_file_system/sync_file_system.pb.h" | 24 #include "chrome/browser/sync_file_system/sync_file_system.pb.h" |
| 23 #include "googleurl/src/gurl.h" | 25 #include "googleurl/src/gurl.h" |
| 24 #include "third_party/leveldatabase/src/include/leveldb/db.h" | 26 #include "third_party/leveldatabase/src/include/leveldb/db.h" |
| 25 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" | 27 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" |
| 26 #include "webkit/browser/fileapi/file_system_url.h" | 28 #include "webkit/browser/fileapi/file_system_url.h" |
| 27 #include "webkit/common/fileapi/file_system_util.h" | 29 #include "webkit/common/fileapi/file_system_util.h" |
| 28 #include "webkit/fileapi/syncable/syncable_file_system_util.h" | 30 #include "webkit/fileapi/syncable/syncable_file_system_util.h" |
| 29 | 31 |
| 30 using fileapi::FileSystemURL; | 32 using fileapi::FileSystemURL; |
| 31 | 33 |
| 32 namespace sync_file_system { | 34 namespace sync_file_system { |
| 33 | 35 |
| 34 typedef DriveMetadataStore::ResourceIdByOrigin ResourceIdByOrigin; | 36 typedef DriveMetadataStore::ResourceIdByOrigin ResourceIdByOrigin; |
| 35 typedef DriveMetadataStore::OriginByResourceId OriginByResourceId; | 37 typedef DriveMetadataStore::OriginByResourceId OriginByResourceId; |
| 36 | 38 |
| 37 const base::FilePath::CharType DriveMetadataStore::kDatabaseName[] = | 39 const base::FilePath::CharType DriveMetadataStore::kDatabaseName[] = |
| 38 FILE_PATH_LITERAL("DriveMetadata"); | 40 FILE_PATH_LITERAL("DriveMetadata"); |
| 39 | 41 |
| 40 namespace { | 42 namespace { |
| 41 | 43 |
| 42 const char* const kServiceName = DriveFileSyncService::kServiceName; | 44 const char* const kServiceName = DriveFileSyncService::kServiceName; |
| 43 const char kDatabaseVersionKey[] = "VERSION"; | 45 const char kDatabaseVersionKey[] = "VERSION"; |
| 44 const int64 kCurrentDatabaseVersion = 1; | 46 const int64 kCurrentDatabaseVersion = 2; |
| 45 const char kChangeStampKey[] = "CHANGE_STAMP"; | 47 const char kChangeStampKey[] = "CHANGE_STAMP"; |
| 46 const char kSyncRootDirectoryKey[] = "SYNC_ROOT_DIR"; | 48 const char kSyncRootDirectoryKey[] = "SYNC_ROOT_DIR"; |
| 47 const char kDriveMetadataKeyPrefix[] = "METADATA: "; | 49 const char kDriveMetadataKeyPrefix[] = "METADATA: "; |
| 48 const char kMetadataKeySeparator = ' '; | 50 const char kMetadataKeySeparator = ' '; |
| 49 const char kDriveBatchSyncOriginKeyPrefix[] = "BSYNC_ORIGIN: "; | 51 const char kDriveBatchSyncOriginKeyPrefix[] = "BSYNC_ORIGIN: "; |
| 50 const char kDriveIncrementalSyncOriginKeyPrefix[] = "ISYNC_ORIGIN: "; | 52 const char kDriveIncrementalSyncOriginKeyPrefix[] = "ISYNC_ORIGIN: "; |
| 51 const char kDriveDisabledOriginKeyPrefix[] = "DISABLED_ORIGIN: "; | 53 const char kDriveDisabledOriginKeyPrefix[] = "DISABLED_ORIGIN: "; |
| 52 const size_t kDriveMetadataKeyPrefixLength = arraysize(kDriveMetadataKeyPrefix); | 54 const size_t kDriveMetadataKeyPrefixLength = arraysize(kDriveMetadataKeyPrefix); |
| 53 | 55 |
| 54 const base::FilePath::CharType kV0FormatPathPrefix[] = | 56 const base::FilePath::CharType kV0FormatPathPrefix[] = |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 99 ResourceIdByOrigin::iterator found = map->find(origin); | 101 ResourceIdByOrigin::iterator found = map->find(origin); |
| 100 if (found == map->end()) | 102 if (found == map->end()) |
| 101 return false; | 103 return false; |
| 102 reverse_map->erase(found->second); | 104 reverse_map->erase(found->second); |
| 103 reverse_map->insert(std::make_pair(resource_id, origin)); | 105 reverse_map->insert(std::make_pair(resource_id, origin)); |
| 104 | 106 |
| 105 found->second = resource_id; | 107 found->second = resource_id; |
| 106 return true; | 108 return true; |
| 107 } | 109 } |
| 108 | 110 |
| 111 std::string RemovePrefix(const std::string& str, const std::string& prefix) { | |
| 112 if (StartsWithASCII(str, prefix, true)) | |
| 113 return std::string(str.begin() + prefix.size(), str.end()); | |
|
tzik
2013/05/29 04:30:24
str.substr(prefix.size())?
nhiroki
2013/05/29 06:31:03
Done.
| |
| 114 return str; | |
| 115 } | |
| 116 | |
| 109 } // namespace | 117 } // namespace |
| 110 | 118 |
| 111 class DriveMetadataDB { | 119 class DriveMetadataDB { |
| 112 public: | 120 public: |
| 113 enum OriginSyncType { | 121 enum OriginSyncType { |
| 114 INCREMENTAL_SYNC_ORIGIN, | 122 INCREMENTAL_SYNC_ORIGIN, |
| 115 DISABLED_ORIGIN | 123 DISABLED_ORIGIN |
| 116 }; | 124 }; |
| 117 | 125 |
| 118 typedef DriveMetadataStore::MetadataMap MetadataMap; | 126 typedef DriveMetadataStore::MetadataMap MetadataMap; |
| 119 | 127 |
| 120 DriveMetadataDB(const base::FilePath& base_dir, | 128 DriveMetadataDB(const base::FilePath& base_dir, |
| 121 base::SequencedTaskRunner* task_runner); | 129 base::SequencedTaskRunner* task_runner); |
| 122 ~DriveMetadataDB(); | 130 ~DriveMetadataDB(); |
| 123 | 131 |
| 124 SyncStatusCode Initialize(bool* created); | 132 SyncStatusCode Initialize(bool* created); |
| 125 SyncStatusCode ReadContents(DriveMetadataDBContents* contents); | 133 SyncStatusCode ReadContents(DriveMetadataDBContents* contents); |
| 126 | 134 |
| 127 SyncStatusCode MigrateDatabaseIfNeeded(); | 135 SyncStatusCode MigrateDatabaseIfNeeded(); |
| 128 SyncStatusCode MigrateFromVersion0Database(); | 136 SyncStatusCode MigrateFromVersion0To1Database(); |
| 129 | 137 |
| 130 SyncStatusCode SetLargestChangestamp(int64 largest_changestamp); | 138 SyncStatusCode SetLargestChangestamp(int64 largest_changestamp); |
| 131 SyncStatusCode SetSyncRootDirectory(const std::string& resource_id); | 139 SyncStatusCode SetSyncRootDirectory(const std::string& resource_id); |
| 132 SyncStatusCode GetSyncRootDirectory(std::string* resource_id); | 140 SyncStatusCode GetSyncRootDirectory(std::string* resource_id); |
| 133 SyncStatusCode SetOriginRootDirectory(const GURL& origin, | 141 SyncStatusCode SetOriginRootDirectory(const GURL& origin, |
| 134 OriginSyncType sync_type, | 142 OriginSyncType sync_type, |
| 135 const std::string& resource_id); | 143 const std::string& resource_id); |
| 136 SyncStatusCode UpdateEntry(const FileSystemURL& url, | 144 SyncStatusCode UpdateEntry(const FileSystemURL& url, |
| 137 const DriveMetadata& metadata); | 145 DriveMetadata metadata); |
| 138 SyncStatusCode DeleteEntry(const FileSystemURL& url); | 146 SyncStatusCode DeleteEntry(const FileSystemURL& url); |
| 139 | 147 |
| 140 // TODO(calvinlo): consolidate these state transition functions for sync | 148 // TODO(calvinlo): consolidate these state transition functions for sync |
| 141 // origins like "UpdateOrigin(GURL, SyncStatusEnum)". And manage origins in | 149 // origins like "UpdateOrigin(GURL, SyncStatusEnum)". And manage origins in |
| 142 // just one map like "Map<SyncStatusEnum, ResourceIDMap>". | 150 // just one map like "Map<SyncStatusEnum, ResourceIDMap>". |
| 143 // http://crbug.com/211600 | 151 // http://crbug.com/211600 |
| 144 SyncStatusCode UpdateOriginAsBatchSync(const GURL& origin, | 152 SyncStatusCode UpdateOriginAsBatchSync(const GURL& origin, |
| 145 const std::string& resource_id); | 153 const std::string& resource_id); |
| 146 SyncStatusCode UpdateOriginAsIncrementalSync(const GURL& origin, | 154 SyncStatusCode UpdateOriginAsIncrementalSync(const GURL& origin, |
| 147 const std::string& resource_id); | 155 const std::string& resource_id); |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 436 | 444 |
| 437 if (found->second.erase(url.path()) == 1) { | 445 if (found->second.erase(url.path()) == 1) { |
| 438 base::PostTaskAndReplyWithResult( | 446 base::PostTaskAndReplyWithResult( |
| 439 file_task_runner_, FROM_HERE, | 447 file_task_runner_, FROM_HERE, |
| 440 base::Bind(&DriveMetadataDB::DeleteEntry, | 448 base::Bind(&DriveMetadataDB::DeleteEntry, |
| 441 base::Unretained(db_.get()), url), | 449 base::Unretained(db_.get()), url), |
| 442 base::Bind(&DriveMetadataStore::UpdateDBStatusAndInvokeCallback, | 450 base::Bind(&DriveMetadataStore::UpdateDBStatusAndInvokeCallback, |
| 443 AsWeakPtr(), callback)); | 451 AsWeakPtr(), callback)); |
| 444 return; | 452 return; |
| 445 } | 453 } |
| 454 | |
| 446 base::MessageLoopProxy::current()->PostTask( | 455 base::MessageLoopProxy::current()->PostTask( |
| 447 FROM_HERE, | 456 FROM_HERE, |
| 448 base::Bind(callback, SYNC_DATABASE_ERROR_NOT_FOUND)); | 457 base::Bind(callback, SYNC_DATABASE_ERROR_NOT_FOUND)); |
| 449 } | 458 } |
| 450 | 459 |
| 451 SyncStatusCode DriveMetadataStore::ReadEntry(const FileSystemURL& url, | 460 SyncStatusCode DriveMetadataStore::ReadEntry(const FileSystemURL& url, |
| 452 DriveMetadata* metadata) const { | 461 DriveMetadata* metadata) const { |
| 453 DCHECK(CalledOnValidThread()); | 462 DCHECK(CalledOnValidThread()); |
| 454 DCHECK(metadata); | 463 DCHECK(metadata); |
| 455 | 464 |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 809 DCHECK(success); | 818 DCHECK(success); |
| 810 } else if (StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) { | 819 } else if (StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) { |
| 811 GURL origin; | 820 GURL origin; |
| 812 base::FilePath path; | 821 base::FilePath path; |
| 813 MetadataKeyToOriginAndPath(key, &origin, &path); | 822 MetadataKeyToOriginAndPath(key, &origin, &path); |
| 814 | 823 |
| 815 DriveMetadata metadata; | 824 DriveMetadata metadata; |
| 816 bool success = metadata.ParseFromString(itr->value().ToString()); | 825 bool success = metadata.ParseFromString(itr->value().ToString()); |
| 817 DCHECK(success); | 826 DCHECK(success); |
| 818 | 827 |
| 828 if (!IsDriveAPIEnabled()) { | |
| 829 metadata.set_resource_id( | |
| 830 drive::AddWapiIdPrefix(metadata.resource_id(), metadata.type())); | |
| 831 } | |
| 832 | |
| 819 success = contents->metadata_map[origin].insert( | 833 success = contents->metadata_map[origin].insert( |
| 820 std::make_pair(path, metadata)).second; | 834 std::make_pair(path, metadata)).second; |
| 821 DCHECK(success); | 835 DCHECK(success); |
| 822 } | 836 } |
| 823 } | 837 } |
| 824 | 838 |
| 825 SyncStatusCode status = GetOrigins(&contents->incremental_sync_origins, | 839 SyncStatusCode status = GetOrigins(&contents->incremental_sync_origins, |
| 826 &contents->disabled_origins); | 840 &contents->disabled_origins); |
| 827 if (status != SYNC_STATUS_OK && | 841 if (status != SYNC_STATUS_OK && |
| 828 status != SYNC_DATABASE_ERROR_NOT_FOUND) | 842 status != SYNC_DATABASE_ERROR_NOT_FOUND) |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 845 bool success = base::StringToInt64(itr->value().ToString(), | 859 bool success = base::StringToInt64(itr->value().ToString(), |
| 846 &database_version); | 860 &database_version); |
| 847 if (!success) | 861 if (!success) |
| 848 return SYNC_DATABASE_ERROR_FAILED; | 862 return SYNC_DATABASE_ERROR_FAILED; |
| 849 if (database_version > kCurrentDatabaseVersion) | 863 if (database_version > kCurrentDatabaseVersion) |
| 850 return SYNC_DATABASE_ERROR_FAILED; | 864 return SYNC_DATABASE_ERROR_FAILED; |
| 851 if (database_version == kCurrentDatabaseVersion) | 865 if (database_version == kCurrentDatabaseVersion) |
| 852 return SYNC_STATUS_OK; | 866 return SYNC_STATUS_OK; |
| 853 } | 867 } |
| 854 | 868 |
| 855 if (database_version == 0) { | 869 switch (database_version) { |
| 856 MigrateFromVersion0Database(); | 870 case 0: |
| 857 return SYNC_STATUS_OK; | 871 MigrateFromVersion0To1Database(); |
| 872 // fall-through | |
| 873 case 1: | |
| 874 drive::MigrateDatabaseFromV1ToV2(db_.get()); | |
| 875 return SYNC_STATUS_OK; | |
| 858 } | 876 } |
| 859 return SYNC_DATABASE_ERROR_FAILED; | 877 return SYNC_DATABASE_ERROR_FAILED; |
| 860 } | 878 } |
| 861 | 879 |
| 862 SyncStatusCode DriveMetadataDB::MigrateFromVersion0Database() { | 880 SyncStatusCode DriveMetadataDB::MigrateFromVersion0To1Database() { |
| 863 // Version 0 database format: | 881 // Version 0 database format: |
| 864 // key: "CHANGE_STAMP" | 882 // key: "CHANGE_STAMP" |
| 865 // value: <Largest Changestamp> | 883 // value: <Largest Changestamp> |
| 866 // | 884 // |
| 867 // key: "SYNC_ROOT_DIR" | 885 // key: "SYNC_ROOT_DIR" |
| 868 // value: <Resource ID of the sync root directory> | 886 // value: <Resource ID of the sync root directory> |
| 869 // | 887 // |
| 870 // key: "METADATA: " + | 888 // key: "METADATA: " + |
| 871 // <FileSystemURL serialized by SerializeSyncableFileSystemURL> | 889 // <FileSystemURL serialized by SerializeSyncableFileSystemURL> |
| 872 // value: <Serialized DriveMetadata> | 890 // value: <Serialized DriveMetadata> |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 893 // key: "BSYNC_ORIGIN: " + <URL string of a batch sync origin> | 911 // key: "BSYNC_ORIGIN: " + <URL string of a batch sync origin> |
| 894 // value: <Resource ID of the drive directory for the origin> | 912 // value: <Resource ID of the drive directory for the origin> |
| 895 // | 913 // |
| 896 // key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin> | 914 // key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin> |
| 897 // value: <Resource ID of the drive directory for the origin> | 915 // value: <Resource ID of the drive directory for the origin> |
| 898 // | 916 // |
| 899 // key: "DISABLED_ORIGIN: " + <URL string of a disabled origin> | 917 // key: "DISABLED_ORIGIN: " + <URL string of a disabled origin> |
| 900 // value: <Resource ID of the drive directory for the origin> | 918 // value: <Resource ID of the drive directory for the origin> |
| 901 | 919 |
| 902 leveldb::WriteBatch write_batch; | 920 leveldb::WriteBatch write_batch; |
| 903 write_batch.Put(kDatabaseVersionKey, | 921 write_batch.Put(kDatabaseVersionKey, "1"); |
| 904 base::Int64ToString(kCurrentDatabaseVersion)); | |
| 905 | 922 |
| 906 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); | 923 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); |
| 907 for (itr->Seek(kDriveMetadataKeyPrefix); itr->Valid(); itr->Next()) { | 924 for (itr->Seek(kDriveMetadataKeyPrefix); itr->Valid(); itr->Next()) { |
| 908 std::string key = itr->key().ToString(); | 925 std::string key = itr->key().ToString(); |
| 909 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) | 926 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) |
| 910 break; | 927 break; |
| 911 std::string serialized_url( | 928 std::string serialized_url( |
| 912 key.begin() + kDriveMetadataKeyPrefixLength - 1, key.end()); | 929 key.begin() + kDriveMetadataKeyPrefixLength - 1, key.end()); |
| 913 | 930 |
| 914 GURL origin; | 931 GURL origin; |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 935 leveldb::WriteOptions(), | 952 leveldb::WriteOptions(), |
| 936 kChangeStampKey, base::Int64ToString(largest_changestamp)); | 953 kChangeStampKey, base::Int64ToString(largest_changestamp)); |
| 937 return LevelDBStatusToSyncStatusCode(status); | 954 return LevelDBStatusToSyncStatusCode(status); |
| 938 } | 955 } |
| 939 | 956 |
| 940 SyncStatusCode DriveMetadataDB::SetSyncRootDirectory( | 957 SyncStatusCode DriveMetadataDB::SetSyncRootDirectory( |
| 941 const std::string& resource_id) { | 958 const std::string& resource_id) { |
| 942 DCHECK(CalledOnValidThread()); | 959 DCHECK(CalledOnValidThread()); |
| 943 DCHECK(db_.get()); | 960 DCHECK(db_.get()); |
| 944 | 961 |
| 945 leveldb::Status status = db_->Put( | 962 leveldb::Status status = db_->Put(leveldb::WriteOptions(), |
| 946 leveldb::WriteOptions(), kSyncRootDirectoryKey, resource_id); | 963 kSyncRootDirectoryKey, |
| 964 drive::RemoveWapiIdPrefix(resource_id)); | |
| 947 return LevelDBStatusToSyncStatusCode(status); | 965 return LevelDBStatusToSyncStatusCode(status); |
| 948 } | 966 } |
| 949 | 967 |
| 950 SyncStatusCode DriveMetadataDB::SetOriginRootDirectory( | 968 SyncStatusCode DriveMetadataDB::SetOriginRootDirectory( |
| 951 const GURL& origin, | 969 const GURL& origin, |
| 952 OriginSyncType sync_type, | 970 OriginSyncType sync_type, |
| 953 const std::string& resource_id) { | 971 const std::string& resource_id) { |
| 954 DCHECK(CalledOnValidThread()); | 972 DCHECK(CalledOnValidThread()); |
| 955 DCHECK(db_.get()); | 973 DCHECK(db_.get()); |
| 956 | 974 |
| 957 std::string key = CreateKeyForOriginRoot(origin, sync_type); | 975 std::string key = CreateKeyForOriginRoot(origin, sync_type); |
| 958 if (key.empty()) | 976 if (key.empty()) |
| 959 return SYNC_DATABASE_ERROR_FAILED; | 977 return SYNC_DATABASE_ERROR_FAILED; |
| 960 | 978 |
| 961 leveldb::Status status = db_->Put(leveldb::WriteOptions(), key, resource_id); | 979 leveldb::Status status = db_->Put( |
| 980 leveldb::WriteOptions(), key, drive::RemoveWapiIdPrefix(resource_id)); | |
| 962 return LevelDBStatusToSyncStatusCode(status); | 981 return LevelDBStatusToSyncStatusCode(status); |
| 963 } | 982 } |
| 964 | 983 |
| 965 SyncStatusCode DriveMetadataDB::GetSyncRootDirectory(std::string* resource_id) { | 984 SyncStatusCode DriveMetadataDB::GetSyncRootDirectory(std::string* resource_id) { |
| 966 DCHECK(CalledOnValidThread()); | 985 DCHECK(CalledOnValidThread()); |
| 967 DCHECK(db_.get()); | 986 DCHECK(db_.get()); |
| 968 | 987 |
| 969 leveldb::Status status = db_->Get( | 988 leveldb::Status status = db_->Get( |
| 970 leveldb::ReadOptions(), kSyncRootDirectoryKey, resource_id); | 989 leveldb::ReadOptions(), kSyncRootDirectoryKey, resource_id); |
| 990 | |
| 991 if (!IsDriveAPIEnabled() && status.ok()) | |
| 992 *resource_id = drive::AddWapiFolderPrefix(*resource_id); | |
| 993 | |
| 971 return LevelDBStatusToSyncStatusCode(status); | 994 return LevelDBStatusToSyncStatusCode(status); |
| 972 } | 995 } |
| 973 | 996 |
| 974 SyncStatusCode DriveMetadataDB::UpdateEntry(const FileSystemURL& url, | 997 SyncStatusCode DriveMetadataDB::UpdateEntry(const FileSystemURL& url, |
| 975 const DriveMetadata& metadata) { | 998 DriveMetadata metadata) { |
| 976 DCHECK(CalledOnValidThread()); | 999 DCHECK(CalledOnValidThread()); |
| 977 DCHECK(db_.get()); | 1000 DCHECK(db_.get()); |
| 978 | 1001 |
| 1002 if (!IsDriveAPIEnabled()) { | |
| 1003 metadata.set_resource_id( | |
| 1004 drive::RemoveWapiIdPrefix(metadata.resource_id())); | |
| 1005 } | |
| 1006 | |
| 979 std::string metadata_key = FileSystemURLToMetadataKey(url); | 1007 std::string metadata_key = FileSystemURLToMetadataKey(url); |
| 980 std::string value; | 1008 std::string value; |
| 981 bool success = metadata.SerializeToString(&value); | 1009 bool success = metadata.SerializeToString(&value); |
| 982 DCHECK(success); | 1010 DCHECK(success); |
| 983 leveldb::Status status = db_->Put( | 1011 leveldb::Status status = db_->Put( |
| 984 leveldb::WriteOptions(), metadata_key, value); | 1012 leveldb::WriteOptions(), metadata_key, value); |
| 985 | 1013 |
| 986 return LevelDBStatusToSyncStatusCode(status); | 1014 return LevelDBStatusToSyncStatusCode(status); |
| 987 } | 1015 } |
| 988 | 1016 |
| 989 SyncStatusCode DriveMetadataDB::DeleteEntry(const FileSystemURL& url) { | 1017 SyncStatusCode DriveMetadataDB::DeleteEntry(const FileSystemURL& url) { |
| 990 DCHECK(CalledOnValidThread()); | 1018 DCHECK(CalledOnValidThread()); |
| 991 DCHECK(db_.get()); | 1019 DCHECK(db_.get()); |
| 992 | 1020 |
| 993 std::string metadata_key = FileSystemURLToMetadataKey(url); | 1021 std::string metadata_key = FileSystemURLToMetadataKey(url); |
| 994 leveldb::Status status = db_->Delete( | 1022 leveldb::Status status = db_->Delete( |
| 995 leveldb::WriteOptions(), metadata_key); | 1023 leveldb::WriteOptions(), metadata_key); |
| 996 return LevelDBStatusToSyncStatusCode(status); | 1024 return LevelDBStatusToSyncStatusCode(status); |
| 997 } | 1025 } |
| 998 | 1026 |
| 999 SyncStatusCode DriveMetadataDB::UpdateOriginAsIncrementalSync( | 1027 SyncStatusCode DriveMetadataDB::UpdateOriginAsIncrementalSync( |
| 1000 const GURL& origin, const std::string& resource_id) { | 1028 const GURL& origin, const std::string& resource_id) { |
| 1001 DCHECK(CalledOnValidThread()); | 1029 DCHECK(CalledOnValidThread()); |
| 1002 DCHECK(db_.get()); | 1030 DCHECK(db_.get()); |
| 1003 | 1031 |
| 1004 leveldb::WriteBatch batch; | 1032 leveldb::WriteBatch batch; |
| 1005 batch.Delete(CreateKeyForOriginRoot(origin, DISABLED_ORIGIN)); | 1033 batch.Delete(CreateKeyForOriginRoot(origin, DISABLED_ORIGIN)); |
| 1006 batch.Put(CreateKeyForOriginRoot(origin, INCREMENTAL_SYNC_ORIGIN), | 1034 batch.Put(CreateKeyForOriginRoot(origin, INCREMENTAL_SYNC_ORIGIN), |
| 1007 resource_id); | 1035 drive::RemoveWapiIdPrefix(resource_id)); |
| 1008 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); | 1036 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); |
| 1009 | 1037 |
| 1010 return LevelDBStatusToSyncStatusCode(status); | 1038 return LevelDBStatusToSyncStatusCode(status); |
| 1011 } | 1039 } |
| 1012 | 1040 |
| 1013 SyncStatusCode DriveMetadataDB::EnableOrigin( | 1041 SyncStatusCode DriveMetadataDB::EnableOrigin( |
| 1014 const GURL& origin, const std::string& resource_id) { | 1042 const GURL& origin, const std::string& resource_id) { |
| 1015 DCHECK(CalledOnValidThread()); | 1043 DCHECK(CalledOnValidThread()); |
| 1016 DCHECK(db_.get()); | 1044 DCHECK(db_.get()); |
| 1017 | 1045 |
| 1018 // No DB entry as enabled origins go back to | 1046 // No DB entry as enabled origins go back to |
| 1019 // DriveFileSyncService.pending_batch_sync_origins only. | 1047 // DriveFileSyncService.pending_batch_sync_origins only. |
| 1020 leveldb::WriteBatch batch; | 1048 leveldb::WriteBatch batch; |
| 1021 batch.Delete(CreateKeyForOriginRoot(origin, INCREMENTAL_SYNC_ORIGIN)); | 1049 batch.Delete(CreateKeyForOriginRoot(origin, INCREMENTAL_SYNC_ORIGIN)); |
| 1022 batch.Delete(CreateKeyForOriginRoot(origin, DISABLED_ORIGIN)); | 1050 batch.Delete(CreateKeyForOriginRoot(origin, DISABLED_ORIGIN)); |
| 1023 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); | 1051 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); |
| 1024 | 1052 |
| 1025 return LevelDBStatusToSyncStatusCode(status); | 1053 return LevelDBStatusToSyncStatusCode(status); |
| 1026 } | 1054 } |
| 1027 | 1055 |
| 1028 SyncStatusCode DriveMetadataDB::DisableOrigin( | 1056 SyncStatusCode DriveMetadataDB::DisableOrigin( |
| 1029 const GURL& origin_to_disable, const std::string& resource_id) { | 1057 const GURL& origin_to_disable, const std::string& resource_id) { |
| 1030 DCHECK(CalledOnValidThread()); | 1058 DCHECK(CalledOnValidThread()); |
| 1031 DCHECK(db_.get()); | 1059 DCHECK(db_.get()); |
| 1032 | 1060 |
| 1033 leveldb::WriteBatch batch; | 1061 leveldb::WriteBatch batch; |
| 1034 batch.Delete(CreateKeyForOriginRoot(origin_to_disable, | 1062 batch.Delete(CreateKeyForOriginRoot(origin_to_disable, |
| 1035 INCREMENTAL_SYNC_ORIGIN)); | 1063 INCREMENTAL_SYNC_ORIGIN)); |
| 1036 batch.Put(CreateKeyForOriginRoot(origin_to_disable, DISABLED_ORIGIN), | 1064 batch.Put(CreateKeyForOriginRoot(origin_to_disable, DISABLED_ORIGIN), |
| 1037 resource_id); | 1065 drive::RemoveWapiIdPrefix(resource_id)); |
| 1038 | 1066 |
| 1039 // Remove entries specified by |origin_to_disable|. | 1067 // Remove entries specified by |origin_to_disable|. |
| 1040 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); | 1068 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); |
| 1041 std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_disable.spec(); | 1069 std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_disable.spec(); |
| 1042 for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) { | 1070 for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) { |
| 1043 std::string key = itr->key().ToString(); | 1071 std::string key = itr->key().ToString(); |
| 1044 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) | 1072 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) |
| 1045 break; | 1073 break; |
| 1046 GURL origin; | 1074 GURL origin; |
| 1047 base::FilePath path; | 1075 base::FilePath path; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1088 DCHECK(db_.get()); | 1116 DCHECK(db_.get()); |
| 1089 | 1117 |
| 1090 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); | 1118 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); |
| 1091 | 1119 |
| 1092 // Get incremental sync origins from the DB. | 1120 // Get incremental sync origins from the DB. |
| 1093 for (itr->Seek(kDriveIncrementalSyncOriginKeyPrefix); | 1121 for (itr->Seek(kDriveIncrementalSyncOriginKeyPrefix); |
| 1094 itr->Valid(); itr->Next()) { | 1122 itr->Valid(); itr->Next()) { |
| 1095 std::string key = itr->key().ToString(); | 1123 std::string key = itr->key().ToString(); |
| 1096 if (!StartsWithASCII(key, kDriveIncrementalSyncOriginKeyPrefix, true)) | 1124 if (!StartsWithASCII(key, kDriveIncrementalSyncOriginKeyPrefix, true)) |
| 1097 break; | 1125 break; |
| 1098 GURL origin(std::string( | 1126 GURL origin(RemovePrefix(key, kDriveIncrementalSyncOriginKeyPrefix)); |
| 1099 key.begin() + arraysize(kDriveIncrementalSyncOriginKeyPrefix) - 1, | |
| 1100 key.end())); | |
| 1101 DCHECK(origin.is_valid()); | 1127 DCHECK(origin.is_valid()); |
| 1128 | |
| 1129 std::string origin_resource_id = IsDriveAPIEnabled() | |
| 1130 ? itr->value().ToString() | |
| 1131 : drive::AddWapiFolderPrefix(itr->value().ToString()); | |
| 1132 | |
| 1102 bool result = incremental_sync_origins->insert( | 1133 bool result = incremental_sync_origins->insert( |
| 1103 std::make_pair(origin, itr->value().ToString())).second; | 1134 std::make_pair(origin, origin_resource_id)).second; |
| 1104 DCHECK(result); | 1135 DCHECK(result); |
| 1105 } | 1136 } |
| 1106 | 1137 |
| 1107 // Get disabled origins from the DB. | 1138 // Get disabled origins from the DB. |
| 1108 for (itr->Seek(kDriveDisabledOriginKeyPrefix); | 1139 for (itr->Seek(kDriveDisabledOriginKeyPrefix); |
| 1109 itr->Valid(); itr->Next()) { | 1140 itr->Valid(); itr->Next()) { |
| 1110 std::string key = itr->key().ToString(); | 1141 std::string key = itr->key().ToString(); |
| 1111 if (!StartsWithASCII(key, kDriveDisabledOriginKeyPrefix, true)) | 1142 if (!StartsWithASCII(key, kDriveDisabledOriginKeyPrefix, true)) |
| 1112 break; | 1143 break; |
| 1113 GURL origin(std::string( | 1144 GURL origin(RemovePrefix(key, kDriveDisabledOriginKeyPrefix)); |
| 1114 key.begin() + arraysize(kDriveDisabledOriginKeyPrefix) - 1, | |
| 1115 key.end())); | |
| 1116 DCHECK(origin.is_valid()); | 1145 DCHECK(origin.is_valid()); |
| 1146 | |
| 1147 std::string origin_resource_id = IsDriveAPIEnabled() | |
| 1148 ? itr->value().ToString() | |
| 1149 : drive::AddWapiFolderPrefix(itr->value().ToString()); | |
| 1150 | |
| 1117 bool result = disabled_origins->insert( | 1151 bool result = disabled_origins->insert( |
| 1118 std::make_pair(origin, itr->value().ToString())).second; | 1152 std::make_pair(origin, origin_resource_id)).second; |
| 1119 DCHECK(result); | 1153 DCHECK(result); |
| 1120 } | 1154 } |
| 1121 | 1155 |
| 1122 return SYNC_STATUS_OK; | 1156 return SYNC_STATUS_OK; |
| 1123 } | 1157 } |
| 1124 | 1158 |
| 1125 } // namespace sync_file_system | 1159 } // namespace sync_file_system |
| OLD | NEW |