Chromium Code Reviews| Index: content/browser/indexed_db/database_impl.cc |
| diff --git a/content/browser/indexed_db/database_impl.cc b/content/browser/indexed_db/database_impl.cc |
| index fd3b190eb6c494cc7333197a9f9cad2561ac4b95..27b331f44466128b2082e2054e48a51ad966e817 100644 |
| --- a/content/browser/indexed_db/database_impl.cc |
| +++ b/content/browser/indexed_db/database_impl.cc |
| @@ -9,6 +9,7 @@ |
| #include "content/browser/indexed_db/indexed_db_connection.h" |
| #include "content/browser/indexed_db/indexed_db_context_impl.h" |
| #include "content/browser/indexed_db/indexed_db_dispatcher_host.h" |
| +#include "content/browser/indexed_db/indexed_db_transaction.h" |
| #include "content/browser/indexed_db/indexed_db_value.h" |
| #include "storage/browser/blob/blob_storage_context.h" |
| #include "storage/browser/quota/quota_manager_proxy.h" |
| @@ -453,9 +454,13 @@ void DatabaseImpl::IDBThreadHelper::CreateObjectStore( |
| if (!connection_->IsConnected()) |
| return; |
| - connection_->database()->CreateObjectStore( |
| - dispatcher_host_->HostTransactionId(transaction_id), object_store_id, |
| - name, key_path, auto_increment); |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| + connection_->database()->CreateObjectStore(transaction, object_store_id, name, |
| + key_path, auto_increment); |
| } |
| void DatabaseImpl::IDBThreadHelper::DeleteObjectStore(int64_t transaction_id, |
| @@ -463,8 +468,12 @@ void DatabaseImpl::IDBThreadHelper::DeleteObjectStore(int64_t transaction_id, |
| if (!connection_->IsConnected()) |
| return; |
| - connection_->database()->DeleteObjectStore( |
| - dispatcher_host_->HostTransactionId(transaction_id), object_store_id); |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| + connection_->database()->DeleteObjectStore(transaction, object_store_id); |
| } |
| void DatabaseImpl::IDBThreadHelper::RenameObjectStore( |
| @@ -474,9 +483,13 @@ void DatabaseImpl::IDBThreadHelper::RenameObjectStore( |
| if (!connection_->IsConnected()) |
| return; |
| - connection_->database()->RenameObjectStore( |
| - dispatcher_host_->HostTransactionId(transaction_id), object_store_id, |
| - new_name); |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| + connection_->database()->RenameObjectStore(transaction, object_store_id, |
| + new_name); |
| } |
| void DatabaseImpl::IDBThreadHelper::CreateTransaction( |
| @@ -486,15 +499,8 @@ void DatabaseImpl::IDBThreadHelper::CreateTransaction( |
| if (!connection_->IsConnected()) |
| return; |
| - int64_t host_transaction_id = |
| - dispatcher_host_->HostTransactionId(transaction_id); |
| - if (!dispatcher_host_->RegisterTransactionId(host_transaction_id, origin_)) { |
| - DLOG(ERROR) << "Duplicate host_transaction_id."; |
|
jsbell
2016/11/30 21:30:13
Can you add the extra logging details into the DCH
dmurph
2016/11/30 23:13:06
Done.
|
| - return; |
| - } |
| - |
| - connection_->database()->CreateTransaction( |
| - host_transaction_id, connection_.get(), object_store_ids, mode); |
| + connection_->database()->CreateTransaction(transaction_id, connection_.get(), |
| + object_store_ids, mode); |
| } |
| void DatabaseImpl::IDBThreadHelper::Close() { |
| @@ -520,11 +526,15 @@ void DatabaseImpl::IDBThreadHelper::AddObserver(int64_t transaction_id, |
| if (!connection_->IsConnected()) |
| return; |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| IndexedDBObserver::Options options(include_transaction, no_records, values, |
| operation_types); |
| - connection_->database()->AddPendingObserver( |
| - dispatcher_host_->HostTransactionId(transaction_id), observer_id, |
| - options); |
| + connection_->database()->AddPendingObserver(transaction, observer_id, |
| + options); |
| } |
| void DatabaseImpl::IDBThreadHelper::RemoveObservers( |
| @@ -545,10 +555,14 @@ void DatabaseImpl::IDBThreadHelper::Get( |
| if (!connection_->IsConnected()) |
| return; |
| - connection_->database()->Get( |
| - dispatcher_host_->HostTransactionId(transaction_id), object_store_id, |
| - index_id, base::MakeUnique<IndexedDBKeyRange>(key_range), key_only, |
| - callbacks); |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| + connection_->database()->Get(transaction, object_store_id, index_id, |
| + base::MakeUnique<IndexedDBKeyRange>(key_range), |
| + key_only, callbacks); |
| } |
| void DatabaseImpl::IDBThreadHelper::GetAll( |
| @@ -562,10 +576,15 @@ void DatabaseImpl::IDBThreadHelper::GetAll( |
| if (!connection_->IsConnected()) |
| return; |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| connection_->database()->GetAll( |
| - dispatcher_host_->HostTransactionId(transaction_id), object_store_id, |
| - index_id, base::MakeUnique<IndexedDBKeyRange>(key_range), key_only, |
| - max_count, std::move(callbacks)); |
| + transaction, object_store_id, index_id, |
| + base::MakeUnique<IndexedDBKeyRange>(key_range), key_only, max_count, |
| + std::move(callbacks)); |
| } |
| void DatabaseImpl::IDBThreadHelper::Put( |
| @@ -581,19 +600,22 @@ void DatabaseImpl::IDBThreadHelper::Put( |
| if (!connection_->IsConnected()) |
| return; |
| - int64_t host_transaction_id = |
| - dispatcher_host_->HostTransactionId(transaction_id); |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| uint64_t commit_size = mojo_value->bits.size(); |
| IndexedDBValue value; |
| swap(value.bits, mojo_value->bits); |
| swap(value.blob_info, blob_info); |
| - connection_->database()->Put(host_transaction_id, object_store_id, &value, |
| - &handles, base::MakeUnique<IndexedDBKey>(key), |
| - mode, std::move(callbacks), index_keys); |
| + connection_->database()->Put(transaction, object_store_id, &value, &handles, |
| + base::MakeUnique<IndexedDBKey>(key), mode, |
| + std::move(callbacks), index_keys); |
| // Size can't be big enough to overflow because it represents the |
| // actual bytes passed through IPC. |
| - dispatcher_host_->AddToTransaction(host_transaction_id, commit_size); |
| + transaction->set_size(transaction->size() + commit_size); |
| } |
| void DatabaseImpl::IDBThreadHelper::SetIndexKeys( |
| @@ -604,9 +626,14 @@ void DatabaseImpl::IDBThreadHelper::SetIndexKeys( |
| if (!connection_->IsConnected()) |
| return; |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| connection_->database()->SetIndexKeys( |
| - dispatcher_host_->HostTransactionId(transaction_id), object_store_id, |
| - base::MakeUnique<IndexedDBKey>(primary_key), index_keys); |
| + transaction, object_store_id, base::MakeUnique<IndexedDBKey>(primary_key), |
| + index_keys); |
| } |
| void DatabaseImpl::IDBThreadHelper::SetIndexesReady( |
| @@ -616,9 +643,13 @@ void DatabaseImpl::IDBThreadHelper::SetIndexesReady( |
| if (!connection_->IsConnected()) |
| return; |
| - connection_->database()->SetIndexesReady( |
| - dispatcher_host_->HostTransactionId(transaction_id), object_store_id, |
| - index_ids); |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| + connection_->database()->SetIndexesReady(transaction, object_store_id, |
| + index_ids); |
| } |
| void DatabaseImpl::IDBThreadHelper::OpenCursor( |
| @@ -633,10 +664,15 @@ void DatabaseImpl::IDBThreadHelper::OpenCursor( |
| if (!connection_->IsConnected()) |
| return; |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| connection_->database()->OpenCursor( |
| - dispatcher_host_->HostTransactionId(transaction_id), object_store_id, |
| - index_id, base::MakeUnique<IndexedDBKeyRange>(key_range), direction, |
| - key_only, task_type, std::move(callbacks)); |
| + transaction, object_store_id, index_id, |
| + base::MakeUnique<IndexedDBKeyRange>(key_range), direction, key_only, |
| + task_type, std::move(callbacks)); |
| } |
| void DatabaseImpl::IDBThreadHelper::Count( |
| @@ -648,10 +684,14 @@ void DatabaseImpl::IDBThreadHelper::Count( |
| if (!connection_->IsConnected()) |
| return; |
| - connection_->database()->Count( |
| - dispatcher_host_->HostTransactionId(transaction_id), object_store_id, |
| - index_id, base::MakeUnique<IndexedDBKeyRange>(key_range), |
| - std::move(callbacks)); |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| + connection_->database()->Count(transaction, object_store_id, index_id, |
| + base::MakeUnique<IndexedDBKeyRange>(key_range), |
| + std::move(callbacks)); |
| } |
| void DatabaseImpl::IDBThreadHelper::DeleteRange( |
| @@ -662,8 +702,13 @@ void DatabaseImpl::IDBThreadHelper::DeleteRange( |
| if (!connection_->IsConnected()) |
| return; |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| connection_->database()->DeleteRange( |
| - dispatcher_host_->HostTransactionId(transaction_id), object_store_id, |
| + transaction, object_store_id, |
| base::MakeUnique<IndexedDBKeyRange>(key_range), std::move(callbacks)); |
| } |
| @@ -674,9 +719,12 @@ void DatabaseImpl::IDBThreadHelper::Clear( |
| if (!connection_->IsConnected()) |
| return; |
| - connection_->database()->Clear( |
| - dispatcher_host_->HostTransactionId(transaction_id), object_store_id, |
| - callbacks); |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| + connection_->database()->Clear(transaction, object_store_id, callbacks); |
| } |
| void DatabaseImpl::IDBThreadHelper::CreateIndex( |
| @@ -690,9 +738,13 @@ void DatabaseImpl::IDBThreadHelper::CreateIndex( |
| if (!connection_->IsConnected()) |
| return; |
| - connection_->database()->CreateIndex( |
| - dispatcher_host_->HostTransactionId(transaction_id), object_store_id, |
| - index_id, name, key_path, unique, multi_entry); |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| + connection_->database()->CreateIndex(transaction, object_store_id, index_id, |
| + name, key_path, unique, multi_entry); |
| } |
| void DatabaseImpl::IDBThreadHelper::DeleteIndex(int64_t transaction_id, |
| @@ -701,9 +753,12 @@ void DatabaseImpl::IDBThreadHelper::DeleteIndex(int64_t transaction_id, |
| if (!connection_->IsConnected()) |
| return; |
| - connection_->database()->DeleteIndex( |
| - dispatcher_host_->HostTransactionId(transaction_id), object_store_id, |
| - index_id); |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| + connection_->database()->DeleteIndex(transaction, object_store_id, index_id); |
| } |
| void DatabaseImpl::IDBThreadHelper::RenameIndex( |
| @@ -714,34 +769,39 @@ void DatabaseImpl::IDBThreadHelper::RenameIndex( |
| if (!connection_->IsConnected()) |
| return; |
| - connection_->database()->RenameIndex( |
| - dispatcher_host_->HostTransactionId(transaction_id), object_store_id, |
| - index_id, new_name); |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| + connection_->database()->RenameIndex(transaction, object_store_id, index_id, |
| + new_name); |
| } |
| void DatabaseImpl::IDBThreadHelper::Abort(int64_t transaction_id) { |
| if (!connection_->IsConnected()) |
| return; |
| - connection_->database()->Abort( |
| - dispatcher_host_->HostTransactionId(transaction_id)); |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| + return; |
| + |
| + connection_->AbortTransaction(transaction); |
| } |
| void DatabaseImpl::IDBThreadHelper::Commit(int64_t transaction_id) { |
| if (!connection_->IsConnected()) |
| return; |
| - int64_t host_transaction_id = |
| - dispatcher_host_->HostTransactionId(transaction_id); |
| - // May have been aborted by back end before front-end could request commit. |
| - int64_t transaction_size; |
| - if (!dispatcher_host_->GetTransactionSize(host_transaction_id, |
| - &transaction_size)) |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| return; |
| // Always allow empty or delete-only transactions. |
| - if (transaction_size == 0) { |
| - connection_->database()->Commit(host_transaction_id); |
| + if (transaction->size() == 0) { |
| + connection_->database()->Commit(transaction); |
| return; |
| } |
| @@ -761,19 +821,17 @@ void DatabaseImpl::IDBThreadHelper::OnGotUsageAndQuotaForCommit( |
| if (!connection_->IsConnected()) |
| return; |
| - int64_t host_transaction_id = |
| - dispatcher_host_->HostTransactionId(transaction_id); |
| - // May have aborted while quota check was pending. |
| - int64_t transaction_size; |
| - if (!dispatcher_host_->GetTransactionSize(host_transaction_id, |
| - &transaction_size)) |
| + IndexedDBTransaction* transaction = |
| + connection_->GetTransaction(transaction_id); |
| + if (!transaction) |
| return; |
| - if (status == storage::kQuotaStatusOk && usage + transaction_size <= quota) { |
| - connection_->database()->Commit(host_transaction_id); |
| + if (status == storage::kQuotaStatusOk && |
| + usage + transaction->size() <= quota) { |
| + connection_->database()->Commit(transaction); |
| } else { |
| - connection_->database()->Abort( |
| - host_transaction_id, |
| + connection_->AbortTransaction( |
| + transaction, |
| IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionQuotaError)); |
| } |
| } |