Commit f243eacf authored by jsbell@chromium.org's avatar jsbell@chromium.org

IndexedDB: Replace passing identically-sized vectors with pairs

Avoid the antipattern of passing vectors-that-must-be-the-same-size.
Use a tuple (well, a pair) instead.

R=tsepez@chromium.org,alecflett@chromium.org
BUG=334314

Review URL: https://codereview.chromium.org/138703002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@245383 0039d316-1c4b-4281-b951-d872f2087c98
parent 99b6ee45
...@@ -698,7 +698,6 @@ struct IndexedDBDatabase::PutOperationParams { ...@@ -698,7 +698,6 @@ struct IndexedDBDatabase::PutOperationParams {
scoped_ptr<IndexedDBKey> key; scoped_ptr<IndexedDBKey> key;
IndexedDBDatabase::PutMode put_mode; IndexedDBDatabase::PutMode put_mode;
scoped_refptr<IndexedDBCallbacks> callbacks; scoped_refptr<IndexedDBCallbacks> callbacks;
std::vector<int64> index_ids;
std::vector<IndexKeys> index_keys; std::vector<IndexKeys> index_keys;
DISALLOW_COPY_AND_ASSIGN(PutOperationParams); DISALLOW_COPY_AND_ASSIGN(PutOperationParams);
...@@ -710,7 +709,6 @@ void IndexedDBDatabase::Put(int64 transaction_id, ...@@ -710,7 +709,6 @@ void IndexedDBDatabase::Put(int64 transaction_id,
scoped_ptr<IndexedDBKey> key, scoped_ptr<IndexedDBKey> key,
PutMode put_mode, PutMode put_mode,
scoped_refptr<IndexedDBCallbacks> callbacks, scoped_refptr<IndexedDBCallbacks> callbacks,
const std::vector<int64>& index_ids,
const std::vector<IndexKeys>& index_keys) { const std::vector<IndexKeys>& index_keys) {
IDB_TRACE("IndexedDBDatabase::Put"); IDB_TRACE("IndexedDBDatabase::Put");
IndexedDBTransaction* transaction = GetTransaction(transaction_id); IndexedDBTransaction* transaction = GetTransaction(transaction_id);
...@@ -728,7 +726,6 @@ void IndexedDBDatabase::Put(int64 transaction_id, ...@@ -728,7 +726,6 @@ void IndexedDBDatabase::Put(int64 transaction_id,
params->key = key.Pass(); params->key = key.Pass();
params->put_mode = put_mode; params->put_mode = put_mode;
params->callbacks = callbacks; params->callbacks = callbacks;
params->index_ids = index_ids;
params->index_keys = index_keys; params->index_keys = index_keys;
transaction->ScheduleTask(base::Bind( transaction->ScheduleTask(base::Bind(
&IndexedDBDatabase::PutOperation, this, base::Passed(&params))); &IndexedDBDatabase::PutOperation, this, base::Passed(&params)));
...@@ -738,7 +735,6 @@ void IndexedDBDatabase::PutOperation(scoped_ptr<PutOperationParams> params, ...@@ -738,7 +735,6 @@ void IndexedDBDatabase::PutOperation(scoped_ptr<PutOperationParams> params,
IndexedDBTransaction* transaction) { IndexedDBTransaction* transaction) {
IDB_TRACE("IndexedDBDatabase::PutOperation"); IDB_TRACE("IndexedDBDatabase::PutOperation");
DCHECK_NE(transaction->mode(), indexed_db::TRANSACTION_READ_ONLY); DCHECK_NE(transaction->mode(), indexed_db::TRANSACTION_READ_ONLY);
DCHECK_EQ(params->index_ids.size(), params->index_keys.size());
bool key_was_generated = false; bool key_was_generated = false;
DCHECK(metadata_.object_stores.find(params->object_store_id) != DCHECK(metadata_.object_stores.find(params->object_store_id) !=
...@@ -799,7 +795,6 @@ void IndexedDBDatabase::PutOperation(scoped_ptr<PutOperationParams> params, ...@@ -799,7 +795,6 @@ void IndexedDBDatabase::PutOperation(scoped_ptr<PutOperationParams> params,
object_store, object_store,
*key, *key,
key_was_generated, key_was_generated,
params->index_ids,
params->index_keys, params->index_keys,
&index_writers, &index_writers,
&error_message, &error_message,
...@@ -864,7 +859,6 @@ void IndexedDBDatabase::PutOperation(scoped_ptr<PutOperationParams> params, ...@@ -864,7 +859,6 @@ void IndexedDBDatabase::PutOperation(scoped_ptr<PutOperationParams> params,
void IndexedDBDatabase::SetIndexKeys(int64 transaction_id, void IndexedDBDatabase::SetIndexKeys(int64 transaction_id,
int64 object_store_id, int64 object_store_id,
scoped_ptr<IndexedDBKey> primary_key, scoped_ptr<IndexedDBKey> primary_key,
const std::vector<int64>& index_ids,
const std::vector<IndexKeys>& index_keys) { const std::vector<IndexKeys>& index_keys) {
IDB_TRACE("IndexedDBDatabase::SetIndexKeys"); IDB_TRACE("IndexedDBDatabase::SetIndexKeys");
IndexedDBTransaction* transaction = GetTransaction(transaction_id); IndexedDBTransaction* transaction = GetTransaction(transaction_id);
...@@ -909,7 +903,6 @@ void IndexedDBDatabase::SetIndexKeys(int64 transaction_id, ...@@ -909,7 +903,6 @@ void IndexedDBDatabase::SetIndexKeys(int64 transaction_id,
object_store_metadata, object_store_metadata,
*primary_key, *primary_key,
false, false,
index_ids,
index_keys, index_keys,
&index_writers, &index_writers,
&error_message, &error_message,
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <list> #include <list>
#include <map> #include <map>
#include <string> #include <string>
#include <utility>
#include <vector> #include <vector>
#include "base/basictypes.h" #include "base/basictypes.h"
...@@ -44,7 +45,9 @@ class CONTENT_EXPORT IndexedDBDatabase ...@@ -44,7 +45,9 @@ class CONTENT_EXPORT IndexedDBDatabase
CURSOR_UPDATE CURSOR_UPDATE
}; };
typedef std::vector<IndexedDBKey> IndexKeys; // An index and corresponding set of keys
typedef std::pair<int64, std::vector<IndexedDBKey> > IndexKeys;
// Identifier is pair of (origin url, database name). // Identifier is pair of (origin url, database name).
typedef std::pair<GURL, base::string16> Identifier; typedef std::pair<GURL, base::string16> Identifier;
...@@ -130,12 +133,10 @@ class CONTENT_EXPORT IndexedDBDatabase ...@@ -130,12 +133,10 @@ class CONTENT_EXPORT IndexedDBDatabase
scoped_ptr<IndexedDBKey> key, scoped_ptr<IndexedDBKey> key,
PutMode mode, PutMode mode,
scoped_refptr<IndexedDBCallbacks> callbacks, scoped_refptr<IndexedDBCallbacks> callbacks,
const std::vector<int64>& index_ids,
const std::vector<IndexKeys>& index_keys); const std::vector<IndexKeys>& index_keys);
void SetIndexKeys(int64 transaction_id, void SetIndexKeys(int64 transaction_id,
int64 object_store_id, int64 object_store_id,
scoped_ptr<IndexedDBKey> primary_key, scoped_ptr<IndexedDBKey> primary_key,
const std::vector<int64>& index_ids,
const std::vector<IndexKeys>& index_keys); const std::vector<IndexKeys>& index_keys);
void SetIndexesReady(int64 transaction_id, void SetIndexesReady(int64 transaction_id,
int64 object_store_id, int64 object_store_id,
......
...@@ -531,16 +531,6 @@ void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnPut( ...@@ -531,16 +531,6 @@ void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnPut(
parent_, params.ipc_thread_id, params.ipc_callbacks_id)); parent_, params.ipc_thread_id, params.ipc_callbacks_id));
int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id); int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id);
if (params.index_ids.size() != params.index_keys.size()) {
connection->database()->Abort(
host_transaction_id,
IndexedDBDatabaseError(
blink::WebIDBDatabaseExceptionUnknownError,
"Malformed IPC message: index_ids.size() != index_keys.size()"));
parent_->BadMessageReceived();
return;
}
// TODO(alecflett): Avoid a copy here. // TODO(alecflett): Avoid a copy here.
std::string value_copy(params.value); std::string value_copy(params.value);
connection->database()->Put( connection->database()->Put(
...@@ -550,7 +540,6 @@ void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnPut( ...@@ -550,7 +540,6 @@ void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnPut(
make_scoped_ptr(new IndexedDBKey(params.key)), make_scoped_ptr(new IndexedDBKey(params.key)),
static_cast<IndexedDBDatabase::PutMode>(params.put_mode), static_cast<IndexedDBDatabase::PutMode>(params.put_mode),
callbacks, callbacks,
params.index_ids,
params.index_keys); params.index_keys);
TransactionIDToSizeMap* map = TransactionIDToSizeMap* map =
&parent_->database_dispatcher_host_->transaction_size_map_; &parent_->database_dispatcher_host_->transaction_size_map_;
...@@ -569,21 +558,10 @@ void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnSetIndexKeys( ...@@ -569,21 +558,10 @@ void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnSetIndexKeys(
return; return;
int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id); int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id);
if (params.index_ids.size() != params.index_keys.size()) {
connection->database()->Abort(
host_transaction_id,
IndexedDBDatabaseError(
blink::WebIDBDatabaseExceptionUnknownError,
"Malformed IPC message: index_ids.size() != index_keys.size()"));
parent_->BadMessageReceived();
return;
}
connection->database()->SetIndexKeys( connection->database()->SetIndexKeys(
host_transaction_id, host_transaction_id,
params.object_store_id, params.object_store_id,
make_scoped_ptr(new IndexedDBKey(params.primary_key)), make_scoped_ptr(new IndexedDBKey(params.primary_key)),
params.index_ids,
params.index_keys); params.index_keys);
} }
......
...@@ -38,13 +38,14 @@ bool IndexWriter::VerifyIndexKeys( ...@@ -38,13 +38,14 @@ bool IndexWriter::VerifyIndexKeys(
const IndexedDBKey& primary_key, const IndexedDBKey& primary_key,
base::string16* error_message) const { base::string16* error_message) const {
*can_add_keys = false; *can_add_keys = false;
for (size_t i = 0; i < index_keys_.size(); ++i) { DCHECK_EQ(index_id, index_keys_.first);
for (size_t i = 0; i < index_keys_.second.size(); ++i) {
bool ok = AddingKeyAllowed(backing_store, bool ok = AddingKeyAllowed(backing_store,
transaction, transaction,
database_id, database_id,
object_store_id, object_store_id,
index_id, index_id,
(index_keys_)[i], (index_keys_.second)[i],
primary_key, primary_key,
can_add_keys); can_add_keys);
if (!ok) if (!ok)
...@@ -70,12 +71,13 @@ void IndexWriter::WriteIndexKeys( ...@@ -70,12 +71,13 @@ void IndexWriter::WriteIndexKeys(
int64 database_id, int64 database_id,
int64 object_store_id) const { int64 object_store_id) const {
int64 index_id = index_metadata_.id; int64 index_id = index_metadata_.id;
for (size_t i = 0; i < index_keys_.size(); ++i) { DCHECK_EQ(index_id, index_keys_.first);
for (size_t i = 0; i < index_keys_.second.size(); ++i) {
bool ok = backing_store->PutIndexDataForRecord(transaction, bool ok = backing_store->PutIndexDataForRecord(transaction,
database_id, database_id,
object_store_id, object_store_id,
index_id, index_id,
index_keys_[i], index_keys_.second[i],
record_identifier); record_identifier);
// This should have already been verified as a valid write during // This should have already been verified as a valid write during
// verify_index_keys. // verify_index_keys.
...@@ -122,29 +124,27 @@ bool MakeIndexWriters( ...@@ -122,29 +124,27 @@ bool MakeIndexWriters(
const IndexedDBObjectStoreMetadata& object_store, const IndexedDBObjectStoreMetadata& object_store,
const IndexedDBKey& primary_key, // makes a copy const IndexedDBKey& primary_key, // makes a copy
bool key_was_generated, bool key_was_generated,
const std::vector<int64>& index_ids,
const std::vector<IndexedDBDatabase::IndexKeys>& index_keys, const std::vector<IndexedDBDatabase::IndexKeys>& index_keys,
ScopedVector<IndexWriter>* index_writers, ScopedVector<IndexWriter>* index_writers,
base::string16* error_message, base::string16* error_message,
bool* completed) { bool* completed) {
DCHECK_EQ(index_ids.size(), index_keys.size());
*completed = false; *completed = false;
std::map<int64, IndexedDBDatabase::IndexKeys> index_key_map; for (std::vector<IndexedDBDatabase::IndexKeys>::const_iterator it =
for (size_t i = 0; i < index_ids.size(); ++i) index_keys.begin();
index_key_map[index_ids[i]] = index_keys[i]; it != index_keys.end();
for (IndexedDBObjectStoreMetadata::IndexMap::const_iterator it =
object_store.indexes.begin();
it != object_store.indexes.end();
++it) { ++it) {
const IndexedDBIndexMetadata& index = it->second; IndexedDBObjectStoreMetadata::IndexMap::const_iterator found =
object_store.indexes.find(it->first);
if (found == object_store.indexes.end())
continue;
const IndexedDBIndexMetadata& index = found->second;
IndexedDBDatabase::IndexKeys keys = *it;
IndexedDBDatabase::IndexKeys keys = index_key_map[it->first];
// If the object_store is using auto_increment, then any indexes with an // If the object_store is using auto_increment, then any indexes with an
// identical key_path need to also use the primary (generated) key as a key. // identical key_path need to also use the primary (generated) key as a key.
if (key_was_generated && (index.key_path == object_store.key_path)) if (key_was_generated && (index.key_path == object_store.key_path))
keys.push_back(primary_key); keys.second.push_back(primary_key);
scoped_ptr<IndexWriter> index_writer(new IndexWriter(index, keys)); scoped_ptr<IndexWriter> index_writer(new IndexWriter(index, keys));
bool can_add_keys = false; bool can_add_keys = false;
......
...@@ -65,7 +65,6 @@ bool MakeIndexWriters( ...@@ -65,7 +65,6 @@ bool MakeIndexWriters(
const IndexedDBObjectStoreMetadata& metadata, const IndexedDBObjectStoreMetadata& metadata,
const IndexedDBKey& primary_key, const IndexedDBKey& primary_key,
bool key_was_generated, bool key_was_generated,
const std::vector<int64>& index_ids,
const std::vector<IndexedDBDatabase::IndexKeys>& index_keys, const std::vector<IndexedDBDatabase::IndexKeys>& index_keys,
ScopedVector<IndexWriter>* index_writers, ScopedVector<IndexWriter>* index_writers,
base::string16* error_message, base::string16* error_message,
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#include "content/child/indexed_db/indexed_db_dispatcher.h" #include "content/child/indexed_db/indexed_db_dispatcher.h"
#include <utility>
#include "base/format_macros.h" #include "base/format_macros.h"
#include "base/lazy_instance.h" #include "base/lazy_instance.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
...@@ -346,19 +348,17 @@ void IndexedDBDispatcher::RequestIDBDatabasePut( ...@@ -346,19 +348,17 @@ void IndexedDBDispatcher::RequestIDBDatabasePut(
params.key = key; params.key = key;
params.put_mode = put_mode; params.put_mode = put_mode;
COMPILE_ASSERT(sizeof(params.index_ids[0]) == sizeof(index_ids[0]), DCHECK_EQ(index_ids.size(), index_keys.size());
Cant_copy); params.index_keys.resize(index_ids.size());
params.index_ids for (size_t i = 0, len = index_ids.size(); i < len; ++i) {
.assign(index_ids.data(), index_ids.data() + index_ids.size()); params.index_keys[i].first = index_ids[i];
params.index_keys[i].second.resize(index_keys[i].size());
params.index_keys.resize(index_keys.size());
for (size_t i = 0; i < index_keys.size(); ++i) {
params.index_keys[i].resize(index_keys[i].size());
for (size_t j = 0; j < index_keys[i].size(); ++j) { for (size_t j = 0; j < index_keys[i].size(); ++j) {
params.index_keys[i][j] = params.index_keys[i].second[j] =
IndexedDBKey(IndexedDBKeyBuilder::Build(index_keys[i][j])); IndexedDBKey(IndexedDBKeyBuilder::Build(index_keys[i][j]));
} }
} }
Send(new IndexedDBHostMsg_DatabasePut(params)); Send(new IndexedDBHostMsg_DatabasePut(params));
} }
......
...@@ -137,18 +137,18 @@ void WebIDBDatabaseImpl::setIndexKeys( ...@@ -137,18 +137,18 @@ void WebIDBDatabaseImpl::setIndexKeys(
params.transaction_id = transaction_id; params.transaction_id = transaction_id;
params.object_store_id = object_store_id; params.object_store_id = object_store_id;
params.primary_key = IndexedDBKeyBuilder::Build(primary_key); params.primary_key = IndexedDBKeyBuilder::Build(primary_key);
COMPILE_ASSERT(sizeof(params.index_ids[0]) == sizeof(index_ids[0]),
Cant_copy);
params.index_ids.assign(index_ids.data(),
index_ids.data() + index_ids.size());
params.index_keys.resize(index_keys.size()); DCHECK_EQ(index_ids.size(), index_keys.size());
for (size_t i = 0; i < index_keys.size(); ++i) { params.index_keys.resize(index_ids.size());
params.index_keys[i].resize(index_keys[i].size()); for (size_t i = 0, len = index_ids.size(); i < len; ++i) {
params.index_keys[i].first = index_ids[i];
params.index_keys[i].second.resize(index_keys[i].size());
for (size_t j = 0; j < index_keys[i].size(); ++j) { for (size_t j = 0; j < index_keys[i].size(); ++j) {
params.index_keys[i][j] = IndexedDBKeyBuilder::Build(index_keys[i][j]); params.index_keys[i].second[j] =
IndexedDBKey(IndexedDBKeyBuilder::Build(index_keys[i][j]));
} }
} }
thread_safe_sender_->Send(new IndexedDBHostMsg_DatabaseSetIndexKeys(params)); thread_safe_sender_->Send(new IndexedDBHostMsg_DatabaseSetIndexKeys(params));
} }
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
// Message definition file, included multiple times, hence no include guard. // Message definition file, included multiple times, hence no include guard.
#include <utility>
#include <vector> #include <vector>
#include "content/common/indexed_db/indexed_db_key.h" #include "content/common/indexed_db/indexed_db_key.h"
...@@ -25,6 +26,9 @@ IPC_ENUM_TRAITS(blink::WebIDBDatabase::TaskType) ...@@ -25,6 +26,9 @@ IPC_ENUM_TRAITS(blink::WebIDBDatabase::TaskType)
IPC_ENUM_TRAITS_MAX_VALUE(blink::WebIDBDataLoss, blink::WebIDBDataLossTotal) IPC_ENUM_TRAITS_MAX_VALUE(blink::WebIDBDataLoss, blink::WebIDBDataLossTotal)
// An index id, and corresponding set of keys to insert.
typedef std::pair<int64, std::vector<content::IndexedDBKey> > IndexKeys;
// Used to enumerate indexed databases. // Used to enumerate indexed databases.
IPC_STRUCT_BEGIN(IndexedDBHostMsg_FactoryGetDatabaseNames_Params) IPC_STRUCT_BEGIN(IndexedDBHostMsg_FactoryGetDatabaseNames_Params)
// The response should have these ids. // The response should have these ids.
...@@ -130,12 +134,8 @@ IPC_STRUCT_BEGIN(IndexedDBHostMsg_DatabasePut_Params) ...@@ -130,12 +134,8 @@ IPC_STRUCT_BEGIN(IndexedDBHostMsg_DatabasePut_Params)
IPC_STRUCT_MEMBER(content::IndexedDBKey, key) IPC_STRUCT_MEMBER(content::IndexedDBKey, key)
// Whether this is an add or a put. // Whether this is an add or a put.
IPC_STRUCT_MEMBER(blink::WebIDBDatabase::PutMode, put_mode) IPC_STRUCT_MEMBER(blink::WebIDBDatabase::PutMode, put_mode)
// The names of the indexes used below. // The index ids and the list of keys for each index.
IPC_STRUCT_MEMBER(std::vector<int64>, index_ids) IPC_STRUCT_MEMBER(std::vector<IndexKeys>, index_keys)
// The keys for each index, such that each inner vector corresponds
// to each index named in index_names, respectively.
IPC_STRUCT_MEMBER(std::vector<std::vector<content::IndexedDBKey> >,
index_keys)
IPC_STRUCT_END() IPC_STRUCT_END()
// Used to open both cursors and object cursors in IndexedDB. // Used to open both cursors and object cursors in IndexedDB.
...@@ -201,11 +201,8 @@ IPC_STRUCT_BEGIN(IndexedDBHostMsg_DatabaseSetIndexKeys_Params) ...@@ -201,11 +201,8 @@ IPC_STRUCT_BEGIN(IndexedDBHostMsg_DatabaseSetIndexKeys_Params)
IPC_STRUCT_MEMBER(int64, object_store_id) IPC_STRUCT_MEMBER(int64, object_store_id)
// The object store key that we're setting index keys for. // The object store key that we're setting index keys for.
IPC_STRUCT_MEMBER(content::IndexedDBKey, primary_key) IPC_STRUCT_MEMBER(content::IndexedDBKey, primary_key)
// The indexes that we're setting keys on. // The index ids and the list of keys for each index.
IPC_STRUCT_MEMBER(std::vector<int64>, index_ids) IPC_STRUCT_MEMBER(std::vector<IndexKeys>, index_keys)
// A list of index keys for each index.
IPC_STRUCT_MEMBER(std::vector<std::vector<content::IndexedDBKey> >,
index_keys)
IPC_STRUCT_END() IPC_STRUCT_END()
// Used to create an index. // Used to create an index.
...@@ -504,4 +501,3 @@ IPC_MESSAGE_CONTROL2(IndexedDBHostMsg_DatabaseCommit, ...@@ -504,4 +501,3 @@ IPC_MESSAGE_CONTROL2(IndexedDBHostMsg_DatabaseCommit,
// WebIDBDatabase::~WebIDBCursor() message. // WebIDBDatabase::~WebIDBCursor() message.
IPC_MESSAGE_CONTROL1(IndexedDBHostMsg_CursorDestroyed, IPC_MESSAGE_CONTROL1(IndexedDBHostMsg_CursorDestroyed,
int32 /* ipc_cursor_id */) int32 /* ipc_cursor_id */)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment