2 * Copyright (C) 2013 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
26 #ifndef UniqueIDBDatabase_h
27 #define UniqueIDBDatabase_h
29 #if ENABLE(INDEXED_DATABASE) && ENABLE(DATABASE_PROCESS)
31 #include "IDBTransactionIdentifier.h"
32 #include "UniqueIDBDatabaseIdentifier.h"
33 #include <WebCore/IndexedDB.h>
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>
42 struct IDBDatabaseMetadata;
50 class DatabaseProcessIDBConnection;
51 class UniqueIDBDatabaseBackingStore;
53 struct SecurityOriginData;
55 class UniqueIDBDatabase : public ThreadSafeRefCounted<UniqueIDBDatabase> {
57 static PassRefPtr<UniqueIDBDatabase> create(const UniqueIDBDatabaseIdentifier& identifier)
59 return adoptRef(new UniqueIDBDatabase(identifier));
64 const UniqueIDBDatabaseIdentifier& identifier() const { return m_identifier; }
66 void registerConnection(DatabaseProcessIDBConnection&);
67 void unregisterConnection(DatabaseProcessIDBConnection&);
69 void getOrEstablishIDBDatabaseMetadata(std::function<void(bool, const WebCore::IDBDatabaseMetadata&)> completionCallback);
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);
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);
83 UniqueIDBDatabase(const UniqueIDBDatabaseIdentifier&);
85 UniqueIDBDatabaseIdentifier m_identifier;
88 String m_databaseRelativeDirectory;
90 HashSet<RefPtr<DatabaseProcessIDBConnection>> m_connections;
91 HashMap<uint64_t, RefPtr<AsyncRequest>> m_databaseRequests;
93 String absoluteDatabaseDirectory() const;
95 void postDatabaseTask(std::unique_ptr<AsyncTask>);
98 // Method that attempts to make legal filenames from all legal database names
99 String filenameForDatabaseName() const;
101 // Returns a string that is appropriate for use as a unique filename
102 String databaseFilenameIdentifier(const SecurityOriginData&) const;
104 // Returns true if this origin can use the same databases as the given origin.
105 bool canShareDatabases(const SecurityOriginData&, const SecurityOriginData&) const;
107 void postTransactionOperation(const IDBTransactionIdentifier&, std::unique_ptr<AsyncTask>, std::function<void(bool)> successCallback);
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&);
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);
125 void shutdownBackingStore();
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);
138 bool m_acceptingNewRequests;
140 Deque<RefPtr<AsyncRequest>> m_pendingMetadataRequests;
141 HashMap<IDBTransactionIdentifier, RefPtr<AsyncRequest>> m_pendingTransactionRequests;
142 HashMap<uint64_t, RefPtr<AsyncRequest>> m_pendingDatabaseTasks;
144 std::unique_ptr<WebCore::IDBDatabaseMetadata> m_metadata;
145 bool m_didGetMetadataFromBackingStore;
147 RefPtr<UniqueIDBDatabaseBackingStore> m_backingStore;
149 Deque<std::unique_ptr<AsyncTask>> m_databaseTasks;
150 Mutex m_databaseTaskMutex;
152 Deque<std::unique_ptr<AsyncTask>> m_mainThreadTasks;
153 Mutex m_mainThreadTaskMutex;
156 } // namespace WebKit
158 #endif // ENABLE(INDEXED_DATABASE) && ENABLE(DATABASE_PROCESS)
159 #endif // UniqueIDBDatabase_h