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

Side by Side Diff: content/browser/indexed_db/indexed_db_backing_store.cc

Issue 1116253003: IndexedDB: Added IDBObjectStore.getAll() corruption test. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@idb-objectstore-getall
Patch Set: Created 5 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
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/indexed_db/indexed_db_backing_store.h" 5 #include "content/browser/indexed_db/indexed_db_backing_store.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/files/file_util.h" 10 #include "base/files/file_util.h"
(...skipping 3223 matching lines...) Expand 10 before | Expand all | Expand 10 after
3234 continue; 3234 continue;
3235 } 3235 }
3236 3236
3237 return false; 3237 return false;
3238 } 3238 }
3239 3239
3240 if (!HaveEnteredRange()) 3240 if (!HaveEnteredRange())
3241 continue; 3241 continue;
3242 3242
3243 // The row may not load because there's a stale entry in the 3243 // The row may not load because there's a stale entry in the
3244 // index. This is not fatal. 3244 // index. If no error then not fatal.
3245 if (!LoadCurrentRow()) 3245 if (!LoadCurrentRow(s)) {
3246 if (!s->ok())
3247 return false;
3246 continue; 3248 continue;
3249 }
3247 3250
3248 if (key) { 3251 if (key) {
3249 if (forward) { 3252 if (forward) {
3250 if (primary_key && current_key_->Equals(*key) && 3253 if (primary_key && current_key_->Equals(*key) &&
3251 this->primary_key().IsLessThan(*primary_key)) 3254 this->primary_key().IsLessThan(*primary_key))
3252 continue; 3255 continue;
3253 if (!flipped && current_key_->IsLessThan(*key)) 3256 if (!flipped && current_key_->IsLessThan(*key))
3254 continue; 3257 continue;
3255 } else { 3258 } else {
3256 if (primary_key && key->Equals(*current_key_) && 3259 if (primary_key && key->Equals(*current_key_) &&
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
3345 database_id, 3348 database_id,
3346 cursor_options) {} 3349 cursor_options) {}
3347 3350
3348 Cursor* Clone() override { return new ObjectStoreKeyCursorImpl(this); } 3351 Cursor* Clone() override { return new ObjectStoreKeyCursorImpl(this); }
3349 3352
3350 // IndexedDBBackingStore::Cursor 3353 // IndexedDBBackingStore::Cursor
3351 IndexedDBValue* value() override { 3354 IndexedDBValue* value() override {
3352 NOTREACHED(); 3355 NOTREACHED();
3353 return NULL; 3356 return NULL;
3354 } 3357 }
3355 bool LoadCurrentRow() override; 3358 bool LoadCurrentRow(leveldb::Status* s) override;
3356 3359
3357 protected: 3360 protected:
3358 std::string EncodeKey(const IndexedDBKey& key) override { 3361 std::string EncodeKey(const IndexedDBKey& key) override {
3359 return ObjectStoreDataKey::Encode( 3362 return ObjectStoreDataKey::Encode(
3360 cursor_options_.database_id, cursor_options_.object_store_id, key); 3363 cursor_options_.database_id, cursor_options_.object_store_id, key);
3361 } 3364 }
3362 std::string EncodeKey(const IndexedDBKey& key, 3365 std::string EncodeKey(const IndexedDBKey& key,
3363 const IndexedDBKey& primary_key) override { 3366 const IndexedDBKey& primary_key) override {
3364 NOTREACHED(); 3367 NOTREACHED();
3365 return std::string(); 3368 return std::string();
3366 } 3369 }
3367 3370
3368 private: 3371 private:
3369 explicit ObjectStoreKeyCursorImpl(const ObjectStoreKeyCursorImpl* other) 3372 explicit ObjectStoreKeyCursorImpl(const ObjectStoreKeyCursorImpl* other)
3370 : IndexedDBBackingStore::Cursor(other) {} 3373 : IndexedDBBackingStore::Cursor(other) {}
3371 3374
3372 DISALLOW_COPY_AND_ASSIGN(ObjectStoreKeyCursorImpl); 3375 DISALLOW_COPY_AND_ASSIGN(ObjectStoreKeyCursorImpl);
3373 }; 3376 };
3374 3377
3375 bool ObjectStoreKeyCursorImpl::LoadCurrentRow() { 3378 bool ObjectStoreKeyCursorImpl::LoadCurrentRow(leveldb::Status* s) {
3376 StringPiece slice(iterator_->Key()); 3379 StringPiece slice(iterator_->Key());
3377 ObjectStoreDataKey object_store_data_key; 3380 ObjectStoreDataKey object_store_data_key;
3378 if (!ObjectStoreDataKey::Decode(&slice, &object_store_data_key)) { 3381 if (!ObjectStoreDataKey::Decode(&slice, &object_store_data_key)) {
3379 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3382 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3383 *s = InvalidDBKeyStatus();
3380 return false; 3384 return false;
3381 } 3385 }
3382 3386
3383 current_key_ = object_store_data_key.user_key(); 3387 current_key_ = object_store_data_key.user_key();
3384 3388
3385 int64 version; 3389 int64 version;
3386 slice = StringPiece(iterator_->Value()); 3390 slice = StringPiece(iterator_->Value());
3387 if (!DecodeVarInt(&slice, &version)) { 3391 if (!DecodeVarInt(&slice, &version)) {
3388 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3392 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3393 *s = InternalInconsistencyStatus();
3389 return false; 3394 return false;
3390 } 3395 }
3391 3396
3392 // TODO(jsbell): This re-encodes what was just decoded; try and optimize. 3397 // TODO(jsbell): This re-encodes what was just decoded; try and optimize.
3393 std::string encoded_key; 3398 std::string encoded_key;
3394 EncodeIDBKey(*current_key_, &encoded_key); 3399 EncodeIDBKey(*current_key_, &encoded_key);
3395 record_identifier_.Reset(encoded_key, version); 3400 record_identifier_.Reset(encoded_key, version);
3396 3401
3397 return true; 3402 return true;
3398 } 3403 }
3399 3404
3400 class ObjectStoreCursorImpl : public IndexedDBBackingStore::Cursor { 3405 class ObjectStoreCursorImpl : public IndexedDBBackingStore::Cursor {
3401 public: 3406 public:
3402 ObjectStoreCursorImpl( 3407 ObjectStoreCursorImpl(
3403 scoped_refptr<IndexedDBBackingStore> backing_store, 3408 scoped_refptr<IndexedDBBackingStore> backing_store,
3404 IndexedDBBackingStore::Transaction* transaction, 3409 IndexedDBBackingStore::Transaction* transaction,
3405 int64 database_id, 3410 int64 database_id,
3406 const IndexedDBBackingStore::Cursor::CursorOptions& cursor_options) 3411 const IndexedDBBackingStore::Cursor::CursorOptions& cursor_options)
3407 : IndexedDBBackingStore::Cursor(backing_store, 3412 : IndexedDBBackingStore::Cursor(backing_store,
3408 transaction, 3413 transaction,
3409 database_id, 3414 database_id,
3410 cursor_options) {} 3415 cursor_options) {}
3411 3416
3412 Cursor* Clone() override { return new ObjectStoreCursorImpl(this); } 3417 Cursor* Clone() override { return new ObjectStoreCursorImpl(this); }
3413 3418
3414 // IndexedDBBackingStore::Cursor 3419 // IndexedDBBackingStore::Cursor
3415 IndexedDBValue* value() override { return &current_value_; } 3420 IndexedDBValue* value() override { return &current_value_; }
3416 bool LoadCurrentRow() override; 3421 bool LoadCurrentRow(leveldb::Status* s) override;
3417 3422
3418 protected: 3423 protected:
3419 std::string EncodeKey(const IndexedDBKey& key) override { 3424 std::string EncodeKey(const IndexedDBKey& key) override {
3420 return ObjectStoreDataKey::Encode( 3425 return ObjectStoreDataKey::Encode(
3421 cursor_options_.database_id, cursor_options_.object_store_id, key); 3426 cursor_options_.database_id, cursor_options_.object_store_id, key);
3422 } 3427 }
3423 std::string EncodeKey(const IndexedDBKey& key, 3428 std::string EncodeKey(const IndexedDBKey& key,
3424 const IndexedDBKey& primary_key) override { 3429 const IndexedDBKey& primary_key) override {
3425 NOTREACHED(); 3430 NOTREACHED();
3426 return std::string(); 3431 return std::string();
3427 } 3432 }
3428 3433
3429 private: 3434 private:
3430 explicit ObjectStoreCursorImpl(const ObjectStoreCursorImpl* other) 3435 explicit ObjectStoreCursorImpl(const ObjectStoreCursorImpl* other)
3431 : IndexedDBBackingStore::Cursor(other), 3436 : IndexedDBBackingStore::Cursor(other),
3432 current_value_(other->current_value_) {} 3437 current_value_(other->current_value_) {}
3433 3438
3434 IndexedDBValue current_value_; 3439 IndexedDBValue current_value_;
3435 3440
3436 DISALLOW_COPY_AND_ASSIGN(ObjectStoreCursorImpl); 3441 DISALLOW_COPY_AND_ASSIGN(ObjectStoreCursorImpl);
3437 }; 3442 };
3438 3443
3439 bool ObjectStoreCursorImpl::LoadCurrentRow() { 3444 bool ObjectStoreCursorImpl::LoadCurrentRow(leveldb::Status* s) {
3440 StringPiece key_slice(iterator_->Key()); 3445 StringPiece key_slice(iterator_->Key());
3441 ObjectStoreDataKey object_store_data_key; 3446 ObjectStoreDataKey object_store_data_key;
3442 if (!ObjectStoreDataKey::Decode(&key_slice, &object_store_data_key)) { 3447 if (!ObjectStoreDataKey::Decode(&key_slice, &object_store_data_key)) {
3443 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3448 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3449 *s = InvalidDBKeyStatus();
3444 return false; 3450 return false;
3445 } 3451 }
3446 3452
3447 current_key_ = object_store_data_key.user_key(); 3453 current_key_ = object_store_data_key.user_key();
3448 3454
3449 int64 version; 3455 int64 version;
3450 StringPiece value_slice = StringPiece(iterator_->Value()); 3456 StringPiece value_slice = StringPiece(iterator_->Value());
3451 if (!DecodeVarInt(&value_slice, &version)) { 3457 if (!DecodeVarInt(&value_slice, &version)) {
3452 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3458 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3459 *s = InternalInconsistencyStatus();
3453 return false; 3460 return false;
3454 } 3461 }
3455 3462
3456 // TODO(jsbell): This re-encodes what was just decoded; try and optimize. 3463 // TODO(jsbell): This re-encodes what was just decoded; try and optimize.
3457 std::string encoded_key; 3464 std::string encoded_key;
3458 EncodeIDBKey(*current_key_, &encoded_key); 3465 EncodeIDBKey(*current_key_, &encoded_key);
3459 record_identifier_.Reset(encoded_key, version); 3466 record_identifier_.Reset(encoded_key, version);
3460 3467
3461 if (!transaction_->GetBlobInfoForRecord(database_id_, 3468 *s = transaction_->GetBlobInfoForRecord(
3462 iterator_->Key().as_string(), 3469 database_id_, iterator_->Key().as_string(), &current_value_);
3463 &current_value_).ok()) { 3470 if (!s->ok())
3464 return false; 3471 return false;
3465 } 3472
3466 current_value_.bits = value_slice.as_string(); 3473 current_value_.bits = value_slice.as_string();
3467 return true; 3474 return true;
3468 } 3475 }
3469 3476
3470 class IndexKeyCursorImpl : public IndexedDBBackingStore::Cursor { 3477 class IndexKeyCursorImpl : public IndexedDBBackingStore::Cursor {
3471 public: 3478 public:
3472 IndexKeyCursorImpl( 3479 IndexKeyCursorImpl(
3473 scoped_refptr<IndexedDBBackingStore> backing_store, 3480 scoped_refptr<IndexedDBBackingStore> backing_store,
3474 IndexedDBBackingStore::Transaction* transaction, 3481 IndexedDBBackingStore::Transaction* transaction,
3475 int64 database_id, 3482 int64 database_id,
3476 const IndexedDBBackingStore::Cursor::CursorOptions& cursor_options) 3483 const IndexedDBBackingStore::Cursor::CursorOptions& cursor_options)
3477 : IndexedDBBackingStore::Cursor(backing_store, 3484 : IndexedDBBackingStore::Cursor(backing_store,
3478 transaction, 3485 transaction,
3479 database_id, 3486 database_id,
3480 cursor_options) {} 3487 cursor_options) {}
3481 3488
3482 Cursor* Clone() override { return new IndexKeyCursorImpl(this); } 3489 Cursor* Clone() override { return new IndexKeyCursorImpl(this); }
3483 3490
3484 // IndexedDBBackingStore::Cursor 3491 // IndexedDBBackingStore::Cursor
3485 IndexedDBValue* value() override { 3492 IndexedDBValue* value() override {
3486 NOTREACHED(); 3493 NOTREACHED();
3487 return NULL; 3494 return NULL;
3488 } 3495 }
3489 const IndexedDBKey& primary_key() const override { return *primary_key_; } 3496 const IndexedDBKey& primary_key() const override { return *primary_key_; }
3490 const IndexedDBBackingStore::RecordIdentifier& record_identifier() 3497 const IndexedDBBackingStore::RecordIdentifier& record_identifier()
3491 const override { 3498 const override {
3492 NOTREACHED(); 3499 NOTREACHED();
3493 return record_identifier_; 3500 return record_identifier_;
3494 } 3501 }
3495 bool LoadCurrentRow() override; 3502 bool LoadCurrentRow(leveldb::Status* s) override;
3496 3503
3497 protected: 3504 protected:
3498 std::string EncodeKey(const IndexedDBKey& key) override { 3505 std::string EncodeKey(const IndexedDBKey& key) override {
3499 return IndexDataKey::Encode(cursor_options_.database_id, 3506 return IndexDataKey::Encode(cursor_options_.database_id,
3500 cursor_options_.object_store_id, 3507 cursor_options_.object_store_id,
3501 cursor_options_.index_id, 3508 cursor_options_.index_id,
3502 key); 3509 key);
3503 } 3510 }
3504 std::string EncodeKey(const IndexedDBKey& key, 3511 std::string EncodeKey(const IndexedDBKey& key,
3505 const IndexedDBKey& primary_key) override { 3512 const IndexedDBKey& primary_key) override {
3506 return IndexDataKey::Encode(cursor_options_.database_id, 3513 return IndexDataKey::Encode(cursor_options_.database_id,
3507 cursor_options_.object_store_id, 3514 cursor_options_.object_store_id,
3508 cursor_options_.index_id, 3515 cursor_options_.index_id,
3509 key, 3516 key,
3510 primary_key); 3517 primary_key);
3511 } 3518 }
3512 3519
3513 private: 3520 private:
3514 explicit IndexKeyCursorImpl(const IndexKeyCursorImpl* other) 3521 explicit IndexKeyCursorImpl(const IndexKeyCursorImpl* other)
3515 : IndexedDBBackingStore::Cursor(other), 3522 : IndexedDBBackingStore::Cursor(other),
3516 primary_key_(new IndexedDBKey(*other->primary_key_)) {} 3523 primary_key_(new IndexedDBKey(*other->primary_key_)) {}
3517 3524
3518 scoped_ptr<IndexedDBKey> primary_key_; 3525 scoped_ptr<IndexedDBKey> primary_key_;
3519 3526
3520 DISALLOW_COPY_AND_ASSIGN(IndexKeyCursorImpl); 3527 DISALLOW_COPY_AND_ASSIGN(IndexKeyCursorImpl);
3521 }; 3528 };
3522 3529
3523 bool IndexKeyCursorImpl::LoadCurrentRow() { 3530 bool IndexKeyCursorImpl::LoadCurrentRow(leveldb::Status* s) {
3524 StringPiece slice(iterator_->Key()); 3531 StringPiece slice(iterator_->Key());
3525 IndexDataKey index_data_key; 3532 IndexDataKey index_data_key;
3526 if (!IndexDataKey::Decode(&slice, &index_data_key)) { 3533 if (!IndexDataKey::Decode(&slice, &index_data_key)) {
3527 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3534 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3535 *s = InvalidDBKeyStatus();
3528 return false; 3536 return false;
3529 } 3537 }
3530 3538
3531 current_key_ = index_data_key.user_key(); 3539 current_key_ = index_data_key.user_key();
3532 DCHECK(current_key_); 3540 DCHECK(current_key_);
3533 3541
3534 slice = StringPiece(iterator_->Value()); 3542 slice = StringPiece(iterator_->Value());
3535 int64 index_data_version; 3543 int64 index_data_version;
3536 if (!DecodeVarInt(&slice, &index_data_version)) { 3544 if (!DecodeVarInt(&slice, &index_data_version)) {
3537 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3545 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3546 *s = InternalInconsistencyStatus();
3538 return false; 3547 return false;
3539 } 3548 }
3540 3549
3541 if (!DecodeIDBKey(&slice, &primary_key_) || !slice.empty()) { 3550 if (!DecodeIDBKey(&slice, &primary_key_) || !slice.empty()) {
3542 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3551 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3552 *s = InternalInconsistencyStatus();
3543 return false; 3553 return false;
3544 } 3554 }
3545 3555
3546 std::string primary_leveldb_key = 3556 std::string primary_leveldb_key =
3547 ObjectStoreDataKey::Encode(index_data_key.DatabaseId(), 3557 ObjectStoreDataKey::Encode(index_data_key.DatabaseId(),
3548 index_data_key.ObjectStoreId(), 3558 index_data_key.ObjectStoreId(),
3549 *primary_key_); 3559 *primary_key_);
3550 3560
3551 std::string result; 3561 std::string result;
3552 bool found = false; 3562 bool found = false;
3553 leveldb::Status s = 3563 *s = transaction_->transaction()->Get(primary_leveldb_key, &result, &found);
3554 transaction_->transaction()->Get(primary_leveldb_key, &result, &found); 3564 if (!s->ok()) {
3555 if (!s.ok()) {
3556 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3565 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3557 return false; 3566 return false;
3558 } 3567 }
3559 if (!found) { 3568 if (!found) {
3560 transaction_->transaction()->Remove(iterator_->Key()); 3569 transaction_->transaction()->Remove(iterator_->Key());
3561 return false; 3570 return false;
3562 } 3571 }
3563 if (!result.size()) { 3572 if (!result.size()) {
3564 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3573 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3565 return false; 3574 return false;
3566 } 3575 }
3567 3576
3568 int64 object_store_data_version; 3577 int64 object_store_data_version;
3569 slice = StringPiece(result); 3578 slice = StringPiece(result);
3570 if (!DecodeVarInt(&slice, &object_store_data_version)) { 3579 if (!DecodeVarInt(&slice, &object_store_data_version)) {
3571 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3580 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3581 *s = InternalInconsistencyStatus();
3572 return false; 3582 return false;
3573 } 3583 }
3574 3584
3575 if (object_store_data_version != index_data_version) { 3585 if (object_store_data_version != index_data_version) {
3576 transaction_->transaction()->Remove(iterator_->Key()); 3586 transaction_->transaction()->Remove(iterator_->Key());
3577 return false; 3587 return false;
3578 } 3588 }
3579 3589
3580 return true; 3590 return true;
3581 } 3591 }
(...skipping 13 matching lines...) Expand all
3595 Cursor* Clone() override { return new IndexCursorImpl(this); } 3605 Cursor* Clone() override { return new IndexCursorImpl(this); }
3596 3606
3597 // IndexedDBBackingStore::Cursor 3607 // IndexedDBBackingStore::Cursor
3598 IndexedDBValue* value() override { return &current_value_; } 3608 IndexedDBValue* value() override { return &current_value_; }
3599 const IndexedDBKey& primary_key() const override { return *primary_key_; } 3609 const IndexedDBKey& primary_key() const override { return *primary_key_; }
3600 const IndexedDBBackingStore::RecordIdentifier& record_identifier() 3610 const IndexedDBBackingStore::RecordIdentifier& record_identifier()
3601 const override { 3611 const override {
3602 NOTREACHED(); 3612 NOTREACHED();
3603 return record_identifier_; 3613 return record_identifier_;
3604 } 3614 }
3605 bool LoadCurrentRow() override; 3615 bool LoadCurrentRow(leveldb::Status* s) override;
3606 3616
3607 protected: 3617 protected:
3608 std::string EncodeKey(const IndexedDBKey& key) override { 3618 std::string EncodeKey(const IndexedDBKey& key) override {
3609 return IndexDataKey::Encode(cursor_options_.database_id, 3619 return IndexDataKey::Encode(cursor_options_.database_id,
3610 cursor_options_.object_store_id, 3620 cursor_options_.object_store_id,
3611 cursor_options_.index_id, 3621 cursor_options_.index_id,
3612 key); 3622 key);
3613 } 3623 }
3614 std::string EncodeKey(const IndexedDBKey& key, 3624 std::string EncodeKey(const IndexedDBKey& key,
3615 const IndexedDBKey& primary_key) override { 3625 const IndexedDBKey& primary_key) override {
(...skipping 11 matching lines...) Expand all
3627 current_value_(other->current_value_), 3637 current_value_(other->current_value_),
3628 primary_leveldb_key_(other->primary_leveldb_key_) {} 3638 primary_leveldb_key_(other->primary_leveldb_key_) {}
3629 3639
3630 scoped_ptr<IndexedDBKey> primary_key_; 3640 scoped_ptr<IndexedDBKey> primary_key_;
3631 IndexedDBValue current_value_; 3641 IndexedDBValue current_value_;
3632 std::string primary_leveldb_key_; 3642 std::string primary_leveldb_key_;
3633 3643
3634 DISALLOW_COPY_AND_ASSIGN(IndexCursorImpl); 3644 DISALLOW_COPY_AND_ASSIGN(IndexCursorImpl);
3635 }; 3645 };
3636 3646
3637 bool IndexCursorImpl::LoadCurrentRow() { 3647 bool IndexCursorImpl::LoadCurrentRow(leveldb::Status* s) {
3638 StringPiece slice(iterator_->Key()); 3648 StringPiece slice(iterator_->Key());
3639 IndexDataKey index_data_key; 3649 IndexDataKey index_data_key;
3640 if (!IndexDataKey::Decode(&slice, &index_data_key)) { 3650 if (!IndexDataKey::Decode(&slice, &index_data_key)) {
3641 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3651 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3652 *s = InvalidDBKeyStatus();
3642 return false; 3653 return false;
3643 } 3654 }
3644 3655
3645 current_key_ = index_data_key.user_key(); 3656 current_key_ = index_data_key.user_key();
3646 DCHECK(current_key_); 3657 DCHECK(current_key_);
3647 3658
3648 slice = StringPiece(iterator_->Value()); 3659 slice = StringPiece(iterator_->Value());
3649 int64 index_data_version; 3660 int64 index_data_version;
3650 if (!DecodeVarInt(&slice, &index_data_version)) { 3661 if (!DecodeVarInt(&slice, &index_data_version)) {
3651 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3662 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3663 *s = InternalInconsistencyStatus();
3652 return false; 3664 return false;
3653 } 3665 }
3654 if (!DecodeIDBKey(&slice, &primary_key_)) { 3666 if (!DecodeIDBKey(&slice, &primary_key_)) {
3655 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3667 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3668 *s = InvalidDBKeyStatus();
3656 return false; 3669 return false;
3657 } 3670 }
3658 3671
3659 DCHECK_EQ(index_data_key.DatabaseId(), database_id_); 3672 DCHECK_EQ(index_data_key.DatabaseId(), database_id_);
3660 primary_leveldb_key_ = 3673 primary_leveldb_key_ =
3661 ObjectStoreDataKey::Encode(index_data_key.DatabaseId(), 3674 ObjectStoreDataKey::Encode(index_data_key.DatabaseId(),
3662 index_data_key.ObjectStoreId(), 3675 index_data_key.ObjectStoreId(),
3663 *primary_key_); 3676 *primary_key_);
3664 3677
3665 std::string result; 3678 std::string result;
3666 bool found = false; 3679 bool found = false;
3667 leveldb::Status s = 3680 *s = transaction_->transaction()->Get(primary_leveldb_key_, &result, &found);
3668 transaction_->transaction()->Get(primary_leveldb_key_, &result, &found); 3681 if (!s->ok()) {
3669 if (!s.ok()) {
3670 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3682 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3671 return false; 3683 return false;
3672 } 3684 }
3673 if (!found) { 3685 if (!found) {
3674 transaction_->transaction()->Remove(iterator_->Key()); 3686 transaction_->transaction()->Remove(iterator_->Key());
3675 return false; 3687 return false;
3676 } 3688 }
3677 if (!result.size()) { 3689 if (!result.size()) {
3678 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3690 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3679 return false; 3691 return false;
3680 } 3692 }
3681 3693
3682 int64 object_store_data_version; 3694 int64 object_store_data_version;
3683 slice = StringPiece(result); 3695 slice = StringPiece(result);
3684 if (!DecodeVarInt(&slice, &object_store_data_version)) { 3696 if (!DecodeVarInt(&slice, &object_store_data_version)) {
3685 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW); 3697 INTERNAL_READ_ERROR_UNTESTED(LOAD_CURRENT_ROW);
3698 *s = InternalInconsistencyStatus();
3686 return false; 3699 return false;
3687 } 3700 }
3688 3701
3689 if (object_store_data_version != index_data_version) { 3702 if (object_store_data_version != index_data_version) {
3690 transaction_->transaction()->Remove(iterator_->Key()); 3703 transaction_->transaction()->Remove(iterator_->Key());
3691 return false; 3704 return false;
3692 } 3705 }
3693 3706
3694 current_value_.bits = slice.as_string(); 3707 current_value_.bits = slice.as_string();
3695 return transaction_->GetBlobInfoForRecord(database_id_, 3708 *s = transaction_->GetBlobInfoForRecord(database_id_, primary_leveldb_key_,
3696 primary_leveldb_key_, 3709 &current_value_);
3697 &current_value_).ok(); 3710 return s->ok();
3698 } 3711 }
3699 3712
3700 bool ObjectStoreCursorOptions( 3713 bool ObjectStoreCursorOptions(
3701 LevelDBTransaction* transaction, 3714 LevelDBTransaction* transaction,
3702 int64 database_id, 3715 int64 database_id,
3703 int64 object_store_id, 3716 int64 object_store_id,
3704 const IndexedDBKeyRange& range, 3717 const IndexedDBKeyRange& range,
3705 blink::WebIDBCursorDirection direction, 3718 blink::WebIDBCursorDirection direction,
3706 IndexedDBBackingStore::Cursor::CursorOptions* cursor_options) { 3719 IndexedDBBackingStore::Cursor::CursorOptions* cursor_options) {
3707 cursor_options->database_id = database_id; 3720 cursor_options->database_id = database_id;
(...skipping 711 matching lines...) Expand 10 before | Expand all | Expand 10 after
4419 4432
4420 IndexedDBBackingStore::Transaction::WriteDescriptor::WriteDescriptor( 4433 IndexedDBBackingStore::Transaction::WriteDescriptor::WriteDescriptor(
4421 const WriteDescriptor& other) = default; 4434 const WriteDescriptor& other) = default;
4422 IndexedDBBackingStore::Transaction::WriteDescriptor::~WriteDescriptor() = 4435 IndexedDBBackingStore::Transaction::WriteDescriptor::~WriteDescriptor() =
4423 default; 4436 default;
4424 IndexedDBBackingStore::Transaction::WriteDescriptor& 4437 IndexedDBBackingStore::Transaction::WriteDescriptor&
4425 IndexedDBBackingStore::Transaction::WriteDescriptor:: 4438 IndexedDBBackingStore::Transaction::WriteDescriptor::
4426 operator=(const WriteDescriptor& other) = default; 4439 operator=(const WriteDescriptor& other) = default;
4427 4440
4428 } // namespace content 4441 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/indexed_db/indexed_db_backing_store.h ('k') | content/browser/indexed_db/indexed_db_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698