Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Side by Side Diff: content/browser/service_worker/service_worker_database.cc

Issue 275103004: ServiceWorker: Database functions should return status code instead of boolean (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 <string> 7 #include <string>
8 8
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 GURL url(record.url()); 204 GURL url(record.url());
205 if (!url.is_valid()) 205 if (!url.is_valid())
206 return false; 206 return false;
207 207
208 // Convert ServiceWorkerResourceRecord to ResourceRecord. 208 // Convert ServiceWorkerResourceRecord to ResourceRecord.
209 out->resource_id = record.resource_id(); 209 out->resource_id = record.resource_id();
210 out->url = url; 210 out->url = url;
211 return true; 211 return true;
212 } 212 }
213 213
214 ServiceWorkerStatusCode LevelDBStatusToServiceWorkerStatusCode(
215 const leveldb::Status& status) {
216 if (status.ok())
217 return SERVICE_WORKER_OK;
218 else if (status.IsNotFound())
219 return SERVICE_WORKER_ERROR_NOT_FOUND;
220 else if (status.IsCorruption())
221 return SERVICE_WORKER_ERROR_DB_CORRUPTED;
222 else
223 return SERVICE_WORKER_ERROR_FAILED;
224 }
225
214 } // namespace 226 } // namespace
215 227
216 ServiceWorkerDatabase::RegistrationData::RegistrationData() 228 ServiceWorkerDatabase::RegistrationData::RegistrationData()
217 : registration_id(-1), 229 : registration_id(-1),
218 version_id(-1), 230 version_id(-1),
219 is_active(false), 231 is_active(false),
220 has_fetch_handler(false) { 232 has_fetch_handler(false) {
221 } 233 }
222 234
223 ServiceWorkerDatabase::RegistrationData::~RegistrationData() { 235 ServiceWorkerDatabase::RegistrationData::~RegistrationData() {
224 } 236 }
225 237
226 ServiceWorkerDatabase::ServiceWorkerDatabase(const base::FilePath& path) 238 ServiceWorkerDatabase::ServiceWorkerDatabase(const base::FilePath& path)
227 : path_(path), 239 : path_(path),
228 next_avail_registration_id_(0), 240 next_avail_registration_id_(0),
229 next_avail_resource_id_(0), 241 next_avail_resource_id_(0),
230 next_avail_version_id_(0), 242 next_avail_version_id_(0),
231 is_disabled_(false), 243 is_disabled_(false),
232 was_corruption_detected_(false), 244 was_corruption_detected_(false),
233 is_initialized_(false) { 245 is_initialized_(false) {
234 sequence_checker_.DetachFromSequence(); 246 sequence_checker_.DetachFromSequence();
235 } 247 }
236 248
237 ServiceWorkerDatabase::~ServiceWorkerDatabase() { 249 ServiceWorkerDatabase::~ServiceWorkerDatabase() {
238 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); 250 DCHECK(sequence_checker_.CalledOnValidSequencedThread());
239 db_.reset(); 251 db_.reset();
240 } 252 }
241 253
242 bool ServiceWorkerDatabase::GetNextAvailableIds( 254 ServiceWorkerStatusCode ServiceWorkerDatabase::GetNextAvailableIds(
243 int64* next_avail_registration_id, 255 int64* next_avail_registration_id,
244 int64* next_avail_version_id, 256 int64* next_avail_version_id,
245 int64* next_avail_resource_id) { 257 int64* next_avail_resource_id) {
246 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); 258 DCHECK(sequence_checker_.CalledOnValidSequencedThread());
247 DCHECK(next_avail_registration_id); 259 DCHECK(next_avail_registration_id);
248 DCHECK(next_avail_version_id); 260 DCHECK(next_avail_version_id);
249 DCHECK(next_avail_resource_id); 261 DCHECK(next_avail_resource_id);
250 262
251 if (!LazyOpen(false)) { 263 if (!LazyOpen(false)) {
252 if (is_disabled_) 264 if (is_disabled_)
253 return false; 265 return SERVICE_WORKER_ERROR_FAILED;
254 // Database has never been used. 266 // Database has never been used.
255 *next_avail_registration_id = 0; 267 *next_avail_registration_id = 0;
256 *next_avail_version_id = 0; 268 *next_avail_version_id = 0;
257 *next_avail_resource_id = 0; 269 *next_avail_resource_id = 0;
258 return true; 270 return SERVICE_WORKER_OK;
259 } 271 }
260 272
261 if (!ReadNextAvailableId(kNextRegIdKey, &next_avail_registration_id_) || 273 ServiceWorkerStatusCode status =
262 !ReadNextAvailableId(kNextVerIdKey, &next_avail_version_id_) || 274 ReadNextAvailableId(kNextRegIdKey, &next_avail_registration_id_);
263 !ReadNextAvailableId(kNextResIdKey, &next_avail_resource_id_)) { 275 if (status != SERVICE_WORKER_OK)
264 return false; 276 return status;
265 } 277 status = ReadNextAvailableId(kNextVerIdKey, &next_avail_version_id_);
278 if (status != SERVICE_WORKER_OK)
279 return status;
280 status = ReadNextAvailableId(kNextResIdKey, &next_avail_resource_id_);
281 if (status != SERVICE_WORKER_OK)
282 return status;
266 283
267 *next_avail_registration_id = next_avail_registration_id_; 284 *next_avail_registration_id = next_avail_registration_id_;
268 *next_avail_version_id = next_avail_version_id_; 285 *next_avail_version_id = next_avail_version_id_;
269 *next_avail_resource_id = next_avail_resource_id_; 286 *next_avail_resource_id = next_avail_resource_id_;
270 return true; 287 return SERVICE_WORKER_OK;
271 } 288 }
272 289
273 bool ServiceWorkerDatabase::GetOriginsWithRegistrations( 290 ServiceWorkerStatusCode ServiceWorkerDatabase::GetOriginsWithRegistrations(
274 std::set<GURL>* origins) { 291 std::set<GURL>* origins) {
275 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); 292 DCHECK(sequence_checker_.CalledOnValidSequencedThread());
276 DCHECK(origins); 293 DCHECK(origins);
277 294
278 if (!LazyOpen(false)) { 295 if (!LazyOpen(false)) {
279 if (is_disabled_) 296 if (is_disabled_)
280 return false; 297 return SERVICE_WORKER_ERROR_FAILED;
281 // Database has never been used. 298 // Database has never been used.
282 origins->clear(); 299 origins->clear();
283 return true; 300 return SERVICE_WORKER_OK;
284 } 301 }
285 302
286 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions())); 303 scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
287 for (itr->Seek(kUniqueOriginKey); itr->Valid(); itr->Next()) { 304 for (itr->Seek(kUniqueOriginKey); itr->Valid(); itr->Next()) {
288 if (!itr->status().ok()) { 305 if (!itr->status().ok()) {
289 HandleError(FROM_HERE, itr->status()); 306 HandleError(FROM_HERE, itr->status());
290 origins->clear(); 307 origins->clear();
291 return false; 308 return LevelDBStatusToServiceWorkerStatusCode(itr->status());
292 } 309 }
293 310
294 std::string origin; 311 std::string origin;
295 if (!RemovePrefix(itr->key().ToString(), kUniqueOriginKey, &origin)) 312 if (!RemovePrefix(itr->key().ToString(), kUniqueOriginKey, &origin))
296 break; 313 break;
297 origins->insert(GURL(origin)); 314 origins->insert(GURL(origin));
298 } 315 }
299 return true; 316 return SERVICE_WORKER_OK;
300 } 317 }
301 318
302 bool ServiceWorkerDatabase::GetRegistrationsForOrigin( 319 bool ServiceWorkerDatabase::GetRegistrationsForOrigin(
303 const GURL& origin, 320 const GURL& origin,
304 std::vector<RegistrationData>* registrations) { 321 std::vector<RegistrationData>* registrations) {
305 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); 322 DCHECK(sequence_checker_.CalledOnValidSequencedThread());
306 DCHECK(registrations); 323 DCHECK(registrations);
307 324
308 if (!LazyOpen(false)) { 325 if (!LazyOpen(false)) {
309 if (is_disabled_) 326 if (is_disabled_)
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 db_.reset(db); 634 db_.reset(db);
618 635
619 int64 db_version; 636 int64 db_version;
620 if (!ReadDatabaseVersion(&db_version)) 637 if (!ReadDatabaseVersion(&db_version))
621 return false; 638 return false;
622 if (db_version > 0) 639 if (db_version > 0)
623 is_initialized_ = true; 640 is_initialized_ = true;
624 return true; 641 return true;
625 } 642 }
626 643
627 bool ServiceWorkerDatabase::ReadNextAvailableId( 644 ServiceWorkerStatusCode ServiceWorkerDatabase::ReadNextAvailableId(
628 const char* id_key, int64* next_avail_id) { 645 const char* id_key,
646 int64* next_avail_id) {
629 DCHECK(id_key); 647 DCHECK(id_key);
630 DCHECK(next_avail_id); 648 DCHECK(next_avail_id);
631 649
632 std::string value; 650 std::string value;
633 leveldb::Status status = db_->Get(leveldb::ReadOptions(), id_key, &value); 651 leveldb::Status status = db_->Get(leveldb::ReadOptions(), id_key, &value);
634 if (status.IsNotFound()) { 652 if (status.IsNotFound()) {
635 // Nobody has gotten the next resource id for |id_key|. 653 // Nobody has gotten the next resource id for |id_key|.
636 *next_avail_id = 0; 654 *next_avail_id = 0;
637 return true; 655 return SERVICE_WORKER_OK;
638 } 656 }
639 657
640 if (!status.ok()) { 658 if (!status.ok()) {
641 HandleError(FROM_HERE, status); 659 HandleError(FROM_HERE, status);
642 return false; 660 return LevelDBStatusToServiceWorkerStatusCode(status);
643 } 661 }
644 662
645 int64 parsed; 663 int64 parsed;
646 if (!base::StringToInt64(value, &parsed)) { 664 if (!base::StringToInt64(value, &parsed)) {
647 HandleError(FROM_HERE, leveldb::Status::Corruption("failed to parse")); 665 HandleError(FROM_HERE, leveldb::Status::Corruption("failed to parse"));
648 return false; 666 return SERVICE_WORKER_ERROR_DB_CORRUPTED;
649 } 667 }
650 668
651 *next_avail_id = parsed; 669 *next_avail_id = parsed;
652 return true; 670 return SERVICE_WORKER_OK;
653 } 671 }
654 672
655 bool ServiceWorkerDatabase::ReadRegistrationData( 673 bool ServiceWorkerDatabase::ReadRegistrationData(
656 int64 registration_id, 674 int64 registration_id,
657 const GURL& origin, 675 const GURL& origin,
658 RegistrationData* registration) { 676 RegistrationData* registration) {
659 DCHECK(registration); 677 DCHECK(registration);
660 678
661 std::string key = CreateRegistrationKey(registration_id, origin); 679 std::string key = CreateRegistrationKey(registration_id, origin);
662 680
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 // TODO(nhiroki): Add an UMA histogram. 903 // TODO(nhiroki): Add an UMA histogram.
886 DLOG(ERROR) << "Failed at: " << from_here.ToString() 904 DLOG(ERROR) << "Failed at: " << from_here.ToString()
887 << " with error: " << status.ToString(); 905 << " with error: " << status.ToString();
888 is_disabled_ = true; 906 is_disabled_ = true;
889 if (status.IsCorruption()) 907 if (status.IsCorruption())
890 was_corruption_detected_ = true; 908 was_corruption_detected_ = true;
891 db_.reset(); 909 db_.reset();
892 } 910 }
893 911
894 } // namespace content 912 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698