Unreviewed test gardening.
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / legacy / IDBTransactionBackendOperations.h
1 /*
2  * Copyright (C) 2013 Apple 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef IDBTransactionBackendOperations_h
27 #define IDBTransactionBackendOperations_h
28
29 #include "IDBDatabaseBackend.h"
30 #include "IDBOperation.h"
31 #include "IDBTransactionBackend.h"
32
33 #if ENABLE(INDEXED_DATABASE)
34
35 namespace WebCore {
36
37 class IDBServerConnection;
38
39 class CreateObjectStoreOperation : public IDBOperation {
40 public:
41     static Ref<IDBOperation> create(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStoreMetadata)
42     {
43         return adoptRef(*new CreateObjectStoreOperation(transaction, objectStoreMetadata));
44     }
45     virtual void perform(std::function<void()> successCallback) override final;
46
47     const IDBObjectStoreMetadata& objectStoreMetadata() const { return m_objectStoreMetadata; }
48
49 private:
50     CreateObjectStoreOperation(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStoreMetadata)
51         : m_transaction(transaction)
52         , m_objectStoreMetadata(objectStoreMetadata)
53     {
54     }
55     
56     RefPtr<IDBTransactionBackend> m_transaction;
57     const IDBObjectStoreMetadata m_objectStoreMetadata;
58 };
59
60 class DeleteObjectStoreOperation : public IDBOperation {
61 public:
62     static Ref<IDBOperation> create(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStoreMetadata)
63     {
64         return adoptRef(*new DeleteObjectStoreOperation(transaction, objectStoreMetadata));
65     }
66     virtual void perform(std::function<void()> successCallback) override final;
67
68     IDBTransactionBackend* transaction() const { return m_transaction.get(); }
69     const IDBObjectStoreMetadata& objectStoreMetadata() const { return m_objectStoreMetadata; }
70
71 private:
72     DeleteObjectStoreOperation(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStoreMetadata)
73         : m_transaction(transaction)
74         , m_objectStoreMetadata(objectStoreMetadata)
75     {
76     }
77
78     RefPtr<IDBTransactionBackend> m_transaction;
79     const IDBObjectStoreMetadata m_objectStoreMetadata;
80 };
81
82 class IDBDatabaseBackend::VersionChangeOperation : public IDBOperation {
83 public:
84     static Ref<IDBOperation> create(IDBTransactionBackend* transaction, int64_t version, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks)
85     {
86         return adoptRef(*new VersionChangeOperation(transaction, version, callbacks, databaseCallbacks));
87     }
88     virtual void perform(std::function<void()> successCallback) override final;
89
90     IDBTransactionBackend* transaction() const { return m_transaction.get(); }
91     int64_t version() const { return m_version; }
92     IDBDatabaseCallbacks* databaseCallbacks() const { return m_databaseCallbacks.get(); }
93
94 private:
95     VersionChangeOperation(IDBTransactionBackend* transaction, int64_t version, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks)
96         : m_transaction(transaction)
97         , m_version(version)
98         , m_callbacks(callbacks)
99         , m_databaseCallbacks(databaseCallbacks)
100     {
101     }
102
103     RefPtr<IDBTransactionBackend> m_transaction;
104     int64_t m_version;
105     RefPtr<IDBCallbacks> m_callbacks;
106     RefPtr<IDBDatabaseCallbacks> m_databaseCallbacks;
107 };
108
109 class CreateObjectStoreAbortOperation : public IDBSynchronousOperation {
110 public:
111     static Ref<IDBSynchronousOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId)
112     {
113         return adoptRef(*new CreateObjectStoreAbortOperation(transaction, objectStoreId));
114     }
115     virtual void perform() override final;
116 private:
117     CreateObjectStoreAbortOperation(IDBTransactionBackend* transaction, int64_t objectStoreId)
118         : m_transaction(transaction)
119         , m_objectStoreID(objectStoreId)
120     {
121     }
122
123     RefPtr<IDBTransactionBackend> m_transaction;
124     const int64_t m_objectStoreID;
125 };
126
127 class DeleteObjectStoreAbortOperation : public IDBSynchronousOperation {
128 public:
129     static Ref<IDBSynchronousOperation> create(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStore)
130     {
131         return adoptRef(*new DeleteObjectStoreAbortOperation(transaction, objectStore));
132     }
133     virtual void perform() override final;
134 private:
135     DeleteObjectStoreAbortOperation(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStoreMetadata)
136         : m_transaction(transaction)
137         , m_objectStoreMetadata(objectStoreMetadata)
138     {
139     }
140
141     RefPtr<IDBTransactionBackend> m_transaction;
142     IDBObjectStoreMetadata m_objectStoreMetadata;
143 };
144
145 class IDBDatabaseBackend::VersionChangeAbortOperation : public IDBSynchronousOperation {
146 public:
147     static Ref<IDBSynchronousOperation> create(IDBTransactionBackend* transaction, const String& previousVersion, int64_t previousIntVersion)
148     {
149         return adoptRef(*new VersionChangeAbortOperation(transaction, previousVersion, previousIntVersion));
150     }
151     virtual void perform() override final;
152 private:
153     VersionChangeAbortOperation(IDBTransactionBackend* transaction, const String& previousVersion, int64_t previousIntVersion)
154         : m_transaction(transaction)
155         , m_previousVersion(previousVersion)
156         , m_previousIntVersion(previousIntVersion)
157     {
158     }
159
160     RefPtr<IDBTransactionBackend> m_transaction;
161     String m_previousVersion;
162     int64_t m_previousIntVersion;
163 };
164
165 class CreateIndexOperation : public IDBOperation {
166 public:
167     static Ref<IDBOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, const IDBIndexMetadata& indexMetadata)
168     {
169         return adoptRef(*new CreateIndexOperation(transaction, objectStoreId, indexMetadata));
170     }
171     virtual void perform(std::function<void()> successCallback) override final;
172
173     int64_t objectStoreID() const { return m_objectStoreID; }
174     const IDBIndexMetadata& idbIndexMetadata() const { return m_indexMetadata; }
175
176 private:
177     CreateIndexOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, const IDBIndexMetadata& indexMetadata)
178         : m_transaction(transaction)
179         , m_objectStoreID(objectStoreId)
180         , m_indexMetadata(indexMetadata)
181     {
182     }
183
184     RefPtr<IDBTransactionBackend> m_transaction;
185     const int64_t m_objectStoreID;
186     const IDBIndexMetadata m_indexMetadata;
187 };
188
189 class CreateIndexAbortOperation : public IDBSynchronousOperation {
190 public:
191     static Ref<IDBSynchronousOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, int64_t indexId)
192     {
193         return adoptRef(*new CreateIndexAbortOperation(transaction, objectStoreId, indexId));
194     }
195     virtual void perform() override final;
196 private:
197     CreateIndexAbortOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, int64_t indexId)
198         : m_transaction(transaction)
199         , m_objectStoreID(objectStoreId)
200         , m_indexID(indexId)
201     {
202     }
203
204     const RefPtr<IDBTransactionBackend> m_transaction;
205     const int64_t m_objectStoreID;
206     const int64_t m_indexID;
207 };
208
209 class DeleteIndexOperation : public IDBOperation {
210 public:
211     static Ref<IDBOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, const IDBIndexMetadata& indexMetadata)
212     {
213         return adoptRef(*new DeleteIndexOperation(transaction, objectStoreId, indexMetadata));
214     }
215     virtual void perform(std::function<void()> successCallback) override final;
216
217     int64_t objectStoreID() const { return m_objectStoreID; }
218     const IDBIndexMetadata& idbIndexMetadata() const { return m_indexMetadata; }
219
220 private:
221     DeleteIndexOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, const IDBIndexMetadata& indexMetadata)
222         : m_transaction(transaction)
223         , m_objectStoreID(objectStoreId)
224         , m_indexMetadata(indexMetadata)
225     {
226     }
227
228     RefPtr<IDBTransactionBackend> m_transaction;
229     const int64_t m_objectStoreID;
230     const IDBIndexMetadata m_indexMetadata;
231 };
232
233 class DeleteIndexAbortOperation : public IDBSynchronousOperation {
234 public:
235     static Ref<IDBSynchronousOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, const IDBIndexMetadata& indexMetadata)
236     {
237         return adoptRef(*new DeleteIndexAbortOperation(transaction, objectStoreId, indexMetadata));
238     }
239     virtual void perform() override final;
240 private:
241     DeleteIndexAbortOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, const IDBIndexMetadata& indexMetadata)
242         : m_transaction(transaction)
243         , m_objectStoreID(objectStoreId)
244         , m_indexMetadata(indexMetadata)
245     {
246     }
247
248     RefPtr<IDBTransactionBackend> m_transaction;
249     const int64_t m_objectStoreID;
250     const IDBIndexMetadata m_indexMetadata;
251 };
252
253 class GetOperation : public IDBOperation {
254 public:
255     static Ref<IDBOperation> create(IDBTransactionBackend* transaction, const IDBDatabaseMetadata& metadata, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange> keyRange, IndexedDB::CursorType cursorType, PassRefPtr<IDBCallbacks> callbacks)
256     {
257         return adoptRef(*new GetOperation(transaction, metadata, objectStoreId, indexId, keyRange, cursorType, callbacks));
258     }
259     virtual void perform(std::function<void()> successCallback) override final;
260
261     int64_t objectStoreID() const { return m_objectStoreID; }
262     int64_t indexID() const { return m_indexID; }
263     IndexedDB::CursorType cursorType() const { return m_cursorType; }
264     IDBKeyRange* keyRange() const { return m_keyRange.get(); }
265     bool autoIncrement() const { return m_autoIncrement; }
266     IDBKeyPath keyPath() const { return m_keyPath; }
267
268 private:
269     GetOperation(IDBTransactionBackend* transaction, const IDBDatabaseMetadata& metadata, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange> keyRange, IndexedDB::CursorType cursorType, PassRefPtr<IDBCallbacks> callbacks)
270         : m_transaction(transaction)
271         , m_objectStoreID(objectStoreId)
272         , m_indexID(indexId)
273         , m_keyPath(metadata.objectStores.get(objectStoreId).keyPath)
274         , m_autoIncrement(metadata.objectStores.get(objectStoreId).autoIncrement)
275         , m_keyRange(keyRange)
276         , m_cursorType(cursorType)
277         , m_callbacks(callbacks)
278     {
279         ASSERT(metadata.objectStores.contains(objectStoreId));
280         ASSERT(metadata.objectStores.get(objectStoreId).id == objectStoreId);
281     }
282
283     RefPtr<IDBTransactionBackend> m_transaction;
284     const int64_t m_objectStoreID;
285     const int64_t m_indexID;
286     const IDBKeyPath m_keyPath;
287     const bool m_autoIncrement;
288     const RefPtr<IDBKeyRange> m_keyRange;
289     const IndexedDB::CursorType m_cursorType;
290     const RefPtr<IDBCallbacks> m_callbacks;
291 };
292
293 class PutOperation : public IDBOperation {
294 public:
295     static Ref<IDBOperation> create(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStore, PassRefPtr<SharedBuffer> value, PassRefPtr<IDBKey> key, IDBDatabaseBackend::PutMode putMode, PassRefPtr<IDBCallbacks> callbacks, const Vector<int64_t>& indexIds, const Vector<IndexKeys>& indexKeys)
296     {
297         return adoptRef(*new PutOperation(transaction, objectStore, value, key, putMode, callbacks, indexIds, indexKeys));
298     }
299     virtual void perform(std::function<void()> successCallback) override final;
300
301     IDBDatabaseBackend::PutMode putMode() const { return m_putMode; }
302     const IDBObjectStoreMetadata& objectStore() const { return m_objectStore; }
303     IDBKey* key() const { return m_key.get(); }
304     const Vector<int64_t>& indexIDs() const { return m_indexIDs; }
305     const Vector<IndexKeys>& indexKeys() const { return m_indexKeys; }
306     SharedBuffer* value() const { return m_value.get(); }
307
308 private:
309     PutOperation(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStore, PassRefPtr<SharedBuffer>& value, PassRefPtr<IDBKey> key, IDBDatabaseBackend::PutMode putMode, PassRefPtr<IDBCallbacks> callbacks, const Vector<int64_t>& indexIds, const Vector<IndexKeys>& indexKeys)
310         : m_transaction(transaction)
311         , m_objectStore(objectStore)
312         , m_value(value)
313         , m_key(key)
314         , m_putMode(putMode)
315         , m_callbacks(callbacks)
316         , m_indexIDs(indexIds)
317         , m_indexKeys(indexKeys)
318     {
319     }
320
321     RefPtr<IDBTransactionBackend> m_transaction;
322     const IDBObjectStoreMetadata m_objectStore;
323     const RefPtr<SharedBuffer> m_value;
324     const RefPtr<IDBKey> m_key;
325     const IDBDatabaseBackend::PutMode m_putMode;
326     const RefPtr<IDBCallbacks> m_callbacks;
327     const Vector<int64_t> m_indexIDs;
328     const Vector<IndexKeys> m_indexKeys;
329 };
330
331 class SetIndexesReadyOperation : public IDBOperation {
332 public:
333     static Ref<IDBOperation> create(IDBTransactionBackend* transaction, size_t indexCount)
334     {
335         return adoptRef(*new SetIndexesReadyOperation(transaction, indexCount));
336     }
337     virtual void perform(std::function<void()> successCallback) override final;
338 private:
339     SetIndexesReadyOperation(IDBTransactionBackend* transaction, size_t indexCount)
340         : m_transaction(transaction)
341         , m_indexCount(indexCount)
342     {
343     }
344
345     RefPtr<IDBTransactionBackend> m_transaction;
346     const size_t m_indexCount;
347 };
348
349 class OpenCursorOperation : public IDBOperation {
350 public:
351     static Ref<IDBOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange> keyRange, IndexedDB::CursorDirection direction, IndexedDB::CursorType cursorType, IDBDatabaseBackend::TaskType taskType, PassRefPtr<IDBCallbacks> callbacks)
352     {
353         return adoptRef(*new OpenCursorOperation(transaction, objectStoreId, indexId, keyRange, direction, cursorType, taskType, callbacks));
354     }
355     virtual void perform(std::function<void()> successCallback) override final;
356
357     int64_t transactionID() const { return m_transaction->id(); }
358     int64_t objectStoreID() const { return m_objectStoreID; }
359     int64_t indexID() const { return m_indexID; }
360     IndexedDB::CursorDirection direction() const { return m_direction; }
361     IndexedDB::CursorType cursorType() const { return m_cursorType; }
362     IDBDatabaseBackend::TaskType taskType() const { return m_taskType; }
363     IDBKeyRange* keyRange() const { return m_keyRange.get(); }
364     IndexedDB::CursorDirection cursorDirection() const { return m_direction; }
365
366 private:
367     OpenCursorOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange> keyRange, IndexedDB::CursorDirection direction, IndexedDB::CursorType cursorType, IDBDatabaseBackend::TaskType taskType, PassRefPtr<IDBCallbacks> callbacks)
368         : m_transaction(transaction)
369         , m_objectStoreID(objectStoreId)
370         , m_indexID(indexId)
371         , m_keyRange(keyRange)
372         , m_direction(direction)
373         , m_cursorType(cursorType)
374         , m_taskType(taskType)
375         , m_callbacks(callbacks)
376     {
377     }
378
379     RefPtr<IDBTransactionBackend> m_transaction;
380     const int64_t m_objectStoreID;
381     const int64_t m_indexID;
382     const PassRefPtr<IDBKeyRange> m_keyRange;
383     const IndexedDB::CursorDirection m_direction;
384     const IndexedDB::CursorType m_cursorType;
385     const IDBDatabaseBackend::TaskType m_taskType;
386     const RefPtr<IDBCallbacks> m_callbacks;
387 };
388
389 class CountOperation : public IDBOperation {
390 public:
391     static Ref<IDBOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange> keyRange, PassRefPtr<IDBCallbacks> callbacks)
392     {
393         return adoptRef(*new CountOperation(transaction, objectStoreId, indexId, keyRange, callbacks));
394     }
395     virtual void perform(std::function<void()> successCallback) override final;
396
397     int64_t objectStoreID() const { return m_objectStoreID; }
398     int64_t indexID() const { return m_indexID; }
399     IDBKeyRange* keyRange() const { return m_keyRange.get(); }
400
401 private:
402     CountOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange> keyRange, PassRefPtr<IDBCallbacks> callbacks)
403         : m_transaction(transaction)
404         , m_objectStoreID(objectStoreId)
405         , m_indexID(indexId)
406         , m_keyRange(keyRange)
407         , m_callbacks(callbacks)
408     {
409     }
410
411     RefPtr<IDBTransactionBackend> m_transaction;
412     const int64_t m_objectStoreID;
413     const int64_t m_indexID;
414     const RefPtr<IDBKeyRange> m_keyRange;
415     const RefPtr<IDBCallbacks> m_callbacks;
416 };
417
418 class DeleteRangeOperation : public IDBOperation {
419 public:
420     static Ref<IDBOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, PassRefPtr<IDBKeyRange> keyRange, PassRefPtr<IDBCallbacks> callbacks)
421     {
422         return adoptRef(*new DeleteRangeOperation(transaction, objectStoreId, keyRange, callbacks));
423     }
424     virtual void perform(std::function<void()> successCallback) override final;
425
426     int64_t objectStoreID() const { return m_objectStoreID; }
427     IDBKeyRange* keyRange() const { return m_keyRange.get(); }
428
429 private:
430     DeleteRangeOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, PassRefPtr<IDBKeyRange> keyRange, PassRefPtr<IDBCallbacks> callbacks)
431         : m_transaction(transaction)
432         , m_objectStoreID(objectStoreId)
433         , m_keyRange(keyRange)
434         , m_callbacks(callbacks)
435     {
436     }
437
438     RefPtr<IDBTransactionBackend> m_transaction;
439     const int64_t m_objectStoreID;
440     const RefPtr<IDBKeyRange> m_keyRange;
441     const RefPtr<IDBCallbacks> m_callbacks;
442 };
443
444 class ClearObjectStoreOperation : public IDBOperation {
445 public:
446     static Ref<IDBOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId, PassRefPtr<IDBCallbacks> callbacks)
447     {
448         return adoptRef(*new ClearObjectStoreOperation(transaction, objectStoreId, callbacks));
449     }
450     virtual void perform(std::function<void()> successCallback) override final;
451
452     IDBTransactionBackend* transaction() const { return m_transaction.get(); }
453     int64_t objectStoreID() const { return m_objectStoreID; }
454
455 private:
456     ClearObjectStoreOperation(IDBTransactionBackend* transaction, int64_t objectStoreId, PassRefPtr<IDBCallbacks> callbacks)
457         : m_transaction(transaction)
458         , m_objectStoreID(objectStoreId)
459         , m_callbacks(callbacks)
460     {
461     }
462
463     RefPtr<IDBTransactionBackend> m_transaction;
464     const int64_t m_objectStoreID;
465     const RefPtr<IDBCallbacks> m_callbacks;
466 };
467
468 } // namespace WebCore
469
470 #endif // ENABLE(INDEXED_DATABASE)
471 #endif // IDBTransactionBackendOperations_h