ba9b55b055ae9524e4412a669fb3310952d6365c
[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 "IDBTransactionIdentifier.h"
32 #include "UniqueIDBDatabaseIdentifier.h"
33 #include <WebCore/IndexedDB.h>
34 #include <functional>
35 #include <wtf/Deque.h>
36 #include <wtf/HashSet.h>
37 #include <wtf/PassRefPtr.h>
38 #include <wtf/RefCounted.h>
39 #include <wtf/text/WTFString.h>
40
41 namespace WebCore {
42 struct IDBDatabaseMetadata;
43 struct IDBKeyData;
44 }
45
46 namespace WebKit {
47
48 class AsyncRequest;
49 class AsyncTask;
50 class DatabaseProcessIDBConnection;
51 class UniqueIDBDatabaseBackingStore;
52
53 struct SecurityOriginData;
54
55 class UniqueIDBDatabase : public ThreadSafeRefCounted<UniqueIDBDatabase> {
56 public:
57     static PassRefPtr<UniqueIDBDatabase> create(const UniqueIDBDatabaseIdentifier& identifier)
58     {
59         return adoptRef(new UniqueIDBDatabase(identifier));
60     }
61
62     ~UniqueIDBDatabase();
63
64     const UniqueIDBDatabaseIdentifier& identifier() const { return m_identifier; }
65
66     void registerConnection(DatabaseProcessIDBConnection&);
67     void unregisterConnection(DatabaseProcessIDBConnection&);
68
69     void getOrEstablishIDBDatabaseMetadata(std::function<void(bool, const WebCore::IDBDatabaseMetadata&)> completionCallback);
70
71     void openTransaction(const IDBTransactionIdentifier&, const Vector<int64_t>& objectStoreIDs, WebCore::IndexedDB::TransactionMode, std::function<void(bool)> successCallback);
72     void beginTransaction(const IDBTransactionIdentifier&, std::function<void(bool)> successCallback);
73     void commitTransaction(const IDBTransactionIdentifier&, std::function<void(bool)> successCallback);
74     void resetTransaction(const IDBTransactionIdentifier&, std::function<void(bool)> successCallback);
75     void rollbackTransaction(const IDBTransactionIdentifier&, std::function<void(bool)> successCallback);
76
77     void changeDatabaseVersion(const IDBTransactionIdentifier&, uint64_t newVersion, std::function<void(bool)> successCallback);
78     void createObjectStore(const IDBTransactionIdentifier&, const WebCore::IDBObjectStoreMetadata&, std::function<void(bool)> successCallback);
79     void deleteObjectStore(const IDBTransactionIdentifier&, int64_t objectStoreID, std::function<void(bool)> successCallback);
80     void putRecord(const IDBTransactionIdentifier&, 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);
81
82 private:
83     UniqueIDBDatabase(const UniqueIDBDatabaseIdentifier&);
84
85     UniqueIDBDatabaseIdentifier m_identifier;
86
87     bool m_inMemory;
88     String m_databaseRelativeDirectory;
89
90     HashSet<RefPtr<DatabaseProcessIDBConnection>> m_connections;
91     HashMap<uint64_t, RefPtr<AsyncRequest>> m_databaseRequests;
92
93     String absoluteDatabaseDirectory() const;
94
95     void postDatabaseTask(std::unique_ptr<AsyncTask>);
96     void shutdown();
97
98     // Method that attempts to make legal filenames from all legal database names
99     String filenameForDatabaseName() const;
100
101     // Returns a string that is appropriate for use as a unique filename
102     String databaseFilenameIdentifier(const SecurityOriginData&) const;
103
104     // Returns true if this origin can use the same databases as the given origin.
105     bool canShareDatabases(const SecurityOriginData&, const SecurityOriginData&) const;
106
107     void postTransactionOperation(const IDBTransactionIdentifier&, std::unique_ptr<AsyncTask>, std::function<void(bool)> successCallback);
108     
109     // To be called from the database workqueue thread only
110     void performNextDatabaseTask();
111     void postMainThreadTask(std::unique_ptr<AsyncTask>);
112     void openBackingStoreAndReadMetadata(const UniqueIDBDatabaseIdentifier&, const String& databaseDirectory);
113     void openBackingStoreTransaction(const IDBTransactionIdentifier&, const Vector<int64_t>& objectStoreIDs, WebCore::IndexedDB::TransactionMode);
114     void beginBackingStoreTransaction(const IDBTransactionIdentifier&);
115     void commitBackingStoreTransaction(const IDBTransactionIdentifier&);
116     void resetBackingStoreTransaction(const IDBTransactionIdentifier&);
117     void rollbackBackingStoreTransaction(const IDBTransactionIdentifier&);
118
119     void changeDatabaseVersionInBackingStore(uint64_t requestID, const IDBTransactionIdentifier&, uint64_t newVersion);
120     void createObjectStoreInBackingStore(uint64_t requestID, const IDBTransactionIdentifier&, const WebCore::IDBObjectStoreMetadata&);
121     void deleteObjectStoreInBackingStore(uint64_t requestID, const IDBTransactionIdentifier&, int64_t objectStoreID);
122     void putRecordInBackingStore(uint64_t requestID, const IDBTransactionIdentifier&, 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);
123
124
125     void shutdownBackingStore();
126
127     // Callbacks from the database workqueue thread, to be performed on the main thread only
128     void performNextMainThreadTask();
129     void didOpenBackingStoreAndReadMetadata(const WebCore::IDBDatabaseMetadata&, bool success);
130     void didCompleteTransactionOperation(const IDBTransactionIdentifier&, bool success);
131     void didChangeDatabaseVersion(uint64_t requestID, bool success);
132     void didCreateObjectStore(uint64_t requestID, bool success);
133     void didDeleteObjectStore(uint64_t requestID, bool success);
134     void didPutRecordInBackingStore(uint64_t requestID, const WebCore::IDBKeyData&, uint32_t errorCode, const String& errorMessage);
135     void didShutdownBackingStore();
136     void didCompleteBoolRequest(uint64_t requestID, bool success);
137
138     bool m_acceptingNewRequests;
139
140     Deque<RefPtr<AsyncRequest>> m_pendingMetadataRequests;
141     HashMap<IDBTransactionIdentifier, RefPtr<AsyncRequest>> m_pendingTransactionRequests;
142     HashMap<uint64_t, RefPtr<AsyncRequest>> m_pendingDatabaseTasks;
143
144     std::unique_ptr<WebCore::IDBDatabaseMetadata> m_metadata;
145     bool m_didGetMetadataFromBackingStore;
146
147     RefPtr<UniqueIDBDatabaseBackingStore> m_backingStore;
148
149     Deque<std::unique_ptr<AsyncTask>> m_databaseTasks;
150     Mutex m_databaseTaskMutex;
151
152     Deque<std::unique_ptr<AsyncTask>> m_mainThreadTasks;
153     Mutex m_mainThreadTaskMutex;
154 };
155
156 } // namespace WebKit
157
158 #endif // ENABLE(INDEXED_DATABASE) && ENABLE(DATABASE_PROCESS)
159 #endif // UniqueIDBDatabase_h