Chromium Code Reviews| Index: content/browser/indexed_db/indexed_db_database.cc |
| diff --git a/content/browser/indexed_db/indexed_db_database.cc b/content/browser/indexed_db/indexed_db_database.cc |
| index c97048b5612094eb54796602bc067543d9ac3515..50090c64d99e3c98aeb7c48cf9bf82ffb471e784 100644 |
| --- a/content/browser/indexed_db/indexed_db_database.cc |
| +++ b/content/browser/indexed_db/indexed_db_database.cc |
| @@ -92,12 +92,12 @@ scoped_refptr<IndexedDBDatabase> IndexedDBDatabase::Create( |
| const base::string16& name, |
| IndexedDBBackingStore* backing_store, |
| IndexedDBFactory* factory, |
| - const Identifier& unique_identifier) { |
| + const Identifier& unique_identifier, |
| + leveldb::Status& s) { |
| scoped_refptr<IndexedDBDatabase> database = |
| new IndexedDBDatabase(name, backing_store, factory, unique_identifier); |
| - if (!database->OpenInternal().ok()) |
| - return 0; |
| - return database; |
| + s = database->OpenInternal(); |
| + return s.ok() ? database : 0; |
|
jsbell
2014/04/14 20:44:20
Does this compile everywhere? The trinary operator
cmumford
2014/04/14 23:39:23
I didn't compile it everywhere. I'll be safe and g
|
| } |
| namespace { |
| @@ -527,6 +527,7 @@ void IndexedDBDatabase::GetOperation( |
| const IndexedDBKey* key; |
| + leveldb::Status s; |
| scoped_ptr<IndexedDBBackingStore::Cursor> backing_store_cursor; |
| if (key_range->IsOnlyKey()) { |
| key = &key_range->lower(); |
| @@ -539,7 +540,8 @@ void IndexedDBDatabase::GetOperation( |
| id(), |
| object_store_id, |
| *key_range, |
| - indexed_db::CURSOR_NEXT); |
| + indexed_db::CURSOR_NEXT, |
| + s); |
| } else if (cursor_type == indexed_db::CURSOR_KEY_ONLY) { |
| // Index Value Retrieval Operation |
| backing_store_cursor = backing_store_->OpenIndexKeyCursor( |
| @@ -548,7 +550,8 @@ void IndexedDBDatabase::GetOperation( |
| object_store_id, |
| index_id, |
| *key_range, |
| - indexed_db::CURSOR_NEXT); |
| + indexed_db::CURSOR_NEXT, |
| + s); |
| } else { |
| // Index Referenced Value Retrieval Operation |
| backing_store_cursor = backing_store_->OpenIndexCursor( |
| @@ -557,7 +560,18 @@ void IndexedDBDatabase::GetOperation( |
| object_store_id, |
| index_id, |
| *key_range, |
| - indexed_db::CURSOR_NEXT); |
| + indexed_db::CURSOR_NEXT, |
| + s); |
| + } |
| + |
| + if (!s.ok()) { |
| + DLOG(ERROR) << "Unable to open cursor operation: " << s.ToString(); |
| + IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError, |
| + "Internal error deleting data in range"); |
| + if (s.IsCorruption()) { |
| + factory_->HandleBackingStoreCorruption(backing_store_->origin_url(), |
| + error); |
| + } |
| } |
| if (!backing_store_cursor) { |
| @@ -569,7 +583,6 @@ void IndexedDBDatabase::GetOperation( |
| } |
| scoped_ptr<IndexedDBKey> primary_key; |
| - leveldb::Status s; |
| if (index_id == IndexedDBIndexMetadata::kInvalidId) { |
| // Object Store Retrieval Operation |
| IndexedDBValue value; |
| @@ -1030,6 +1043,7 @@ void IndexedDBDatabase::OpenCursorOperation( |
| if (params->task_type == IndexedDBDatabase::PREEMPTIVE_TASK) |
| transaction->AddPreemptiveEvent(); |
| + leveldb::Status s; |
| scoped_ptr<IndexedDBBackingStore::Cursor> backing_store_cursor; |
| if (params->index_id == IndexedDBIndexMetadata::kInvalidId) { |
| if (params->cursor_type == indexed_db::CURSOR_KEY_ONLY) { |
| @@ -1039,14 +1053,16 @@ void IndexedDBDatabase::OpenCursorOperation( |
| id(), |
| params->object_store_id, |
| *params->key_range, |
| - params->direction); |
| + params->direction, |
| + s); |
| } else { |
| backing_store_cursor = backing_store_->OpenObjectStoreCursor( |
| transaction->BackingStoreTransaction(), |
| id(), |
| params->object_store_id, |
| *params->key_range, |
| - params->direction); |
| + params->direction, |
| + s); |
| } |
| } else { |
| DCHECK_EQ(params->task_type, IndexedDBDatabase::NORMAL_TASK); |
| @@ -1057,7 +1073,8 @@ void IndexedDBDatabase::OpenCursorOperation( |
| params->object_store_id, |
| params->index_id, |
| *params->key_range, |
| - params->direction); |
| + params->direction, |
| + s); |
| } else { |
| backing_store_cursor = backing_store_->OpenIndexCursor( |
| transaction->BackingStoreTransaction(), |
| @@ -1065,11 +1082,23 @@ void IndexedDBDatabase::OpenCursorOperation( |
| params->object_store_id, |
| params->index_id, |
| *params->key_range, |
| - params->direction); |
| + params->direction, |
| + s); |
| + } |
| + } |
| + |
| + if (!s.ok()) { |
| + DLOG(ERROR) << "Unable to open cursor operation: " << s.ToString(); |
| + IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError, |
| + "Internal error opening cursor operation"); |
| + if (s.IsCorruption()) { |
| + factory_->HandleBackingStoreCorruption(backing_store_->origin_url(), |
| + error); |
| } |
| } |
| if (!backing_store_cursor) { |
| + // Why is Success being called? |
|
jsbell
2014/04/14 20:44:20
In script, if a cursor is opened and there's nothi
cmumford
2014/04/14 23:39:23
Are you saying that if the db is corrupt you want
jsbell
2014/04/15 16:39:57
I'm just answering the question "Why is Success be
|
| params->callbacks->OnSuccess(static_cast<IndexedDBValue*>(NULL)); |
| return; |
| } |
| @@ -1114,13 +1143,15 @@ void IndexedDBDatabase::CountOperation( |
| uint32 count = 0; |
| scoped_ptr<IndexedDBBackingStore::Cursor> backing_store_cursor; |
| + leveldb::Status s; |
| if (index_id == IndexedDBIndexMetadata::kInvalidId) { |
| backing_store_cursor = backing_store_->OpenObjectStoreKeyCursor( |
| transaction->BackingStoreTransaction(), |
| id(), |
| object_store_id, |
| *key_range, |
| - indexed_db::CURSOR_NEXT); |
| + indexed_db::CURSOR_NEXT, |
| + s); |
| } else { |
| backing_store_cursor = backing_store_->OpenIndexKeyCursor( |
| transaction->BackingStoreTransaction(), |
| @@ -1128,7 +1159,17 @@ void IndexedDBDatabase::CountOperation( |
| object_store_id, |
| index_id, |
| *key_range, |
| - indexed_db::CURSOR_NEXT); |
| + indexed_db::CURSOR_NEXT, |
| + s); |
| + } |
| + if (!s.ok()) { |
| + DLOG(ERROR) << "Unable perform count operation: " << s.ToString(); |
| + IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError, |
| + "Internal error performing count operation"); |
| + if (s.IsCorruption()) { |
| + factory_->HandleBackingStoreCorruption(backing_store_->origin_url(), |
| + error); |
| + } |
| } |
| if (!backing_store_cursor) { |
| callbacks->OnSuccess(count); |
| @@ -1137,7 +1178,9 @@ void IndexedDBDatabase::CountOperation( |
| do { |
| ++count; |
| - } while (backing_store_cursor->Continue()); |
| + } while (backing_store_cursor->Continue(s)); |
| + |
| + // Should probably check for corruption here too? |
|
jsbell
2014/04/14 20:44:20
Make this a TODO
cmumford
2014/04/14 23:39:23
Done.
|
| callbacks->OnSuccess(count); |
| } |
| @@ -1169,14 +1212,16 @@ void IndexedDBDatabase::DeleteRangeOperation( |
| scoped_refptr<IndexedDBCallbacks> callbacks, |
| IndexedDBTransaction* transaction) { |
| IDB_TRACE("IndexedDBDatabase::DeleteRangeOperation"); |
| + leveldb::Status s; |
| scoped_ptr<IndexedDBBackingStore::Cursor> backing_store_cursor = |
| backing_store_->OpenObjectStoreCursor( |
| transaction->BackingStoreTransaction(), |
| id(), |
| object_store_id, |
| *key_range, |
| - indexed_db::CURSOR_NEXT); |
| - if (backing_store_cursor) { |
| + indexed_db::CURSOR_NEXT, |
| + s); |
| + if (backing_store_cursor && s.ok()) { |
| do { |
| if (!backing_store_->DeleteRecord( |
| transaction->BackingStoreTransaction(), |
| @@ -1189,7 +1234,18 @@ void IndexedDBDatabase::DeleteRangeOperation( |
| "Internal error deleting data in range")); |
| return; |
| } |
| - } while (backing_store_cursor->Continue()); |
| + } while (backing_store_cursor->Continue(s)); |
| + } |
| + |
| + if (!s.ok()) { |
| + IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError, |
| + ASCIIToUTF16("Internal error deleting range")); |
| + transaction->Abort(error); |
| + if (s.IsCorruption()) { |
| + factory_->HandleBackingStoreCorruption(backing_store_->origin_url(), |
| + error); |
| + } |
| + return; |
| } |
| callbacks->OnSuccess(); |