OLD | NEW |
---|---|
(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_BACKING_STORE_H_ | |
6 #define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_BACKING_STORE_H_ | |
7 | |
8 #include <vector> | |
9 | |
10 #include "base/memory/ref_counted.h" | |
11 #include "base/memory/scoped_ptr.h" | |
12 #include "base/memory/weak_ptr.h" | |
13 #include "content/browser/indexed_db/indexed_db.h" | |
14 #include "content/browser/indexed_db/indexed_db_metadata.h" | |
15 #include "content/browser/indexed_db/leveldb/leveldb_iterator.h" | |
16 #include "content/browser/indexed_db/leveldb/leveldb_transaction.h" | |
17 #include "content/common/content_export.h" | |
18 #include "content/common/indexed_db/indexed_db_key.h" | |
19 #include "content/common/indexed_db/indexed_db_key_path.h" | |
20 #include "content/common/indexed_db/indexed_db_key_range.h" | |
21 | |
22 namespace content { | |
23 | |
24 class LevelDBComparator; | |
25 class LevelDBDatabase; | |
26 | |
27 class LevelDBFactory { | |
28 public: | |
29 virtual scoped_ptr<LevelDBDatabase> OpenLevelDB(const string16& file_name, | |
30 const LevelDBComparator*) = 0; | |
31 virtual bool DestroyLevelDB(const string16& file_name) = 0; | |
32 }; | |
33 | |
34 class CONTENT_EXPORT IndexedDBBackingStore | |
35 : public base::RefCounted<IndexedDBBackingStore> { | |
36 public: | |
37 class Transaction; | |
38 | |
39 static scoped_refptr<IndexedDBBackingStore> Open( | |
40 const string16& database_identifier, | |
41 const string16& path_base, | |
42 const string16& file_identifier); | |
43 static scoped_refptr<IndexedDBBackingStore> Open( | |
44 const string16& database_identifier, | |
45 const string16& path_base, | |
46 const string16& file_identifier, | |
47 LevelDBFactory*); | |
48 static scoped_refptr<IndexedDBBackingStore> OpenInMemory( | |
49 const string16& identifier); | |
50 static scoped_refptr<IndexedDBBackingStore> OpenInMemory( | |
51 const string16& identifier, | |
52 LevelDBFactory*); | |
53 base::WeakPtr<IndexedDBBackingStore> GetWeakPtr() { | |
54 return weak_factory_.GetWeakPtr(); | |
55 } | |
56 | |
57 virtual std::vector<string16> GetDatabaseNames(); | |
58 virtual bool GetIDBDatabaseMetaData(const string16& name, | |
59 IndexedDBDatabaseMetadata*, | |
60 bool& success) WARN_UNUSED_RESULT; | |
61 virtual bool CreateIDBDatabaseMetaData(const string16& name, | |
62 const string16& version, | |
63 int64_t int_version, | |
64 int64_t& row_id); | |
65 virtual bool UpdateIDBDatabaseMetaData(IndexedDBBackingStore::Transaction*, | |
66 int64_t row_id, | |
67 const string16& version); | |
68 virtual bool UpdateIDBDatabaseIntVersion(IndexedDBBackingStore::Transaction*, | |
69 int64_t row_id, | |
70 int64_t int_version); | |
71 virtual bool DeleteDatabase(const string16& name); | |
72 | |
73 bool GetObjectStores(int64_t database_id, | |
74 IndexedDBDatabaseMetadata::ObjectStoreMap*) | |
75 WARN_UNUSED_RESULT; | |
76 virtual bool CreateObjectStore(IndexedDBBackingStore::Transaction*, | |
77 int64_t database_id, | |
78 int64_t object_store_id, | |
79 const string16& name, | |
80 const IndexedDBKeyPath&, | |
81 bool auto_increment); | |
82 virtual bool DeleteObjectStore(IndexedDBBackingStore::Transaction*, | |
83 int64_t database_id, | |
84 int64_t object_store_id) WARN_UNUSED_RESULT; | |
85 | |
86 class RecordIdentifier { | |
87 DISALLOW_COPY_AND_ASSIGN(RecordIdentifier); | |
jamesr
2013/05/21 23:56:06
in chromium, this is nearly always the last thing
jsbell
2013/05/22 17:54:44
Done.
| |
88 | |
89 public: | |
90 RecordIdentifier(const std::vector<char>& primary_key, int64_t version); | |
91 RecordIdentifier(); | |
92 ~RecordIdentifier(); | |
93 | |
94 const std::vector<char>& primary_key() const { return primary_key_; } | |
95 int64_t version() const { return version_; } | |
96 void Reset(const std::vector<char>& primary_key, int64_t version) { | |
97 primary_key_ = primary_key; | |
98 version_ = version; | |
99 } | |
100 | |
101 private: | |
102 std::vector<char> primary_key_; // TODO: Make it more clear that this is | |
jamesr
2013/05/21 23:56:06
TODOs in chromium should have a name in parens, e.
jsbell
2013/05/22 17:54:44
Done.
| |
103 // the *encoded* version of the key. | |
104 int64_t version_; | |
105 }; | |
106 | |
107 virtual bool GetRecord(IndexedDBBackingStore::Transaction*, | |
108 int64_t database_id, | |
109 int64_t object_store_id, | |
110 const IndexedDBKey&, | |
111 std::vector<char>& record) WARN_UNUSED_RESULT; | |
112 virtual bool PutRecord(IndexedDBBackingStore::Transaction*, | |
113 int64_t database_id, | |
114 int64_t object_store_id, | |
115 const IndexedDBKey&, | |
116 const std::vector<char>& value, | |
117 RecordIdentifier*) WARN_UNUSED_RESULT; | |
118 virtual bool ClearObjectStore(IndexedDBBackingStore::Transaction*, | |
119 int64_t database_id, | |
120 int64_t object_store_id) WARN_UNUSED_RESULT; | |
121 virtual bool DeleteRecord(IndexedDBBackingStore::Transaction*, | |
122 int64_t database_id, | |
123 int64_t object_store_id, | |
124 const RecordIdentifier&) WARN_UNUSED_RESULT; | |
125 virtual bool GetKeyGeneratorCurrentNumber(IndexedDBBackingStore::Transaction*, | |
126 int64_t database_id, | |
127 int64_t object_store_id, | |
128 int64_t& current_number) | |
129 WARN_UNUSED_RESULT; | |
130 virtual bool MaybeUpdateKeyGeneratorCurrentNumber( | |
131 IndexedDBBackingStore::Transaction*, | |
132 int64_t database_id, | |
133 int64_t object_store_id, | |
134 int64_t new_state, | |
135 bool check_current) WARN_UNUSED_RESULT; | |
136 virtual bool KeyExistsInObjectStore(IndexedDBBackingStore::Transaction*, | |
137 int64_t database_id, | |
138 int64_t object_store_id, | |
139 const IndexedDBKey&, | |
140 RecordIdentifier* found_record_identifier, | |
141 bool& found) WARN_UNUSED_RESULT; | |
142 | |
143 virtual bool CreateIndex(IndexedDBBackingStore::Transaction*, | |
144 int64_t database_id, | |
145 int64_t object_store_id, | |
146 int64_t index_id, | |
147 const string16& name, | |
148 const IndexedDBKeyPath&, | |
149 bool is_unique, | |
150 bool is_multi_entry) WARN_UNUSED_RESULT; | |
151 virtual bool DeleteIndex(IndexedDBBackingStore::Transaction*, | |
152 int64_t database_id, | |
153 int64_t object_store_id, | |
154 int64_t index_id) WARN_UNUSED_RESULT; | |
155 virtual bool PutIndexDataForRecord(IndexedDBBackingStore::Transaction*, | |
156 int64_t database_id, | |
157 int64_t object_store_id, | |
158 int64_t index_id, | |
159 const IndexedDBKey&, | |
160 const RecordIdentifier&) | |
161 WARN_UNUSED_RESULT; | |
162 virtual bool GetPrimaryKeyViaIndex(IndexedDBBackingStore::Transaction*, | |
163 int64_t database_id, | |
164 int64_t object_store_id, | |
165 int64_t index_id, | |
166 const IndexedDBKey&, | |
167 scoped_ptr<IndexedDBKey>* primary_key) | |
168 WARN_UNUSED_RESULT; | |
169 virtual bool KeyExistsInIndex(IndexedDBBackingStore::Transaction*, | |
170 int64_t database_id, | |
171 int64_t object_store_id, | |
172 int64_t index_id, | |
173 const IndexedDBKey& index_key, | |
174 scoped_ptr<IndexedDBKey>* found_primary_key, | |
175 bool& exists) WARN_UNUSED_RESULT; | |
176 | |
177 class Cursor { | |
178 public: | |
179 virtual ~Cursor(); | |
180 | |
181 enum IteratorState { | |
182 Ready = 0, | |
jamesr
2013/05/21 23:56:06
enums should SHOUT
jsbell
2013/05/22 17:54:44
Done.
| |
183 Seek | |
184 }; | |
185 | |
186 struct CursorOptions { | |
187 CursorOptions(); | |
188 ~CursorOptions(); | |
189 int64_t database_id; | |
190 int64_t object_store_id; | |
191 int64_t index_id; | |
192 std::vector<char> low_key; | |
193 bool low_open; | |
194 std::vector<char> high_key; | |
195 bool high_open; | |
196 bool forward; | |
197 bool unique; | |
198 }; | |
199 | |
200 const IndexedDBKey& key() const { return *current_key_; } | |
201 bool ContinueFunction(const IndexedDBKey* = 0, IteratorState = Seek); | |
202 bool Advance(unsigned long); | |
203 bool FirstSeek(); | |
204 | |
205 virtual Cursor* Clone() = 0; | |
206 virtual const IndexedDBKey& primary_key() const; | |
207 virtual std::vector<char>* Value() = 0; | |
208 virtual const RecordIdentifier& record_identifier() const; | |
209 virtual bool LoadCurrentRow() = 0; | |
210 | |
211 protected: | |
212 Cursor(LevelDBTransaction* transaction, | |
213 const CursorOptions& cursor_options); | |
214 explicit Cursor(const IndexedDBBackingStore::Cursor* other); | |
215 | |
216 virtual std::vector<char> EncodeKey(const IndexedDBKey&) = 0; | |
217 | |
218 bool IsPastBounds() const; | |
219 bool HaveEnteredRange() const; | |
220 | |
221 LevelDBTransaction* transaction_; | |
222 const CursorOptions cursor_options_; | |
223 scoped_ptr<LevelDBIterator> iterator_; | |
224 scoped_ptr<IndexedDBKey> current_key_; | |
225 IndexedDBBackingStore::RecordIdentifier record_identifier_; | |
226 }; | |
227 | |
228 virtual scoped_ptr<Cursor> OpenObjectStoreKeyCursor( | |
229 IndexedDBBackingStore::Transaction*, | |
230 int64_t database_id, | |
231 int64_t object_store_id, | |
232 const IndexedDBKeyRange&, | |
233 IndexedDB::CursorDirection); | |
234 virtual scoped_ptr<Cursor> OpenObjectStoreCursor( | |
235 IndexedDBBackingStore::Transaction*, | |
236 int64_t database_id, | |
237 int64_t object_store_id, | |
238 const IndexedDBKeyRange&, | |
239 IndexedDB::CursorDirection); | |
240 virtual scoped_ptr<Cursor> OpenIndexKeyCursor( | |
241 IndexedDBBackingStore::Transaction*, | |
242 int64_t database_id, | |
243 int64_t object_store_id, | |
244 int64_t index_id, | |
245 const IndexedDBKeyRange&, | |
246 IndexedDB::CursorDirection); | |
247 virtual scoped_ptr<Cursor> OpenIndexCursor( | |
248 IndexedDBBackingStore::Transaction*, | |
249 int64_t database_id, | |
250 int64_t object_store_id, | |
251 int64_t index_id, | |
252 const IndexedDBKeyRange&, | |
253 IndexedDB::CursorDirection); | |
254 | |
255 class Transaction { | |
256 public: | |
257 explicit Transaction(IndexedDBBackingStore*); | |
258 ~Transaction(); | |
259 void begin(); | |
260 bool Commit(); | |
261 void Rollback(); | |
262 void Reset() { | |
263 backing_store_ = NULL; | |
264 transaction_ = NULL; | |
265 } | |
266 | |
267 static LevelDBTransaction* LevelDBTransactionFrom( | |
268 Transaction* transaction) { | |
269 return transaction->transaction_.get(); | |
270 } | |
271 | |
272 private: | |
273 IndexedDBBackingStore* backing_store_; | |
274 scoped_refptr<LevelDBTransaction> transaction_; | |
275 }; | |
276 | |
277 protected: | |
278 IndexedDBBackingStore(const string16& identifier, | |
279 scoped_ptr<LevelDBDatabase>, | |
280 scoped_ptr<LevelDBComparator>); | |
281 virtual ~IndexedDBBackingStore(); | |
282 friend class base::RefCounted<IndexedDBBackingStore>; | |
283 | |
284 private: | |
285 static scoped_refptr<IndexedDBBackingStore> Create( | |
286 const string16& identifier, | |
287 scoped_ptr<LevelDBDatabase>, | |
288 scoped_ptr<LevelDBComparator>); | |
289 | |
290 bool FindKeyInIndex(IndexedDBBackingStore::Transaction*, | |
291 int64_t database_id, | |
292 int64_t object_store_id, | |
293 int64_t index_id, | |
294 const IndexedDBKey&, | |
295 std::vector<char>& found_encoded_primary_key, | |
296 bool& found); | |
297 bool GetIndexes(int64_t database_id, | |
298 int64_t object_store_id, | |
299 IndexedDBObjectStoreMetadata::IndexMap*) WARN_UNUSED_RESULT; | |
300 | |
301 string16 identifier_; | |
302 | |
303 scoped_ptr<LevelDBDatabase> db_; | |
304 scoped_ptr<LevelDBComparator> comparator_; | |
305 base::WeakPtrFactory<IndexedDBBackingStore> weak_factory_; | |
306 }; | |
307 | |
308 } // namespace content | |
309 | |
310 #endif // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_BACKING_STORE_H_ | |
OLD | NEW |