| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/browser/service_worker/service_worker_database.h" | 5 #include "content/browser/service_worker/service_worker_database.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| 11 #include "base/location.h" | 11 #include "base/location.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/metrics/histogram_macros.h" | 13 #include "base/metrics/histogram_macros.h" |
| 14 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
| 15 #include "base/strings/string_number_conversions.h" | 15 #include "base/strings/string_number_conversions.h" |
| 16 #include "base/strings/string_split.h" | 16 #include "base/strings/string_split.h" |
| 17 #include "base/strings/string_util.h" | 17 #include "base/strings/string_util.h" |
| 18 #include "base/strings/stringprintf.h" | 18 #include "base/strings/stringprintf.h" |
| 19 #include "content/browser/service_worker/service_worker_database.pb.h" | 19 #include "content/browser/service_worker/service_worker_database.pb.h" |
| 20 #include "content/browser/service_worker/service_worker_metrics.h" | 20 #include "content/browser/service_worker/service_worker_metrics.h" |
| 21 #include "content/common/service_worker/service_worker_utils.h" | 21 #include "content/common/service_worker/service_worker_utils.h" |
| 22 #include "third_party/leveldatabase/env_chromium.h" | 22 #include "third_party/leveldatabase/env_chromium.h" |
| 23 #include "third_party/leveldatabase/src/helpers/memenv/memenv.h" | 23 #include "third_party/leveldatabase/src/helpers/memenv/memenv.h" |
| 24 #include "third_party/leveldatabase/src/include/leveldb/db.h" | 24 #include "third_party/leveldatabase/src/include/leveldb/db.h" |
| 25 #include "third_party/leveldatabase/src/include/leveldb/env.h" | 25 #include "third_party/leveldatabase/src/include/leveldb/env.h" |
| 26 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" | 26 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" |
| 27 // third_party/webrtc/base/thread_checker.h leaks the define |
| 28 // EXCLUSIVE_LOCKS_REQUIRED and more which collide with the same define in |
| 29 // third_party/leveldatabase/src/port/thread_annotations. |
| 30 #undef EXCLUSIVE_LOCKS_REQUIRED |
| 31 #undef SHARED_LOCKS_REQUIRED |
| 32 #undef LOCKS_EXCLUDED |
| 33 #undef LOCK_RETURNED |
| 34 #undef LOCKABLE |
| 35 #undef SCOPED_LOCKABLE |
| 36 #undef EXCLUSIVE_LOCK_FUNCTION |
| 37 #undef SHARED_LOCK_FUNCTION |
| 38 #undef EXCLUSIVE_TRYLOCK_FUNCTION |
| 39 #undef SHARED_TRYLOCK_FUNCTION |
| 40 #undef UNLOCK_FUNCTION |
| 41 #undef NO_THREAD_SAFETY_ANALYSIS |
| 27 #include "url/origin.h" | 42 #include "url/origin.h" |
| 28 | 43 |
| 29 // LevelDB database schema | 44 // LevelDB database schema |
| 30 // ======================= | 45 // ======================= |
| 31 // | 46 // |
| 32 // NOTE | 47 // NOTE |
| 33 // - int64_t value is serialized as a string by base::Int64ToString(). | 48 // - int64_t value is serialized as a string by base::Int64ToString(). |
| 34 // - GURL value is serialized as a string by GURL::spec(). | 49 // - GURL value is serialized as a string by GURL::spec(). |
| 35 // | 50 // |
| 36 // Version 1 (in sorted order) | 51 // Version 1 (in sorted order) |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 const char kNextResIdKey[] = "INITDATA_NEXT_RESOURCE_ID"; | 115 const char kNextResIdKey[] = "INITDATA_NEXT_RESOURCE_ID"; |
| 101 const char kNextVerIdKey[] = "INITDATA_NEXT_VERSION_ID"; | 116 const char kNextVerIdKey[] = "INITDATA_NEXT_VERSION_ID"; |
| 102 const char kUniqueOriginKey[] = "INITDATA_UNIQUE_ORIGIN:"; | 117 const char kUniqueOriginKey[] = "INITDATA_UNIQUE_ORIGIN:"; |
| 103 const char kForeignFetchOriginKey[] = "INITDATA_FOREIGN_FETCH_ORIGIN:"; | 118 const char kForeignFetchOriginKey[] = "INITDATA_FOREIGN_FETCH_ORIGIN:"; |
| 104 | 119 |
| 105 const char kRegKeyPrefix[] = "REG:"; | 120 const char kRegKeyPrefix[] = "REG:"; |
| 106 const char kRegUserDataKeyPrefix[] = "REG_USER_DATA:"; | 121 const char kRegUserDataKeyPrefix[] = "REG_USER_DATA:"; |
| 107 const char kRegHasUserDataKeyPrefix[] = "REG_HAS_USER_DATA:"; | 122 const char kRegHasUserDataKeyPrefix[] = "REG_HAS_USER_DATA:"; |
| 108 const char kRegIdToOriginKeyPrefix[] = "REGID_TO_ORIGIN:"; | 123 const char kRegIdToOriginKeyPrefix[] = "REGID_TO_ORIGIN:"; |
| 109 const char kResKeyPrefix[] = "RES:"; | 124 const char kResKeyPrefix[] = "RES:"; |
| 110 const char kKeySeparator = '\x00'; | 125 const char kSWKeySeparator = '\x00'; |
| 111 | 126 |
| 112 const char kUncommittedResIdKeyPrefix[] = "URES:"; | 127 const char kUncommittedResIdKeyPrefix[] = "URES:"; |
| 113 const char kPurgeableResIdKeyPrefix[] = "PRES:"; | 128 const char kPurgeableResIdKeyPrefix[] = "PRES:"; |
| 114 | 129 |
| 115 const int64_t kCurrentSchemaVersion = 2; | 130 const int64_t kSWCurrentSchemaVersion = 2; |
| 116 | 131 |
| 117 class ServiceWorkerEnv : public leveldb_env::ChromiumEnv { | 132 class ServiceWorkerEnv : public leveldb_env::ChromiumEnv { |
| 118 public: | 133 public: |
| 119 ServiceWorkerEnv() : ChromiumEnv("LevelDBEnv.ServiceWorker") {} | 134 ServiceWorkerEnv() : ChromiumEnv("LevelDBEnv.ServiceWorker") {} |
| 120 }; | 135 }; |
| 121 | 136 |
| 122 base::LazyInstance<ServiceWorkerEnv>::Leaky g_service_worker_env = | 137 base::LazyInstance<ServiceWorkerEnv>::Leaky g_service_worker_env = |
| 123 LAZY_INSTANCE_INITIALIZER; | 138 LAZY_INSTANCE_INITIALIZER; |
| 124 | 139 |
| 125 bool RemovePrefix(const std::string& str, | 140 bool RemovePrefix(const std::string& str, |
| 126 const std::string& prefix, | 141 const std::string& prefix, |
| 127 std::string* out) { | 142 std::string* out) { |
| 128 if (!base::StartsWith(str, prefix, base::CompareCase::SENSITIVE)) | 143 if (!base::StartsWith(str, prefix, base::CompareCase::SENSITIVE)) |
| 129 return false; | 144 return false; |
| 130 if (out) | 145 if (out) |
| 131 *out = str.substr(prefix.size()); | 146 *out = str.substr(prefix.size()); |
| 132 return true; | 147 return true; |
| 133 } | 148 } |
| 134 | 149 |
| 135 std::string CreateRegistrationKeyPrefix(const GURL& origin) { | 150 std::string CreateRegistrationKeyPrefix(const GURL& origin) { |
| 136 return base::StringPrintf("%s%s%c", kRegKeyPrefix, | 151 return base::StringPrintf("%s%s%c", kRegKeyPrefix, |
| 137 origin.GetOrigin().spec().c_str(), kKeySeparator); | 152 origin.GetOrigin().spec().c_str(), kSWKeySeparator); |
| 138 } | 153 } |
| 139 | 154 |
| 140 std::string CreateRegistrationKey(int64_t registration_id, const GURL& origin) { | 155 std::string CreateRegistrationKey(int64_t registration_id, const GURL& origin) { |
| 141 return CreateRegistrationKeyPrefix(origin) | 156 return CreateRegistrationKeyPrefix(origin) |
| 142 .append(base::Int64ToString(registration_id)); | 157 .append(base::Int64ToString(registration_id)); |
| 143 } | 158 } |
| 144 | 159 |
| 145 std::string CreateResourceRecordKeyPrefix(int64_t version_id) { | 160 std::string CreateResourceRecordKeyPrefix(int64_t version_id) { |
| 146 return base::StringPrintf("%s%s%c", | 161 return base::StringPrintf("%s%s%c", |
| 147 kResKeyPrefix, | 162 kResKeyPrefix, |
| 148 base::Int64ToString(version_id).c_str(), | 163 base::Int64ToString(version_id).c_str(), |
| 149 kKeySeparator); | 164 kSWKeySeparator); |
| 150 } | 165 } |
| 151 | 166 |
| 152 std::string CreateResourceRecordKey(int64_t version_id, int64_t resource_id) { | 167 std::string CreateResourceRecordKey(int64_t version_id, int64_t resource_id) { |
| 153 return CreateResourceRecordKeyPrefix(version_id).append( | 168 return CreateResourceRecordKeyPrefix(version_id).append( |
| 154 base::Int64ToString(resource_id)); | 169 base::Int64ToString(resource_id)); |
| 155 } | 170 } |
| 156 | 171 |
| 157 std::string CreateUniqueOriginKey(const GURL& origin) { | 172 std::string CreateUniqueOriginKey(const GURL& origin) { |
| 158 return base::StringPrintf("%s%s", kUniqueOriginKey, | 173 return base::StringPrintf("%s%s", kUniqueOriginKey, |
| 159 origin.GetOrigin().spec().c_str()); | 174 origin.GetOrigin().spec().c_str()); |
| 160 } | 175 } |
| 161 | 176 |
| 162 std::string CreateForeignFetchOriginKey(const GURL& origin) { | 177 std::string CreateForeignFetchOriginKey(const GURL& origin) { |
| 163 return base::StringPrintf("%s%s", kForeignFetchOriginKey, | 178 return base::StringPrintf("%s%s", kForeignFetchOriginKey, |
| 164 origin.GetOrigin().spec().c_str()); | 179 origin.GetOrigin().spec().c_str()); |
| 165 } | 180 } |
| 166 | 181 |
| 167 std::string CreateResourceIdKey(const char* key_prefix, int64_t resource_id) { | 182 std::string CreateResourceIdKey(const char* key_prefix, int64_t resource_id) { |
| 168 return base::StringPrintf( | 183 return base::StringPrintf( |
| 169 "%s%s", key_prefix, base::Int64ToString(resource_id).c_str()); | 184 "%s%s", key_prefix, base::Int64ToString(resource_id).c_str()); |
| 170 } | 185 } |
| 171 | 186 |
| 172 std::string CreateUserDataKeyPrefix(int64_t registration_id) { | 187 std::string CreateUserDataKeyPrefix(int64_t registration_id) { |
| 173 return base::StringPrintf("%s%s%c", | 188 return base::StringPrintf("%s%s%c", |
| 174 kRegUserDataKeyPrefix, | 189 kRegUserDataKeyPrefix, |
| 175 base::Int64ToString(registration_id).c_str(), | 190 base::Int64ToString(registration_id).c_str(), |
| 176 kKeySeparator); | 191 kSWKeySeparator); |
| 177 } | 192 } |
| 178 | 193 |
| 179 std::string CreateUserDataKey(int64_t registration_id, | 194 std::string CreateUserDataKey(int64_t registration_id, |
| 180 const std::string& user_data_name) { | 195 const std::string& user_data_name) { |
| 181 return CreateUserDataKeyPrefix(registration_id).append(user_data_name); | 196 return CreateUserDataKeyPrefix(registration_id).append(user_data_name); |
| 182 } | 197 } |
| 183 | 198 |
| 184 std::string CreateHasUserDataKeyPrefix(const std::string& user_data_name) { | 199 std::string CreateHasUserDataKeyPrefix(const std::string& user_data_name) { |
| 185 return base::StringPrintf("%s%s%c", kRegHasUserDataKeyPrefix, | 200 return base::StringPrintf("%s%s%c", kRegHasUserDataKeyPrefix, |
| 186 user_data_name.c_str(), kKeySeparator); | 201 user_data_name.c_str(), kSWKeySeparator); |
| 187 } | 202 } |
| 188 | 203 |
| 189 std::string CreateHasUserDataKey(int64_t registration_id, | 204 std::string CreateHasUserDataKey(int64_t registration_id, |
| 190 const std::string& user_data_name) { | 205 const std::string& user_data_name) { |
| 191 return CreateHasUserDataKeyPrefix(user_data_name) | 206 return CreateHasUserDataKeyPrefix(user_data_name) |
| 192 .append(base::Int64ToString(registration_id)); | 207 .append(base::Int64ToString(registration_id)); |
| 193 } | 208 } |
| 194 | 209 |
| 195 std::string CreateRegistrationIdToOriginKey(int64_t registration_id) { | 210 std::string CreateRegistrationIdToOriginKey(int64_t registration_id) { |
| 196 return base::StringPrintf("%s%s", kRegIdToOriginKeyPrefix, | 211 return base::StringPrintf("%s%s", kRegIdToOriginKeyPrefix, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 218 ServiceWorkerDatabase::Status ParseId(const std::string& serialized, | 233 ServiceWorkerDatabase::Status ParseId(const std::string& serialized, |
| 219 int64_t* out) { | 234 int64_t* out) { |
| 220 DCHECK(out); | 235 DCHECK(out); |
| 221 int64_t id; | 236 int64_t id; |
| 222 if (!base::StringToInt64(serialized, &id) || id < 0) | 237 if (!base::StringToInt64(serialized, &id) || id < 0) |
| 223 return ServiceWorkerDatabase::STATUS_ERROR_CORRUPTED; | 238 return ServiceWorkerDatabase::STATUS_ERROR_CORRUPTED; |
| 224 *out = id; | 239 *out = id; |
| 225 return ServiceWorkerDatabase::STATUS_OK; | 240 return ServiceWorkerDatabase::STATUS_OK; |
| 226 } | 241 } |
| 227 | 242 |
| 228 ServiceWorkerDatabase::Status LevelDBStatusToStatus( | 243 ServiceWorkerDatabase::Status LevelDBStatusToSWStatus( |
| 229 const leveldb::Status& status) { | 244 const leveldb::Status& status) { |
| 230 if (status.ok()) | 245 if (status.ok()) |
| 231 return ServiceWorkerDatabase::STATUS_OK; | 246 return ServiceWorkerDatabase::STATUS_OK; |
| 232 else if (status.IsNotFound()) | 247 else if (status.IsNotFound()) |
| 233 return ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND; | 248 return ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND; |
| 234 else if (status.IsIOError()) | 249 else if (status.IsIOError()) |
| 235 return ServiceWorkerDatabase::STATUS_ERROR_IO_ERROR; | 250 return ServiceWorkerDatabase::STATUS_ERROR_IO_ERROR; |
| 236 else if (status.IsCorruption()) | 251 else if (status.IsCorruption()) |
| 237 return ServiceWorkerDatabase::STATUS_ERROR_CORRUPTED; | 252 return ServiceWorkerDatabase::STATUS_ERROR_CORRUPTED; |
| 238 else if (status.IsNotSupportedError()) | 253 else if (status.IsNotSupportedError()) |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 Status status = LazyOpen(false); | 360 Status status = LazyOpen(false); |
| 346 if (IsNewOrNonexistentDatabase(status)) | 361 if (IsNewOrNonexistentDatabase(status)) |
| 347 return STATUS_OK; | 362 return STATUS_OK; |
| 348 if (status != STATUS_OK) | 363 if (status != STATUS_OK) |
| 349 return status; | 364 return status; |
| 350 | 365 |
| 351 { | 366 { |
| 352 std::unique_ptr<leveldb::Iterator> itr( | 367 std::unique_ptr<leveldb::Iterator> itr( |
| 353 db_->NewIterator(leveldb::ReadOptions())); | 368 db_->NewIterator(leveldb::ReadOptions())); |
| 354 for (itr->Seek(kUniqueOriginKey); itr->Valid(); itr->Next()) { | 369 for (itr->Seek(kUniqueOriginKey); itr->Valid(); itr->Next()) { |
| 355 status = LevelDBStatusToStatus(itr->status()); | 370 status = LevelDBStatusToSWStatus(itr->status()); |
| 356 if (status != STATUS_OK) { | 371 if (status != STATUS_OK) { |
| 357 origins->clear(); | 372 origins->clear(); |
| 358 break; | 373 break; |
| 359 } | 374 } |
| 360 | 375 |
| 361 std::string origin_str; | 376 std::string origin_str; |
| 362 if (!RemovePrefix(itr->key().ToString(), kUniqueOriginKey, &origin_str)) | 377 if (!RemovePrefix(itr->key().ToString(), kUniqueOriginKey, &origin_str)) |
| 363 break; | 378 break; |
| 364 | 379 |
| 365 GURL origin(origin_str); | 380 GURL origin(origin_str); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 386 Status status = LazyOpen(false); | 401 Status status = LazyOpen(false); |
| 387 if (IsNewOrNonexistentDatabase(status)) | 402 if (IsNewOrNonexistentDatabase(status)) |
| 388 return STATUS_OK; | 403 return STATUS_OK; |
| 389 if (status != STATUS_OK) | 404 if (status != STATUS_OK) |
| 390 return status; | 405 return status; |
| 391 | 406 |
| 392 { | 407 { |
| 393 std::unique_ptr<leveldb::Iterator> itr( | 408 std::unique_ptr<leveldb::Iterator> itr( |
| 394 db_->NewIterator(leveldb::ReadOptions())); | 409 db_->NewIterator(leveldb::ReadOptions())); |
| 395 for (itr->Seek(kForeignFetchOriginKey); itr->Valid(); itr->Next()) { | 410 for (itr->Seek(kForeignFetchOriginKey); itr->Valid(); itr->Next()) { |
| 396 status = LevelDBStatusToStatus(itr->status()); | 411 status = LevelDBStatusToSWStatus(itr->status()); |
| 397 if (status != STATUS_OK) { | 412 if (status != STATUS_OK) { |
| 398 origins->clear(); | 413 origins->clear(); |
| 399 break; | 414 break; |
| 400 } | 415 } |
| 401 | 416 |
| 402 std::string origin_str; | 417 std::string origin_str; |
| 403 if (!RemovePrefix(itr->key().ToString(), kForeignFetchOriginKey, | 418 if (!RemovePrefix(itr->key().ToString(), kForeignFetchOriginKey, |
| 404 &origin_str)) | 419 &origin_str)) |
| 405 break; | 420 break; |
| 406 | 421 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 430 if (IsNewOrNonexistentDatabase(status)) | 445 if (IsNewOrNonexistentDatabase(status)) |
| 431 return STATUS_OK; | 446 return STATUS_OK; |
| 432 if (status != STATUS_OK) | 447 if (status != STATUS_OK) |
| 433 return status; | 448 return status; |
| 434 | 449 |
| 435 std::string prefix = CreateRegistrationKeyPrefix(origin); | 450 std::string prefix = CreateRegistrationKeyPrefix(origin); |
| 436 { | 451 { |
| 437 std::unique_ptr<leveldb::Iterator> itr( | 452 std::unique_ptr<leveldb::Iterator> itr( |
| 438 db_->NewIterator(leveldb::ReadOptions())); | 453 db_->NewIterator(leveldb::ReadOptions())); |
| 439 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { | 454 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { |
| 440 status = LevelDBStatusToStatus(itr->status()); | 455 status = LevelDBStatusToSWStatus(itr->status()); |
| 441 if (status != STATUS_OK) { | 456 if (status != STATUS_OK) { |
| 442 registrations->clear(); | 457 registrations->clear(); |
| 443 if (opt_resources_list) | 458 if (opt_resources_list) |
| 444 opt_resources_list->clear(); | 459 opt_resources_list->clear(); |
| 445 break; | 460 break; |
| 446 } | 461 } |
| 447 | 462 |
| 448 if (!RemovePrefix(itr->key().ToString(), prefix, NULL)) | 463 if (!RemovePrefix(itr->key().ToString(), prefix, NULL)) |
| 449 break; | 464 break; |
| 450 | 465 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 Status status = LazyOpen(false); | 498 Status status = LazyOpen(false); |
| 484 if (IsNewOrNonexistentDatabase(status)) | 499 if (IsNewOrNonexistentDatabase(status)) |
| 485 return STATUS_OK; | 500 return STATUS_OK; |
| 486 if (status != STATUS_OK) | 501 if (status != STATUS_OK) |
| 487 return status; | 502 return status; |
| 488 | 503 |
| 489 { | 504 { |
| 490 std::unique_ptr<leveldb::Iterator> itr( | 505 std::unique_ptr<leveldb::Iterator> itr( |
| 491 db_->NewIterator(leveldb::ReadOptions())); | 506 db_->NewIterator(leveldb::ReadOptions())); |
| 492 for (itr->Seek(kRegKeyPrefix); itr->Valid(); itr->Next()) { | 507 for (itr->Seek(kRegKeyPrefix); itr->Valid(); itr->Next()) { |
| 493 status = LevelDBStatusToStatus(itr->status()); | 508 status = LevelDBStatusToSWStatus(itr->status()); |
| 494 if (status != STATUS_OK) { | 509 if (status != STATUS_OK) { |
| 495 registrations->clear(); | 510 registrations->clear(); |
| 496 break; | 511 break; |
| 497 } | 512 } |
| 498 | 513 |
| 499 if (!RemovePrefix(itr->key().ToString(), kRegKeyPrefix, NULL)) | 514 if (!RemovePrefix(itr->key().ToString(), kRegKeyPrefix, NULL)) |
| 500 break; | 515 break; |
| 501 | 516 |
| 502 RegistrationData registration; | 517 RegistrationData registration; |
| 503 status = ParseRegistrationData(itr->value().ToString(), ®istration); | 518 status = ParseRegistrationData(itr->value().ToString(), ®istration); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 DCHECK(sequence_checker_.CalledOnValidSequence()); | 566 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 552 DCHECK(origin); | 567 DCHECK(origin); |
| 553 | 568 |
| 554 Status status = LazyOpen(true); | 569 Status status = LazyOpen(true); |
| 555 if (IsNewOrNonexistentDatabase(status)) | 570 if (IsNewOrNonexistentDatabase(status)) |
| 556 return STATUS_ERROR_NOT_FOUND; | 571 return STATUS_ERROR_NOT_FOUND; |
| 557 if (status != STATUS_OK) | 572 if (status != STATUS_OK) |
| 558 return status; | 573 return status; |
| 559 | 574 |
| 560 std::string value; | 575 std::string value; |
| 561 status = LevelDBStatusToStatus( | 576 status = LevelDBStatusToSWStatus( |
| 562 db_->Get(leveldb::ReadOptions(), | 577 db_->Get(leveldb::ReadOptions(), |
| 563 CreateRegistrationIdToOriginKey(registration_id), &value)); | 578 CreateRegistrationIdToOriginKey(registration_id), &value)); |
| 564 if (status != STATUS_OK) { | 579 if (status != STATUS_OK) { |
| 565 HandleReadResult(FROM_HERE, | 580 HandleReadResult(FROM_HERE, |
| 566 status == STATUS_ERROR_NOT_FOUND ? STATUS_OK : status); | 581 status == STATUS_ERROR_NOT_FOUND ? STATUS_OK : status); |
| 567 return status; | 582 return status; |
| 568 } | 583 } |
| 569 | 584 |
| 570 GURL parsed(value); | 585 GURL parsed(value); |
| 571 if (!parsed.is_valid()) { | 586 if (!parsed.is_valid()) { |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 861 Status status = LazyOpen(false); | 876 Status status = LazyOpen(false); |
| 862 if (IsNewOrNonexistentDatabase(status)) | 877 if (IsNewOrNonexistentDatabase(status)) |
| 863 return STATUS_ERROR_NOT_FOUND; | 878 return STATUS_ERROR_NOT_FOUND; |
| 864 if (status != STATUS_OK) | 879 if (status != STATUS_OK) |
| 865 return status; | 880 return status; |
| 866 | 881 |
| 867 user_data_values->resize(user_data_names.size()); | 882 user_data_values->resize(user_data_names.size()); |
| 868 for (size_t i = 0; i < user_data_names.size(); i++) { | 883 for (size_t i = 0; i < user_data_names.size(); i++) { |
| 869 const std::string key = | 884 const std::string key = |
| 870 CreateUserDataKey(registration_id, user_data_names[i]); | 885 CreateUserDataKey(registration_id, user_data_names[i]); |
| 871 status = LevelDBStatusToStatus( | 886 status = LevelDBStatusToSWStatus( |
| 872 db_->Get(leveldb::ReadOptions(), key, &(*user_data_values)[i])); | 887 db_->Get(leveldb::ReadOptions(), key, &(*user_data_values)[i])); |
| 873 if (status != STATUS_OK) { | 888 if (status != STATUS_OK) { |
| 874 user_data_values->clear(); | 889 user_data_values->clear(); |
| 875 break; | 890 break; |
| 876 } | 891 } |
| 877 } | 892 } |
| 878 HandleReadResult(FROM_HERE, | 893 HandleReadResult(FROM_HERE, |
| 879 status == STATUS_ERROR_NOT_FOUND ? STATUS_OK : status); | 894 status == STATUS_ERROR_NOT_FOUND ? STATUS_OK : status); |
| 880 return status; | 895 return status; |
| 881 } | 896 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 892 if (IsNewOrNonexistentDatabase(status)) | 907 if (IsNewOrNonexistentDatabase(status)) |
| 893 return STATUS_ERROR_NOT_FOUND; | 908 return STATUS_ERROR_NOT_FOUND; |
| 894 if (status != STATUS_OK) | 909 if (status != STATUS_OK) |
| 895 return status; | 910 return status; |
| 896 | 911 |
| 897 std::string prefix = CreateUserDataKey(registration_id, key_prefix); | 912 std::string prefix = CreateUserDataKey(registration_id, key_prefix); |
| 898 { | 913 { |
| 899 std::unique_ptr<leveldb::Iterator> itr( | 914 std::unique_ptr<leveldb::Iterator> itr( |
| 900 db_->NewIterator(leveldb::ReadOptions())); | 915 db_->NewIterator(leveldb::ReadOptions())); |
| 901 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { | 916 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { |
| 902 status = LevelDBStatusToStatus(itr->status()); | 917 status = LevelDBStatusToSWStatus(itr->status()); |
| 903 if (status != STATUS_OK) { | 918 if (status != STATUS_OK) { |
| 904 user_data_values->clear(); | 919 user_data_values->clear(); |
| 905 break; | 920 break; |
| 906 } | 921 } |
| 907 | 922 |
| 908 if (!itr->key().starts_with(prefix)) | 923 if (!itr->key().starts_with(prefix)) |
| 909 break; | 924 break; |
| 910 | 925 |
| 911 std::string user_data_value; | 926 std::string user_data_value; |
| 912 status = LevelDBStatusToStatus( | 927 status = LevelDBStatusToSWStatus( |
| 913 db_->Get(leveldb::ReadOptions(), itr->key(), &user_data_value)); | 928 db_->Get(leveldb::ReadOptions(), itr->key(), &user_data_value)); |
| 914 if (status != STATUS_OK) { | 929 if (status != STATUS_OK) { |
| 915 user_data_values->clear(); | 930 user_data_values->clear(); |
| 916 break; | 931 break; |
| 917 } | 932 } |
| 918 | 933 |
| 919 user_data_values->push_back(user_data_value); | 934 user_data_values->push_back(user_data_value); |
| 920 } | 935 } |
| 921 } | 936 } |
| 922 | 937 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 986 if (IsNewOrNonexistentDatabase(status)) | 1001 if (IsNewOrNonexistentDatabase(status)) |
| 987 return STATUS_OK; | 1002 return STATUS_OK; |
| 988 if (status != STATUS_OK) | 1003 if (status != STATUS_OK) |
| 989 return status; | 1004 return status; |
| 990 | 1005 |
| 991 std::string key_prefix = CreateHasUserDataKeyPrefix(user_data_name); | 1006 std::string key_prefix = CreateHasUserDataKeyPrefix(user_data_name); |
| 992 { | 1007 { |
| 993 std::unique_ptr<leveldb::Iterator> itr( | 1008 std::unique_ptr<leveldb::Iterator> itr( |
| 994 db_->NewIterator(leveldb::ReadOptions())); | 1009 db_->NewIterator(leveldb::ReadOptions())); |
| 995 for (itr->Seek(key_prefix); itr->Valid(); itr->Next()) { | 1010 for (itr->Seek(key_prefix); itr->Valid(); itr->Next()) { |
| 996 status = LevelDBStatusToStatus(itr->status()); | 1011 status = LevelDBStatusToSWStatus(itr->status()); |
| 997 if (status != STATUS_OK) { | 1012 if (status != STATUS_OK) { |
| 998 user_data->clear(); | 1013 user_data->clear(); |
| 999 break; | 1014 break; |
| 1000 } | 1015 } |
| 1001 | 1016 |
| 1002 std::string registration_id_string; | 1017 std::string registration_id_string; |
| 1003 if (!RemovePrefix(itr->key().ToString(), key_prefix, | 1018 if (!RemovePrefix(itr->key().ToString(), key_prefix, |
| 1004 ®istration_id_string)) { | 1019 ®istration_id_string)) { |
| 1005 break; | 1020 break; |
| 1006 } | 1021 } |
| 1007 | 1022 |
| 1008 int64_t registration_id; | 1023 int64_t registration_id; |
| 1009 status = ParseId(registration_id_string, ®istration_id); | 1024 status = ParseId(registration_id_string, ®istration_id); |
| 1010 if (status != STATUS_OK) { | 1025 if (status != STATUS_OK) { |
| 1011 user_data->clear(); | 1026 user_data->clear(); |
| 1012 break; | 1027 break; |
| 1013 } | 1028 } |
| 1014 | 1029 |
| 1015 std::string value; | 1030 std::string value; |
| 1016 status = LevelDBStatusToStatus( | 1031 status = LevelDBStatusToSWStatus( |
| 1017 db_->Get(leveldb::ReadOptions(), | 1032 db_->Get(leveldb::ReadOptions(), |
| 1018 CreateUserDataKey(registration_id, user_data_name), &value)); | 1033 CreateUserDataKey(registration_id, user_data_name), &value)); |
| 1019 if (status != STATUS_OK) { | 1034 if (status != STATUS_OK) { |
| 1020 user_data->clear(); | 1035 user_data->clear(); |
| 1021 break; | 1036 break; |
| 1022 } | 1037 } |
| 1023 user_data->push_back(std::make_pair(registration_id, value)); | 1038 user_data->push_back(std::make_pair(registration_id, value)); |
| 1024 } | 1039 } |
| 1025 } | 1040 } |
| 1026 | 1041 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1039 if (IsNewOrNonexistentDatabase(status)) | 1054 if (IsNewOrNonexistentDatabase(status)) |
| 1040 return STATUS_OK; | 1055 return STATUS_OK; |
| 1041 if (status != STATUS_OK) | 1056 if (status != STATUS_OK) |
| 1042 return status; | 1057 return status; |
| 1043 | 1058 |
| 1044 std::string key_prefix = kRegHasUserDataKeyPrefix + user_data_name_prefix; | 1059 std::string key_prefix = kRegHasUserDataKeyPrefix + user_data_name_prefix; |
| 1045 { | 1060 { |
| 1046 std::unique_ptr<leveldb::Iterator> itr( | 1061 std::unique_ptr<leveldb::Iterator> itr( |
| 1047 db_->NewIterator(leveldb::ReadOptions())); | 1062 db_->NewIterator(leveldb::ReadOptions())); |
| 1048 for (itr->Seek(key_prefix); itr->Valid(); itr->Next()) { | 1063 for (itr->Seek(key_prefix); itr->Valid(); itr->Next()) { |
| 1049 status = LevelDBStatusToStatus(itr->status()); | 1064 status = LevelDBStatusToSWStatus(itr->status()); |
| 1050 if (status != STATUS_OK) { | 1065 if (status != STATUS_OK) { |
| 1051 user_data->clear(); | 1066 user_data->clear(); |
| 1052 break; | 1067 break; |
| 1053 } | 1068 } |
| 1054 | 1069 |
| 1055 if (!itr->key().starts_with(key_prefix)) | 1070 if (!itr->key().starts_with(key_prefix)) |
| 1056 break; | 1071 break; |
| 1057 | 1072 |
| 1058 std::string user_data_name_with_id; | 1073 std::string user_data_name_with_id; |
| 1059 if (!RemovePrefix(itr->key().ToString(), kRegHasUserDataKeyPrefix, | 1074 if (!RemovePrefix(itr->key().ToString(), kRegHasUserDataKeyPrefix, |
| 1060 &user_data_name_with_id)) { | 1075 &user_data_name_with_id)) { |
| 1061 break; | 1076 break; |
| 1062 } | 1077 } |
| 1063 | 1078 |
| 1064 std::vector<std::string> parts = base::SplitString( | 1079 std::vector<std::string> parts = base::SplitString( |
| 1065 user_data_name_with_id, base::StringPrintf("%c", kKeySeparator), | 1080 user_data_name_with_id, base::StringPrintf("%c", kSWKeySeparator), |
| 1066 base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); | 1081 base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); |
| 1067 if (parts.size() != 2) { | 1082 if (parts.size() != 2) { |
| 1068 status = STATUS_ERROR_CORRUPTED; | 1083 status = STATUS_ERROR_CORRUPTED; |
| 1069 user_data->clear(); | 1084 user_data->clear(); |
| 1070 break; | 1085 break; |
| 1071 } | 1086 } |
| 1072 | 1087 |
| 1073 int64_t registration_id; | 1088 int64_t registration_id; |
| 1074 status = ParseId(parts[1], ®istration_id); | 1089 status = ParseId(parts[1], ®istration_id); |
| 1075 if (status != STATUS_OK) { | 1090 if (status != STATUS_OK) { |
| 1076 user_data->clear(); | 1091 user_data->clear(); |
| 1077 break; | 1092 break; |
| 1078 } | 1093 } |
| 1079 | 1094 |
| 1080 std::string value; | 1095 std::string value; |
| 1081 status = LevelDBStatusToStatus( | 1096 status = LevelDBStatusToSWStatus( |
| 1082 db_->Get(leveldb::ReadOptions(), | 1097 db_->Get(leveldb::ReadOptions(), |
| 1083 CreateUserDataKey(registration_id, parts[0]), &value)); | 1098 CreateUserDataKey(registration_id, parts[0]), &value)); |
| 1084 if (status != STATUS_OK) { | 1099 if (status != STATUS_OK) { |
| 1085 user_data->clear(); | 1100 user_data->clear(); |
| 1086 break; | 1101 break; |
| 1087 } | 1102 } |
| 1088 user_data->push_back(std::make_pair(registration_id, value)); | 1103 user_data->push_back(std::make_pair(registration_id, value)); |
| 1089 } | 1104 } |
| 1090 } | 1105 } |
| 1091 | 1106 |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1224 options.create_if_missing = create_if_missing; | 1239 options.create_if_missing = create_if_missing; |
| 1225 options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue; | 1240 options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue; |
| 1226 if (IsDatabaseInMemory()) { | 1241 if (IsDatabaseInMemory()) { |
| 1227 env_.reset(leveldb::NewMemEnv(leveldb::Env::Default())); | 1242 env_.reset(leveldb::NewMemEnv(leveldb::Env::Default())); |
| 1228 options.env = env_.get(); | 1243 options.env = env_.get(); |
| 1229 } else { | 1244 } else { |
| 1230 options.env = g_service_worker_env.Pointer(); | 1245 options.env = g_service_worker_env.Pointer(); |
| 1231 } | 1246 } |
| 1232 | 1247 |
| 1233 leveldb::DB* db = NULL; | 1248 leveldb::DB* db = NULL; |
| 1234 Status status = LevelDBStatusToStatus( | 1249 Status status = LevelDBStatusToSWStatus( |
| 1235 leveldb::DB::Open(options, path_.AsUTF8Unsafe(), &db)); | 1250 leveldb::DB::Open(options, path_.AsUTF8Unsafe(), &db)); |
| 1236 HandleOpenResult(FROM_HERE, status); | 1251 HandleOpenResult(FROM_HERE, status); |
| 1237 if (status != STATUS_OK) { | 1252 if (status != STATUS_OK) { |
| 1238 DCHECK(!db); | 1253 DCHECK(!db); |
| 1239 // TODO(nhiroki): Should we retry to open the database? | 1254 // TODO(nhiroki): Should we retry to open the database? |
| 1240 return status; | 1255 return status; |
| 1241 } | 1256 } |
| 1242 db_.reset(db); | 1257 db_.reset(db); |
| 1243 | 1258 |
| 1244 int64_t db_version; | 1259 int64_t db_version; |
| 1245 status = ReadDatabaseVersion(&db_version); | 1260 status = ReadDatabaseVersion(&db_version); |
| 1246 if (status != STATUS_OK) | 1261 if (status != STATUS_OK) |
| 1247 return status; | 1262 return status; |
| 1248 | 1263 |
| 1249 switch (db_version) { | 1264 switch (db_version) { |
| 1250 case 0: | 1265 case 0: |
| 1251 // This database is new. It will be initialized when something is written. | 1266 // This database is new. It will be initialized when something is written. |
| 1252 DCHECK_EQ(UNINITIALIZED, state_); | 1267 DCHECK_EQ(UNINITIALIZED, state_); |
| 1253 return STATUS_OK; | 1268 return STATUS_OK; |
| 1254 case 1: | 1269 case 1: |
| 1255 // This database has an obsolete schema version. ServiceWorkerStorage | 1270 // This database has an obsolete schema version. ServiceWorkerStorage |
| 1256 // should recreate it. | 1271 // should recreate it. |
| 1257 status = STATUS_ERROR_FAILED; | 1272 status = STATUS_ERROR_FAILED; |
| 1258 Disable(FROM_HERE, status); | 1273 Disable(FROM_HERE, status); |
| 1259 return status; | 1274 return status; |
| 1260 case 2: | 1275 case 2: |
| 1261 DCHECK_EQ(db_version, kCurrentSchemaVersion); | 1276 DCHECK_EQ(db_version, kSWCurrentSchemaVersion); |
| 1262 state_ = INITIALIZED; | 1277 state_ = INITIALIZED; |
| 1263 return STATUS_OK; | 1278 return STATUS_OK; |
| 1264 default: | 1279 default: |
| 1265 // Other cases should be handled in ReadDatabaseVersion. | 1280 // Other cases should be handled in ReadDatabaseVersion. |
| 1266 NOTREACHED(); | 1281 NOTREACHED(); |
| 1267 return STATUS_ERROR_CORRUPTED; | 1282 return STATUS_ERROR_CORRUPTED; |
| 1268 } | 1283 } |
| 1269 } | 1284 } |
| 1270 | 1285 |
| 1271 bool ServiceWorkerDatabase::IsNewOrNonexistentDatabase( | 1286 bool ServiceWorkerDatabase::IsNewOrNonexistentDatabase( |
| 1272 ServiceWorkerDatabase::Status status) { | 1287 ServiceWorkerDatabase::Status status) { |
| 1273 if (status == STATUS_ERROR_NOT_FOUND) | 1288 if (status == STATUS_ERROR_NOT_FOUND) |
| 1274 return true; | 1289 return true; |
| 1275 if (status == STATUS_OK && state_ == UNINITIALIZED) | 1290 if (status == STATUS_OK && state_ == UNINITIALIZED) |
| 1276 return true; | 1291 return true; |
| 1277 return false; | 1292 return false; |
| 1278 } | 1293 } |
| 1279 | 1294 |
| 1280 ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadNextAvailableId( | 1295 ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadNextAvailableId( |
| 1281 const char* id_key, | 1296 const char* id_key, |
| 1282 int64_t* next_avail_id) { | 1297 int64_t* next_avail_id) { |
| 1283 DCHECK(id_key); | 1298 DCHECK(id_key); |
| 1284 DCHECK(next_avail_id); | 1299 DCHECK(next_avail_id); |
| 1285 | 1300 |
| 1286 std::string value; | 1301 std::string value; |
| 1287 Status status = LevelDBStatusToStatus( | 1302 Status status = LevelDBStatusToSWStatus( |
| 1288 db_->Get(leveldb::ReadOptions(), id_key, &value)); | 1303 db_->Get(leveldb::ReadOptions(), id_key, &value)); |
| 1289 if (status == STATUS_ERROR_NOT_FOUND) { | 1304 if (status == STATUS_ERROR_NOT_FOUND) { |
| 1290 // Nobody has gotten the next resource id for |id_key|. | 1305 // Nobody has gotten the next resource id for |id_key|. |
| 1291 *next_avail_id = 0; | 1306 *next_avail_id = 0; |
| 1292 HandleReadResult(FROM_HERE, STATUS_OK); | 1307 HandleReadResult(FROM_HERE, STATUS_OK); |
| 1293 return STATUS_OK; | 1308 return STATUS_OK; |
| 1294 } else if (status != STATUS_OK) { | 1309 } else if (status != STATUS_OK) { |
| 1295 HandleReadResult(FROM_HERE, status); | 1310 HandleReadResult(FROM_HERE, status); |
| 1296 return status; | 1311 return status; |
| 1297 } | 1312 } |
| 1298 | 1313 |
| 1299 status = ParseId(value, next_avail_id); | 1314 status = ParseId(value, next_avail_id); |
| 1300 HandleReadResult(FROM_HERE, status); | 1315 HandleReadResult(FROM_HERE, status); |
| 1301 return status; | 1316 return status; |
| 1302 } | 1317 } |
| 1303 | 1318 |
| 1304 ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistrationData( | 1319 ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistrationData( |
| 1305 int64_t registration_id, | 1320 int64_t registration_id, |
| 1306 const GURL& origin, | 1321 const GURL& origin, |
| 1307 RegistrationData* registration) { | 1322 RegistrationData* registration) { |
| 1308 DCHECK(registration); | 1323 DCHECK(registration); |
| 1309 | 1324 |
| 1310 const std::string key = CreateRegistrationKey(registration_id, origin); | 1325 const std::string key = CreateRegistrationKey(registration_id, origin); |
| 1311 std::string value; | 1326 std::string value; |
| 1312 Status status = LevelDBStatusToStatus( | 1327 Status status = LevelDBStatusToSWStatus( |
| 1313 db_->Get(leveldb::ReadOptions(), key, &value)); | 1328 db_->Get(leveldb::ReadOptions(), key, &value)); |
| 1314 if (status != STATUS_OK) { | 1329 if (status != STATUS_OK) { |
| 1315 HandleReadResult( | 1330 HandleReadResult( |
| 1316 FROM_HERE, | 1331 FROM_HERE, |
| 1317 status == STATUS_ERROR_NOT_FOUND ? STATUS_OK : status); | 1332 status == STATUS_ERROR_NOT_FOUND ? STATUS_OK : status); |
| 1318 return status; | 1333 return status; |
| 1319 } | 1334 } |
| 1320 | 1335 |
| 1321 status = ParseRegistrationData(value, registration); | 1336 status = ParseRegistrationData(value, registration); |
| 1322 HandleReadResult(FROM_HERE, status); | 1337 HandleReadResult(FROM_HERE, status); |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1464 DCHECK(resources->empty()); | 1479 DCHECK(resources->empty()); |
| 1465 | 1480 |
| 1466 Status status = STATUS_OK; | 1481 Status status = STATUS_OK; |
| 1467 bool has_main_resource = false; | 1482 bool has_main_resource = false; |
| 1468 const std::string prefix = | 1483 const std::string prefix = |
| 1469 CreateResourceRecordKeyPrefix(registration.version_id); | 1484 CreateResourceRecordKeyPrefix(registration.version_id); |
| 1470 { | 1485 { |
| 1471 std::unique_ptr<leveldb::Iterator> itr( | 1486 std::unique_ptr<leveldb::Iterator> itr( |
| 1472 db_->NewIterator(leveldb::ReadOptions())); | 1487 db_->NewIterator(leveldb::ReadOptions())); |
| 1473 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { | 1488 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { |
| 1474 Status status = LevelDBStatusToStatus(itr->status()); | 1489 Status status = LevelDBStatusToSWStatus(itr->status()); |
| 1475 if (status != STATUS_OK) { | 1490 if (status != STATUS_OK) { |
| 1476 resources->clear(); | 1491 resources->clear(); |
| 1477 break; | 1492 break; |
| 1478 } | 1493 } |
| 1479 | 1494 |
| 1480 if (!RemovePrefix(itr->key().ToString(), prefix, NULL)) | 1495 if (!RemovePrefix(itr->key().ToString(), prefix, NULL)) |
| 1481 break; | 1496 break; |
| 1482 | 1497 |
| 1483 ResourceRecord resource; | 1498 ResourceRecord resource; |
| 1484 status = ParseResourceRecord(itr->value().ToString(), &resource); | 1499 status = ParseResourceRecord(itr->value().ToString(), &resource); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1565 leveldb::WriteBatch* batch) { | 1580 leveldb::WriteBatch* batch) { |
| 1566 DCHECK(batch); | 1581 DCHECK(batch); |
| 1567 | 1582 |
| 1568 Status status = STATUS_OK; | 1583 Status status = STATUS_OK; |
| 1569 const std::string prefix = CreateResourceRecordKeyPrefix(version_id); | 1584 const std::string prefix = CreateResourceRecordKeyPrefix(version_id); |
| 1570 | 1585 |
| 1571 { | 1586 { |
| 1572 std::unique_ptr<leveldb::Iterator> itr( | 1587 std::unique_ptr<leveldb::Iterator> itr( |
| 1573 db_->NewIterator(leveldb::ReadOptions())); | 1588 db_->NewIterator(leveldb::ReadOptions())); |
| 1574 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { | 1589 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { |
| 1575 status = LevelDBStatusToStatus(itr->status()); | 1590 status = LevelDBStatusToSWStatus(itr->status()); |
| 1576 if (status != STATUS_OK) | 1591 if (status != STATUS_OK) |
| 1577 break; | 1592 break; |
| 1578 | 1593 |
| 1579 const std::string key = itr->key().ToString(); | 1594 const std::string key = itr->key().ToString(); |
| 1580 std::string unprefixed; | 1595 std::string unprefixed; |
| 1581 if (!RemovePrefix(key, prefix, &unprefixed)) | 1596 if (!RemovePrefix(key, prefix, &unprefixed)) |
| 1582 break; | 1597 break; |
| 1583 | 1598 |
| 1584 int64_t resource_id; | 1599 int64_t resource_id; |
| 1585 status = ParseId(unprefixed, &resource_id); | 1600 status = ParseId(unprefixed, &resource_id); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1610 Status status = LazyOpen(false); | 1625 Status status = LazyOpen(false); |
| 1611 if (IsNewOrNonexistentDatabase(status)) | 1626 if (IsNewOrNonexistentDatabase(status)) |
| 1612 return STATUS_OK; | 1627 return STATUS_OK; |
| 1613 if (status != STATUS_OK) | 1628 if (status != STATUS_OK) |
| 1614 return status; | 1629 return status; |
| 1615 | 1630 |
| 1616 { | 1631 { |
| 1617 std::unique_ptr<leveldb::Iterator> itr( | 1632 std::unique_ptr<leveldb::Iterator> itr( |
| 1618 db_->NewIterator(leveldb::ReadOptions())); | 1633 db_->NewIterator(leveldb::ReadOptions())); |
| 1619 for (itr->Seek(id_key_prefix); itr->Valid(); itr->Next()) { | 1634 for (itr->Seek(id_key_prefix); itr->Valid(); itr->Next()) { |
| 1620 status = LevelDBStatusToStatus(itr->status()); | 1635 status = LevelDBStatusToSWStatus(itr->status()); |
| 1621 if (status != STATUS_OK) { | 1636 if (status != STATUS_OK) { |
| 1622 ids->clear(); | 1637 ids->clear(); |
| 1623 break; | 1638 break; |
| 1624 } | 1639 } |
| 1625 | 1640 |
| 1626 std::string unprefixed; | 1641 std::string unprefixed; |
| 1627 if (!RemovePrefix(itr->key().ToString(), id_key_prefix, &unprefixed)) | 1642 if (!RemovePrefix(itr->key().ToString(), id_key_prefix, &unprefixed)) |
| 1628 break; | 1643 break; |
| 1629 | 1644 |
| 1630 int64_t resource_id; | 1645 int64_t resource_id; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1689 int64_t registration_id, | 1704 int64_t registration_id, |
| 1690 leveldb::WriteBatch* batch) { | 1705 leveldb::WriteBatch* batch) { |
| 1691 DCHECK(batch); | 1706 DCHECK(batch); |
| 1692 Status status = STATUS_OK; | 1707 Status status = STATUS_OK; |
| 1693 const std::string prefix = CreateUserDataKeyPrefix(registration_id); | 1708 const std::string prefix = CreateUserDataKeyPrefix(registration_id); |
| 1694 | 1709 |
| 1695 { | 1710 { |
| 1696 std::unique_ptr<leveldb::Iterator> itr( | 1711 std::unique_ptr<leveldb::Iterator> itr( |
| 1697 db_->NewIterator(leveldb::ReadOptions())); | 1712 db_->NewIterator(leveldb::ReadOptions())); |
| 1698 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { | 1713 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { |
| 1699 status = LevelDBStatusToStatus(itr->status()); | 1714 status = LevelDBStatusToSWStatus(itr->status()); |
| 1700 if (status != STATUS_OK) | 1715 if (status != STATUS_OK) |
| 1701 break; | 1716 break; |
| 1702 | 1717 |
| 1703 const std::string key = itr->key().ToString(); | 1718 const std::string key = itr->key().ToString(); |
| 1704 std::string user_data_name; | 1719 std::string user_data_name; |
| 1705 if (!RemovePrefix(key, prefix, &user_data_name)) | 1720 if (!RemovePrefix(key, prefix, &user_data_name)) |
| 1706 break; | 1721 break; |
| 1707 batch->Delete(key); | 1722 batch->Delete(key); |
| 1708 batch->Delete(CreateHasUserDataKey(registration_id, user_data_name)); | 1723 batch->Delete(CreateHasUserDataKey(registration_id, user_data_name)); |
| 1709 } | 1724 } |
| 1710 } | 1725 } |
| 1711 | 1726 |
| 1712 HandleReadResult(FROM_HERE, status); | 1727 HandleReadResult(FROM_HERE, status); |
| 1713 return status; | 1728 return status; |
| 1714 } | 1729 } |
| 1715 | 1730 |
| 1716 ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadDatabaseVersion( | 1731 ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadDatabaseVersion( |
| 1717 int64_t* db_version) { | 1732 int64_t* db_version) { |
| 1718 std::string value; | 1733 std::string value; |
| 1719 Status status = LevelDBStatusToStatus( | 1734 Status status = LevelDBStatusToSWStatus( |
| 1720 db_->Get(leveldb::ReadOptions(), kDatabaseVersionKey, &value)); | 1735 db_->Get(leveldb::ReadOptions(), kDatabaseVersionKey, &value)); |
| 1721 if (status == STATUS_ERROR_NOT_FOUND) { | 1736 if (status == STATUS_ERROR_NOT_FOUND) { |
| 1722 // The database hasn't been initialized yet. | 1737 // The database hasn't been initialized yet. |
| 1723 *db_version = 0; | 1738 *db_version = 0; |
| 1724 HandleReadResult(FROM_HERE, STATUS_OK); | 1739 HandleReadResult(FROM_HERE, STATUS_OK); |
| 1725 return STATUS_OK; | 1740 return STATUS_OK; |
| 1726 } | 1741 } |
| 1727 | 1742 |
| 1728 if (status != STATUS_OK) { | 1743 if (status != STATUS_OK) { |
| 1729 HandleReadResult(FROM_HERE, status); | 1744 HandleReadResult(FROM_HERE, status); |
| 1730 return status; | 1745 return status; |
| 1731 } | 1746 } |
| 1732 | 1747 |
| 1733 const int kFirstValidVersion = 1; | 1748 const int kFirstValidVersion = 1; |
| 1734 if (!base::StringToInt64(value, db_version) || | 1749 if (!base::StringToInt64(value, db_version) || |
| 1735 *db_version < kFirstValidVersion || kCurrentSchemaVersion < *db_version) { | 1750 *db_version < kFirstValidVersion || kSWCurrentSchemaVersion < *db_version)
{ |
| 1736 status = STATUS_ERROR_CORRUPTED; | 1751 status = STATUS_ERROR_CORRUPTED; |
| 1737 HandleReadResult(FROM_HERE, status); | 1752 HandleReadResult(FROM_HERE, status); |
| 1738 return status; | 1753 return status; |
| 1739 } | 1754 } |
| 1740 | 1755 |
| 1741 status = STATUS_OK; | 1756 status = STATUS_OK; |
| 1742 HandleReadResult(FROM_HERE, status); | 1757 HandleReadResult(FROM_HERE, status); |
| 1743 return status; | 1758 return status; |
| 1744 } | 1759 } |
| 1745 | 1760 |
| 1746 ServiceWorkerDatabase::Status ServiceWorkerDatabase::WriteBatch( | 1761 ServiceWorkerDatabase::Status ServiceWorkerDatabase::WriteBatch( |
| 1747 leveldb::WriteBatch* batch) { | 1762 leveldb::WriteBatch* batch) { |
| 1748 DCHECK(batch); | 1763 DCHECK(batch); |
| 1749 DCHECK_NE(DISABLED, state_); | 1764 DCHECK_NE(DISABLED, state_); |
| 1750 | 1765 |
| 1751 if (state_ == UNINITIALIZED) { | 1766 if (state_ == UNINITIALIZED) { |
| 1752 // Write database default values. | 1767 // Write database default values. |
| 1753 batch->Put(kDatabaseVersionKey, base::Int64ToString(kCurrentSchemaVersion)); | 1768 batch->Put(kDatabaseVersionKey, base::Int64ToString(kSWCurrentSchemaVersion)
); |
| 1754 state_ = INITIALIZED; | 1769 state_ = INITIALIZED; |
| 1755 } | 1770 } |
| 1756 | 1771 |
| 1757 Status status = LevelDBStatusToStatus( | 1772 Status status = LevelDBStatusToSWStatus( |
| 1758 db_->Write(leveldb::WriteOptions(), batch)); | 1773 db_->Write(leveldb::WriteOptions(), batch)); |
| 1759 HandleWriteResult(FROM_HERE, status); | 1774 HandleWriteResult(FROM_HERE, status); |
| 1760 return status; | 1775 return status; |
| 1761 } | 1776 } |
| 1762 | 1777 |
| 1763 void ServiceWorkerDatabase::BumpNextRegistrationIdIfNeeded( | 1778 void ServiceWorkerDatabase::BumpNextRegistrationIdIfNeeded( |
| 1764 int64_t used_id, | 1779 int64_t used_id, |
| 1765 leveldb::WriteBatch* batch) { | 1780 leveldb::WriteBatch* batch) { |
| 1766 DCHECK(batch); | 1781 DCHECK(batch); |
| 1767 if (next_avail_registration_id_ <= used_id) { | 1782 if (next_avail_registration_id_ <= used_id) { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1828 if (status != STATUS_OK) | 1843 if (status != STATUS_OK) |
| 1829 Disable(from_here, status); | 1844 Disable(from_here, status); |
| 1830 ServiceWorkerMetrics::CountWriteDatabaseResult(status); | 1845 ServiceWorkerMetrics::CountWriteDatabaseResult(status); |
| 1831 } | 1846 } |
| 1832 | 1847 |
| 1833 bool ServiceWorkerDatabase::IsDatabaseInMemory() const { | 1848 bool ServiceWorkerDatabase::IsDatabaseInMemory() const { |
| 1834 return path_.empty(); | 1849 return path_.empty(); |
| 1835 } | 1850 } |
| 1836 | 1851 |
| 1837 } // namespace content | 1852 } // namespace content |
| OLD | NEW |