| 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 | 
|---|