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
35namespace WebCore {
36
37class IDBServerConnection;
38
39class CreateObjectStoreOperation : public IDBOperation {
40public:
41    static PassRefPtr<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
49private:
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
60class DeleteObjectStoreOperation : public IDBOperation {
61public:
62    static PassRefPtr<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
71private:
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
82class IDBDatabaseBackend::VersionChangeOperation : public IDBOperation {
83public:
84    static PassRefPtr<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
94private:
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
109class CreateObjectStoreAbortOperation : public IDBSynchronousOperation {
110public:
111    static PassRefPtr<IDBSynchronousOperation> create(IDBTransactionBackend* transaction, int64_t objectStoreId)
112    {
113        return adoptRef(new CreateObjectStoreAbortOperation(transaction, objectStoreId));
114    }
115    virtual void perform() override final;
116private:
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
127class DeleteObjectStoreAbortOperation : public IDBSynchronousOperation {
128public:
129    static PassRefPtr<IDBSynchronousOperation> create(IDBTransactionBackend* transaction, const IDBObjectStoreMetadata& objectStore)
130    {
131        return adoptRef(new DeleteObjectStoreAbortOperation(transaction, objectStore));
132    }
133    virtual void perform() override final;
134private:
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
145class IDBDatabaseBackend::VersionChangeAbortOperation : public IDBSynchronousOperation {
146public:
147    static PassRefPtr<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;
152private:
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
165class CreateIndexOperation : public IDBOperation {
166public:
167    static PassRefPtr<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
176private:
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
189class CreateIndexAbortOperation : public IDBSynchronousOperation {
190public:
191    static PassRefPtr<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;
196private:
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
209class DeleteIndexOperation : public IDBOperation {
210public:
211    static PassRefPtr<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
220private:
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
233class DeleteIndexAbortOperation : public IDBSynchronousOperation {
234public:
235    static PassRefPtr<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;
240private:
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
253class GetOperation : public IDBOperation {
254public:
255    static PassRefPtr<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
268private:
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
293class PutOperation : public IDBOperation {
294public:
295    static PassRefPtr<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
308private:
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
331class SetIndexesReadyOperation : public IDBOperation {
332public:
333    static PassRefPtr<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;
338private:
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
349class OpenCursorOperation : public IDBOperation {
350public:
351    static PassRefPtr<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
366private:
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
389class CountOperation : public IDBOperation {
390public:
391    static PassRefPtr<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
401private:
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
418class DeleteRangeOperation : public IDBOperation {
419public:
420    static PassRefPtr<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
429private:
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
444class ClearObjectStoreOperation : public IDBOperation {
445public:
446    static PassRefPtr<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
455private:
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
472