IndexedDB: Allow createIndex/createObjectStore to be asynchronous
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / IDBDatabaseBackendImpl.h
1 /*
2  * Copyright (C) 2010 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 IDBDatabaseBackendImpl_h
27 #define IDBDatabaseBackendImpl_h
28
29 #include "IDBCallbacks.h"
30 #include "IDBDatabase.h"
31 #include <stdint.h>
32 #include <wtf/Deque.h>
33 #include <wtf/HashMap.h>
34 #include <wtf/ListHashSet.h>
35
36 #if ENABLE(INDEXED_DATABASE)
37
38 namespace WebCore {
39
40 class IDBBackingStore;
41 class IDBDatabase;
42 class IDBFactoryBackendImpl;
43 class IDBTransactionBackendImpl;
44 class IDBTransactionBackendInterface;
45 class IDBTransactionCoordinator;
46
47 class IDBDatabaseBackendImpl : public IDBDatabaseBackendInterface {
48 public:
49     static PassRefPtr<IDBDatabaseBackendImpl> create(const String& name, IDBBackingStore* database, IDBFactoryBackendImpl*, const String& uniqueIdentifier);
50     virtual ~IDBDatabaseBackendImpl();
51
52     PassRefPtr<IDBBackingStore> backingStore() const;
53
54     static const int64_t InvalidId = 0;
55     int64_t id() const { return m_metadata.id; }
56     void addObjectStore(const IDBObjectStoreMetadata&, int64_t newMaxObjectStoreId);
57     void removeObjectStore(int64_t objectStoreId);
58     void addIndex(int64_t objectStoreId, const IDBIndexMetadata&, int64_t newMaxIndexId);
59     void removeIndex(int64_t objectStoreId, int64_t indexId);
60
61     void openConnection(PassRefPtr<IDBCallbacks>, PassRefPtr<IDBDatabaseCallbacks>, int64_t transactionId, int64_t version);
62     void deleteDatabase(PassRefPtr<IDBCallbacks>);
63
64     // IDBDatabaseBackendInterface
65     virtual IDBDatabaseMetadata metadata() const;
66     virtual PassRefPtr<IDBObjectStoreBackendInterface> createObjectStore(int64_t id, const String& name, const IDBKeyPath&, bool autoIncrement, IDBTransactionBackendInterface*, ExceptionCode&)  { ASSERT_NOT_REACHED(); return 0; }
67     virtual void createObjectStore(int64_t transactionId, int64_t objectStoreId, const String& name, const IDBKeyPath&, bool autoIncrement);
68     virtual void deleteObjectStore(int64_t, IDBTransactionBackendInterface*, ExceptionCode&) { ASSERT_NOT_REACHED(); }
69     virtual void deleteObjectStore(int64_t transactionId, int64_t objectStoreId);
70     // FIXME: Remove this method in https://bugs.webkit.org/show_bug.cgi?id=103923.
71     virtual PassRefPtr<IDBTransactionBackendInterface> createTransaction(int64_t transactionId, const Vector<int64_t>& objectStoreIds, IDBTransaction::Mode);
72     virtual void createTransaction(int64_t transactionId, PassRefPtr<IDBDatabaseCallbacks>, const Vector<int64_t>& objectStoreIds, unsigned short mode);
73     virtual void close(PassRefPtr<IDBDatabaseCallbacks>);
74
75     virtual void commit(int64_t transactionId);
76     virtual void abort(int64_t transactionId);
77
78     virtual void createIndex(int64_t transactionId, int64_t objectStoreId, int64_t indexId, const String& name, const IDBKeyPath&, bool unique, bool multiEntry);
79     virtual void deleteIndex(int64_t transactionId, int64_t objectStoreId, int64_t indexId);
80
81     IDBTransactionCoordinator* transactionCoordinator() const { return m_transactionCoordinator.get(); }
82     void transactionStarted(PassRefPtr<IDBTransactionBackendImpl>);
83     void transactionFinished(PassRefPtr<IDBTransactionBackendImpl>);
84     void transactionFinishedAndCompleteFired(PassRefPtr<IDBTransactionBackendImpl>);
85     void transactionFinishedAndAbortFired(PassRefPtr<IDBTransactionBackendImpl>);
86
87     virtual void get(int64_t transactionId, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange>, bool keyOnly, PassRefPtr<IDBCallbacks>) OVERRIDE;
88     virtual void put(int64_t transactionId, int64_t objectStoreId, Vector<uint8_t>* value, PassRefPtr<IDBKey>, PutMode, PassRefPtr<IDBCallbacks>, const Vector<int64_t>& indexIds, const Vector<IndexKeys>&) OVERRIDE;
89     virtual void setIndexKeys(int64_t transactionId, int64_t objectStoreId, PassRefPtr<IDBKey> prpPrimaryKey, const Vector<int64_t>& indexIds, const Vector<IndexKeys>&) OVERRIDE;
90     virtual void setIndexesReady(int64_t transactionId, int64_t objectStoreId, const Vector<int64_t>& indexIds) OVERRIDE;
91     virtual void openCursor(int64_t transactionId, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange>, unsigned short direction, bool keyOnly, TaskType, PassRefPtr<IDBCallbacks>) OVERRIDE;
92     virtual void count(int64_t transactionId, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange>, PassRefPtr<IDBCallbacks>) OVERRIDE;
93     virtual void deleteRange(int64_t transactionId, int64_t objectStoreId, PassRefPtr<IDBKeyRange>, PassRefPtr<IDBCallbacks>) OVERRIDE;
94     virtual void clear(int64_t transactionId, int64_t objectStoreId, PassRefPtr<IDBCallbacks>) OVERRIDE;
95
96 private:
97     IDBDatabaseBackendImpl(const String& name, IDBBackingStore* database, IDBFactoryBackendImpl*, const String& uniqueIdentifier);
98
99     bool openInternal();
100     void runIntVersionChangeTransaction(PassRefPtr<IDBCallbacks>, PassRefPtr<IDBDatabaseCallbacks>, int64_t transactionId, int64_t requestedVersion);
101     size_t connectionCount();
102     void processPendingCalls();
103
104     bool isDeleteDatabaseBlocked();
105     void deleteDatabaseFinal(PassRefPtr<IDBCallbacks>);
106
107     class VersionChangeOperation;
108
109     // When a "versionchange" transaction aborts, these restore the back-end object hierarchy.
110     class VersionChangeAbortOperation;
111
112     RefPtr<IDBBackingStore> m_backingStore;
113     IDBDatabaseMetadata m_metadata;
114
115     String m_identifier;
116     // This might not need to be a RefPtr since the factory's lifetime is that of the page group, but it's better to be conservitive than sorry.
117     RefPtr<IDBFactoryBackendImpl> m_factory;
118
119     OwnPtr<IDBTransactionCoordinator> m_transactionCoordinator;
120     RefPtr<IDBTransactionBackendImpl> m_runningVersionChangeTransaction;
121
122     typedef HashMap<int64_t, IDBTransactionBackendImpl*> TransactionMap;
123     TransactionMap m_transactions;
124
125     class PendingOpenCall;
126     Deque<OwnPtr<PendingOpenCall> > m_pendingOpenCalls;
127     OwnPtr<PendingOpenCall> m_pendingSecondHalfOpen;
128
129     class PendingDeleteCall;
130     Deque<OwnPtr<PendingDeleteCall> > m_pendingDeleteCalls;
131
132     typedef ListHashSet<RefPtr<IDBDatabaseCallbacks> > DatabaseCallbacksSet;
133     DatabaseCallbacksSet m_databaseCallbacksSet;
134
135     bool m_closingConnection;
136 };
137
138 } // namespace WebCore
139
140 #endif
141
142 #endif // IDBDatabaseBackendImpl_h