Make IDBKeyData from a struct to a class.
[WebKit-https.git] / Source / WebKit2 / DatabaseProcess / IndexedDB / UniqueIDBDatabase.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 UniqueIDBDatabase_h
27 #define UniqueIDBDatabase_h
28
29 #if ENABLE(INDEXED_DATABASE) && ENABLE(DATABASE_PROCESS)
30
31 #include "AsyncRequest.h"
32 #include "IDBIdentifier.h"
33 #include "UniqueIDBDatabaseIdentifier.h"
34 #include <WebCore/IDBDatabaseBackend.h>
35 #include <WebCore/IndexedDB.h>
36 #include <functional>
37 #include <wtf/Deque.h>
38 #include <wtf/HashSet.h>
39 #include <wtf/PassRefPtr.h>
40 #include <wtf/RefCounted.h>
41 #include <wtf/text/WTFString.h>
42
43 namespace IPC {
44 class DataReference;
45 }
46
47 namespace WebCore {
48 class CrossThreadTask;
49 class IDBKeyData;
50 class SharedBuffer;
51
52 struct IDBDatabaseMetadata;
53 struct IDBGetResult;
54 struct IDBKeyRangeData;
55 struct SecurityOriginData;
56 }
57
58 namespace WebKit {
59
60 class DatabaseProcessIDBConnection;
61 class UniqueIDBDatabaseBackingStore;
62
63 enum class UniqueIDBDatabaseShutdownType {
64     NormalShutdown,
65     DeleteShutdown
66 };
67
68 class UniqueIDBDatabase : public ThreadSafeRefCounted<UniqueIDBDatabase> {
69 public:
70     static Ref<UniqueIDBDatabase> create(const UniqueIDBDatabaseIdentifier& identifier)
71     {
72         return adoptRef(*new UniqueIDBDatabase(identifier));
73     }
74
75     ~UniqueIDBDatabase();
76
77     static String calculateAbsoluteDatabaseFilename(const String& absoluteDatabaseDirectory);
78
79     const UniqueIDBDatabaseIdentifier& identifier() const { return m_identifier; }
80
81     void registerConnection(DatabaseProcessIDBConnection&);
82     void unregisterConnection(DatabaseProcessIDBConnection&);
83
84     void deleteDatabase(std::function<void (bool)> successCallback);
85
86     void getOrEstablishIDBDatabaseMetadata(std::function<void (bool, const WebCore::IDBDatabaseMetadata&)> completionCallback);
87
88     void openTransaction(const IDBIdentifier& transactionIdentifier, const Vector<int64_t>& objectStoreIDs, WebCore::IndexedDB::TransactionMode, std::function<void (bool)> successCallback);
89     void beginTransaction(const IDBIdentifier& transactionIdentifier, std::function<void (bool)> successCallback);
90     void commitTransaction(const IDBIdentifier& transactionIdentifier, std::function<void (bool)> successCallback);
91     void resetTransaction(const IDBIdentifier& transactionIdentifier, std::function<void (bool)> successCallback);
92     void rollbackTransaction(const IDBIdentifier& transactionIdentifier, std::function<void (bool)> successCallback);
93
94     void changeDatabaseVersion(const IDBIdentifier& transactionIdentifier, uint64_t newVersion, std::function<void (bool)> successCallback);
95     void createObjectStore(const IDBIdentifier& transactionIdentifier, const WebCore::IDBObjectStoreMetadata&, std::function<void (bool)> successCallback);
96     void deleteObjectStore(const IDBIdentifier& transactionIdentifier, int64_t objectStoreID, std::function<void (bool)> successCallback);
97     void clearObjectStore(const IDBIdentifier& transactionIdentifier, int64_t objectStoreID, std::function<void (bool)> successCallback);
98     void createIndex(const IDBIdentifier& transactionIdentifier, int64_t objectStoreID, const WebCore::IDBIndexMetadata&, std::function<void (bool)> successCallback);
99     void deleteIndex(const IDBIdentifier& transactionIdentifier, int64_t objectStoreID, int64_t indexID, std::function<void (bool)> successCallback);
100
101     void putRecord(const IDBIdentifier& transactionIdentifier, int64_t objectStoreID, const WebCore::IDBKeyData&, const IPC::DataReference& value, int64_t putMode, const Vector<int64_t>& indexIDs, const Vector<Vector<WebCore::IDBKeyData>>& indexKeys, std::function<void (const WebCore::IDBKeyData&, uint32_t, const String&)> callback);
102     void getRecord(const IDBIdentifier& transactionIdentifier, int64_t objectStoreID, int64_t indexID, const WebCore::IDBKeyRangeData&, WebCore::IndexedDB::CursorType, std::function<void (const WebCore::IDBGetResult&, uint32_t, const String&)> callback);
103
104     void openCursor(const IDBIdentifier& transactionIdentifier, int64_t objectStoreID, int64_t indexID, WebCore::IndexedDB::CursorDirection, WebCore::IndexedDB::CursorType, WebCore::IDBDatabaseBackend::TaskType, const WebCore::IDBKeyRangeData&, std::function<void (int64_t, const WebCore::IDBKeyData&, const WebCore::IDBKeyData&, PassRefPtr<WebCore::SharedBuffer>, uint32_t, const String&)> callback);
105     void cursorAdvance(const IDBIdentifier& cursorIdentifier, uint64_t count, std::function<void (const WebCore::IDBKeyData&, const WebCore::IDBKeyData&, PassRefPtr<WebCore::SharedBuffer>, uint32_t, const String&)> callback);
106     void cursorIterate(const IDBIdentifier& cursorIdentifier, const WebCore::IDBKeyData&, std::function<void (const WebCore::IDBKeyData&, const WebCore::IDBKeyData&, PassRefPtr<WebCore::SharedBuffer>, uint32_t, const String&)> callback);
107
108     void count(const IDBIdentifier& transactionIdentifier, int64_t objectStoreID, int64_t indexID, const WebCore::IDBKeyRangeData&, std::function<void (int64_t, uint32_t, const String&)> callback);
109     void deleteRange(const IDBIdentifier& transactionIdentifier, int64_t objectStoreID, const WebCore::IDBKeyRangeData&, std::function<void (uint32_t, const String&)> callback);
110
111 private:
112     UniqueIDBDatabase(const UniqueIDBDatabaseIdentifier&);
113
114     UniqueIDBDatabaseIdentifier m_identifier;
115
116     bool m_inMemory;
117     String m_databaseRelativeDirectory;
118
119     HashSet<RefPtr<DatabaseProcessIDBConnection>> m_connections;
120     HashMap<uint64_t, RefPtr<AsyncRequest>> m_databaseRequests;
121
122     String absoluteDatabaseDirectory() const;
123
124     enum class DatabaseTaskType {
125         Normal,
126         Shutdown
127     };
128     void postDatabaseTask(std::unique_ptr<WebCore::CrossThreadTask>, DatabaseTaskType = DatabaseTaskType::Normal);
129
130     void shutdown(UniqueIDBDatabaseShutdownType);
131
132     // Method that attempts to make legal filenames from all legal database names
133     String filenameForDatabaseName() const;
134
135     // Returns a string that is appropriate for use as a unique filename
136     String databaseFilenameIdentifier(const WebCore::SecurityOriginData&) const;
137
138     // Returns true if this origin can use the same databases as the given origin.
139     bool canShareDatabases(const WebCore::SecurityOriginData&, const WebCore::SecurityOriginData&) const;
140
141     void postTransactionOperation(const IDBIdentifier& transactionIdentifier, std::unique_ptr<WebCore::CrossThreadTask>, std::function<void (bool)> successCallback);
142     
143     // To be called from the database workqueue thread only
144     void performNextDatabaseTask();
145     void postMainThreadTask(std::unique_ptr<WebCore::CrossThreadTask>, DatabaseTaskType = DatabaseTaskType::Normal);
146     void openBackingStoreAndReadMetadata(const UniqueIDBDatabaseIdentifier&, const String& databaseDirectory);
147     void openBackingStoreTransaction(const IDBIdentifier& transactionIdentifier, const Vector<int64_t>& objectStoreIDs, WebCore::IndexedDB::TransactionMode);
148     void beginBackingStoreTransaction(const IDBIdentifier&);
149     void commitBackingStoreTransaction(const IDBIdentifier&);
150     void resetBackingStoreTransaction(const IDBIdentifier&);
151     void rollbackBackingStoreTransaction(const IDBIdentifier&);
152
153     void changeDatabaseVersionInBackingStore(uint64_t requestID, const IDBIdentifier& transactionIdentifier, uint64_t newVersion);
154     void createObjectStoreInBackingStore(uint64_t requestID, const IDBIdentifier& transactionIdentifier, const WebCore::IDBObjectStoreMetadata&);
155     void deleteObjectStoreInBackingStore(uint64_t requestID, const IDBIdentifier& transactionIdentifier, int64_t objectStoreID);
156     void clearObjectStoreInBackingStore(uint64_t requestID, const IDBIdentifier& transactionIdentifier, int64_t objectStoreID);
157
158     void createIndexInBackingStore(uint64_t requestID, const IDBIdentifier& transactionIdentifier, int64_t objectStoreID, const WebCore::IDBIndexMetadata&);
159     void deleteIndexInBackingStore(uint64_t requestID, const IDBIdentifier& transactionIdentifier, int64_t objectStoreID, int64_t indexID);
160
161     void putRecordInBackingStore(uint64_t requestID, const IDBIdentifier& transactionIdentifier, const WebCore::IDBObjectStoreMetadata&, const WebCore::IDBKeyData&, const Vector<uint8_t>& value, int64_t putMode, const Vector<int64_t>& indexIDs, const Vector<Vector<WebCore::IDBKeyData>>& indexKeys);
162     void getRecordFromBackingStore(uint64_t requestID, const IDBIdentifier& transactionIdentifier, const WebCore::IDBObjectStoreMetadata&, int64_t indexID, const WebCore::IDBKeyRangeData&, WebCore::IndexedDB::CursorType);
163     void openCursorInBackingStore(uint64_t requestID, const IDBIdentifier& transactionIdentifier, int64_t objectStoreID, int64_t indexID, WebCore::IndexedDB::CursorDirection, WebCore::IndexedDB::CursorType, WebCore::IDBDatabaseBackend::TaskType, const WebCore::IDBKeyRangeData&);
164     void advanceCursorInBackingStore(uint64_t requestID, const IDBIdentifier& cursorIdentifier, uint64_t count);
165     void iterateCursorInBackingStore(uint64_t requestID, const IDBIdentifier& cursorIdentifier, const WebCore::IDBKeyData&);
166     void countInBackingStore(uint64_t requestID, const IDBIdentifier& transactionIdentifier, int64_t objectStoreID, int64_t indexID, const WebCore::IDBKeyRangeData&);
167     void deleteRangeInBackingStore(uint64_t requestID, const IDBIdentifier& transactionIdentifier, int64_t objectStoreID, const WebCore::IDBKeyRangeData&);
168
169     void shutdownBackingStore(UniqueIDBDatabaseShutdownType, const String& databaseDirectory);
170
171     // Callbacks from the database workqueue thread, to be performed on the main thread only
172     bool performNextMainThreadTask();
173     void didOpenBackingStoreAndReadMetadata(const WebCore::IDBDatabaseMetadata&, bool success);
174     void didCompleteTransactionOperation(const IDBIdentifier& transactionIdentifier, bool success);
175     void didChangeDatabaseVersion(uint64_t requestID, bool success);
176     void didCreateObjectStore(uint64_t requestID, bool success);
177     void didDeleteObjectStore(uint64_t requestID, bool success);
178     void didClearObjectStore(uint64_t requestID, bool success);
179     void didCreateIndex(uint64_t requestID, bool success);
180     void didDeleteIndex(uint64_t requestID, bool success);
181     void didPutRecordInBackingStore(uint64_t requestID, const WebCore::IDBKeyData&, uint32_t errorCode, const String& errorMessage);
182     void didGetRecordFromBackingStore(uint64_t requestID, const WebCore::IDBGetResult&, uint32_t errorCode, const String& errorMessage);
183     void didOpenCursorInBackingStore(uint64_t requestID, int64_t cursorID, const WebCore::IDBKeyData&, const WebCore::IDBKeyData&, const Vector<uint8_t>&, uint32_t errorCode, const String& errorMessage);
184     void didAdvanceCursorInBackingStore(uint64_t requestID, const WebCore::IDBKeyData&, const WebCore::IDBKeyData&, const Vector<uint8_t>&, uint32_t errorCode, const String& errorMessage);
185     void didIterateCursorInBackingStore(uint64_t requestID, const WebCore::IDBKeyData&, const WebCore::IDBKeyData&, const Vector<uint8_t>&, uint32_t errorCode, const String& errorMessage);
186     void didCountInBackingStore(uint64_t requestID, int64_t count, uint32_t errorCode, const String& errorMessage);
187     void didDeleteRangeInBackingStore(uint64_t requestID, uint32_t errorCode, const String& errorMessage);
188
189     void didShutdownBackingStore(UniqueIDBDatabaseShutdownType);
190     void didCompleteBoolRequest(uint64_t requestID, bool success);
191
192     void didEstablishTransaction(const IDBIdentifier& transactionIdentifier, bool success);
193     void didResetTransaction(const IDBIdentifier& transactionIdentifier, bool success);
194     void resetAllTransactions(const DatabaseProcessIDBConnection&);
195     void finalizeRollback(const IDBIdentifier& transactionId);
196
197     bool m_acceptingNewRequests;
198
199     HashMap<const DatabaseProcessIDBConnection*, HashSet<IDBIdentifier>> m_establishedTransactions;
200     Deque<RefPtr<AsyncRequest>> m_pendingMetadataRequests;
201     HashMap<IDBIdentifier, RefPtr<AsyncRequest>> m_pendingTransactionRequests;
202     HashSet<IDBIdentifier> m_pendingTransactionRollbacks;
203     AsyncRequestMap m_pendingDatabaseTasks;
204     RefPtr<AsyncRequest> m_pendingShutdownTask;
205
206     std::unique_ptr<WebCore::IDBDatabaseMetadata> m_metadata;
207     bool m_didGetMetadataFromBackingStore;
208
209     RefPtr<UniqueIDBDatabaseBackingStore> m_backingStore;
210
211     Deque<std::unique_ptr<WebCore::CrossThreadTask>> m_databaseTasks;
212     Lock m_databaseTaskMutex;
213
214     Deque<std::unique_ptr<WebCore::CrossThreadTask>> m_mainThreadTasks;
215     Lock m_mainThreadTaskMutex;
216 };
217
218 } // namespace WebKit
219
220 #endif // ENABLE(INDEXED_DATABASE) && ENABLE(DATABASE_PROCESS)
221 #endif // UniqueIDBDatabase_h