Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(447)

Unified Diff: content/browser/indexed_db/indexed_db_leveldb_coding.cc

Issue 18075008: IndexedDB: Switch key/value handling from vector<char> to std::string (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/indexed_db/indexed_db_leveldb_coding.cc
diff --git a/content/browser/indexed_db/indexed_db_leveldb_coding.cc b/content/browser/indexed_db/indexed_db_leveldb_coding.cc
index cbd3caf47e7db48007dc1b768ccd8dfb5b10c6c0..14dbda3096491e599cd3a1a967f4802dc4074efa 100644
--- a/content/browser/indexed_db/indexed_db_leveldb_coding.cc
+++ b/content/browser/indexed_db/indexed_db_leveldb_coding.cc
@@ -6,20 +6,17 @@
#include <iterator>
#include <limits>
-#include <string>
#include "base/logging.h"
#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
#include "base/strings/utf_string_conversions.h"
#include "base/sys_byteorder.h"
-#include "content/browser/indexed_db/leveldb/leveldb_slice.h"
#include "content/common/indexed_db/indexed_db_key.h"
#include "content/common/indexed_db/indexed_db_key_path.h"
#include "third_party/WebKit/public/platform/WebIDBKeyPath.h"
// LevelDB stores key/value pairs. Keys and values are strings of bytes,
-// normally of type std::vector<char>.
+// normally of type std::string.
//
// The keys in the backing store are variable-length tuples with different types
// of fields. Each key in the backing store starts with a ternary prefix:
@@ -196,32 +193,32 @@ static const unsigned char kIndexMetaDataTypeMaximum = 255;
const unsigned char kMinimumIndexId = 30;
-inline void EncodeIntSafely(int64 nParam, int64 max, std::vector<char>* into) {
+inline void EncodeIntSafely(int64 nParam, int64 max, std::string* into) {
DCHECK_LE(nParam, max);
return EncodeInt(nParam, into);
}
-std::vector<char> MaxIDBKey() {
- std::vector<char> ret;
+std::string MaxIDBKey() {
+ std::string ret;
EncodeByte(kIndexedDBKeyNullTypeByte, &ret);
return ret;
}
-std::vector<char> MinIDBKey() {
- std::vector<char> ret;
+std::string MinIDBKey() {
+ std::string ret;
EncodeByte(kIndexedDBKeyMinKeyTypeByte, &ret);
return ret;
}
-void EncodeByte(unsigned char value, std::vector<char>* into) {
+void EncodeByte(unsigned char value, std::string* into) {
into->push_back(value);
}
-void EncodeBool(bool value, std::vector<char>* into) {
+void EncodeBool(bool value, std::string* into) {
into->push_back(value ? 1 : 0);
}
-void EncodeInt(int64 value, std::vector<char>* into) {
+void EncodeInt(int64 value, std::string* into) {
#ifndef NDEBUG
// Exercised by unit tests in debug only.
DCHECK_GE(value, 0);
@@ -235,7 +232,7 @@ void EncodeInt(int64 value, std::vector<char>* into) {
} while (n);
}
-void EncodeVarInt(int64 value, std::vector<char>* into) {
+void EncodeVarInt(int64 value, std::string* into) {
#ifndef NDEBUG
// Exercised by unit tests in debug only.
DCHECK_GE(value, 0);
@@ -251,7 +248,7 @@ void EncodeVarInt(int64 value, std::vector<char>* into) {
} while (n);
}
-void EncodeString(const string16& value, std::vector<char>* into) {
+void EncodeString(const string16& value, std::string* into) {
if (value.empty())
return;
// Backing store is UTF-16BE, convert from host endianness.
@@ -265,18 +262,18 @@ void EncodeString(const string16& value, std::vector<char>* into) {
*dst++ = htons(*src++);
}
-void EncodeStringWithLength(const string16& value, std::vector<char>* into) {
+void EncodeStringWithLength(const string16& value, std::string* into) {
EncodeVarInt(value.length(), into);
EncodeString(value, into);
}
-void EncodeDouble(double value, std::vector<char>* into) {
+void EncodeDouble(double value, std::string* into) {
// This always has host endianness.
const char* p = reinterpret_cast<char*>(&value);
into->insert(into->end(), p, p + sizeof(value));
}
-void EncodeIDBKey(const IndexedDBKey& value, std::vector<char>* into) {
+void EncodeIDBKey(const IndexedDBKey& value, std::string* into) {
size_t previous_size = into->size();
DCHECK(value.IsValid());
switch (value.type()) {
@@ -321,7 +318,7 @@ void EncodeIDBKey(const IndexedDBKey& value, std::vector<char>* into) {
NOTREACHED();
}
-void EncodeIDBKeyPath(const IndexedDBKeyPath& value, std::vector<char>* into) {
+void EncodeIDBKeyPath(const IndexedDBKeyPath& value, std::string* into) {
// May be typed, or may be a raw string. An invalid leading
// byte is used to identify typed coding. New records are
// always written as typed.
@@ -593,7 +590,7 @@ bool ExtractEncodedIDBKey(StringPiece* slice) {
return false;
}
-bool ExtractEncodedIDBKey(StringPiece* slice, std::vector<char>* result) {
+bool ExtractEncodedIDBKey(StringPiece* slice, std::string* result) {
const char* start = slice->begin();
if (!ExtractEncodedIDBKey(slice))
return 0;
@@ -724,8 +721,8 @@ int CompareEncodedIDBKeys(StringPiece* slice_a,
return 0;
}
-int CompareEncodedIDBKeys(const std::vector<char>& key_a,
- const std::vector<char>& key_b,
+int CompareEncodedIDBKeys(const std::string& key_a,
+ const std::string& key_b,
bool* ok) {
DCHECK(!key_a.empty());
DCHECK(!key_b.empty());
@@ -738,7 +735,7 @@ int CompareEncodedIDBKeys(const std::vector<char>& key_a,
namespace {
template <typename KeyType>
-int Compare(const LevelDBSlice& a, const LevelDBSlice& b, bool, bool* ok) {
+int Compare(const StringPiece& a, const StringPiece& b, bool, bool* ok) {
KeyType key_a;
KeyType key_b;
@@ -760,8 +757,8 @@ int Compare(const LevelDBSlice& a, const LevelDBSlice& b, bool, bool* ok) {
}
template <>
-int Compare<ExistsEntryKey>(const LevelDBSlice& a,
- const LevelDBSlice& b,
+int Compare<ExistsEntryKey>(const StringPiece& a,
+ const StringPiece& b,
bool,
bool* ok) {
KeyPrefix prefix_a;
@@ -787,8 +784,8 @@ int Compare<ExistsEntryKey>(const LevelDBSlice& a,
}
template <>
-int Compare<ObjectStoreDataKey>(const LevelDBSlice& a,
- const LevelDBSlice& b,
+int Compare<ObjectStoreDataKey>(const StringPiece& a,
+ const StringPiece& b,
bool,
bool* ok) {
KeyPrefix prefix_a;
@@ -814,8 +811,8 @@ int Compare<ObjectStoreDataKey>(const LevelDBSlice& a,
}
template <>
-int Compare<IndexDataKey>(const LevelDBSlice& a,
- const LevelDBSlice& b,
+int Compare<IndexDataKey>(const StringPiece& a,
+ const StringPiece& b,
bool ignore_duplicates,
bool* ok) {
KeyPrefix prefix_a;
@@ -872,8 +869,8 @@ int Compare<IndexDataKey>(const LevelDBSlice& a,
return CompareInts(sequence_number_a, sequence_number_b);
}
-int Compare(const LevelDBSlice& a,
- const LevelDBSlice& b,
+int Compare(const StringPiece& a,
+ const StringPiece& b,
bool index_keys,
bool* ok) {
const char* ptr_a = a.begin();
@@ -999,7 +996,7 @@ int Compare(const LevelDBSlice& a,
} // namespace
-int Compare(const LevelDBSlice& a, const LevelDBSlice& b, bool index_keys) {
+int Compare(const StringPiece& a, const StringPiece& b, bool index_keys) {
bool ok;
int result = Compare(a, b, index_keys, &ok);
DCHECK(ok);
@@ -1107,25 +1104,25 @@ const char* KeyPrefix::Decode(const char* start,
return start;
}
-std::vector<char> KeyPrefix::EncodeEmpty() {
- const std::vector<char> result(4, 0);
- DCHECK(EncodeInternal(0, 0, 0) == std::vector<char>(4, 0));
+std::string KeyPrefix::EncodeEmpty() {
+ const std::string result(4, 0);
+ DCHECK(EncodeInternal(0, 0, 0) == std::string(4, 0));
return result;
}
-std::vector<char> KeyPrefix::Encode() const {
+std::string KeyPrefix::Encode() const {
DCHECK(database_id_ != kInvalidId);
DCHECK(object_store_id_ != kInvalidId);
DCHECK(index_id_ != kInvalidId);
return EncodeInternal(database_id_, object_store_id_, index_id_);
}
-std::vector<char> KeyPrefix::EncodeInternal(int64 database_id,
- int64 object_store_id,
- int64 index_id) {
- std::vector<char> database_id_string;
- std::vector<char> object_store_id_string;
- std::vector<char> index_id_string;
+std::string KeyPrefix::EncodeInternal(int64 database_id,
+ int64 object_store_id,
+ int64 index_id) {
+ std::string database_id_string;
+ std::string object_store_id_string;
+ std::string index_id_string;
EncodeIntSafely(database_id, kMaxDatabaseId, &database_id_string);
EncodeIntSafely(object_store_id, kMaxObjectStoreId, &object_store_id_string);
@@ -1144,7 +1141,7 @@ std::vector<char> KeyPrefix::EncodeInternal(int64 database_id,
kMaxIndexIdSizeBits ==
sizeof(first_byte) * 8,
CANT_ENCODE_IDS);
- std::vector<char> ret;
+ std::string ret;
ret.reserve(kDefaultInlineBufferSize);
ret.push_back(first_byte);
ret.insert(ret.end(), database_id_string.begin(), database_id_string.end());
alecflett 2013/07/09 18:26:30 these inserts can become appends now, no?
jsbell 2013/07/09 19:41:46 Done.
@@ -1190,20 +1187,20 @@ KeyPrefix::Type KeyPrefix::type() const {
return INVALID_TYPE;
}
-std::vector<char> SchemaVersionKey::Encode() {
- std::vector<char> ret = KeyPrefix::EncodeEmpty();
+std::string SchemaVersionKey::Encode() {
+ std::string ret = KeyPrefix::EncodeEmpty();
ret.push_back(kSchemaVersionTypeByte);
return ret;
}
-std::vector<char> MaxDatabaseIdKey::Encode() {
- std::vector<char> ret = KeyPrefix::EncodeEmpty();
+std::string MaxDatabaseIdKey::Encode() {
+ std::string ret = KeyPrefix::EncodeEmpty();
ret.push_back(kMaxDatabaseIdTypeByte);
return ret;
}
-std::vector<char> DataVersionKey::Encode() {
- std::vector<char> ret = KeyPrefix::EncodeEmpty();
+std::string DataVersionKey::Encode() {
+ std::string ret = KeyPrefix::EncodeEmpty();
ret.push_back(kDataVersionTypeByte);
return ret;
}
@@ -1234,14 +1231,14 @@ const char* DatabaseFreeListKey::Decode(const char* start,
return slice.begin();
}
-std::vector<char> DatabaseFreeListKey::Encode(int64 database_id) {
- std::vector<char> ret = KeyPrefix::EncodeEmpty();
+std::string DatabaseFreeListKey::Encode(int64 database_id) {
+ std::string ret = KeyPrefix::EncodeEmpty();
ret.push_back(kDatabaseFreeListTypeByte);
EncodeVarInt(database_id, &ret);
return ret;
}
-std::vector<char> DatabaseFreeListKey::EncodeMaxKey() {
+std::string DatabaseFreeListKey::EncodeMaxKey() {
return Encode(std::numeric_limits<int64>::max());
}
@@ -1279,21 +1276,21 @@ const char* DatabaseNameKey::Decode(const char* start,
return slice.begin();
}
-std::vector<char> DatabaseNameKey::Encode(const std::string& origin_identifier,
- const string16& database_name) {
- std::vector<char> ret = KeyPrefix::EncodeEmpty();
+std::string DatabaseNameKey::Encode(const std::string& origin_identifier,
+ const string16& database_name) {
+ std::string ret = KeyPrefix::EncodeEmpty();
ret.push_back(kDatabaseNameTypeByte);
EncodeStringWithLength(base::ASCIIToUTF16(origin_identifier), &ret);
EncodeStringWithLength(database_name, &ret);
return ret;
}
-std::vector<char> DatabaseNameKey::EncodeMinKeyForOrigin(
+std::string DatabaseNameKey::EncodeMinKeyForOrigin(
const std::string& origin_identifier) {
return Encode(origin_identifier, string16());
}
-std::vector<char> DatabaseNameKey::EncodeStopKeyForOrigin(
+std::string DatabaseNameKey::EncodeStopKeyForOrigin(
const std::string& origin_identifier) {
// just after origin in collation order
return EncodeMinKeyForOrigin(origin_identifier + '\x01');
@@ -1305,10 +1302,10 @@ int DatabaseNameKey::Compare(const DatabaseNameKey& other) {
return database_name_.compare(other.database_name_);
}
-std::vector<char> DatabaseMetaDataKey::Encode(int64 database_id,
- MetaDataType meta_data_type) {
+std::string DatabaseMetaDataKey::Encode(int64 database_id,
+ MetaDataType meta_data_type) {
KeyPrefix prefix(database_id);
- std::vector<char> ret = prefix.Encode();
+ std::string ret = prefix.Encode();
ret.push_back(meta_data_type);
return ret;
}
@@ -1341,25 +1338,25 @@ const char* ObjectStoreMetaDataKey::Decode(const char* start,
return slice.begin();
}
-std::vector<char> ObjectStoreMetaDataKey::Encode(int64 database_id,
- int64 object_store_id,
- unsigned char meta_data_type) {
+std::string ObjectStoreMetaDataKey::Encode(int64 database_id,
+ int64 object_store_id,
+ unsigned char meta_data_type) {
KeyPrefix prefix(database_id);
- std::vector<char> ret = prefix.Encode();
+ std::string ret = prefix.Encode();
ret.push_back(kObjectStoreMetaDataTypeByte);
EncodeVarInt(object_store_id, &ret);
ret.push_back(meta_data_type);
return ret;
}
-std::vector<char> ObjectStoreMetaDataKey::EncodeMaxKey(int64 database_id) {
+std::string ObjectStoreMetaDataKey::EncodeMaxKey(int64 database_id) {
return Encode(database_id,
std::numeric_limits<int64>::max(),
kObjectMetaDataTypeMaximum);
}
-std::vector<char> ObjectStoreMetaDataKey::EncodeMaxKey(int64 database_id,
- int64 object_store_id) {
+std::string ObjectStoreMetaDataKey::EncodeMaxKey(int64 database_id,
+ int64 object_store_id) {
return Encode(database_id, object_store_id, kObjectMetaDataTypeMaximum);
}
@@ -1410,12 +1407,12 @@ const char* IndexMetaDataKey::Decode(const char* start,
return slice.begin();
}
-std::vector<char> IndexMetaDataKey::Encode(int64 database_id,
- int64 object_store_id,
- int64 index_id,
- unsigned char meta_data_type) {
+std::string IndexMetaDataKey::Encode(int64 database_id,
+ int64 object_store_id,
+ int64 index_id,
+ unsigned char meta_data_type) {
KeyPrefix prefix(database_id);
- std::vector<char> ret = prefix.Encode();
+ std::string ret = prefix.Encode();
ret.push_back(kIndexMetaDataTypeByte);
EncodeVarInt(object_store_id, &ret);
EncodeVarInt(index_id, &ret);
@@ -1423,17 +1420,17 @@ std::vector<char> IndexMetaDataKey::Encode(int64 database_id,
return ret;
}
-std::vector<char> IndexMetaDataKey::EncodeMaxKey(int64 database_id,
- int64 object_store_id) {
+std::string IndexMetaDataKey::EncodeMaxKey(int64 database_id,
+ int64 object_store_id) {
return Encode(database_id,
object_store_id,
std::numeric_limits<int64>::max(),
kIndexMetaDataTypeMaximum);
}
-std::vector<char> IndexMetaDataKey::EncodeMaxKey(int64 database_id,
- int64 object_store_id,
- int64 index_id) {
+std::string IndexMetaDataKey::EncodeMaxKey(int64 database_id,
+ int64 object_store_id,
+ int64 index_id) {
return Encode(
database_id, object_store_id, index_id, kIndexMetaDataTypeMaximum);
}
@@ -1478,16 +1475,16 @@ const char* ObjectStoreFreeListKey::Decode(const char* start,
return slice.begin();
}
-std::vector<char> ObjectStoreFreeListKey::Encode(int64 database_id,
- int64 object_store_id) {
+std::string ObjectStoreFreeListKey::Encode(int64 database_id,
+ int64 object_store_id) {
KeyPrefix prefix(database_id);
- std::vector<char> ret = prefix.Encode();
+ std::string ret = prefix.Encode();
ret.push_back(kObjectStoreFreeListTypeByte);
EncodeVarInt(object_store_id, &ret);
return ret;
}
-std::vector<char> ObjectStoreFreeListKey::EncodeMaxKey(int64 database_id) {
+std::string ObjectStoreFreeListKey::EncodeMaxKey(int64 database_id) {
return Encode(database_id, std::numeric_limits<int64>::max());
}
@@ -1530,19 +1527,19 @@ const char* IndexFreeListKey::Decode(const char* start,
return slice.begin();
}
-std::vector<char> IndexFreeListKey::Encode(int64 database_id,
- int64 object_store_id,
- int64 index_id) {
+std::string IndexFreeListKey::Encode(int64 database_id,
+ int64 object_store_id,
+ int64 index_id) {
KeyPrefix prefix(database_id);
- std::vector<char> ret = prefix.Encode();
+ std::string ret = prefix.Encode();
ret.push_back(kIndexFreeListTypeByte);
EncodeVarInt(object_store_id, &ret);
EncodeVarInt(index_id, &ret);
return ret;
}
-std::vector<char> IndexFreeListKey::EncodeMaxKey(int64 database_id,
- int64 object_store_id) {
+std::string IndexFreeListKey::EncodeMaxKey(int64 database_id,
+ int64 object_store_id) {
return Encode(
database_id, object_store_id, std::numeric_limits<int64>::max());
}
@@ -1590,11 +1587,10 @@ const char* ObjectStoreNamesKey::Decode(const char* start,
return slice.begin();
}
-std::vector<char> ObjectStoreNamesKey::Encode(
- int64 database_id,
- const string16& object_store_name) {
+std::string ObjectStoreNamesKey::Encode(int64 database_id,
+ const string16& object_store_name) {
KeyPrefix prefix(database_id);
- std::vector<char> ret = prefix.Encode();
+ std::string ret = prefix.Encode();
ret.push_back(kObjectStoreNamesTypeByte);
EncodeStringWithLength(object_store_name, &ret);
return ret;
@@ -1632,11 +1628,11 @@ const char* IndexNamesKey::Decode(const char* start,
return slice.begin();
}
-std::vector<char> IndexNamesKey::Encode(int64 database_id,
- int64 object_store_id,
- const string16& index_name) {
+std::string IndexNamesKey::Encode(int64 database_id,
+ int64 object_store_id,
+ const string16& index_name) {
KeyPrefix prefix(database_id);
- std::vector<char> ret = prefix.Encode();
+ std::string ret = prefix.Encode();
ret.push_back(kIndexNamesKeyTypeByte);
EncodeVarInt(object_store_id, &ret);
EncodeStringWithLength(index_name, &ret);
@@ -1671,22 +1667,21 @@ const char* ObjectStoreDataKey::Decode(const char* start,
return slice.begin();
}
-std::vector<char> ObjectStoreDataKey::Encode(
- int64 database_id,
- int64 object_store_id,
- const std::vector<char> encoded_user_key) {
+std::string ObjectStoreDataKey::Encode(int64 database_id,
+ int64 object_store_id,
+ const std::string encoded_user_key) {
KeyPrefix prefix(KeyPrefix::CreateWithSpecialIndex(
database_id, object_store_id, kSpecialIndexNumber));
- std::vector<char> ret = prefix.Encode();
+ std::string ret = prefix.Encode();
ret.insert(ret.end(), encoded_user_key.begin(), encoded_user_key.end());
return ret;
}
-std::vector<char> ObjectStoreDataKey::Encode(int64 database_id,
- int64 object_store_id,
- const IndexedDBKey& user_key) {
- std::vector<char> encoded_key;
+std::string ObjectStoreDataKey::Encode(int64 database_id,
+ int64 object_store_id,
+ const IndexedDBKey& user_key) {
+ std::string encoded_key;
EncodeIDBKey(user_key, &encoded_key);
return Encode(database_id, object_store_id, encoded_key);
}
@@ -1727,20 +1722,20 @@ const char* ExistsEntryKey::Decode(const char* start,
return slice.begin();
}
-std::vector<char> ExistsEntryKey::Encode(int64 database_id,
- int64 object_store_id,
- const std::vector<char>& encoded_key) {
+std::string ExistsEntryKey::Encode(int64 database_id,
+ int64 object_store_id,
+ const std::string& encoded_key) {
KeyPrefix prefix(KeyPrefix::CreateWithSpecialIndex(
database_id, object_store_id, kSpecialIndexNumber));
- std::vector<char> ret = prefix.Encode();
+ std::string ret = prefix.Encode();
ret.insert(ret.end(), encoded_key.begin(), encoded_key.end());
return ret;
}
-std::vector<char> ExistsEntryKey::Encode(int64 database_id,
- int64 object_store_id,
- const IndexedDBKey& user_key) {
- std::vector<char> encoded_key;
+std::string ExistsEntryKey::Encode(int64 database_id,
+ int64 object_store_id,
+ const IndexedDBKey& user_key) {
+ std::string encoded_key;
EncodeIDBKey(user_key, &encoded_key);
return Encode(database_id, object_store_id, encoded_key);
}
@@ -1803,41 +1798,40 @@ const char* IndexDataKey::Decode(const char* start,
return slice.begin();
}
-std::vector<char> IndexDataKey::Encode(
- int64 database_id,
- int64 object_store_id,
- int64 index_id,
- const std::vector<char>& encoded_user_key,
- const std::vector<char>& encoded_primary_key,
- int64 sequence_number) {
+std::string IndexDataKey::Encode(int64 database_id,
+ int64 object_store_id,
+ int64 index_id,
+ const std::string& encoded_user_key,
+ const std::string& encoded_primary_key,
+ int64 sequence_number) {
KeyPrefix prefix(database_id, object_store_id, index_id);
- std::vector<char> ret = prefix.Encode();
+ std::string ret = prefix.Encode();
ret.insert(ret.end(), encoded_user_key.begin(), encoded_user_key.end());
EncodeVarInt(sequence_number, &ret);
ret.insert(ret.end(), encoded_primary_key.begin(), encoded_primary_key.end());
return ret;
}
-std::vector<char> IndexDataKey::Encode(int64 database_id,
- int64 object_store_id,
- int64 index_id,
- const IndexedDBKey& user_key) {
- std::vector<char> encoded_key;
+std::string IndexDataKey::Encode(int64 database_id,
+ int64 object_store_id,
+ int64 index_id,
+ const IndexedDBKey& user_key) {
+ std::string encoded_key;
EncodeIDBKey(user_key, &encoded_key);
return Encode(
database_id, object_store_id, index_id, encoded_key, MinIDBKey(), 0);
}
-std::vector<char> IndexDataKey::EncodeMinKey(int64 database_id,
- int64 object_store_id,
- int64 index_id) {
+std::string IndexDataKey::EncodeMinKey(int64 database_id,
+ int64 object_store_id,
+ int64 index_id) {
return Encode(
database_id, object_store_id, index_id, MinIDBKey(), MinIDBKey(), 0);
}
-std::vector<char> IndexDataKey::EncodeMaxKey(int64 database_id,
- int64 object_store_id,
- int64 index_id) {
+std::string IndexDataKey::EncodeMaxKey(int64 database_id,
+ int64 object_store_id,
+ int64 index_id) {
return Encode(database_id,
object_store_id,
index_id,

Powered by Google App Engine
This is Rietveld 408576698