summaryrefslogtreecommitdiffstats
path: root/content/browser/indexed_db/indexed_db_backing_store.cc
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser/indexed_db/indexed_db_backing_store.cc')
-rw-r--r--content/browser/indexed_db/indexed_db_backing_store.cc314
1 files changed, 213 insertions, 101 deletions
diff --git a/content/browser/indexed_db/indexed_db_backing_store.cc b/content/browser/indexed_db/indexed_db_backing_store.cc
index 32c53bc..162d451 100644
--- a/content/browser/indexed_db/indexed_db_backing_store.cc
+++ b/content/browser/indexed_db/indexed_db_backing_store.cc
@@ -78,6 +78,8 @@ enum IndexedDBBackingStoreErrorSource {
DELETE_DATABASE,
TRANSACTION_COMMIT_METHOD, // TRANSACTION_COMMIT is a WinNT.h macro
GET_DATABASE_NAMES,
+ DELETE_INDEX,
+ CLEAR_OBJECT_STORE,
INTERNAL_ERROR_MAX,
};
@@ -323,9 +325,9 @@ WARN_UNUSED_RESULT static bool SetUpMetadata(
const std::string stop_key =
DatabaseNameKey::EncodeStopKeyForOrigin(origin_identifier);
scoped_ptr<LevelDBIterator> it = db->CreateIterator();
- for (it->Seek(start_key);
- it->IsValid() && CompareKeys(it->Key(), stop_key) < 0;
- it->Next()) {
+ for (s = it->Seek(start_key);
+ s.ok() && it->IsValid() && CompareKeys(it->Key(), stop_key) < 0;
+ s = it->Next()) {
int64 database_id = 0;
found = false;
s = GetInt(transaction.get(), it->Key(), &database_id, &found);
@@ -344,7 +346,7 @@ WARN_UNUSED_RESULT static bool SetUpMetadata(
IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION);
}
}
- if (db_schema_version < 2) {
+ if (s.ok() && db_schema_version < 2) {
db_schema_version = 2;
PutInt(transaction.get(), schema_version_key, db_schema_version);
db_data_version = blink::kSerializedScriptValueVersion;
@@ -352,6 +354,11 @@ WARN_UNUSED_RESULT static bool SetUpMetadata(
}
}
+ if (!s.ok()) {
+ INTERNAL_READ_ERROR_UNTESTED(SET_UP_METADATA);
+ return false;
+ }
+
// All new values will be written using this serialization version.
found = false;
s = GetInt(transaction.get(), data_version_key, &db_data_version, &found);
@@ -810,7 +817,9 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Create(
return backing_store;
}
-std::vector<base::string16> IndexedDBBackingStore::GetDatabaseNames() {
+std::vector<base::string16> IndexedDBBackingStore::GetDatabaseNames(
+ leveldb::Status* s) {
+ *s = leveldb::Status::OK();
std::vector<base::string16> found_names;
const std::string start_key =
DatabaseNameKey::EncodeMinKeyForOrigin(origin_identifier_);
@@ -820,9 +829,9 @@ std::vector<base::string16> IndexedDBBackingStore::GetDatabaseNames() {
DCHECK(found_names.empty());
scoped_ptr<LevelDBIterator> it = db_->CreateIterator();
- for (it->Seek(start_key);
- it->IsValid() && CompareKeys(it->Key(), stop_key) < 0;
- it->Next()) {
+ for (*s = it->Seek(start_key);
+ s->ok() && it->IsValid() && CompareKeys(it->Key(), stop_key) < 0;
+ *s = it->Next()) {
StringPiece slice(it->Key());
DatabaseNameKey database_name_key;
if (!DatabaseNameKey::Decode(&slice, &database_name_key)) {
@@ -831,6 +840,10 @@ std::vector<base::string16> IndexedDBBackingStore::GetDatabaseNames() {
}
found_names.push_back(database_name_key.database_name());
}
+
+ if (!s->ok())
+ INTERNAL_READ_ERROR_UNTESTED(GET_DATABASE_NAMES);
+
return found_names;
}
@@ -843,7 +856,7 @@ leveldb::Status IndexedDBBackingStore::GetIDBDatabaseMetaData(
leveldb::Status s = GetInt(db_.get(), key, &metadata->id, found);
if (!s.ok()) {
- INTERNAL_READ_ERROR_UNTESTED(GET_IDBDATABASE_METADATA);
+ INTERNAL_READ_ERROR(GET_IDBDATABASE_METADATA);
return s;
}
if (!*found)
@@ -959,13 +972,16 @@ bool IndexedDBBackingStore::UpdateIDBDatabaseIntVersion(
return true;
}
-static void DeleteRange(LevelDBTransaction* transaction,
- const std::string& begin,
- const std::string& end) {
+static leveldb::Status DeleteRange(LevelDBTransaction* transaction,
+ const std::string& begin,
+ const std::string& end) {
scoped_ptr<LevelDBIterator> it = transaction->CreateIterator();
- for (it->Seek(begin); it->IsValid() && CompareKeys(it->Key(), end) < 0;
- it->Next())
+ leveldb::Status s;
+ for (s = it->Seek(begin);
+ s.ok() && it->IsValid() && CompareKeys(it->Key(), end) < 0;
+ s = it->Next())
transaction->Remove(it->Key());
+ return s;
}
leveldb::Status IndexedDBBackingStore::DeleteDatabase(
@@ -987,10 +1003,14 @@ leveldb::Status IndexedDBBackingStore::DeleteDatabase(
const std::string stop_key = DatabaseMetaDataKey::Encode(
metadata.id + 1, DatabaseMetaDataKey::ORIGIN_NAME);
scoped_ptr<LevelDBIterator> it = db_->CreateIterator();
- for (it->Seek(start_key);
- it->IsValid() && CompareKeys(it->Key(), stop_key) < 0;
- it->Next())
+ for (s = it->Seek(start_key);
+ s.ok() && it->IsValid() && CompareKeys(it->Key(), stop_key) < 0;
+ s = it->Next())
transaction->Remove(it->Key());
+ if (!s.ok()) {
+ INTERNAL_WRITE_ERROR_UNTESTED(DELETE_DATABASE);
+ return s;
+ }
const std::string key = DatabaseNameKey::Encode(origin_identifier_, name);
transaction->Remove(key);
@@ -1038,8 +1058,8 @@ leveldb::Status IndexedDBBackingStore::GetObjectStores(
DCHECK(object_stores->empty());
scoped_ptr<LevelDBIterator> it = db_->CreateIterator();
- it->Seek(start_key);
- while (it->IsValid() && CompareKeys(it->Key(), stop_key) < 0) {
+ leveldb::Status s = it->Seek(start_key);
+ while (s.ok() && it->IsValid() && CompareKeys(it->Key(), stop_key) < 0) {
StringPiece slice(it->Key());
ObjectStoreMetaDataKey meta_data_key;
bool ok = ObjectStoreMetaDataKey::Decode(&slice, &meta_data_key);
@@ -1047,7 +1067,9 @@ leveldb::Status IndexedDBBackingStore::GetObjectStores(
if (meta_data_key.MetaDataType() != ObjectStoreMetaDataKey::NAME) {
INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES);
// Possible stale metadata, but don't fail the load.
- it->Next();
+ s = it->Next();
+ if (!s.ok())
+ break;
continue;
}
@@ -1062,7 +1084,9 @@ leveldb::Status IndexedDBBackingStore::GetObjectStores(
INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES);
}
- it->Next();
+ s = it->Next();
+ if (!s.ok())
+ break;
if (!CheckObjectStoreAndMetaDataType(it.get(),
stop_key,
object_store_id,
@@ -1077,7 +1101,9 @@ leveldb::Status IndexedDBBackingStore::GetObjectStores(
INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES);
}
- it->Next();
+ s = it->Next();
+ if (!s.ok())
+ break;
if (!CheckObjectStoreAndMetaDataType(
it.get(),
stop_key,
@@ -1093,7 +1119,9 @@ leveldb::Status IndexedDBBackingStore::GetObjectStores(
INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES);
}
- it->Next(); // Is evicatble.
+ s = it->Next(); // Is evicatble.
+ if (!s.ok())
+ break;
if (!CheckObjectStoreAndMetaDataType(it.get(),
stop_key,
object_store_id,
@@ -1102,7 +1130,9 @@ leveldb::Status IndexedDBBackingStore::GetObjectStores(
break;
}
- it->Next(); // Last version.
+ s = it->Next(); // Last version.
+ if (!s.ok())
+ break;
if (!CheckObjectStoreAndMetaDataType(
it.get(),
stop_key,
@@ -1112,7 +1142,9 @@ leveldb::Status IndexedDBBackingStore::GetObjectStores(
break;
}
- it->Next(); // Maximum index id allocated.
+ s = it->Next(); // Maximum index id allocated.
+ if (!s.ok())
+ break;
if (!CheckObjectStoreAndMetaDataType(
it.get(),
stop_key,
@@ -1128,7 +1160,9 @@ leveldb::Status IndexedDBBackingStore::GetObjectStores(
INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_OBJECT_STORES);
}
- it->Next(); // [optional] has key path (is not null)
+ s = it->Next(); // [optional] has key path (is not null)
+ if (!s.ok())
+ break;
if (CheckObjectStoreAndMetaDataType(it.get(),
stop_key,
object_store_id,
@@ -1151,7 +1185,9 @@ leveldb::Status IndexedDBBackingStore::GetObjectStores(
}
if (!has_key_path)
key_path = IndexedDBKeyPath();
- it->Next();
+ s = it->Next();
+ if (!s.ok())
+ break;
}
int64 key_generator_current_number = -1;
@@ -1168,7 +1204,9 @@ leveldb::Status IndexedDBBackingStore::GetObjectStores(
// object store, and write lazily to backing store. For now,
// just assert that if it was written it was valid.
DCHECK_GE(key_generator_current_number, kKeyGeneratorInitialNumber);
- it->Next();
+ s = it->Next();
+ if (!s.ok())
+ break;
}
IndexedDBObjectStoreMetadata metadata(object_store_name,
@@ -1176,13 +1214,16 @@ leveldb::Status IndexedDBBackingStore::GetObjectStores(
key_path,
auto_increment,
max_index_id);
- leveldb::Status s =
- GetIndexes(database_id, object_store_id, &metadata.indexes);
+ s = GetIndexes(database_id, object_store_id, &metadata.indexes);
if (!s.ok())
- return s;
+ break;
(*object_stores)[object_store_id] = metadata;
}
- return leveldb::Status::OK();
+
+ if (!s.ok())
+ INTERNAL_READ_ERROR_UNTESTED(GET_OBJECT_STORES);
+
+ return s;
}
WARN_UNUSED_RESULT static leveldb::Status SetMaxObjectStoreId(
@@ -1286,20 +1327,32 @@ leveldb::Status IndexedDBBackingStore::DeleteObjectStore(
return InternalInconsistencyStatus();
}
- DeleteRange(
+ s = DeleteRange(
leveldb_transaction,
ObjectStoreMetaDataKey::Encode(database_id, object_store_id, 0),
ObjectStoreMetaDataKey::EncodeMaxKey(database_id, object_store_id));
- leveldb_transaction->Remove(
- ObjectStoreNamesKey::Encode(database_id, object_store_name));
+ if (s.ok()) {
+ leveldb_transaction->Remove(
+ ObjectStoreNamesKey::Encode(database_id, object_store_name));
+
+ s = DeleteRange(
+ leveldb_transaction,
+ IndexFreeListKey::Encode(database_id, object_store_id, 0),
+ IndexFreeListKey::EncodeMaxKey(database_id, object_store_id));
+ }
+
+ if (s.ok()) {
+ s = DeleteRange(
+ leveldb_transaction,
+ IndexMetaDataKey::Encode(database_id, object_store_id, 0, 0),
+ IndexMetaDataKey::EncodeMaxKey(database_id, object_store_id));
+ }
- DeleteRange(leveldb_transaction,
- IndexFreeListKey::Encode(database_id, object_store_id, 0),
- IndexFreeListKey::EncodeMaxKey(database_id, object_store_id));
- DeleteRange(leveldb_transaction,
- IndexMetaDataKey::Encode(database_id, object_store_id, 0, 0),
- IndexMetaDataKey::EncodeMaxKey(database_id, object_store_id));
+ if (!s.ok()) {
+ INTERNAL_WRITE_ERROR_UNTESTED(DELETE_OBJECT_STORE);
+ return s;
+ }
return ClearObjectStore(transaction, database_id, object_store_id);
}
@@ -1429,8 +1482,11 @@ leveldb::Status IndexedDBBackingStore::ClearObjectStore(
const std::string stop_key =
KeyPrefix(database_id, object_store_id + 1).Encode();
- DeleteRange(transaction->transaction(), start_key, stop_key);
- return leveldb::Status::OK();
+ leveldb::Status s =
+ DeleteRange(transaction->transaction(), start_key, stop_key);
+ if (!s.ok())
+ INTERNAL_WRITE_ERROR_UNTESTED(CLEAR_OBJECT_STORE);
+ return s;
}
leveldb::Status IndexedDBBackingStore::DeleteRecord(
@@ -1500,9 +1556,9 @@ leveldb::Status IndexedDBBackingStore::GetKeyGeneratorCurrentNumber(
scoped_ptr<LevelDBIterator> it = leveldb_transaction->CreateIterator();
int64 max_numeric_key = 0;
- for (it->Seek(start_key);
- it->IsValid() && CompareKeys(it->Key(), stop_key) < 0;
- it->Next()) {
+ for (s = it->Seek(start_key);
+ s.ok() && it->IsValid() && CompareKeys(it->Key(), stop_key) < 0;
+ s = it->Next()) {
StringPiece slice(it->Key());
ObjectStoreDataKey data_key;
if (!ObjectStoreDataKey::Decode(&slice, &data_key)) {
@@ -1517,7 +1573,11 @@ leveldb::Status IndexedDBBackingStore::GetKeyGeneratorCurrentNumber(
}
}
- *key_generator_current_number = max_numeric_key + 1;
+ if (s.ok())
+ *key_generator_current_number = max_numeric_key + 1;
+ else
+ INTERNAL_READ_ERROR_UNTESTED(GET_KEY_GENERATOR_CURRENT_NUMBER);
+
return s;
}
@@ -1624,8 +1684,8 @@ leveldb::Status IndexedDBBackingStore::GetIndexes(
DCHECK(indexes->empty());
scoped_ptr<LevelDBIterator> it = db_->CreateIterator();
- it->Seek(start_key);
- while (it->IsValid() && CompareKeys(it->Key(), stop_key) < 0) {
+ leveldb::Status s = it->Seek(start_key);
+ while (s.ok() && it->IsValid() && CompareKeys(it->Key(), stop_key) < 0) {
StringPiece slice(it->Key());
IndexMetaDataKey meta_data_key;
bool ok = IndexMetaDataKey::Decode(&slice, &meta_data_key);
@@ -1634,7 +1694,9 @@ leveldb::Status IndexedDBBackingStore::GetIndexes(
INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_INDEXES);
// Possible stale metadata due to http://webkit.org/b/85557 but don't fail
// the load.
- it->Next();
+ s = it->Next();
+ if (!s.ok())
+ break;
continue;
}
@@ -1648,7 +1710,9 @@ leveldb::Status IndexedDBBackingStore::GetIndexes(
INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_INDEXES);
}
- it->Next(); // unique flag
+ s = it->Next(); // unique flag
+ if (!s.ok())
+ break;
if (!CheckIndexAndMetaDataKey(
it.get(), stop_key, index_id, IndexMetaDataKey::UNIQUE)) {
INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_INDEXES);
@@ -1661,7 +1725,9 @@ leveldb::Status IndexedDBBackingStore::GetIndexes(
INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_INDEXES);
}
- it->Next(); // key_path
+ s = it->Next(); // key_path
+ if (!s.ok())
+ break;
if (!CheckIndexAndMetaDataKey(
it.get(), stop_key, index_id, IndexMetaDataKey::KEY_PATH)) {
INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_INDEXES);
@@ -1674,7 +1740,9 @@ leveldb::Status IndexedDBBackingStore::GetIndexes(
INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_INDEXES);
}
- it->Next(); // [optional] multi_entry flag
+ s = it->Next(); // [optional] multi_entry flag
+ if (!s.ok())
+ break;
bool index_multi_entry = false;
if (CheckIndexAndMetaDataKey(
it.get(), stop_key, index_id, IndexMetaDataKey::MULTI_ENTRY)) {
@@ -1682,13 +1750,19 @@ leveldb::Status IndexedDBBackingStore::GetIndexes(
if (!DecodeBool(&slice, &index_multi_entry) || !slice.empty())
INTERNAL_CONSISTENCY_ERROR_UNTESTED(GET_INDEXES);
- it->Next();
+ s = it->Next();
+ if (!s.ok())
+ break;
}
(*indexes)[index_id] = IndexedDBIndexMetadata(
index_name, index_id, key_path, index_unique, index_multi_entry);
}
- return leveldb::Status::OK();
+
+ if (!s.ok())
+ INTERNAL_READ_ERROR_UNTESTED(GET_INDEXES);
+
+ return s;
}
WARN_UNUSED_RESULT static leveldb::Status SetMaxIndexId(
@@ -1767,14 +1841,21 @@ leveldb::Status IndexedDBBackingStore::DeleteIndex(
IndexMetaDataKey::Encode(database_id, object_store_id, index_id, 0);
const std::string index_meta_data_end =
IndexMetaDataKey::EncodeMaxKey(database_id, object_store_id, index_id);
- DeleteRange(leveldb_transaction, index_meta_data_start, index_meta_data_end);
+ leveldb::Status s = DeleteRange(
+ leveldb_transaction, index_meta_data_start, index_meta_data_end);
- const std::string index_data_start =
- IndexDataKey::EncodeMinKey(database_id, object_store_id, index_id);
- const std::string index_data_end =
- IndexDataKey::EncodeMaxKey(database_id, object_store_id, index_id);
- DeleteRange(leveldb_transaction, index_data_start, index_data_end);
- return leveldb::Status::OK();
+ if (s.ok()) {
+ const std::string index_data_start =
+ IndexDataKey::EncodeMinKey(database_id, object_store_id, index_id);
+ const std::string index_data_end =
+ IndexDataKey::EncodeMaxKey(database_id, object_store_id, index_id);
+ s = DeleteRange(leveldb_transaction, index_data_start, index_data_end);
+ }
+
+ if (!s.ok())
+ INTERNAL_WRITE_ERROR_UNTESTED(DELETE_INDEX);
+
+ return s;
}
leveldb::Status IndexedDBBackingStore::PutIndexDataForRecord(
@@ -1810,19 +1891,22 @@ leveldb::Status IndexedDBBackingStore::PutIndexDataForRecord(
static bool FindGreatestKeyLessThanOrEqual(LevelDBTransaction* transaction,
const std::string& target,
- std::string* found_key) {
+ std::string* found_key,
+ leveldb::Status& s) {
scoped_ptr<LevelDBIterator> it = transaction->CreateIterator();
- it->Seek(target);
+ s = it->Seek(target);
+ if (!s.ok())
+ return false;
if (!it->IsValid()) {
- it->SeekToLast();
- if (!it->IsValid())
+ s = it->SeekToLast();
+ if (!s.ok() || !it->IsValid())
return false;
}
while (CompareIndexKeys(it->Key(), target) > 0) {
- it->Prev();
- if (!it->IsValid())
+ s = it->Prev();
+ if (!s.ok() || !it->IsValid())
return false;
}
@@ -1830,8 +1914,8 @@ static bool FindGreatestKeyLessThanOrEqual(LevelDBTransaction* transaction,
*found_key = it->Key().as_string();
// There can be several index keys that compare equal. We want the last one.
- it->Next();
- } while (it->IsValid() && !CompareIndexKeys(it->Key(), target));
+ s = it->Next();
+ } while (s.ok() && it->IsValid() && !CompareIndexKeys(it->Key(), target));
return true;
}
@@ -1880,7 +1964,11 @@ leveldb::Status IndexedDBBackingStore::FindKeyInIndex(
const std::string leveldb_key =
IndexDataKey::Encode(database_id, object_store_id, index_id, key);
scoped_ptr<LevelDBIterator> it = leveldb_transaction->CreateIterator();
- it->Seek(leveldb_key);
+ leveldb::Status s = it->Seek(leveldb_key);
+ if (!s.ok()) {
+ INTERNAL_READ_ERROR_UNTESTED(FIND_KEY_IN_INDEX);
+ return s;
+ }
for (;;) {
if (!it->IsValid())
@@ -1898,18 +1986,18 @@ leveldb::Status IndexedDBBackingStore::FindKeyInIndex(
*found_encoded_primary_key = slice.as_string();
bool exists = false;
- leveldb::Status s = VersionExists(leveldb_transaction,
- database_id,
- object_store_id,
- version,
- *found_encoded_primary_key,
- &exists);
+ s = VersionExists(leveldb_transaction,
+ database_id,
+ object_store_id,
+ version,
+ *found_encoded_primary_key,
+ &exists);
if (!s.ok())
return s;
if (!exists) {
// Delete stale index data entry and continue.
leveldb_transaction->Remove(it->Key());
- it->Next();
+ s = it->Next();
continue;
}
*found = true;
@@ -2008,7 +2096,8 @@ IndexedDBBackingStore::Cursor::Cursor(
iterator_ = transaction_->CreateIterator();
if (other->iterator_->IsValid()) {
- iterator_->Seek(other->iterator_->Key());
+ leveldb::Status s = iterator_->Seek(other->iterator_->Key());
+ // TODO(cmumford): Handle this error (crbug.com/363397)
DCHECK(iterator_->IsValid());
}
}
@@ -2019,19 +2108,22 @@ IndexedDBBackingStore::Cursor::Cursor(LevelDBTransaction* transaction,
: transaction_(transaction), cursor_options_(cursor_options) {}
IndexedDBBackingStore::Cursor::~Cursor() {}
-bool IndexedDBBackingStore::Cursor::FirstSeek() {
+bool IndexedDBBackingStore::Cursor::FirstSeek(leveldb::Status* s) {
iterator_ = transaction_->CreateIterator();
if (cursor_options_.forward)
- iterator_->Seek(cursor_options_.low_key);
+ *s = iterator_->Seek(cursor_options_.low_key);
else
- iterator_->Seek(cursor_options_.high_key);
+ *s = iterator_->Seek(cursor_options_.high_key);
+ if (!s->ok())
+ return false;
- return Continue(0, READY);
+ return Continue(0, READY, s);
}
-bool IndexedDBBackingStore::Cursor::Advance(uint32 count) {
+bool IndexedDBBackingStore::Cursor::Advance(uint32 count, leveldb::Status* s) {
+ *s = leveldb::Status::OK();
while (count--) {
- if (!Continue())
+ if (!Continue(s))
return false;
}
return true;
@@ -2039,9 +2131,11 @@ bool IndexedDBBackingStore::Cursor::Advance(uint32 count) {
bool IndexedDBBackingStore::Cursor::Continue(const IndexedDBKey* key,
const IndexedDBKey* primary_key,
- IteratorState next_state) {
+ IteratorState next_state,
+ leveldb::Status* s) {
DCHECK(!key || key->IsValid());
DCHECK(!primary_key || primary_key->IsValid());
+ *s = leveldb::Status::OK();
// TODO(alecflett): avoid a copy here?
IndexedDBKey previous_key = current_key_ ? *current_key_ : IndexedDBKey();
@@ -2065,13 +2159,15 @@ bool IndexedDBBackingStore::Cursor::Continue(const IndexedDBKey* key,
} else {
leveldb_key = EncodeKey(*key);
}
- iterator_->Seek(leveldb_key);
+ *s = iterator_->Seek(leveldb_key);
first_iteration = false;
} else if (forward) {
- iterator_->Next();
+ *s = iterator_->Next();
} else {
- iterator_->Prev();
+ *s = iterator_->Prev();
}
+ if (!s->ok())
+ return false;
} else {
next_state = SEEK; // for subsequent iterations
}
@@ -2553,6 +2649,8 @@ bool ObjectStoreCursorOptions(
cursor_options->low_open = range.lowerOpen();
}
+ leveldb::Status s;
+
if (!upper_bound) {
cursor_options->high_key =
ObjectStoreDataKey::Encode(database_id, object_store_id, MaxIDBKey());
@@ -2561,9 +2659,11 @@ bool ObjectStoreCursorOptions(
cursor_options->high_open = true; // Not included.
} else {
// We need a key that exists.
+ // TODO(cmumford): Handle this error (crbug.com/363397)
if (!FindGreatestKeyLessThanOrEqual(transaction,
cursor_options->high_key,
- &cursor_options->high_key))
+ &cursor_options->high_key,
+ s))
return false;
cursor_options->high_open = false;
}
@@ -2575,8 +2675,9 @@ bool ObjectStoreCursorOptions(
if (!cursor_options->forward) {
// For reverse cursors, we need a key that exists.
std::string found_high_key;
+ // TODO(cmumford): Handle this error (crbug.com/363397)
if (!FindGreatestKeyLessThanOrEqual(
- transaction, cursor_options->high_key, &found_high_key))
+ transaction, cursor_options->high_key, &found_high_key, s))
return false;
// If the target key should not be included, but we end up with a smaller
@@ -2626,6 +2727,8 @@ bool IndexCursorOptions(
cursor_options->low_open = range.lowerOpen();
}
+ leveldb::Status s;
+
if (!upper_bound) {
cursor_options->high_key =
IndexDataKey::EncodeMaxKey(database_id, object_store_id, index_id);
@@ -2634,7 +2737,8 @@ bool IndexCursorOptions(
if (!cursor_options->forward) { // We need a key that exists.
if (!FindGreatestKeyLessThanOrEqual(transaction,
cursor_options->high_key,
- &cursor_options->high_key))
+ &cursor_options->high_key,
+ s))
return false;
cursor_options->high_open = false;
}
@@ -2645,8 +2749,9 @@ bool IndexCursorOptions(
std::string found_high_key;
// Seek to the *last* key in the set of non-unique keys
+ // TODO(cmumford): Handle this error (crbug.com/363397)
if (!FindGreatestKeyLessThanOrEqual(
- transaction, cursor_options->high_key, &found_high_key))
+ transaction, cursor_options->high_key, &found_high_key, s))
return false;
// If the target key should not be included, but we end up with a smaller
@@ -2667,8 +2772,10 @@ IndexedDBBackingStore::OpenObjectStoreCursor(
int64 database_id,
int64 object_store_id,
const IndexedDBKeyRange& range,
- indexed_db::CursorDirection direction) {
+ indexed_db::CursorDirection direction,
+ leveldb::Status* s) {
IDB_TRACE("IndexedDBBackingStore::OpenObjectStoreCursor");
+ *s = leveldb::Status::OK();
LevelDBTransaction* leveldb_transaction = transaction->transaction();
IndexedDBBackingStore::Cursor::CursorOptions cursor_options;
if (!ObjectStoreCursorOptions(leveldb_transaction,
@@ -2680,7 +2787,7 @@ IndexedDBBackingStore::OpenObjectStoreCursor(
return scoped_ptr<IndexedDBBackingStore::Cursor>();
scoped_ptr<ObjectStoreCursorImpl> cursor(
new ObjectStoreCursorImpl(leveldb_transaction, cursor_options));
- if (!cursor->FirstSeek())
+ if (!cursor->FirstSeek(s))
return scoped_ptr<IndexedDBBackingStore::Cursor>();
return cursor.PassAs<IndexedDBBackingStore::Cursor>();
@@ -2692,8 +2799,10 @@ IndexedDBBackingStore::OpenObjectStoreKeyCursor(
int64 database_id,
int64 object_store_id,
const IndexedDBKeyRange& range,
- indexed_db::CursorDirection direction) {
+ indexed_db::CursorDirection direction,
+ leveldb::Status* s) {
IDB_TRACE("IndexedDBBackingStore::OpenObjectStoreKeyCursor");
+ *s = leveldb::Status::OK();
LevelDBTransaction* leveldb_transaction = transaction->transaction();
IndexedDBBackingStore::Cursor::CursorOptions cursor_options;
if (!ObjectStoreCursorOptions(leveldb_transaction,
@@ -2705,7 +2814,7 @@ IndexedDBBackingStore::OpenObjectStoreKeyCursor(
return scoped_ptr<IndexedDBBackingStore::Cursor>();
scoped_ptr<ObjectStoreKeyCursorImpl> cursor(
new ObjectStoreKeyCursorImpl(leveldb_transaction, cursor_options));
- if (!cursor->FirstSeek())
+ if (!cursor->FirstSeek(s))
return scoped_ptr<IndexedDBBackingStore::Cursor>();
return cursor.PassAs<IndexedDBBackingStore::Cursor>();
@@ -2718,8 +2827,10 @@ IndexedDBBackingStore::OpenIndexKeyCursor(
int64 object_store_id,
int64 index_id,
const IndexedDBKeyRange& range,
- indexed_db::CursorDirection direction) {
+ indexed_db::CursorDirection direction,
+ leveldb::Status* s) {
IDB_TRACE("IndexedDBBackingStore::OpenIndexKeyCursor");
+ *s = leveldb::Status::OK();
LevelDBTransaction* leveldb_transaction = transaction->transaction();
IndexedDBBackingStore::Cursor::CursorOptions cursor_options;
if (!IndexCursorOptions(leveldb_transaction,
@@ -2732,7 +2843,7 @@ IndexedDBBackingStore::OpenIndexKeyCursor(
return scoped_ptr<IndexedDBBackingStore::Cursor>();
scoped_ptr<IndexKeyCursorImpl> cursor(
new IndexKeyCursorImpl(leveldb_transaction, cursor_options));
- if (!cursor->FirstSeek())
+ if (!cursor->FirstSeek(s))
return scoped_ptr<IndexedDBBackingStore::Cursor>();
return cursor.PassAs<IndexedDBBackingStore::Cursor>();
@@ -2745,7 +2856,8 @@ IndexedDBBackingStore::OpenIndexCursor(
int64 object_store_id,
int64 index_id,
const IndexedDBKeyRange& range,
- indexed_db::CursorDirection direction) {
+ indexed_db::CursorDirection direction,
+ leveldb::Status* s) {
IDB_TRACE("IndexedDBBackingStore::OpenIndexCursor");
LevelDBTransaction* leveldb_transaction = transaction->transaction();
IndexedDBBackingStore::Cursor::CursorOptions cursor_options;
@@ -2759,7 +2871,7 @@ IndexedDBBackingStore::OpenIndexCursor(
return scoped_ptr<IndexedDBBackingStore::Cursor>();
scoped_ptr<IndexCursorImpl> cursor(
new IndexCursorImpl(leveldb_transaction, cursor_options));
- if (!cursor->FirstSeek())
+ if (!cursor->FirstSeek(s))
return scoped_ptr<IndexedDBBackingStore::Cursor>();
return cursor.PassAs<IndexedDBBackingStore::Cursor>();