| 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 11 matching lines...) Expand all Loading... |
| 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 = | 912 std::string prefix = |
| 898 CreateUserDataKey(registration_id, user_data_name_prefix); | 913 CreateUserDataKey(registration_id, user_data_name_prefix); |
| 899 { | 914 { |
| 900 std::unique_ptr<leveldb::Iterator> itr( | 915 std::unique_ptr<leveldb::Iterator> itr( |
| 901 db_->NewIterator(leveldb::ReadOptions())); | 916 db_->NewIterator(leveldb::ReadOptions())); |
| 902 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { | 917 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { |
| 903 status = LevelDBStatusToStatus(itr->status()); | 918 status = LevelDBStatusToSWStatus(itr->status()); |
| 904 if (status != STATUS_OK) { | 919 if (status != STATUS_OK) { |
| 905 user_data_values->clear(); | 920 user_data_values->clear(); |
| 906 break; | 921 break; |
| 907 } | 922 } |
| 908 | 923 |
| 909 if (!itr->key().starts_with(prefix)) | 924 if (!itr->key().starts_with(prefix)) |
| 910 break; | 925 break; |
| 911 | 926 |
| 912 std::string user_data_value; | 927 std::string user_data_value; |
| 913 status = LevelDBStatusToStatus( | 928 status = LevelDBStatusToSWStatus( |
| 914 db_->Get(leveldb::ReadOptions(), itr->key(), &user_data_value)); | 929 db_->Get(leveldb::ReadOptions(), itr->key(), &user_data_value)); |
| 915 if (status != STATUS_OK) { | 930 if (status != STATUS_OK) { |
| 916 user_data_values->clear(); | 931 user_data_values->clear(); |
| 917 break; | 932 break; |
| 918 } | 933 } |
| 919 | 934 |
| 920 user_data_values->push_back(user_data_value); | 935 user_data_values->push_back(user_data_value); |
| 921 } | 936 } |
| 922 } | 937 } |
| 923 | 938 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 997 | 1012 |
| 998 leveldb::WriteBatch batch; | 1013 leveldb::WriteBatch batch; |
| 999 | 1014 |
| 1000 for (const std::string& user_data_name_prefix : user_data_name_prefixes) { | 1015 for (const std::string& user_data_name_prefix : user_data_name_prefixes) { |
| 1001 // Example |key_prefix| is "REG_USER_DATA:123456\x00abc". | 1016 // Example |key_prefix| is "REG_USER_DATA:123456\x00abc". |
| 1002 std::string key_prefix = | 1017 std::string key_prefix = |
| 1003 CreateUserDataKey(registration_id, user_data_name_prefix); | 1018 CreateUserDataKey(registration_id, user_data_name_prefix); |
| 1004 std::unique_ptr<leveldb::Iterator> itr( | 1019 std::unique_ptr<leveldb::Iterator> itr( |
| 1005 db_->NewIterator(leveldb::ReadOptions())); | 1020 db_->NewIterator(leveldb::ReadOptions())); |
| 1006 for (itr->Seek(key_prefix); itr->Valid(); itr->Next()) { | 1021 for (itr->Seek(key_prefix); itr->Valid(); itr->Next()) { |
| 1007 status = LevelDBStatusToStatus(itr->status()); | 1022 status = LevelDBStatusToSWStatus(itr->status()); |
| 1008 if (status != STATUS_OK) | 1023 if (status != STATUS_OK) |
| 1009 return status; | 1024 return status; |
| 1010 | 1025 |
| 1011 // Example |itr->key()| is "REG_USER_DATA:123456\x00abcdef". | 1026 // Example |itr->key()| is "REG_USER_DATA:123456\x00abcdef". |
| 1012 if (!itr->key().starts_with(key_prefix)) { | 1027 if (!itr->key().starts_with(key_prefix)) { |
| 1013 // |itr| reached the end of the range of keys prefixed by |key_prefix|. | 1028 // |itr| reached the end of the range of keys prefixed by |key_prefix|. |
| 1014 break; | 1029 break; |
| 1015 } | 1030 } |
| 1016 | 1031 |
| 1017 // Example |user_data_name| is "abcdef". | 1032 // Example |user_data_name| is "abcdef". |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1041 if (IsNewOrNonexistentDatabase(status)) | 1056 if (IsNewOrNonexistentDatabase(status)) |
| 1042 return STATUS_OK; | 1057 return STATUS_OK; |
| 1043 if (status != STATUS_OK) | 1058 if (status != STATUS_OK) |
| 1044 return status; | 1059 return status; |
| 1045 | 1060 |
| 1046 std::string key_prefix = CreateHasUserDataKeyPrefix(user_data_name); | 1061 std::string key_prefix = CreateHasUserDataKeyPrefix(user_data_name); |
| 1047 { | 1062 { |
| 1048 std::unique_ptr<leveldb::Iterator> itr( | 1063 std::unique_ptr<leveldb::Iterator> itr( |
| 1049 db_->NewIterator(leveldb::ReadOptions())); | 1064 db_->NewIterator(leveldb::ReadOptions())); |
| 1050 for (itr->Seek(key_prefix); itr->Valid(); itr->Next()) { | 1065 for (itr->Seek(key_prefix); itr->Valid(); itr->Next()) { |
| 1051 status = LevelDBStatusToStatus(itr->status()); | 1066 status = LevelDBStatusToSWStatus(itr->status()); |
| 1052 if (status != STATUS_OK) { | 1067 if (status != STATUS_OK) { |
| 1053 user_data->clear(); | 1068 user_data->clear(); |
| 1054 break; | 1069 break; |
| 1055 } | 1070 } |
| 1056 | 1071 |
| 1057 std::string registration_id_string; | 1072 std::string registration_id_string; |
| 1058 if (!RemovePrefix(itr->key().ToString(), key_prefix, | 1073 if (!RemovePrefix(itr->key().ToString(), key_prefix, |
| 1059 ®istration_id_string)) { | 1074 ®istration_id_string)) { |
| 1060 break; | 1075 break; |
| 1061 } | 1076 } |
| 1062 | 1077 |
| 1063 int64_t registration_id; | 1078 int64_t registration_id; |
| 1064 status = ParseId(registration_id_string, ®istration_id); | 1079 status = ParseId(registration_id_string, ®istration_id); |
| 1065 if (status != STATUS_OK) { | 1080 if (status != STATUS_OK) { |
| 1066 user_data->clear(); | 1081 user_data->clear(); |
| 1067 break; | 1082 break; |
| 1068 } | 1083 } |
| 1069 | 1084 |
| 1070 std::string value; | 1085 std::string value; |
| 1071 status = LevelDBStatusToStatus( | 1086 status = LevelDBStatusToSWStatus( |
| 1072 db_->Get(leveldb::ReadOptions(), | 1087 db_->Get(leveldb::ReadOptions(), |
| 1073 CreateUserDataKey(registration_id, user_data_name), &value)); | 1088 CreateUserDataKey(registration_id, user_data_name), &value)); |
| 1074 if (status != STATUS_OK) { | 1089 if (status != STATUS_OK) { |
| 1075 user_data->clear(); | 1090 user_data->clear(); |
| 1076 break; | 1091 break; |
| 1077 } | 1092 } |
| 1078 user_data->push_back(std::make_pair(registration_id, value)); | 1093 user_data->push_back(std::make_pair(registration_id, value)); |
| 1079 } | 1094 } |
| 1080 } | 1095 } |
| 1081 | 1096 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1094 if (IsNewOrNonexistentDatabase(status)) | 1109 if (IsNewOrNonexistentDatabase(status)) |
| 1095 return STATUS_OK; | 1110 return STATUS_OK; |
| 1096 if (status != STATUS_OK) | 1111 if (status != STATUS_OK) |
| 1097 return status; | 1112 return status; |
| 1098 | 1113 |
| 1099 std::string key_prefix = kRegHasUserDataKeyPrefix + user_data_name_prefix; | 1114 std::string key_prefix = kRegHasUserDataKeyPrefix + user_data_name_prefix; |
| 1100 { | 1115 { |
| 1101 std::unique_ptr<leveldb::Iterator> itr( | 1116 std::unique_ptr<leveldb::Iterator> itr( |
| 1102 db_->NewIterator(leveldb::ReadOptions())); | 1117 db_->NewIterator(leveldb::ReadOptions())); |
| 1103 for (itr->Seek(key_prefix); itr->Valid(); itr->Next()) { | 1118 for (itr->Seek(key_prefix); itr->Valid(); itr->Next()) { |
| 1104 status = LevelDBStatusToStatus(itr->status()); | 1119 status = LevelDBStatusToSWStatus(itr->status()); |
| 1105 if (status != STATUS_OK) { | 1120 if (status != STATUS_OK) { |
| 1106 user_data->clear(); | 1121 user_data->clear(); |
| 1107 break; | 1122 break; |
| 1108 } | 1123 } |
| 1109 | 1124 |
| 1110 if (!itr->key().starts_with(key_prefix)) | 1125 if (!itr->key().starts_with(key_prefix)) |
| 1111 break; | 1126 break; |
| 1112 | 1127 |
| 1113 std::string user_data_name_with_id; | 1128 std::string user_data_name_with_id; |
| 1114 if (!RemovePrefix(itr->key().ToString(), kRegHasUserDataKeyPrefix, | 1129 if (!RemovePrefix(itr->key().ToString(), kRegHasUserDataKeyPrefix, |
| 1115 &user_data_name_with_id)) { | 1130 &user_data_name_with_id)) { |
| 1116 break; | 1131 break; |
| 1117 } | 1132 } |
| 1118 | 1133 |
| 1119 std::vector<std::string> parts = base::SplitString( | 1134 std::vector<std::string> parts = base::SplitString( |
| 1120 user_data_name_with_id, base::StringPrintf("%c", kKeySeparator), | 1135 user_data_name_with_id, base::StringPrintf("%c", kSWKeySeparator), |
| 1121 base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); | 1136 base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); |
| 1122 if (parts.size() != 2) { | 1137 if (parts.size() != 2) { |
| 1123 status = STATUS_ERROR_CORRUPTED; | 1138 status = STATUS_ERROR_CORRUPTED; |
| 1124 user_data->clear(); | 1139 user_data->clear(); |
| 1125 break; | 1140 break; |
| 1126 } | 1141 } |
| 1127 | 1142 |
| 1128 int64_t registration_id; | 1143 int64_t registration_id; |
| 1129 status = ParseId(parts[1], ®istration_id); | 1144 status = ParseId(parts[1], ®istration_id); |
| 1130 if (status != STATUS_OK) { | 1145 if (status != STATUS_OK) { |
| 1131 user_data->clear(); | 1146 user_data->clear(); |
| 1132 break; | 1147 break; |
| 1133 } | 1148 } |
| 1134 | 1149 |
| 1135 std::string value; | 1150 std::string value; |
| 1136 status = LevelDBStatusToStatus( | 1151 status = LevelDBStatusToSWStatus( |
| 1137 db_->Get(leveldb::ReadOptions(), | 1152 db_->Get(leveldb::ReadOptions(), |
| 1138 CreateUserDataKey(registration_id, parts[0]), &value)); | 1153 CreateUserDataKey(registration_id, parts[0]), &value)); |
| 1139 if (status != STATUS_OK) { | 1154 if (status != STATUS_OK) { |
| 1140 user_data->clear(); | 1155 user_data->clear(); |
| 1141 break; | 1156 break; |
| 1142 } | 1157 } |
| 1143 user_data->push_back(std::make_pair(registration_id, value)); | 1158 user_data->push_back(std::make_pair(registration_id, value)); |
| 1144 } | 1159 } |
| 1145 } | 1160 } |
| 1146 | 1161 |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1277 | 1292 |
| 1278 leveldb_env::Options options; | 1293 leveldb_env::Options options; |
| 1279 options.create_if_missing = create_if_missing; | 1294 options.create_if_missing = create_if_missing; |
| 1280 if (IsDatabaseInMemory()) { | 1295 if (IsDatabaseInMemory()) { |
| 1281 env_.reset(leveldb::NewMemEnv(leveldb::Env::Default())); | 1296 env_.reset(leveldb::NewMemEnv(leveldb::Env::Default())); |
| 1282 options.env = env_.get(); | 1297 options.env = env_.get(); |
| 1283 } else { | 1298 } else { |
| 1284 options.env = g_service_worker_env.Pointer(); | 1299 options.env = g_service_worker_env.Pointer(); |
| 1285 } | 1300 } |
| 1286 | 1301 |
| 1287 Status status = LevelDBStatusToStatus( | 1302 Status status = LevelDBStatusToSWStatus( |
| 1288 leveldb_env::OpenDB(options, path_.AsUTF8Unsafe(), &db_)); | 1303 leveldb_env::OpenDB(options, path_.AsUTF8Unsafe(), &db_)); |
| 1289 HandleOpenResult(FROM_HERE, status); | 1304 HandleOpenResult(FROM_HERE, status); |
| 1290 if (status != STATUS_OK) { | 1305 if (status != STATUS_OK) { |
| 1291 // TODO(nhiroki): Should we retry to open the database? | 1306 // TODO(nhiroki): Should we retry to open the database? |
| 1292 return status; | 1307 return status; |
| 1293 } | 1308 } |
| 1294 | 1309 |
| 1295 int64_t db_version; | 1310 int64_t db_version; |
| 1296 status = ReadDatabaseVersion(&db_version); | 1311 status = ReadDatabaseVersion(&db_version); |
| 1297 if (status != STATUS_OK) | 1312 if (status != STATUS_OK) |
| 1298 return status; | 1313 return status; |
| 1299 | 1314 |
| 1300 switch (db_version) { | 1315 switch (db_version) { |
| 1301 case 0: | 1316 case 0: |
| 1302 // This database is new. It will be initialized when something is written. | 1317 // This database is new. It will be initialized when something is written. |
| 1303 DCHECK_EQ(UNINITIALIZED, state_); | 1318 DCHECK_EQ(UNINITIALIZED, state_); |
| 1304 return STATUS_OK; | 1319 return STATUS_OK; |
| 1305 case 1: | 1320 case 1: |
| 1306 // This database has an obsolete schema version. ServiceWorkerStorage | 1321 // This database has an obsolete schema version. ServiceWorkerStorage |
| 1307 // should recreate it. | 1322 // should recreate it. |
| 1308 status = STATUS_ERROR_FAILED; | 1323 status = STATUS_ERROR_FAILED; |
| 1309 Disable(FROM_HERE, status); | 1324 Disable(FROM_HERE, status); |
| 1310 return status; | 1325 return status; |
| 1311 case 2: | 1326 case 2: |
| 1312 DCHECK_EQ(db_version, kCurrentSchemaVersion); | 1327 DCHECK_EQ(db_version, kSWCurrentSchemaVersion); |
| 1313 state_ = INITIALIZED; | 1328 state_ = INITIALIZED; |
| 1314 return STATUS_OK; | 1329 return STATUS_OK; |
| 1315 default: | 1330 default: |
| 1316 // Other cases should be handled in ReadDatabaseVersion. | 1331 // Other cases should be handled in ReadDatabaseVersion. |
| 1317 NOTREACHED(); | 1332 NOTREACHED(); |
| 1318 return STATUS_ERROR_CORRUPTED; | 1333 return STATUS_ERROR_CORRUPTED; |
| 1319 } | 1334 } |
| 1320 } | 1335 } |
| 1321 | 1336 |
| 1322 bool ServiceWorkerDatabase::IsNewOrNonexistentDatabase( | 1337 bool ServiceWorkerDatabase::IsNewOrNonexistentDatabase( |
| 1323 ServiceWorkerDatabase::Status status) { | 1338 ServiceWorkerDatabase::Status status) { |
| 1324 if (status == STATUS_ERROR_NOT_FOUND) | 1339 if (status == STATUS_ERROR_NOT_FOUND) |
| 1325 return true; | 1340 return true; |
| 1326 if (status == STATUS_OK && state_ == UNINITIALIZED) | 1341 if (status == STATUS_OK && state_ == UNINITIALIZED) |
| 1327 return true; | 1342 return true; |
| 1328 return false; | 1343 return false; |
| 1329 } | 1344 } |
| 1330 | 1345 |
| 1331 ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadNextAvailableId( | 1346 ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadNextAvailableId( |
| 1332 const char* id_key, | 1347 const char* id_key, |
| 1333 int64_t* next_avail_id) { | 1348 int64_t* next_avail_id) { |
| 1334 DCHECK(id_key); | 1349 DCHECK(id_key); |
| 1335 DCHECK(next_avail_id); | 1350 DCHECK(next_avail_id); |
| 1336 | 1351 |
| 1337 std::string value; | 1352 std::string value; |
| 1338 Status status = LevelDBStatusToStatus( | 1353 Status status = LevelDBStatusToSWStatus( |
| 1339 db_->Get(leveldb::ReadOptions(), id_key, &value)); | 1354 db_->Get(leveldb::ReadOptions(), id_key, &value)); |
| 1340 if (status == STATUS_ERROR_NOT_FOUND) { | 1355 if (status == STATUS_ERROR_NOT_FOUND) { |
| 1341 // Nobody has gotten the next resource id for |id_key|. | 1356 // Nobody has gotten the next resource id for |id_key|. |
| 1342 *next_avail_id = 0; | 1357 *next_avail_id = 0; |
| 1343 HandleReadResult(FROM_HERE, STATUS_OK); | 1358 HandleReadResult(FROM_HERE, STATUS_OK); |
| 1344 return STATUS_OK; | 1359 return STATUS_OK; |
| 1345 } else if (status != STATUS_OK) { | 1360 } else if (status != STATUS_OK) { |
| 1346 HandleReadResult(FROM_HERE, status); | 1361 HandleReadResult(FROM_HERE, status); |
| 1347 return status; | 1362 return status; |
| 1348 } | 1363 } |
| 1349 | 1364 |
| 1350 status = ParseId(value, next_avail_id); | 1365 status = ParseId(value, next_avail_id); |
| 1351 HandleReadResult(FROM_HERE, status); | 1366 HandleReadResult(FROM_HERE, status); |
| 1352 return status; | 1367 return status; |
| 1353 } | 1368 } |
| 1354 | 1369 |
| 1355 ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistrationData( | 1370 ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistrationData( |
| 1356 int64_t registration_id, | 1371 int64_t registration_id, |
| 1357 const GURL& origin, | 1372 const GURL& origin, |
| 1358 RegistrationData* registration) { | 1373 RegistrationData* registration) { |
| 1359 DCHECK(registration); | 1374 DCHECK(registration); |
| 1360 | 1375 |
| 1361 const std::string key = CreateRegistrationKey(registration_id, origin); | 1376 const std::string key = CreateRegistrationKey(registration_id, origin); |
| 1362 std::string value; | 1377 std::string value; |
| 1363 Status status = LevelDBStatusToStatus( | 1378 Status status = LevelDBStatusToSWStatus( |
| 1364 db_->Get(leveldb::ReadOptions(), key, &value)); | 1379 db_->Get(leveldb::ReadOptions(), key, &value)); |
| 1365 if (status != STATUS_OK) { | 1380 if (status != STATUS_OK) { |
| 1366 HandleReadResult( | 1381 HandleReadResult( |
| 1367 FROM_HERE, | 1382 FROM_HERE, |
| 1368 status == STATUS_ERROR_NOT_FOUND ? STATUS_OK : status); | 1383 status == STATUS_ERROR_NOT_FOUND ? STATUS_OK : status); |
| 1369 return status; | 1384 return status; |
| 1370 } | 1385 } |
| 1371 | 1386 |
| 1372 status = ParseRegistrationData(value, registration); | 1387 status = ParseRegistrationData(value, registration); |
| 1373 HandleReadResult(FROM_HERE, status); | 1388 HandleReadResult(FROM_HERE, status); |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1515 DCHECK(resources->empty()); | 1530 DCHECK(resources->empty()); |
| 1516 | 1531 |
| 1517 Status status = STATUS_OK; | 1532 Status status = STATUS_OK; |
| 1518 bool has_main_resource = false; | 1533 bool has_main_resource = false; |
| 1519 const std::string prefix = | 1534 const std::string prefix = |
| 1520 CreateResourceRecordKeyPrefix(registration.version_id); | 1535 CreateResourceRecordKeyPrefix(registration.version_id); |
| 1521 { | 1536 { |
| 1522 std::unique_ptr<leveldb::Iterator> itr( | 1537 std::unique_ptr<leveldb::Iterator> itr( |
| 1523 db_->NewIterator(leveldb::ReadOptions())); | 1538 db_->NewIterator(leveldb::ReadOptions())); |
| 1524 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { | 1539 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { |
| 1525 Status status = LevelDBStatusToStatus(itr->status()); | 1540 Status status = LevelDBStatusToSWStatus(itr->status()); |
| 1526 if (status != STATUS_OK) { | 1541 if (status != STATUS_OK) { |
| 1527 resources->clear(); | 1542 resources->clear(); |
| 1528 break; | 1543 break; |
| 1529 } | 1544 } |
| 1530 | 1545 |
| 1531 if (!RemovePrefix(itr->key().ToString(), prefix, NULL)) | 1546 if (!RemovePrefix(itr->key().ToString(), prefix, NULL)) |
| 1532 break; | 1547 break; |
| 1533 | 1548 |
| 1534 ResourceRecord resource; | 1549 ResourceRecord resource; |
| 1535 status = ParseResourceRecord(itr->value().ToString(), &resource); | 1550 status = ParseResourceRecord(itr->value().ToString(), &resource); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1616 leveldb::WriteBatch* batch) { | 1631 leveldb::WriteBatch* batch) { |
| 1617 DCHECK(batch); | 1632 DCHECK(batch); |
| 1618 | 1633 |
| 1619 Status status = STATUS_OK; | 1634 Status status = STATUS_OK; |
| 1620 const std::string prefix = CreateResourceRecordKeyPrefix(version_id); | 1635 const std::string prefix = CreateResourceRecordKeyPrefix(version_id); |
| 1621 | 1636 |
| 1622 { | 1637 { |
| 1623 std::unique_ptr<leveldb::Iterator> itr( | 1638 std::unique_ptr<leveldb::Iterator> itr( |
| 1624 db_->NewIterator(leveldb::ReadOptions())); | 1639 db_->NewIterator(leveldb::ReadOptions())); |
| 1625 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { | 1640 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { |
| 1626 status = LevelDBStatusToStatus(itr->status()); | 1641 status = LevelDBStatusToSWStatus(itr->status()); |
| 1627 if (status != STATUS_OK) | 1642 if (status != STATUS_OK) |
| 1628 break; | 1643 break; |
| 1629 | 1644 |
| 1630 const std::string key = itr->key().ToString(); | 1645 const std::string key = itr->key().ToString(); |
| 1631 std::string unprefixed; | 1646 std::string unprefixed; |
| 1632 if (!RemovePrefix(key, prefix, &unprefixed)) | 1647 if (!RemovePrefix(key, prefix, &unprefixed)) |
| 1633 break; | 1648 break; |
| 1634 | 1649 |
| 1635 int64_t resource_id; | 1650 int64_t resource_id; |
| 1636 status = ParseId(unprefixed, &resource_id); | 1651 status = ParseId(unprefixed, &resource_id); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1661 Status status = LazyOpen(false); | 1676 Status status = LazyOpen(false); |
| 1662 if (IsNewOrNonexistentDatabase(status)) | 1677 if (IsNewOrNonexistentDatabase(status)) |
| 1663 return STATUS_OK; | 1678 return STATUS_OK; |
| 1664 if (status != STATUS_OK) | 1679 if (status != STATUS_OK) |
| 1665 return status; | 1680 return status; |
| 1666 | 1681 |
| 1667 { | 1682 { |
| 1668 std::unique_ptr<leveldb::Iterator> itr( | 1683 std::unique_ptr<leveldb::Iterator> itr( |
| 1669 db_->NewIterator(leveldb::ReadOptions())); | 1684 db_->NewIterator(leveldb::ReadOptions())); |
| 1670 for (itr->Seek(id_key_prefix); itr->Valid(); itr->Next()) { | 1685 for (itr->Seek(id_key_prefix); itr->Valid(); itr->Next()) { |
| 1671 status = LevelDBStatusToStatus(itr->status()); | 1686 status = LevelDBStatusToSWStatus(itr->status()); |
| 1672 if (status != STATUS_OK) { | 1687 if (status != STATUS_OK) { |
| 1673 ids->clear(); | 1688 ids->clear(); |
| 1674 break; | 1689 break; |
| 1675 } | 1690 } |
| 1676 | 1691 |
| 1677 std::string unprefixed; | 1692 std::string unprefixed; |
| 1678 if (!RemovePrefix(itr->key().ToString(), id_key_prefix, &unprefixed)) | 1693 if (!RemovePrefix(itr->key().ToString(), id_key_prefix, &unprefixed)) |
| 1679 break; | 1694 break; |
| 1680 | 1695 |
| 1681 int64_t resource_id; | 1696 int64_t resource_id; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1740 int64_t registration_id, | 1755 int64_t registration_id, |
| 1741 leveldb::WriteBatch* batch) { | 1756 leveldb::WriteBatch* batch) { |
| 1742 DCHECK(batch); | 1757 DCHECK(batch); |
| 1743 Status status = STATUS_OK; | 1758 Status status = STATUS_OK; |
| 1744 const std::string prefix = CreateUserDataKeyPrefix(registration_id); | 1759 const std::string prefix = CreateUserDataKeyPrefix(registration_id); |
| 1745 | 1760 |
| 1746 { | 1761 { |
| 1747 std::unique_ptr<leveldb::Iterator> itr( | 1762 std::unique_ptr<leveldb::Iterator> itr( |
| 1748 db_->NewIterator(leveldb::ReadOptions())); | 1763 db_->NewIterator(leveldb::ReadOptions())); |
| 1749 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { | 1764 for (itr->Seek(prefix); itr->Valid(); itr->Next()) { |
| 1750 status = LevelDBStatusToStatus(itr->status()); | 1765 status = LevelDBStatusToSWStatus(itr->status()); |
| 1751 if (status != STATUS_OK) | 1766 if (status != STATUS_OK) |
| 1752 break; | 1767 break; |
| 1753 | 1768 |
| 1754 const std::string key = itr->key().ToString(); | 1769 const std::string key = itr->key().ToString(); |
| 1755 std::string user_data_name; | 1770 std::string user_data_name; |
| 1756 if (!RemovePrefix(key, prefix, &user_data_name)) | 1771 if (!RemovePrefix(key, prefix, &user_data_name)) |
| 1757 break; | 1772 break; |
| 1758 batch->Delete(key); | 1773 batch->Delete(key); |
| 1759 batch->Delete(CreateHasUserDataKey(registration_id, user_data_name)); | 1774 batch->Delete(CreateHasUserDataKey(registration_id, user_data_name)); |
| 1760 } | 1775 } |
| 1761 } | 1776 } |
| 1762 | 1777 |
| 1763 HandleReadResult(FROM_HERE, status); | 1778 HandleReadResult(FROM_HERE, status); |
| 1764 return status; | 1779 return status; |
| 1765 } | 1780 } |
| 1766 | 1781 |
| 1767 ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadDatabaseVersion( | 1782 ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadDatabaseVersion( |
| 1768 int64_t* db_version) { | 1783 int64_t* db_version) { |
| 1769 std::string value; | 1784 std::string value; |
| 1770 Status status = LevelDBStatusToStatus( | 1785 Status status = LevelDBStatusToSWStatus( |
| 1771 db_->Get(leveldb::ReadOptions(), kDatabaseVersionKey, &value)); | 1786 db_->Get(leveldb::ReadOptions(), kDatabaseVersionKey, &value)); |
| 1772 if (status == STATUS_ERROR_NOT_FOUND) { | 1787 if (status == STATUS_ERROR_NOT_FOUND) { |
| 1773 // The database hasn't been initialized yet. | 1788 // The database hasn't been initialized yet. |
| 1774 *db_version = 0; | 1789 *db_version = 0; |
| 1775 HandleReadResult(FROM_HERE, STATUS_OK); | 1790 HandleReadResult(FROM_HERE, STATUS_OK); |
| 1776 return STATUS_OK; | 1791 return STATUS_OK; |
| 1777 } | 1792 } |
| 1778 | 1793 |
| 1779 if (status != STATUS_OK) { | 1794 if (status != STATUS_OK) { |
| 1780 HandleReadResult(FROM_HERE, status); | 1795 HandleReadResult(FROM_HERE, status); |
| 1781 return status; | 1796 return status; |
| 1782 } | 1797 } |
| 1783 | 1798 |
| 1784 const int kFirstValidVersion = 1; | 1799 const int kFirstValidVersion = 1; |
| 1785 if (!base::StringToInt64(value, db_version) || | 1800 if (!base::StringToInt64(value, db_version) || |
| 1786 *db_version < kFirstValidVersion || kCurrentSchemaVersion < *db_version) { | 1801 *db_version < kFirstValidVersion || kSWCurrentSchemaVersion < *db_version)
{ |
| 1787 status = STATUS_ERROR_CORRUPTED; | 1802 status = STATUS_ERROR_CORRUPTED; |
| 1788 HandleReadResult(FROM_HERE, status); | 1803 HandleReadResult(FROM_HERE, status); |
| 1789 return status; | 1804 return status; |
| 1790 } | 1805 } |
| 1791 | 1806 |
| 1792 status = STATUS_OK; | 1807 status = STATUS_OK; |
| 1793 HandleReadResult(FROM_HERE, status); | 1808 HandleReadResult(FROM_HERE, status); |
| 1794 return status; | 1809 return status; |
| 1795 } | 1810 } |
| 1796 | 1811 |
| 1797 ServiceWorkerDatabase::Status ServiceWorkerDatabase::WriteBatch( | 1812 ServiceWorkerDatabase::Status ServiceWorkerDatabase::WriteBatch( |
| 1798 leveldb::WriteBatch* batch) { | 1813 leveldb::WriteBatch* batch) { |
| 1799 DCHECK(batch); | 1814 DCHECK(batch); |
| 1800 DCHECK_NE(DISABLED, state_); | 1815 DCHECK_NE(DISABLED, state_); |
| 1801 | 1816 |
| 1802 if (state_ == UNINITIALIZED) { | 1817 if (state_ == UNINITIALIZED) { |
| 1803 // Write database default values. | 1818 // Write database default values. |
| 1804 batch->Put(kDatabaseVersionKey, base::Int64ToString(kCurrentSchemaVersion)); | 1819 batch->Put(kDatabaseVersionKey, base::Int64ToString(kSWCurrentSchemaVersion)
); |
| 1805 state_ = INITIALIZED; | 1820 state_ = INITIALIZED; |
| 1806 } | 1821 } |
| 1807 | 1822 |
| 1808 Status status = LevelDBStatusToStatus( | 1823 Status status = LevelDBStatusToSWStatus( |
| 1809 db_->Write(leveldb::WriteOptions(), batch)); | 1824 db_->Write(leveldb::WriteOptions(), batch)); |
| 1810 HandleWriteResult(FROM_HERE, status); | 1825 HandleWriteResult(FROM_HERE, status); |
| 1811 return status; | 1826 return status; |
| 1812 } | 1827 } |
| 1813 | 1828 |
| 1814 void ServiceWorkerDatabase::BumpNextRegistrationIdIfNeeded( | 1829 void ServiceWorkerDatabase::BumpNextRegistrationIdIfNeeded( |
| 1815 int64_t used_id, | 1830 int64_t used_id, |
| 1816 leveldb::WriteBatch* batch) { | 1831 leveldb::WriteBatch* batch) { |
| 1817 DCHECK(batch); | 1832 DCHECK(batch); |
| 1818 if (next_avail_registration_id_ <= used_id) { | 1833 if (next_avail_registration_id_ <= used_id) { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1879 if (status != STATUS_OK) | 1894 if (status != STATUS_OK) |
| 1880 Disable(from_here, status); | 1895 Disable(from_here, status); |
| 1881 ServiceWorkerMetrics::CountWriteDatabaseResult(status); | 1896 ServiceWorkerMetrics::CountWriteDatabaseResult(status); |
| 1882 } | 1897 } |
| 1883 | 1898 |
| 1884 bool ServiceWorkerDatabase::IsDatabaseInMemory() const { | 1899 bool ServiceWorkerDatabase::IsDatabaseInMemory() const { |
| 1885 return path_.empty(); | 1900 return path_.empty(); |
| 1886 } | 1901 } |
| 1887 | 1902 |
| 1888 } // namespace content | 1903 } // namespace content |
| OLD | NEW |