Replace static_cast<SVGStyledElement> with toSVGStyledElement()
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / IDBLevelDBCoding.h
1 /*
2  * Copyright (C) 2011 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef IDBLevelDBCoding_h
27 #define IDBLevelDBCoding_h
28
29 #if ENABLE(INDEXED_DATABASE)
30 #if USE(LEVELDB)
31
32 #include <wtf/RefPtr.h>
33 #include <wtf/Vector.h>
34 #include <wtf/text/WTFString.h>
35
36 namespace WebCore {
37
38 class IDBKey;
39 class IDBKeyPath;
40 class LevelDBSlice;
41
42 namespace IDBLevelDBCoding {
43
44 const unsigned char MinimumIndexId = 30;
45
46 // As most of the IDBKeys and encoded values are short, we initialize some Vectors with a default inline buffer size
47 // to reduce the memory re-allocations when the Vectors are appended.
48 static const size_t DefaultInlineBufferSize = 32;
49
50 Vector<char> encodeByte(unsigned char);
51 const char* decodeByte(const char* p, const char* limit, unsigned char& foundChar);
52 Vector<char> maxIDBKey();
53 Vector<char> minIDBKey();
54 Vector<char> encodeBool(bool);
55 bool decodeBool(const char* begin, const char* end);
56 Vector<char> encodeInt(int64_t);
57 int64_t decodeInt(const char* begin, const char* end);
58 Vector<char> encodeVarInt(int64_t);
59 const char* decodeVarInt(const char* p, const char* limit, int64_t& foundInt);
60 Vector<char> encodeString(const String&);
61 String decodeString(const char* p, const char* end);
62 Vector<char> encodeStringWithLength(const String&);
63 const char* decodeStringWithLength(const char* p, const char* limit, String& foundString);
64 int compareEncodedStringsWithLength(const char*& p, const char* limitP, const char*& q, const char* limitQ, bool& ok);
65 Vector<char> encodeDouble(double);
66 const char* decodeDouble(const char* p, const char* limit, double*);
67 void encodeIDBKey(const IDBKey&, Vector<char, DefaultInlineBufferSize>& into);
68 Vector<char> encodeIDBKey(const IDBKey&);
69 const char* decodeIDBKey(const char* p, const char* limit, RefPtr<IDBKey>& foundKey);
70 const char* extractEncodedIDBKey(const char* start, const char* limit, Vector<char>* result);
71 int compareEncodedIDBKeys(const Vector<char>&, const Vector<char>&, bool& ok);
72 Vector<char> encodeIDBKeyPath(const IDBKeyPath&);
73 IDBKeyPath decodeIDBKeyPath(const char*, const char*);
74
75 int compare(const LevelDBSlice&, const LevelDBSlice&, bool indexKeys = false);
76
77 class KeyPrefix {
78 public:
79     KeyPrefix();
80     KeyPrefix(int64_t databaseId, int64_t objectStoreId, int64_t indexId);
81
82     static const char* decode(const char* start, const char* limit, KeyPrefix* result);
83     Vector<char> encode() const;
84     int compare(const KeyPrefix& other) const;
85
86     enum Type {
87         GlobalMetaData,
88         DatabaseMetaData,
89         ObjectStoreData,
90         ExistsEntry,
91         IndexData,
92         InvalidType
93     };
94
95     Type type() const;
96
97     int64_t m_databaseId;
98     int64_t m_objectStoreId;
99     int64_t m_indexId;
100
101     static const int64_t InvalidId = -1;
102 };
103
104 class SchemaVersionKey {
105 public:
106     static Vector<char> encode();
107 };
108
109 class MaxDatabaseIdKey {
110 public:
111     static Vector<char> encode();
112 };
113
114 class DataVersionKey {
115 public:
116     static Vector<char> encode();
117 };
118
119 class DatabaseFreeListKey {
120 public:
121     DatabaseFreeListKey();
122     static const char* decode(const char* start, const char* limit, DatabaseFreeListKey* result);
123     static Vector<char> encode(int64_t databaseId);
124     static Vector<char> encodeMaxKey();
125     int64_t databaseId() const;
126     int compare(const DatabaseFreeListKey& other) const;
127
128 private:
129     int64_t m_databaseId;
130 };
131
132 class DatabaseNameKey {
133 public:
134     static const char* decode(const char* start, const char* limit, DatabaseNameKey* result);
135     static Vector<char> encode(const String& origin, const String& databaseName);
136     static Vector<char> encodeMinKeyForOrigin(const String& origin);
137     static Vector<char> encodeStopKeyForOrigin(const String& origin);
138     String origin() const { return m_origin; }
139     String databaseName() const { return m_databaseName; }
140     int compare(const DatabaseNameKey& other);
141
142 private:
143     String m_origin; // FIXME: Store encoded strings, or just pointers.
144     String m_databaseName;
145 };
146
147 class DatabaseMetaDataKey {
148 public:
149     enum MetaDataType {
150         OriginName = 0,
151         DatabaseName = 1,
152         UserVersion = 2,
153         MaxObjectStoreId = 3,
154         UserIntVersion = 4,
155         MaxSimpleMetaDataType = 5
156     };
157
158     static Vector<char> encode(int64_t databaseId, MetaDataType);
159 };
160
161 class ObjectStoreMetaDataKey {
162 public:
163     enum MetaDataType {
164         Name = 0,
165         KeyPath = 1,
166         AutoIncrement = 2,
167         Evictable = 3,
168         LastVersion = 4,
169         MaxIndexId = 5,
170         HasKeyPath = 6,
171         KeyGeneratorCurrentNumber = 7
172     };
173
174     ObjectStoreMetaDataKey();
175     static const char* decode(const char* start, const char* limit, ObjectStoreMetaDataKey* result);
176     static Vector<char> encode(int64_t databaseId, int64_t objectStoreId, unsigned char metaDataType);
177     static Vector<char> encodeMaxKey(int64_t databaseId);
178     static Vector<char> encodeMaxKey(int64_t databaseId, int64_t objectStoreId);
179     int64_t objectStoreId() const;
180     unsigned char metaDataType() const;
181     int compare(const ObjectStoreMetaDataKey& other);
182
183 private:
184     int64_t m_objectStoreId;
185     unsigned char m_metaDataType;
186 };
187
188 class IndexMetaDataKey {
189 public:
190     enum MetaDataType {
191         Name = 0,
192         Unique = 1,
193         KeyPath = 2,
194         MultiEntry = 3
195     };
196
197     IndexMetaDataKey();
198     static const char* decode(const char* start, const char* limit, IndexMetaDataKey* result);
199     static Vector<char> encode(int64_t databaseId, int64_t objectStoreId, int64_t indexId, unsigned char metaDataType);
200     static Vector<char> encodeMaxKey(int64_t databaseId, int64_t objectStoreId);
201     static Vector<char> encodeMaxKey(int64_t databaseId, int64_t objectStoreId, int64_t indexId);
202     int compare(const IndexMetaDataKey& other);
203     int64_t indexId() const;
204     unsigned char metaDataType() const { return m_metaDataType; }
205
206 private:
207     int64_t m_objectStoreId;
208     int64_t m_indexId;
209     unsigned char m_metaDataType;
210 };
211
212 class ObjectStoreFreeListKey {
213 public:
214     ObjectStoreFreeListKey();
215     static const char* decode(const char* start, const char* limit, ObjectStoreFreeListKey* result);
216     static Vector<char> encode(int64_t databaseId, int64_t objectStoreId);
217     static Vector<char> encodeMaxKey(int64_t databaseId);
218     int64_t objectStoreId() const;
219     int compare(const ObjectStoreFreeListKey& other);
220
221 private:
222     int64_t m_objectStoreId;
223 };
224
225 class IndexFreeListKey {
226 public:
227     IndexFreeListKey();
228     static const char* decode(const char* start, const char* limit, IndexFreeListKey* result);
229     static Vector<char> encode(int64_t databaseId, int64_t objectStoreId, int64_t indexId);
230     static Vector<char> encodeMaxKey(int64_t databaseId, int64_t objectStoreId);
231     int compare(const IndexFreeListKey& other);
232     int64_t objectStoreId() const;
233     int64_t indexId() const;
234
235 private:
236     int64_t m_objectStoreId;
237     int64_t m_indexId;
238 };
239
240 class ObjectStoreNamesKey {
241 public:
242     // FIXME: We never use this to look up object store ids, because a mapping
243     // is kept in the IDBDatabaseBackendImpl. Can the mapping become unreliable?
244     // Can we remove this?
245     static const char* decode(const char* start, const char* limit, ObjectStoreNamesKey* result);
246     static Vector<char> encode(int64_t databaseId, const String& objectStoreName);
247     int compare(const ObjectStoreNamesKey& other);
248     String objectStoreName() const { return m_objectStoreName; }
249
250 private:
251     String m_objectStoreName; // FIXME: Store the encoded string, or just pointers to it.
252 };
253
254 class IndexNamesKey {
255 public:
256     IndexNamesKey();
257     // FIXME: We never use this to look up index ids, because a mapping
258     // is kept at a higher level.
259     static const char* decode(const char* start, const char* limit, IndexNamesKey* result);
260     static Vector<char> encode(int64_t databaseId, int64_t objectStoreId, const String& indexName);
261     int compare(const IndexNamesKey& other);
262     String indexName() const { return m_indexName; }
263
264 private:
265     int64_t m_objectStoreId;
266     String m_indexName;
267 };
268
269 class ObjectStoreDataKey {
270 public:
271     static const char* decode(const char* start, const char* end, ObjectStoreDataKey* result);
272     static Vector<char> encode(int64_t databaseId, int64_t objectStoreId, const Vector<char> encodedUserKey);
273     static Vector<char> encode(int64_t databaseId, int64_t objectStoreId, const IDBKey& userKey);
274     int compare(const ObjectStoreDataKey& other, bool& ok);
275     PassRefPtr<IDBKey> userKey() const;
276     static const int64_t SpecialIndexNumber;
277
278 private:
279     Vector<char> m_encodedUserKey;
280 };
281
282 class ExistsEntryKey {
283 public:
284     static const char* decode(const char* start, const char* end, ExistsEntryKey* result);
285     static Vector<char> encode(int64_t databaseId, int64_t objectStoreId, const Vector<char>& encodedKey);
286     static Vector<char> encode(int64_t databaseId, int64_t objectStoreId, const IDBKey& userKey);
287     int compare(const ExistsEntryKey& other, bool& ok);
288     PassRefPtr<IDBKey> userKey() const;
289
290     static const int64_t SpecialIndexNumber;
291
292 private:
293     Vector<char> m_encodedUserKey;
294 };
295
296 class IndexDataKey {
297 public:
298     IndexDataKey();
299     static const char* decode(const char* start, const char* limit, IndexDataKey* result);
300     static Vector<char> encode(int64_t databaseId, int64_t objectStoreId, int64_t indexId, const Vector<char>& encodedUserKey, const Vector<char>& encodedPrimaryKey, int64_t sequenceNumber = 0);
301     static Vector<char> encode(int64_t databaseId, int64_t objectStoreId, int64_t indexId, const IDBKey& userKey);
302     static Vector<char> encodeMinKey(int64_t databaseId, int64_t objectStoreId, int64_t indexId);
303     static Vector<char> encodeMaxKey(int64_t databaseId, int64_t objectStoreId, int64_t indexId);
304     int compare(const IndexDataKey& other, bool ignoreDuplicates, bool& ok);
305     int64_t databaseId() const;
306     int64_t objectStoreId() const;
307     int64_t indexId() const;
308     PassRefPtr<IDBKey> userKey() const;
309     PassRefPtr<IDBKey> primaryKey() const;
310
311 private:
312     int64_t m_databaseId;
313     int64_t m_objectStoreId;
314     int64_t m_indexId;
315     Vector<char> m_encodedUserKey;
316     Vector<char> m_encodedPrimaryKey;
317     int64_t m_sequenceNumber;
318 };
319
320 } // namespace IDBLevelDBCoding
321
322 } // namespace WebCore
323
324 #endif // USE(LEVELDB)
325 #endif // ENABLE(INDEXED_DATABASE)
326
327 #endif // IDBLevelDBCoding_h