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 8dcea537cb067ad66a50ba5d564e107d14bf8e9f..df24eaf03199fc49c31116372a3643f9c338864b 100644 |
| --- a/content/browser/indexed_db/indexed_db_database.cc |
| +++ b/content/browser/indexed_db/indexed_db_database.cc |
| @@ -403,6 +403,13 @@ void IndexedDBDatabase::RemoveObjectStore(int64_t object_store_id) { |
| metadata_.object_stores.erase(object_store_id); |
| } |
| +void IndexedDBDatabase::SetObjectStoreName( |
| + int64_t object_store_id, const base::string16& name) { |
| + DCHECK(metadata_.object_stores.find(object_store_id) != |
| + metadata_.object_stores.end()); |
| + metadata_.object_stores[object_store_id].name = name; |
| +} |
| + |
| void IndexedDBDatabase::AddIndex(int64_t object_store_id, |
| const IndexedDBIndexMetadata& index, |
| int64_t new_max_index_id) { |
| @@ -431,6 +438,18 @@ void IndexedDBDatabase::RemoveIndex(int64_t object_store_id, int64_t index_id) { |
| metadata_.object_stores[object_store_id] = object_store; |
| } |
| +void IndexedDBDatabase::SetIndexName( |
| + int64_t object_store_id, int64_t index_id, const base::string16& name) { |
| + DCHECK(metadata_.object_stores.find(object_store_id) != |
| + metadata_.object_stores.end()); |
| + IndexedDBObjectStoreMetadata object_store = |
| + metadata_.object_stores[object_store_id]; |
| + |
| + DCHECK(object_store.indexes.find(index_id) != object_store.indexes.end()); |
| + object_store.indexes[index_id].name = name; |
| + metadata_.object_stores[object_store_id] = object_store; |
| +} |
| + |
| leveldb::Status IndexedDBDatabase::OpenInternal() { |
| bool success = false; |
| leveldb::Status s = backing_store_->GetIDBDatabaseMetaData( |
| @@ -599,6 +618,48 @@ void IndexedDBDatabase::DeleteObjectStore(int64_t transaction_id, |
| object_store_id)); |
| } |
| +void IndexedDBDatabase::RenameObjectStore(int64_t transaction_id, |
| + int64_t object_store_id, |
| + const base::string16& new_name) { |
| + IDB_TRACE1("IndexedDBDatabase::RenameObjectStore", "txn.id", transaction_id); |
| + IndexedDBTransaction* transaction = GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + DCHECK_EQ(transaction->mode(), blink::WebIDBTransactionModeVersionChange); |
| + |
| + if (!ValidateObjectStoreId(object_store_id)) |
| + return; |
| + |
| + // Store creation is done synchronously, as it may be followed by |
|
jsbell
2016/09/07 17:16:13
Update comment, e.g. "Store metadata changes are m
pwnall
2016/09/07 22:43:52
Done.
|
| + // index creation (also sync) since preemptive OpenCursor/SetIndexKeys |
| + // may follow. |
| + const IndexedDBObjectStoreMetadata object_store_metadata = |
| + metadata_.object_stores[object_store_id]; |
| + |
| + leveldb::Status s = |
| + backing_store_->RenameObjectStore(transaction->BackingStoreTransaction(), |
| + transaction->database()->id(), |
| + object_store_metadata.id, new_name); |
| + if (!s.ok()) { |
| + IndexedDBDatabaseError error( |
| + blink::WebIDBDatabaseExceptionUnknownError, |
| + ASCIIToUTF16("Internal error renaming object store '") + |
| + object_store_metadata.name + ASCIIToUTF16("' to '") + new_name + |
| + ASCIIToUTF16("'.")); |
| + transaction->Abort(error); |
| + if (s.IsCorruption()) |
| + factory_->HandleBackingStoreCorruption(backing_store_->origin(), error); |
| + return; |
| + } |
| + |
| + transaction->ScheduleAbortTask( |
| + base::Bind(&IndexedDBDatabase::RenameObjectStoreAbortOperation, |
| + this, |
| + object_store_id, |
| + object_store_metadata.name)); |
| + SetObjectStoreName(object_store_id, new_name); |
| +} |
| + |
| void IndexedDBDatabase::CreateIndex(int64_t transaction_id, |
| int64_t object_store_id, |
| int64_t index_id, |
| @@ -722,6 +783,59 @@ void IndexedDBDatabase::DeleteIndexAbortOperation( |
| AddIndex(object_store_id, index_metadata, IndexedDBIndexMetadata::kInvalidId); |
| } |
| +void IndexedDBDatabase::RenameIndex(int64_t transaction_id, |
| + int64_t object_store_id, |
| + int64_t index_id, |
| + const base::string16& new_name) { |
| + IDB_TRACE1("IndexedDBDatabase::RenameIndex", "txn.id", transaction_id); |
| + IndexedDBTransaction* transaction = GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + DCHECK_EQ(transaction->mode(), blink::WebIDBTransactionModeVersionChange); |
| + |
| + if (!ValidateObjectStoreIdAndIndexId(object_store_id, index_id)) |
| + return; |
| + |
| + // Index creation is done synchronously since preemptive |
|
jsbell
2016/09/07 17:16:13
Ditto
pwnall
2016/09/07 22:43:52
Done.
|
| + // OpenCursor/SetIndexKeys may follow. |
| + |
| + const IndexedDBIndexMetadata index_metadata = |
| + metadata_.object_stores[object_store_id].indexes[index_id]; |
| + |
| + leveldb::Status s = |
| + backing_store_->RenameIndex(transaction->BackingStoreTransaction(), |
| + transaction->database()->id(), |
| + object_store_id, |
| + index_id, |
| + new_name); |
| + if (!s.ok()) { |
| + base::string16 error_string = |
| + ASCIIToUTF16("Internal error creating index '") + |
|
jsbell
2016/09/07 17:16:13
Update error message.
pwnall
2016/09/07 22:43:52
Done.
|
| + index_metadata.name + ASCIIToUTF16("'."); |
| + transaction->Abort(IndexedDBDatabaseError( |
| + blink::WebIDBDatabaseExceptionUnknownError, error_string)); |
| + return; |
| + } |
| + |
| + transaction->ScheduleAbortTask( |
| + base::Bind(&IndexedDBDatabase::RenameIndexAbortOperation, |
| + this, |
| + object_store_id, |
| + index_id, |
| + index_metadata.name)); |
| + SetIndexName(object_store_id, index_id, new_name); |
| +} |
| + |
| +void IndexedDBDatabase::RenameIndexAbortOperation( |
| + int64_t object_store_id, |
| + int64_t index_id, |
| + const base::string16 old_name, |
| + IndexedDBTransaction* transaction) { |
| + DCHECK(!transaction); |
| + IDB_TRACE("IndexedDBDatabase::RenameIndexAbortOperation"); |
| + SetIndexName(object_store_id, index_id, old_name); |
| +} |
| + |
| void IndexedDBDatabase::Commit(int64_t transaction_id) { |
| // The frontend suggests that we commit, but we may have previously initiated |
| // an abort, and so have disposed of the transaction. on_abort has already |
| @@ -2002,6 +2116,15 @@ void IndexedDBDatabase::DeleteObjectStoreAbortOperation( |
| IndexedDBObjectStoreMetadata::kInvalidId); |
| } |
| +void IndexedDBDatabase::RenameObjectStoreAbortOperation( |
| + int64_t object_store_id, |
| + base::string16 old_name, |
| + IndexedDBTransaction* transaction) { |
| + DCHECK(!transaction); |
| + IDB_TRACE("IndexedDBDatabase::RenameObjectStoreAbortOperation"); |
| + SetObjectStoreName(object_store_id, old_name); |
| +} |
| + |
| void IndexedDBDatabase::VersionChangeAbortOperation( |
| int64_t previous_version, |
| IndexedDBTransaction* transaction) { |