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 |