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 26 matching lines...) Expand all Loading... | |
37 | 37 |
38 const char* const kServiceName = DriveFileSyncService::kServiceName; | 38 const char* const kServiceName = DriveFileSyncService::kServiceName; |
39 const char kDatabaseVersionKey[] = "VERSION"; | 39 const char kDatabaseVersionKey[] = "VERSION"; |
40 const int64 kCurrentDatabaseVersion = 1; | 40 const int64 kCurrentDatabaseVersion = 1; |
41 const char kChangeStampKey[] = "CHANGE_STAMP"; | 41 const char kChangeStampKey[] = "CHANGE_STAMP"; |
42 const char kSyncRootDirectoryKey[] = "SYNC_ROOT_DIR"; | 42 const char kSyncRootDirectoryKey[] = "SYNC_ROOT_DIR"; |
43 const char kDriveMetadataKeyPrefix[] = "METADATA: "; | 43 const char kDriveMetadataKeyPrefix[] = "METADATA: "; |
44 const char kMetadataKeySeparator = ' '; | 44 const char kMetadataKeySeparator = ' '; |
45 const char kDriveBatchSyncOriginKeyPrefix[] = "BSYNC_ORIGIN: "; | 45 const char kDriveBatchSyncOriginKeyPrefix[] = "BSYNC_ORIGIN: "; |
46 const char kDriveIncrementalSyncOriginKeyPrefix[] = "ISYNC_ORIGIN: "; | 46 const char kDriveIncrementalSyncOriginKeyPrefix[] = "ISYNC_ORIGIN: "; |
47 const char kDriveDisabledSyncOriginKeyPrefix[] = "DSYNC_ORIGIN: "; | |
47 const size_t kDriveMetadataKeyPrefixLength = arraysize(kDriveMetadataKeyPrefix); | 48 const size_t kDriveMetadataKeyPrefixLength = arraysize(kDriveMetadataKeyPrefix); |
48 | 49 |
49 const base::FilePath::CharType kV0FormatPathPrefix[] = | 50 const base::FilePath::CharType kV0FormatPathPrefix[] = |
50 FILE_PATH_LITERAL("drive/"); | 51 FILE_PATH_LITERAL("drive/"); |
51 | 52 |
52 bool ParseV0FormatFileSystemURLString(const GURL& url, | 53 bool ParseV0FormatFileSystemURLString(const GURL& url, |
53 GURL* origin, | 54 GURL* origin, |
54 base::FilePath* path) { | 55 base::FilePath* path) { |
55 fileapi::FileSystemType mount_type; | 56 fileapi::FileSystemType mount_type; |
56 base::FilePath virtual_path; | 57 base::FilePath virtual_path; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
104 SyncStatusCode MigrateDatabaseIfNeeded(); | 105 SyncStatusCode MigrateDatabaseIfNeeded(); |
105 SyncStatusCode MigrateFromVersion0Database(); | 106 SyncStatusCode MigrateFromVersion0Database(); |
106 | 107 |
107 SyncStatusCode SetLargestChangestamp(int64 largest_changestamp); | 108 SyncStatusCode SetLargestChangestamp(int64 largest_changestamp); |
108 SyncStatusCode SetSyncRootDirectory(const std::string& resource_id); | 109 SyncStatusCode SetSyncRootDirectory(const std::string& resource_id); |
109 SyncStatusCode GetSyncRootDirectory(std::string* resource_id); | 110 SyncStatusCode GetSyncRootDirectory(std::string* resource_id); |
110 SyncStatusCode UpdateEntry(const FileSystemURL& url, | 111 SyncStatusCode UpdateEntry(const FileSystemURL& url, |
111 const DriveMetadata& metadata); | 112 const DriveMetadata& metadata); |
112 SyncStatusCode DeleteEntry(const FileSystemURL& url); | 113 SyncStatusCode DeleteEntry(const FileSystemURL& url); |
113 | 114 |
115 // TODO(calvinlo): consolidate these state transition functions for sync | |
116 // origins like "UpdateSyncOrigin(GURL, SyncStatusEnum)". And manage origins | |
117 // in just one map like "Map<SyncStatusEnum, ResourceIDMap>". | |
kinuko
2013/03/16 23:16:51
Can we file a bug for this?
nhiroki
2013/03/18 09:40:18
Done.
| |
114 SyncStatusCode UpdateSyncOriginAsBatch(const GURL& origin, | 118 SyncStatusCode UpdateSyncOriginAsBatch(const GURL& origin, |
115 const std::string& resource_id); | 119 const std::string& resource_id); |
116 SyncStatusCode UpdateSyncOriginAsIncremental(const GURL& origin, | 120 SyncStatusCode UpdateSyncOriginAsIncremental(const GURL& origin, |
117 const std::string& resource_id); | 121 const std::string& resource_id); |
122 SyncStatusCode EnableOriginSync(const GURL& origin, | |
123 const std::string& resource_id); | |
124 SyncStatusCode DisableOriginSync(const GURL& origin, | |
125 const std::string& resource_id); | |
118 SyncStatusCode RemoveOrigin(const GURL& origin); | 126 SyncStatusCode RemoveOrigin(const GURL& origin); |
119 | 127 |
120 SyncStatusCode GetSyncOrigins(ResourceIDMap* batch_sync_origins, | 128 SyncStatusCode GetSyncOrigins(ResourceIDMap* batch_sync_origins, |
121 ResourceIDMap* incremental_sync_origins); | 129 ResourceIDMap* incremental_sync_origins, |
130 ResourceIDMap* disabled_sync_origins); | |
kinuko
2013/03/16 23:16:51
Hmm, ok so we seem to use the term 'SyncOrigin' a
nhiroki
2013/03/18 09:40:18
Looks good. (hopefully) I replaced them without an
| |
122 | 131 |
123 private: | 132 private: |
124 bool CalledOnValidThread() const { | 133 bool CalledOnValidThread() const { |
125 return task_runner_->RunsTasksOnCurrentThread(); | 134 return task_runner_->RunsTasksOnCurrentThread(); |
126 } | 135 } |
127 | 136 |
128 scoped_refptr<base::SequencedTaskRunner> task_runner_; | 137 scoped_refptr<base::SequencedTaskRunner> task_runner_; |
129 | 138 |
130 std::string db_path_; | 139 std::string db_path_; |
131 scoped_ptr<leveldb::DB> db_; | 140 scoped_ptr<leveldb::DB> db_; |
132 | 141 |
133 DISALLOW_COPY_AND_ASSIGN(DriveMetadataDB); | 142 DISALLOW_COPY_AND_ASSIGN(DriveMetadataDB); |
134 }; | 143 }; |
135 | 144 |
136 struct DriveMetadataDBContents { | 145 struct DriveMetadataDBContents { |
137 int64 largest_changestamp; | 146 int64 largest_changestamp; |
138 DriveMetadataStore::MetadataMap metadata_map; | 147 DriveMetadataStore::MetadataMap metadata_map; |
139 std::string sync_root_directory_resource_id; | 148 std::string sync_root_directory_resource_id; |
140 DriveMetadataStore::ResourceIDMap batch_sync_origins; | 149 DriveMetadataStore::ResourceIDMap batch_sync_origins; |
141 DriveMetadataStore::ResourceIDMap incremental_sync_origins; | 150 DriveMetadataStore::ResourceIDMap incremental_sync_origins; |
151 DriveMetadataStore::ResourceIDMap disabled_sync_origins; | |
142 }; | 152 }; |
143 | 153 |
144 namespace { | 154 namespace { |
145 | 155 |
146 SyncStatusCode InitializeDBOnFileThread(DriveMetadataDB* db, | 156 SyncStatusCode InitializeDBOnFileThread(DriveMetadataDB* db, |
147 DriveMetadataDBContents* contents) { | 157 DriveMetadataDBContents* contents) { |
148 DCHECK(db); | 158 DCHECK(db); |
149 DCHECK(contents); | 159 DCHECK(contents); |
150 | 160 |
151 contents->largest_changestamp = 0; | 161 contents->largest_changestamp = 0; |
152 contents->metadata_map.clear(); | 162 contents->metadata_map.clear(); |
153 contents->batch_sync_origins.clear(); | 163 contents->batch_sync_origins.clear(); |
154 contents->incremental_sync_origins.clear(); | 164 contents->incremental_sync_origins.clear(); |
165 contents->disabled_sync_origins.clear(); | |
155 | 166 |
156 bool created = false; | 167 bool created = false; |
157 SyncStatusCode status = db->Initialize(&created); | 168 SyncStatusCode status = db->Initialize(&created); |
158 if (status != SYNC_STATUS_OK) | 169 if (status != SYNC_STATUS_OK) |
159 return status; | 170 return status; |
160 | 171 |
161 if (!created) { | 172 if (!created) { |
162 status = db->MigrateDatabaseIfNeeded(); | 173 status = db->MigrateDatabaseIfNeeded(); |
163 if (status != SYNC_STATUS_OK) { | 174 if (status != SYNC_STATUS_OK) { |
164 LOG(WARNING) << "Failed to migrate DriveMetadataStore to latest version."; | 175 LOG(WARNING) << "Failed to migrate DriveMetadataStore to latest version."; |
165 return status; | 176 return status; |
166 } | 177 } |
167 } | 178 } |
168 | 179 |
169 return db->ReadContents(contents); | 180 return db->ReadContents(contents); |
170 } | 181 } |
171 | 182 |
183 | |
172 // Returns a key string for the given batch sync origin. | 184 // Returns a key string for the given batch sync origin. |
173 // For example, when |origin| is "http://www.example.com", | 185 // For example, when |origin| is "http://www.example.com", |
174 // returns "BSYNC_ORIGIN: http://www.example.com". | 186 // returns "BSYNC_ORIGIN: http://www.example.com". |
187 // TODO(calvinlo): consolidate these CreateKeyFor* functions. | |
175 std::string CreateKeyForBatchSyncOrigin(const GURL& origin) { | 188 std::string CreateKeyForBatchSyncOrigin(const GURL& origin) { |
176 DCHECK(origin.is_valid()); | 189 DCHECK(origin.is_valid()); |
177 return kDriveBatchSyncOriginKeyPrefix + origin.spec(); | 190 return kDriveBatchSyncOriginKeyPrefix + origin.spec(); |
178 } | 191 } |
179 | 192 |
180 // Returns a key string for the given incremental sync origin. | 193 // Returns a key string for the given incremental sync origin. |
181 // For example, when |origin| is "http://www.example.com", | 194 // For example, when |origin| is "http://www.example.com", |
182 // returns "ISYNC_ORIGIN: http://www.example.com". | 195 // returns "ISYNC_ORIGIN: http://www.example.com". |
183 std::string CreateKeyForIncrementalSyncOrigin(const GURL& origin) { | 196 std::string CreateKeyForIncrementalSyncOrigin(const GURL& origin) { |
184 DCHECK(origin.is_valid()); | 197 DCHECK(origin.is_valid()); |
185 return kDriveIncrementalSyncOriginKeyPrefix + origin.spec(); | 198 return kDriveIncrementalSyncOriginKeyPrefix + origin.spec(); |
186 } | 199 } |
187 | 200 |
201 // Returns a key string for the given disabled sync origin. | |
202 // For example, when |origin| is "http://www.example.com", | |
203 // returns "DSYNC_ORIGIN: http://www.example.com". | |
204 std::string CreateKeyForDisabledSyncOrigin(const GURL& origin) { | |
205 DCHECK(origin.is_valid()); | |
206 return kDriveDisabledSyncOriginKeyPrefix + origin.spec(); | |
207 } | |
208 | |
188 void AddOriginsToVector(std::vector<GURL>* all_origins, | 209 void AddOriginsToVector(std::vector<GURL>* all_origins, |
189 const DriveMetadataStore::ResourceIDMap& resource_map) { | 210 const DriveMetadataStore::ResourceIDMap& resource_map) { |
190 typedef DriveMetadataStore::ResourceIDMap::const_iterator itr; | 211 typedef DriveMetadataStore::ResourceIDMap::const_iterator itr; |
191 for (std::map<GURL, std::string>::const_iterator itr = resource_map.begin(); | 212 for (std::map<GURL, std::string>::const_iterator itr = resource_map.begin(); |
192 itr != resource_map.end(); | 213 itr != resource_map.end(); |
193 ++itr) { | 214 ++itr) { |
194 all_origins->push_back(itr->first); | 215 all_origins->push_back(itr->first); |
195 } | 216 } |
196 } | 217 } |
197 | 218 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
233 if (status != SYNC_STATUS_OK) { | 254 if (status != SYNC_STATUS_OK) { |
234 callback.Run(status, false); | 255 callback.Run(status, false); |
235 return; | 256 return; |
236 } | 257 } |
237 | 258 |
238 largest_changestamp_ = contents->largest_changestamp; | 259 largest_changestamp_ = contents->largest_changestamp; |
239 metadata_map_.swap(contents->metadata_map); | 260 metadata_map_.swap(contents->metadata_map); |
240 sync_root_directory_resource_id_ = contents->sync_root_directory_resource_id; | 261 sync_root_directory_resource_id_ = contents->sync_root_directory_resource_id; |
241 batch_sync_origins_.swap(contents->batch_sync_origins); | 262 batch_sync_origins_.swap(contents->batch_sync_origins); |
242 incremental_sync_origins_.swap(contents->incremental_sync_origins); | 263 incremental_sync_origins_.swap(contents->incremental_sync_origins); |
264 disabled_sync_origins_.swap(contents->disabled_sync_origins); | |
243 // |largest_changestamp_| is set to 0 for a fresh empty database. | 265 // |largest_changestamp_| is set to 0 for a fresh empty database. |
244 callback.Run(status, largest_changestamp_ <= 0); | 266 callback.Run(status, largest_changestamp_ <= 0); |
245 } | 267 } |
246 | 268 |
247 void DriveMetadataStore::RestoreSyncRootDirectory( | 269 void DriveMetadataStore::RestoreSyncRootDirectory( |
248 const SyncStatusCallback& callback) { | 270 const SyncStatusCallback& callback) { |
249 DCHECK(CalledOnValidThread()); | 271 DCHECK(CalledOnValidThread()); |
250 std::string* sync_root_directory_resource_id = new std::string; | 272 std::string* sync_root_directory_resource_id = new std::string; |
251 base::PostTaskAndReplyWithResult( | 273 base::PostTaskAndReplyWithResult( |
252 file_task_runner_, FROM_HERE, | 274 file_task_runner_, FROM_HERE, |
(...skipping 20 matching lines...) Expand all Loading... | |
273 | 295 |
274 sync_root_directory_resource_id_.swap(*sync_root_directory_resource_id); | 296 sync_root_directory_resource_id_.swap(*sync_root_directory_resource_id); |
275 callback.Run(status); | 297 callback.Run(status); |
276 } | 298 } |
277 | 299 |
278 void DriveMetadataStore::RestoreSyncOrigins( | 300 void DriveMetadataStore::RestoreSyncOrigins( |
279 const SyncStatusCallback& callback) { | 301 const SyncStatusCallback& callback) { |
280 DCHECK(CalledOnValidThread()); | 302 DCHECK(CalledOnValidThread()); |
281 ResourceIDMap* batch_sync_origins = new ResourceIDMap; | 303 ResourceIDMap* batch_sync_origins = new ResourceIDMap; |
282 ResourceIDMap* incremental_sync_origins = new ResourceIDMap; | 304 ResourceIDMap* incremental_sync_origins = new ResourceIDMap; |
305 ResourceIDMap* disabled_sync_origins = new ResourceIDMap; | |
283 base::PostTaskAndReplyWithResult( | 306 base::PostTaskAndReplyWithResult( |
284 file_task_runner_, FROM_HERE, | 307 file_task_runner_, FROM_HERE, |
285 base::Bind(&DriveMetadataDB::GetSyncOrigins, | 308 base::Bind(&DriveMetadataDB::GetSyncOrigins, |
286 base::Unretained(db_.get()), | 309 base::Unretained(db_.get()), |
287 batch_sync_origins, | 310 batch_sync_origins, |
288 incremental_sync_origins), | 311 incremental_sync_origins, |
312 disabled_sync_origins), | |
289 base::Bind(&DriveMetadataStore::DidRestoreSyncOrigins, | 313 base::Bind(&DriveMetadataStore::DidRestoreSyncOrigins, |
290 AsWeakPtr(), callback, | 314 AsWeakPtr(), callback, |
291 base::Owned(batch_sync_origins), | 315 base::Owned(batch_sync_origins), |
292 base::Owned(incremental_sync_origins))); | 316 base::Owned(incremental_sync_origins), |
317 base::Owned(disabled_sync_origins))); | |
293 } | 318 } |
294 | 319 |
295 void DriveMetadataStore::DidRestoreSyncOrigins( | 320 void DriveMetadataStore::DidRestoreSyncOrigins( |
296 const SyncStatusCallback& callback, | 321 const SyncStatusCallback& callback, |
297 ResourceIDMap* batch_sync_origins, | 322 ResourceIDMap* batch_sync_origins, |
298 ResourceIDMap* incremental_sync_origins, | 323 ResourceIDMap* incremental_sync_origins, |
324 ResourceIDMap* disabled_sync_origins, | |
299 SyncStatusCode status) { | 325 SyncStatusCode status) { |
300 DCHECK(CalledOnValidThread()); | 326 DCHECK(CalledOnValidThread()); |
301 DCHECK(batch_sync_origins); | 327 DCHECK(batch_sync_origins); |
302 DCHECK(incremental_sync_origins); | 328 DCHECK(incremental_sync_origins); |
329 DCHECK(disabled_sync_origins); | |
303 | 330 |
304 db_status_ = status; | 331 db_status_ = status; |
305 if (status != SYNC_STATUS_OK) { | 332 if (status != SYNC_STATUS_OK) { |
306 callback.Run(status); | 333 callback.Run(status); |
307 return; | 334 return; |
308 } | 335 } |
309 | 336 |
310 batch_sync_origins_.swap(*batch_sync_origins); | 337 batch_sync_origins_.swap(*batch_sync_origins); |
311 incremental_sync_origins_.swap(*incremental_sync_origins); | 338 incremental_sync_origins_.swap(*incremental_sync_origins); |
339 disabled_sync_origins_.swap(*disabled_sync_origins); | |
312 callback.Run(status); | 340 callback.Run(status); |
313 } | 341 } |
314 | 342 |
315 void DriveMetadataStore::SetLargestChangeStamp( | 343 void DriveMetadataStore::SetLargestChangeStamp( |
316 int64 largest_changestamp, | 344 int64 largest_changestamp, |
317 const SyncStatusCallback& callback) { | 345 const SyncStatusCallback& callback) { |
318 DCHECK(CalledOnValidThread()); | 346 DCHECK(CalledOnValidThread()); |
319 DCHECK_EQ(SYNC_STATUS_OK, db_status_); | 347 DCHECK_EQ(SYNC_STATUS_OK, db_status_); |
320 largest_changestamp_ = largest_changestamp; | 348 largest_changestamp_ = largest_changestamp; |
321 base::PostTaskAndReplyWithResult( | 349 base::PostTaskAndReplyWithResult( |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
413 bool DriveMetadataStore::IsBatchSyncOrigin(const GURL& origin) const { | 441 bool DriveMetadataStore::IsBatchSyncOrigin(const GURL& origin) const { |
414 DCHECK(CalledOnValidThread()); | 442 DCHECK(CalledOnValidThread()); |
415 return ContainsKey(batch_sync_origins_, origin); | 443 return ContainsKey(batch_sync_origins_, origin); |
416 } | 444 } |
417 | 445 |
418 bool DriveMetadataStore::IsIncrementalSyncOrigin(const GURL& origin) const { | 446 bool DriveMetadataStore::IsIncrementalSyncOrigin(const GURL& origin) const { |
419 DCHECK(CalledOnValidThread()); | 447 DCHECK(CalledOnValidThread()); |
420 return ContainsKey(incremental_sync_origins_, origin); | 448 return ContainsKey(incremental_sync_origins_, origin); |
421 } | 449 } |
422 | 450 |
451 bool DriveMetadataStore::IsDisabledSyncOrigin(const GURL& origin) const { | |
452 DCHECK(CalledOnValidThread()); | |
453 return ContainsKey(disabled_sync_origins_, origin); | |
454 } | |
455 | |
423 void DriveMetadataStore::AddBatchSyncOrigin(const GURL& origin, | 456 void DriveMetadataStore::AddBatchSyncOrigin(const GURL& origin, |
424 const std::string& resource_id) { | 457 const std::string& resource_id) { |
425 DCHECK(CalledOnValidThread()); | 458 DCHECK(CalledOnValidThread()); |
426 DCHECK(!IsBatchSyncOrigin(origin)); | 459 DCHECK(!IsBatchSyncOrigin(origin)); |
427 DCHECK(!IsIncrementalSyncOrigin(origin)); | 460 DCHECK(!IsIncrementalSyncOrigin(origin)); |
461 DCHECK(!IsDisabledSyncOrigin(origin)); | |
428 DCHECK_EQ(SYNC_STATUS_OK, db_status_); | 462 DCHECK_EQ(SYNC_STATUS_OK, db_status_); |
429 | 463 |
430 batch_sync_origins_.insert(std::make_pair(origin, resource_id)); | 464 batch_sync_origins_.insert(std::make_pair(origin, resource_id)); |
431 | 465 |
432 // Store a pair of |origin| and |resource_id| in the DB. | 466 // Store a pair of |origin| and |resource_id| in the DB. |
433 base::PostTaskAndReplyWithResult( | 467 base::PostTaskAndReplyWithResult( |
434 file_task_runner_, FROM_HERE, | 468 file_task_runner_, FROM_HERE, |
435 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsBatch, | 469 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsBatch, |
436 base::Unretained(db_.get()), origin, resource_id), | 470 base::Unretained(db_.get()), origin, resource_id), |
437 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); | 471 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); |
438 } | 472 } |
439 | 473 |
440 void DriveMetadataStore::MoveBatchSyncOriginToIncremental(const GURL& origin) { | 474 void DriveMetadataStore::MoveBatchSyncOriginToIncremental(const GURL& origin) { |
441 DCHECK(CalledOnValidThread()); | 475 DCHECK(CalledOnValidThread()); |
442 DCHECK(IsBatchSyncOrigin(origin)); | 476 DCHECK(IsBatchSyncOrigin(origin)); |
443 DCHECK(!IsIncrementalSyncOrigin(origin)); | 477 DCHECK(!IsIncrementalSyncOrigin(origin)); |
478 DCHECK(!IsDisabledSyncOrigin(origin)); | |
444 DCHECK_EQ(SYNC_STATUS_OK, db_status_); | 479 DCHECK_EQ(SYNC_STATUS_OK, db_status_); |
445 | 480 |
446 std::map<GURL, std::string>::iterator found = | 481 std::map<GURL, std::string>::iterator found = |
447 batch_sync_origins_.find(origin); | 482 batch_sync_origins_.find(origin); |
448 incremental_sync_origins_.insert(std::make_pair(origin, found->second)); | 483 incremental_sync_origins_.insert(std::make_pair(origin, found->second)); |
449 | 484 |
450 // Store a pair of |origin| and |resource_id| in the DB. | 485 // Store a pair of |origin| and |resource_id| in the DB. |
451 base::PostTaskAndReplyWithResult( | 486 base::PostTaskAndReplyWithResult( |
452 file_task_runner_, FROM_HERE, | 487 file_task_runner_, FROM_HERE, |
453 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsIncremental, | 488 base::Bind(&DriveMetadataDB::UpdateSyncOriginAsIncremental, |
454 base::Unretained(db_.get()), origin, found->second), | 489 base::Unretained(db_.get()), origin, found->second), |
455 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); | 490 base::Bind(&DriveMetadataStore::UpdateDBStatus, AsWeakPtr())); |
456 | 491 |
457 batch_sync_origins_.erase(found); | 492 batch_sync_origins_.erase(found); |
458 } | 493 } |
459 | 494 |
495 void DriveMetadataStore::EnableOriginSync( | |
496 const GURL& origin, | |
497 const SyncStatusCallback& callback) { | |
498 DCHECK(CalledOnValidThread()); | |
499 DCHECK(IsDisabledSyncOrigin(origin)); | |
500 DCHECK(!IsBatchSyncOrigin(origin)); | |
501 DCHECK(!IsIncrementalSyncOrigin(origin)); | |
kinuko
2013/03/16 23:16:51
Nit-picky comment: If we had a crash after an exte
nhiroki
2013/03/18 09:40:18
You are right. I think it's not needed to check th
| |
502 | |
503 std::map<GURL, std::string>::iterator found = | |
504 disabled_sync_origins_.find(origin); | |
505 batch_sync_origins_.insert(std::make_pair(origin, found->second)); | |
506 | |
507 // Store a pair of |origin| and |resource_id| in the DB. | |
508 base::PostTaskAndReplyWithResult( | |
509 file_task_runner_, FROM_HERE, | |
510 base::Bind(&DriveMetadataDB::EnableOriginSync, | |
511 base::Unretained(db_.get()), origin, found->second), | |
512 base::Bind(&DriveMetadataStore::DidChangeOrigin, AsWeakPtr(), callback)); | |
513 | |
514 disabled_sync_origins_.erase(found); | |
515 } | |
516 | |
517 void DriveMetadataStore::DisableOriginSync( | |
518 const GURL& origin, | |
519 const SyncStatusCallback& callback) { | |
520 DCHECK(CalledOnValidThread()); | |
521 DCHECK(IsBatchSyncOrigin(origin) || IsIncrementalSyncOrigin(origin)); | |
522 DCHECK(!IsDisabledSyncOrigin(origin)); | |
kinuko
2013/03/16 23:16:51
Ditto.
nhiroki
2013/03/18 09:40:18
Done.
| |
523 | |
524 std::string resource_id; | |
525 std::map<GURL, std::string>::iterator found = | |
526 batch_sync_origins_.find(origin); | |
527 if (found != batch_sync_origins_.end()) { | |
528 resource_id = found->second; | |
529 batch_sync_origins_.erase(found); | |
530 } | |
531 | |
532 found = incremental_sync_origins_.find(origin); | |
533 if (found != incremental_sync_origins_.end()) { | |
534 resource_id = found->second; | |
535 incremental_sync_origins_.erase(found); | |
536 } | |
537 | |
538 DCHECK(!resource_id.empty()); | |
539 disabled_sync_origins_.insert(std::make_pair(origin, resource_id)); | |
540 | |
541 // Store a pair of |origin| and |resource_id| in the DB. | |
542 base::PostTaskAndReplyWithResult( | |
543 file_task_runner_, FROM_HERE, | |
544 base::Bind(&DriveMetadataDB::DisableOriginSync, | |
545 base::Unretained(db_.get()), origin, resource_id), | |
546 base::Bind(&DriveMetadataStore::DidChangeOrigin, AsWeakPtr(), callback)); | |
547 } | |
548 | |
460 void DriveMetadataStore::RemoveOrigin( | 549 void DriveMetadataStore::RemoveOrigin( |
461 const GURL& origin, | 550 const GURL& origin, |
462 const SyncStatusCallback& callback) { | 551 const SyncStatusCallback& callback) { |
463 DCHECK(CalledOnValidThread()); | 552 DCHECK(CalledOnValidThread()); |
464 | 553 |
465 metadata_map_.erase(origin); | 554 metadata_map_.erase(origin); |
466 batch_sync_origins_.erase(origin); | 555 batch_sync_origins_.erase(origin); |
467 incremental_sync_origins_.erase(origin); | 556 incremental_sync_origins_.erase(origin); |
557 disabled_sync_origins_.erase(origin); | |
468 | 558 |
469 base::PostTaskAndReplyWithResult( | 559 base::PostTaskAndReplyWithResult( |
470 file_task_runner_, FROM_HERE, | 560 file_task_runner_, FROM_HERE, |
471 base::Bind(&DriveMetadataDB::RemoveOrigin, | 561 base::Bind(&DriveMetadataDB::RemoveOrigin, |
472 base::Unretained(db_.get()), origin), | 562 base::Unretained(db_.get()), origin), |
473 base::Bind(&DriveMetadataStore::DidRemoveOrigin, AsWeakPtr(), callback)); | 563 base::Bind(&DriveMetadataStore::DidChangeOrigin, AsWeakPtr(), callback)); |
474 } | 564 } |
475 | 565 |
476 void DriveMetadataStore::DidRemoveOrigin( | 566 void DriveMetadataStore::DidChangeOrigin( |
477 const SyncStatusCallback& callback, | 567 const SyncStatusCallback& callback, |
478 SyncStatusCode status) { | 568 SyncStatusCode status) { |
479 UpdateDBStatus(status); | 569 UpdateDBStatus(status); |
480 callback.Run(status); | 570 callback.Run(status); |
481 } | 571 } |
482 | 572 |
483 void DriveMetadataStore::UpdateDBStatus(SyncStatusCode status) { | 573 void DriveMetadataStore::UpdateDBStatus(SyncStatusCode status) { |
484 DCHECK(CalledOnValidThread()); | 574 DCHECK(CalledOnValidThread()); |
485 if (db_status_ != SYNC_STATUS_OK && | 575 if (db_status_ != SYNC_STATUS_OK && |
486 db_status_ != SYNC_DATABASE_ERROR_NOT_FOUND) { | 576 db_status_ != SYNC_DATABASE_ERROR_NOT_FOUND) { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
538 list->push_back(std::make_pair(url, itr->second.resource_id())); | 628 list->push_back(std::make_pair(url, itr->second.resource_id())); |
539 } | 629 } |
540 } | 630 } |
541 } | 631 } |
542 return SYNC_STATUS_OK; | 632 return SYNC_STATUS_OK; |
543 } | 633 } |
544 | 634 |
545 std::string DriveMetadataStore::GetResourceIdForOrigin( | 635 std::string DriveMetadataStore::GetResourceIdForOrigin( |
546 const GURL& origin) const { | 636 const GURL& origin) const { |
547 DCHECK(CalledOnValidThread()); | 637 DCHECK(CalledOnValidThread()); |
548 DCHECK(IsBatchSyncOrigin(origin) || IsIncrementalSyncOrigin(origin)); | 638 DCHECK(IsBatchSyncOrigin(origin) || |
639 IsIncrementalSyncOrigin(origin) || | |
640 IsDisabledSyncOrigin(origin)); | |
549 | 641 |
550 ResourceIDMap::const_iterator found = incremental_sync_origins_.find(origin); | 642 ResourceIDMap::const_iterator found = incremental_sync_origins_.find(origin); |
551 if (found != incremental_sync_origins_.end()) | 643 if (found != incremental_sync_origins_.end()) |
552 return found->second; | 644 return found->second; |
553 | 645 |
554 found = batch_sync_origins_.find(origin); | 646 found = batch_sync_origins_.find(origin); |
555 if (found != batch_sync_origins_.end()) | 647 if (found != batch_sync_origins_.end()) |
556 return found->second; | 648 return found->second; |
557 | 649 |
650 found = disabled_sync_origins_.find(origin); | |
651 if (found != disabled_sync_origins_.end()) | |
652 return found->second; | |
653 | |
558 NOTREACHED(); | 654 NOTREACHED(); |
559 return std::string(); | 655 return std::string(); |
560 } | 656 } |
561 | 657 |
562 void DriveMetadataStore::GetAllOrigins(std::vector<GURL>* origins) { | 658 void DriveMetadataStore::GetEnabledOrigins(std::vector<GURL>* origins) { |
659 origins->clear(); | |
563 origins->reserve(batch_sync_origins_.size() + | 660 origins->reserve(batch_sync_origins_.size() + |
564 incremental_sync_origins_.size()); | 661 incremental_sync_origins_.size()); |
565 AddOriginsToVector(origins, batch_sync_origins_); | 662 AddOriginsToVector(origins, batch_sync_origins_); |
566 AddOriginsToVector(origins, incremental_sync_origins_); | 663 AddOriginsToVector(origins, incremental_sync_origins_); |
567 } | 664 } |
568 | 665 |
666 void DriveMetadataStore::GetDisabledOrigins(std::vector<GURL>* origins) { | |
667 origins->clear(); | |
668 origins->reserve(disabled_sync_origins_.size()); | |
669 AddOriginsToVector(origins, disabled_sync_origins_); | |
670 } | |
671 | |
569 //////////////////////////////////////////////////////////////////////////////// | 672 //////////////////////////////////////////////////////////////////////////////// |
570 | 673 |
571 DriveMetadataDB::DriveMetadataDB(const base::FilePath& base_dir, | 674 DriveMetadataDB::DriveMetadataDB(const base::FilePath& base_dir, |
572 base::SequencedTaskRunner* task_runner) | 675 base::SequencedTaskRunner* task_runner) |
573 : task_runner_(task_runner), | 676 : task_runner_(task_runner), |
574 db_path_(fileapi::FilePathToString( | 677 db_path_(fileapi::FilePathToString( |
575 base_dir.Append(DriveMetadataStore::kDatabaseName))) { | 678 base_dir.Append(DriveMetadataStore::kDatabaseName))) { |
576 } | 679 } |
577 | 680 |
578 DriveMetadataDB::~DriveMetadataDB() { | 681 DriveMetadataDB::~DriveMetadataDB() { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
639 bool success = metadata.ParseFromString(itr->value().ToString()); | 742 bool success = metadata.ParseFromString(itr->value().ToString()); |
640 DCHECK(success); | 743 DCHECK(success); |
641 | 744 |
642 success = contents->metadata_map[origin].insert( | 745 success = contents->metadata_map[origin].insert( |
643 std::make_pair(path, metadata)).second; | 746 std::make_pair(path, metadata)).second; |
644 DCHECK(success); | 747 DCHECK(success); |
645 } | 748 } |
646 } | 749 } |
647 | 750 |
648 SyncStatusCode status = GetSyncOrigins(&contents->batch_sync_origins, | 751 SyncStatusCode status = GetSyncOrigins(&contents->batch_sync_origins, |
649 &contents->incremental_sync_origins); | 752 &contents->incremental_sync_origins, |
753 &contents->disabled_sync_origins); | |
650 if (status != SYNC_STATUS_OK && | 754 if (status != SYNC_STATUS_OK && |
651 status != SYNC_DATABASE_ERROR_NOT_FOUND) | 755 status != SYNC_DATABASE_ERROR_NOT_FOUND) |
652 return status; | 756 return status; |
653 | 757 |
654 status = GetSyncRootDirectory(&contents->sync_root_directory_resource_id); | 758 status = GetSyncRootDirectory(&contents->sync_root_directory_resource_id); |
655 if (status != SYNC_STATUS_OK && | 759 if (status != SYNC_STATUS_OK && |
656 status != SYNC_DATABASE_ERROR_NOT_FOUND) | 760 status != SYNC_DATABASE_ERROR_NOT_FOUND) |
657 return status; | 761 return status; |
658 | 762 |
659 return SYNC_STATUS_OK; | 763 return SYNC_STATUS_OK; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
711 // value: <Resource ID of the sync root directory> | 815 // value: <Resource ID of the sync root directory> |
712 // | 816 // |
713 // * key: "METADATA: " + <Origin and URL> (changed) | 817 // * key: "METADATA: " + <Origin and URL> (changed) |
714 // * value: <Serialized DriveMetadata> | 818 // * value: <Serialized DriveMetadata> |
715 // | 819 // |
716 // key: "BSYNC_ORIGIN: " + <URL string of a batch sync origin> | 820 // key: "BSYNC_ORIGIN: " + <URL string of a batch sync origin> |
717 // value: <Resource ID of the drive directory for the origin> | 821 // value: <Resource ID of the drive directory for the origin> |
718 // | 822 // |
719 // key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin> | 823 // key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin> |
720 // value: <Resource ID of the drive directory for the origin> | 824 // value: <Resource ID of the drive directory for the origin> |
825 // | |
826 // key: "DSYNC_ORIGIN: " + <URL string of a disabled sync origin> | |
827 // value: <Resource ID of the drive directory for the origin> | |
721 | 828 |
722 leveldb::WriteBatch write_batch; | 829 leveldb::WriteBatch write_batch; |
723 write_batch.Put(kDatabaseVersionKey, | 830 write_batch.Put(kDatabaseVersionKey, |
724 base::Int64ToString(kCurrentDatabaseVersion)); | 831 base::Int64ToString(kCurrentDatabaseVersion)); |
725 | 832 |
726 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); | 833 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); |
727 for (itr->Seek(kDriveMetadataKeyPrefix); itr->Valid(); itr->Next()) { | 834 for (itr->Seek(kDriveMetadataKeyPrefix); itr->Valid(); itr->Next()) { |
728 std::string key = itr->key().ToString(); | 835 std::string key = itr->key().ToString(); |
729 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) | 836 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) |
730 break; | 837 break; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
813 return LevelDBStatusToSyncStatusCode(status); | 920 return LevelDBStatusToSyncStatusCode(status); |
814 } | 921 } |
815 | 922 |
816 SyncStatusCode DriveMetadataDB::UpdateSyncOriginAsIncremental( | 923 SyncStatusCode DriveMetadataDB::UpdateSyncOriginAsIncremental( |
817 const GURL& origin, const std::string& resource_id) { | 924 const GURL& origin, const std::string& resource_id) { |
818 DCHECK(CalledOnValidThread()); | 925 DCHECK(CalledOnValidThread()); |
819 DCHECK(db_.get()); | 926 DCHECK(db_.get()); |
820 | 927 |
821 leveldb::WriteBatch batch; | 928 leveldb::WriteBatch batch; |
822 batch.Delete(CreateKeyForBatchSyncOrigin(origin)); | 929 batch.Delete(CreateKeyForBatchSyncOrigin(origin)); |
930 batch.Delete(CreateKeyForDisabledSyncOrigin(origin)); | |
823 batch.Put(CreateKeyForIncrementalSyncOrigin(origin), resource_id); | 931 batch.Put(CreateKeyForIncrementalSyncOrigin(origin), resource_id); |
824 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); | 932 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); |
825 | 933 |
826 return LevelDBStatusToSyncStatusCode(status); | 934 return LevelDBStatusToSyncStatusCode(status); |
827 } | 935 } |
828 | 936 |
937 SyncStatusCode DriveMetadataDB::EnableOriginSync( | |
938 const GURL& origin, const std::string& resource_id) { | |
939 DCHECK(CalledOnValidThread()); | |
940 DCHECK(db_.get()); | |
941 | |
942 leveldb::WriteBatch batch; | |
943 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin)); | |
944 batch.Delete(CreateKeyForDisabledSyncOrigin(origin)); | |
945 batch.Put(CreateKeyForBatchSyncOrigin(origin), resource_id); | |
946 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); | |
947 | |
948 return LevelDBStatusToSyncStatusCode(status); | |
949 } | |
950 | |
951 SyncStatusCode DriveMetadataDB::DisableOriginSync( | |
952 const GURL& origin, const std::string& resource_id) { | |
953 DCHECK(CalledOnValidThread()); | |
954 DCHECK(db_.get()); | |
955 | |
956 leveldb::WriteBatch batch; | |
957 batch.Delete(CreateKeyForBatchSyncOrigin(origin)); | |
958 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin)); | |
959 batch.Put(CreateKeyForDisabledSyncOrigin(origin), resource_id); | |
960 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); | |
961 | |
962 return LevelDBStatusToSyncStatusCode(status); | |
963 } | |
964 | |
829 SyncStatusCode DriveMetadataDB::RemoveOrigin(const GURL& origin_to_remove) { | 965 SyncStatusCode DriveMetadataDB::RemoveOrigin(const GURL& origin_to_remove) { |
830 DCHECK(CalledOnValidThread()); | 966 DCHECK(CalledOnValidThread()); |
831 | 967 |
832 leveldb::WriteBatch batch; | 968 leveldb::WriteBatch batch; |
833 batch.Delete(kDriveBatchSyncOriginKeyPrefix + origin_to_remove.spec()); | 969 batch.Delete(CreateKeyForBatchSyncOrigin(origin_to_remove)); |
834 batch.Delete(kDriveIncrementalSyncOriginKeyPrefix + origin_to_remove.spec()); | 970 batch.Delete(CreateKeyForIncrementalSyncOrigin(origin_to_remove)); |
971 batch.Delete(CreateKeyForDisabledSyncOrigin(origin_to_remove)); | |
835 | 972 |
836 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); | 973 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); |
837 std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_remove.spec(); | 974 std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_remove.spec(); |
838 for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) { | 975 for (itr->Seek(metadata_key); itr->Valid(); itr->Next()) { |
839 std::string key = itr->key().ToString(); | 976 std::string key = itr->key().ToString(); |
840 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) | 977 if (!StartsWithASCII(key, kDriveMetadataKeyPrefix, true)) |
841 break; | 978 break; |
842 GURL origin; | 979 GURL origin; |
843 base::FilePath path; | 980 base::FilePath path; |
844 MetadataKeyToOriginAndPath(key, &origin, &path); | 981 MetadataKeyToOriginAndPath(key, &origin, &path); |
845 if (origin != origin_to_remove) | 982 if (origin != origin_to_remove) |
846 break; | 983 break; |
847 batch.Delete(key); | 984 batch.Delete(key); |
848 } | 985 } |
849 | 986 |
850 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); | 987 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); |
851 return LevelDBStatusToSyncStatusCode(status); | 988 return LevelDBStatusToSyncStatusCode(status); |
852 } | 989 } |
853 | 990 |
854 SyncStatusCode DriveMetadataDB::GetSyncOrigins( | 991 SyncStatusCode DriveMetadataDB::GetSyncOrigins( |
855 ResourceIDMap* batch_sync_origins, | 992 ResourceIDMap* batch_sync_origins, |
856 ResourceIDMap* incremental_sync_origins) { | 993 ResourceIDMap* incremental_sync_origins, |
994 ResourceIDMap* disabled_sync_origins) { | |
857 DCHECK(CalledOnValidThread()); | 995 DCHECK(CalledOnValidThread()); |
858 DCHECK(db_.get()); | 996 DCHECK(db_.get()); |
859 | 997 |
860 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); | 998 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); |
861 | 999 |
862 // Get batch sync origins from the DB. | 1000 // Get batch sync origins from the DB. |
863 for (itr->Seek(kDriveBatchSyncOriginKeyPrefix); | 1001 for (itr->Seek(kDriveBatchSyncOriginKeyPrefix); |
864 itr->Valid(); itr->Next()) { | 1002 itr->Valid(); itr->Next()) { |
865 std::string key = itr->key().ToString(); | 1003 std::string key = itr->key().ToString(); |
866 if (!StartsWithASCII(key, kDriveBatchSyncOriginKeyPrefix, true)) | 1004 if (!StartsWithASCII(key, kDriveBatchSyncOriginKeyPrefix, true)) |
(...skipping 15 matching lines...) Expand all Loading... | |
882 break; | 1020 break; |
883 GURL origin(std::string( | 1021 GURL origin(std::string( |
884 key.begin() + arraysize(kDriveIncrementalSyncOriginKeyPrefix) - 1, | 1022 key.begin() + arraysize(kDriveIncrementalSyncOriginKeyPrefix) - 1, |
885 key.end())); | 1023 key.end())); |
886 DCHECK(origin.is_valid()); | 1024 DCHECK(origin.is_valid()); |
887 bool result = incremental_sync_origins->insert( | 1025 bool result = incremental_sync_origins->insert( |
888 std::make_pair(origin, itr->value().ToString())).second; | 1026 std::make_pair(origin, itr->value().ToString())).second; |
889 DCHECK(result); | 1027 DCHECK(result); |
890 } | 1028 } |
891 | 1029 |
1030 // Get disabled sync origins from the DB. | |
1031 for (itr->Seek(kDriveDisabledSyncOriginKeyPrefix); | |
1032 itr->Valid(); itr->Next()) { | |
1033 std::string key = itr->key().ToString(); | |
1034 if (!StartsWithASCII(key, kDriveDisabledSyncOriginKeyPrefix, true)) | |
1035 break; | |
1036 GURL origin(std::string( | |
1037 key.begin() + arraysize(kDriveDisabledSyncOriginKeyPrefix) - 1, | |
1038 key.end())); | |
1039 DCHECK(origin.is_valid()); | |
1040 bool result = disabled_sync_origins->insert( | |
1041 std::make_pair(origin, itr->value().ToString())).second; | |
1042 DCHECK(result); | |
1043 } | |
1044 | |
892 return SYNC_STATUS_OK; | 1045 return SYNC_STATUS_OK; |
893 } | 1046 } |
894 | 1047 |
895 } // namespace sync_file_system | 1048 } // namespace sync_file_system |
OLD | NEW |