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

Side by Side Diff: content/browser/indexed_db/indexed_db_leveldb_coding.h

Issue 15564008: Migrate the IndexedDB backend from Blink to Chromium (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Accessor naming, use LevelDBSlice ctor explicitly Created 7 years, 7 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_LEVELDB_CODING_H_
6 #define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_LEVELDB_CODING_H_
7
8 #include <vector>
9
10 #include "base/logging.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/string16.h"
14 #include "content/common/indexed_db/indexed_db_key.h"
15 #include "content/common/indexed_db/indexed_db_key_path.h"
16
17 namespace content {
18
19 class LevelDBSlice;
20
21 namespace IndexedDBLevelDBCoding {
22
23 const unsigned char MinimumIndexId = 30;
jamesr 2013/05/21 23:56:06 kBlahBlah should probably just declare the variab
jsbell 2013/05/22 17:54:44 Done.
24
25 // As most of the IndexedDBKeys and encoded values are short, we initialize some
26 // Vectors with a default inline buffer size
27 // to reduce the memory re-allocations when the Vectors are appended.
28 static const size_t DefaultInlineBufferSize = 32;
jamesr 2013/05/21 23:56:06 ditto
jsbell 2013/05/22 17:54:44 Done.
29
30 CONTENT_EXPORT std::vector<char> EncodeByte(unsigned char);
31 CONTENT_EXPORT const char* DecodeByte(const char* p,
32 const char* limit,
33 unsigned char& found_char);
34 CONTENT_EXPORT std::vector<char> MaxIDBKey();
35 CONTENT_EXPORT std::vector<char> MinIDBKey();
36 CONTENT_EXPORT std::vector<char> EncodeBool(bool);
37 CONTENT_EXPORT bool DecodeBool(const char* begin, const char* end);
38 CONTENT_EXPORT std::vector<char> EncodeInt(int64_t);
39 inline std::vector<char> EncodeIntSafely(int64_t nParam, int64_t max) {
40 DCHECK(nParam <= max);
41 return EncodeInt(nParam);
42 }
43
44 template <class T> int64_t DecodeInt(T begin, T end) {
45 DCHECK(begin <= end);
46 int64_t ret = 0;
47
48 int shift = 0;
49 while (begin < end) {
50 unsigned char c = *begin++;
51 ret |= static_cast<int64_t>(c) << shift;
52 shift += 8;
53 }
54
55 return ret;
56 }
57
58 CONTENT_EXPORT std::vector<char> EncodeVarInt(int64_t);
59
60 CONTENT_EXPORT const char* DecodeVarInt(const char* p,
61 const char* limit,
62 int64_t& found_int);
63 CONTENT_EXPORT std::vector<char>::iterator DecodeVarInt(
64 std::vector<char>::iterator start,
65 std::vector<char>::iterator limit,
66 int64_t& found_int);
67
68 CONTENT_EXPORT std::vector<char> EncodeString(const string16&);
69 CONTENT_EXPORT string16 DecodeString(const char* p, const char* end);
70 CONTENT_EXPORT std::vector<char> EncodeStringWithLength(const string16&);
71 CONTENT_EXPORT const char* DecodeStringWithLength(const char* p,
72 const char* limit,
73 string16& found_string);
74 CONTENT_EXPORT int CompareEncodedStringsWithLength(const char*& p,
75 const char* limit_p,
76 const char*& q,
77 const char* limit_q,
78 bool& ok);
79 CONTENT_EXPORT std::vector<char> EncodeDouble(double);
80 CONTENT_EXPORT const char* DecodeDouble(const char* p,
81 const char* limit,
82 double*);
83 void EncodeIDBKey(const IndexedDBKey&, std::vector<char>& into);
84 CONTENT_EXPORT std::vector<char> EncodeIDBKey(const IndexedDBKey&);
85 CONTENT_EXPORT const char* DecodeIDBKey(const char* p,
86 const char* limit,
87 scoped_ptr<IndexedDBKey>* found_key);
88 CONTENT_EXPORT const char* ExtractEncodedIDBKey(const char* start,
89 const char* limit,
90 std::vector<char>* result);
91 CONTENT_EXPORT int CompareEncodedIDBKeys(const std::vector<char>&,
92 const std::vector<char>&,
93 bool& ok);
94 CONTENT_EXPORT std::vector<char> EncodeIDBKeyPath(const IndexedDBKeyPath&);
95 CONTENT_EXPORT IndexedDBKeyPath DecodeIDBKeyPath(const char*, const char*);
96
97 CONTENT_EXPORT int Compare(const LevelDBSlice&,
98 const LevelDBSlice&,
99 bool index_keys = false);
100
101 class KeyPrefix {
102 public:
103 KeyPrefix();
104 explicit KeyPrefix(int64_t database_id);
105 KeyPrefix(int64_t database_id, int64_t object_store_id);
106 KeyPrefix(int64_t database_id, int64_t object_store_id, int64_t index_id);
107 static KeyPrefix CreateWithSpecialIndex(int64_t database_id,
108 int64_t object_store_id,
109 int64_t index_id);
110
111 static const char* Decode(const char* start,
112 const char* limit,
113 KeyPrefix* result);
114 std::vector<char> Encode() const;
115 static std::vector<char> EncodeEmpty();
116 int Compare(const KeyPrefix& other) const;
117
118 enum Type {
119 GlobalMetaData,
jamesr 2013/05/21 23:56:06 SHOUT
jsbell 2013/05/22 17:54:44 Done.
120 DatabaseMetaData,
121 ObjectStoreData,
122 ExistsEntry,
123 IndexData,
124 InvalidType
125 };
126
127 static const size_t kMaxDatabaseIdSizeBits = 3;
128 static const size_t kMaxObjectStoreIdSizeBits = 3;
129 static const size_t kMaxIndexIdSizeBits = 2;
130
131 static const size_t kMaxDatabaseIdSizeBytes =
132 1ULL << kMaxDatabaseIdSizeBits; // 8
133 static const size_t kMaxObjectStoreIdSizeBytes =
134 1ULL << kMaxObjectStoreIdSizeBits; // 8
135 static const size_t kMaxIndexIdSizeBytes = 1ULL << kMaxIndexIdSizeBits; // 4
136
137 static const size_t kMaxDatabaseIdBits =
138 kMaxDatabaseIdSizeBytes * 8 - 1; // 63
139 static const size_t kMaxObjectStoreIdBits =
140 kMaxObjectStoreIdSizeBytes * 8 - 1; // 63
141 static const size_t kMaxIndexIdBits = kMaxIndexIdSizeBytes * 8 - 1; // 31
142
143 static const int64_t kMaxDatabaseId =
144 (1ULL << kMaxDatabaseIdBits) - 1; // max signed int64_t
145 static const int64_t kMaxObjectStoreId =
146 (1ULL << kMaxObjectStoreIdBits) - 1; // max signed int64_t
147 static const int64_t kMaxIndexId =
148 (1ULL << kMaxIndexIdBits) - 1; // max signed int32_t
149
150 static bool IsValidDatabaseId(int64_t database_id);
151 static bool IsValidObjectStoreId(int64_t index_id);
152 static bool IsValidIndexId(int64_t index_id);
153 static bool ValidIds(int64_t database_id,
154 int64_t object_store_id,
155 int64_t index_id) {
156 return IsValidDatabaseId(database_id) &&
157 IsValidObjectStoreId(object_store_id) && IsValidIndexId(index_id);
158 }
159 static bool ValidIds(int64_t database_id, int64_t object_store_id) {
160 return IsValidDatabaseId(database_id) &&
161 IsValidObjectStoreId(object_store_id);
162 }
163
164 Type type() const;
165
166 int64_t database_id_;
167 int64_t object_store_id_;
168 int64_t index_id_;
169
170 static const int64_t InvalidId = -1;
171
172 private:
173 static std::vector<char> EncodeInternal(int64_t database_id,
174 int64_t object_store_id,
175 int64_t index_id);
176 // Special constructor for CreateWithSpecialIndex()
177 KeyPrefix(enum Type,
178 int64_t database_id,
179 int64_t object_store_id,
180 int64_t index_id);
181 };
182
183 class SchemaVersionKey {
184 public:
185 CONTENT_EXPORT static std::vector<char> Encode();
186 };
187
188 class MaxDatabaseIdKey {
189 public:
190 CONTENT_EXPORT static std::vector<char> Encode();
191 };
192
193 class DataVersionKey {
194 public:
195 static std::vector<char> Encode();
196 };
197
198 class DatabaseFreeListKey {
199 public:
200 DatabaseFreeListKey();
201 static const char* Decode(const char* start,
202 const char* limit,
203 DatabaseFreeListKey* result);
204 CONTENT_EXPORT static std::vector<char> Encode(int64_t database_id);
205 static CONTENT_EXPORT std::vector<char> EncodeMaxKey();
206 int64_t DatabaseId() const;
207 int Compare(const DatabaseFreeListKey& other) const;
208
209 private:
210 int64_t database_id_;
211 };
212
213 class DatabaseNameKey {
214 public:
215 static const char* Decode(const char* start,
216 const char* limit,
217 DatabaseNameKey* result);
218 CONTENT_EXPORT static std::vector<char> Encode(const string16& origin,
219 const string16& database_name);
220 static std::vector<char> EncodeMinKeyForOrigin(const string16& origin);
221 static std::vector<char> EncodeStopKeyForOrigin(const string16& origin);
222 string16 origin() const { return origin_; }
223 string16 database_name() const { return database_name_; }
224 int Compare(const DatabaseNameKey& other);
225
226 private:
227 string16 origin_; // TODO: Store encoded strings, or just pointers.
228 string16 database_name_;
229 };
230
231 class DatabaseMetaDataKey {
232 public:
233 enum MetaDataType {
234 OriginName = 0,
235 DatabaseName = 1,
236 UserVersion = 2,
237 MaxObjectStoreId = 3,
238 UserIntVersion = 4,
239 MaxSimpleMetaDataType = 5
240 };
241
242 CONTENT_EXPORT static std::vector<char> Encode(int64_t database_id,
243 MetaDataType);
244 };
245
246 class ObjectStoreMetaDataKey {
247 public:
248 enum MetaDataType {
249 Name = 0,
250 KeyPath = 1,
251 AutoIncrement = 2,
252 Evictable = 3,
253 LastVersion = 4,
254 MaxIndexId = 5,
255 HasKeyPath = 6,
256 KeyGeneratorCurrentNumber = 7
257 };
258
259 ObjectStoreMetaDataKey();
260 static const char* Decode(const char* start,
261 const char* limit,
262 ObjectStoreMetaDataKey* result);
263 CONTENT_EXPORT static std::vector<char> Encode(int64_t database_id,
264 int64_t object_store_id,
265 unsigned char meta_data_type);
266 CONTENT_EXPORT static std::vector<char> EncodeMaxKey(int64_t database_id);
267 CONTENT_EXPORT static std::vector<char> EncodeMaxKey(int64_t database_id,
268 int64_t object_store_id);
269 int64_t ObjectStoreId() const;
270 unsigned char MetaDataType() const;
271 int Compare(const ObjectStoreMetaDataKey& other);
272
273 private:
274 int64_t object_store_id_;
275 unsigned char meta_data_type_;
276 };
277
278 class IndexMetaDataKey {
279 public:
280 enum MetaDataType {
281 Name = 0,
282 Unique = 1,
283 KeyPath = 2,
284 MultiEntry = 3
285 };
286
287 IndexMetaDataKey();
288 static const char* Decode(const char* start,
289 const char* limit,
290 IndexMetaDataKey* result);
291 CONTENT_EXPORT static std::vector<char> Encode(int64_t database_id,
292 int64_t object_store_id,
293 int64_t index_id,
294 unsigned char meta_data_type);
295 CONTENT_EXPORT static std::vector<char> EncodeMaxKey(int64_t database_id,
296 int64_t object_store_id);
297 CONTENT_EXPORT static std::vector<char> EncodeMaxKey(int64_t database_id,
298 int64_t object_store_id,
299 int64_t index_id);
300 int Compare(const IndexMetaDataKey& other);
301 int64_t IndexId() const;
302 unsigned char meta_data_type() const { return meta_data_type_; }
303
304 private:
305 int64_t object_store_id_;
306 int64_t index_id_;
307 unsigned char meta_data_type_;
308 };
309
310 class ObjectStoreFreeListKey {
311 public:
312 ObjectStoreFreeListKey();
313 static const char* Decode(const char* start,
314 const char* limit,
315 ObjectStoreFreeListKey* result);
316 CONTENT_EXPORT static std::vector<char> Encode(int64_t database_id,
317 int64_t object_store_id);
318 CONTENT_EXPORT static std::vector<char> EncodeMaxKey(int64_t database_id);
319 int64_t ObjectStoreId() const;
320 int Compare(const ObjectStoreFreeListKey& other);
321
322 private:
323 int64_t object_store_id_;
324 };
325
326 class IndexFreeListKey {
327 public:
328 IndexFreeListKey();
329 static const char* Decode(const char* start,
330 const char* limit,
331 IndexFreeListKey* result);
332 CONTENT_EXPORT static std::vector<char> Encode(int64_t database_id,
333 int64_t object_store_id,
334 int64_t index_id);
335 CONTENT_EXPORT static std::vector<char> EncodeMaxKey(int64_t database_id,
336 int64_t object_store_id);
337 int Compare(const IndexFreeListKey& other);
338 int64_t ObjectStoreId() const;
339 int64_t IndexId() const;
340
341 private:
342 int64_t object_store_id_;
343 int64_t index_id_;
344 };
345
346 class ObjectStoreNamesKey {
347 public:
348 // TODO: We never use this to look up object store ids, because a mapping
349 // is kept in the IndexedDBDatabaseImpl. Can the mapping become unreliable?
350 // Can we remove this?
351 static const char* Decode(const char* start,
352 const char* limit,
353 ObjectStoreNamesKey* result);
354 CONTENT_EXPORT static std::vector<char> Encode(
355 int64_t database_id,
356 const string16& object_store_name);
357 int Compare(const ObjectStoreNamesKey& other);
358 string16 object_store_name() const { return object_store_name_; }
359
360 private:
361 string16 object_store_name_; // TODO: Store the encoded string, or just
362 // pointers to it.
363 };
364
365 class IndexNamesKey {
366 public:
367 IndexNamesKey();
368 // TODO: We never use this to look up index ids, because a mapping
369 // is kept at a higher level.
370 static const char* Decode(const char* start,
371 const char* limit,
372 IndexNamesKey* result);
373 CONTENT_EXPORT static std::vector<char> Encode(int64_t database_id,
374 int64_t object_store_id,
375 const string16& index_name);
376 int Compare(const IndexNamesKey& other);
377 string16 index_name() const { return index_name_; }
378
379 private:
380 int64_t object_store_id_;
381 string16 index_name_;
382 };
383
384 class ObjectStoreDataKey {
385 public:
386 static const char* Decode(const char* start,
387 const char* end,
388 ObjectStoreDataKey* result);
389 CONTENT_EXPORT static std::vector<char> Encode(
390 int64_t database_id,
391 int64_t object_store_id,
392 const std::vector<char> encoded_user_key);
393 static std::vector<char> Encode(int64_t database_id,
394 int64_t object_store_id,
395 const IndexedDBKey& user_key);
396 int Compare(const ObjectStoreDataKey& other, bool& ok);
397 scoped_ptr<IndexedDBKey> user_key() const;
398 static const int64_t SpecialIndexNumber;
399 ObjectStoreDataKey();
400 ~ObjectStoreDataKey();
401
402 private:
403 std::vector<char> encoded_user_key_;
404 };
405
406 class ExistsEntryKey {
407 public:
408 ExistsEntryKey();
409 ~ExistsEntryKey();
410
411 static const char* Decode(const char* start,
412 const char* end,
413 ExistsEntryKey* result);
414 CONTENT_EXPORT static std::vector<char> Encode(
415 int64_t database_id,
416 int64_t object_store_id,
417 const std::vector<char>& encoded_key);
418 static std::vector<char> Encode(int64_t database_id,
419 int64_t object_store_id,
420 const IndexedDBKey& user_key);
421 int Compare(const ExistsEntryKey& other, bool& ok);
422 scoped_ptr<IndexedDBKey> user_key() const;
423
424 static const int64_t SpecialIndexNumber;
425
426 private:
427 std::vector<char> encoded_user_key_;
428 DISALLOW_COPY_AND_ASSIGN(ExistsEntryKey);
429 };
430
431 class IndexDataKey {
432 public:
433 IndexDataKey();
434 ~IndexDataKey();
435 static const char* Decode(const char* start,
436 const char* limit,
437 IndexDataKey* result);
438 CONTENT_EXPORT static std::vector<char> Encode(
439 int64_t database_id,
440 int64_t object_store_id,
441 int64_t index_id,
442 const std::vector<char>& encoded_user_key,
443 const std::vector<char>& encoded_primary_key,
444 int64_t sequence_number = 0);
445 static std::vector<char> Encode(int64_t database_id,
446 int64_t object_store_id,
447 int64_t index_id,
448 const IndexedDBKey& user_key);
449 static std::vector<char> EncodeMinKey(int64_t database_id,
450 int64_t object_store_id,
451 int64_t index_id);
452 CONTENT_EXPORT static std::vector<char> EncodeMaxKey(int64_t database_id,
453 int64_t object_store_id,
454 int64_t index_id);
455 int Compare(const IndexDataKey& other, bool ignore_duplicates, bool& ok);
456 int64_t DatabaseId() const;
457 int64_t ObjectStoreId() const;
458 int64_t IndexId() const;
459 scoped_ptr<IndexedDBKey> user_key() const;
460 scoped_ptr<IndexedDBKey> primary_key() const;
461
462 private:
463 int64_t database_id_;
464 int64_t object_store_id_;
465 int64_t index_id_;
466 std::vector<char> encoded_user_key_;
467 std::vector<char> encoded_primary_key_;
468 int64_t sequence_number_;
469
470 DISALLOW_COPY_AND_ASSIGN(IndexDataKey);
471 };
472
473 } // namespace IndexedDBLevelDBCoding
474
475 } // namespace content
476
477 #endif // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_LEVELDB_CODING_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698