dfe8a00b8fba6c4ac2d7c5ad3a7d6b7104fb67de
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / server / UniqueIDBDatabaseConnection.cpp
1 /*
2  * Copyright (C) 2015 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 #include "config.h"
27 #include "UniqueIDBDatabaseConnection.h"
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "IDBConnectionToClient.h"
32 #include "IDBServer.h"
33 #include "IDBTransactionInfo.h"
34 #include "Logging.h"
35 #include "UniqueIDBDatabase.h"
36
37 namespace WebCore {
38 namespace IDBServer {
39
40 static uint64_t nextDatabaseConnectionIdentifier()
41 {
42     static uint64_t nextIdentifier = 0;
43     return ++nextIdentifier;
44 }
45
46 Ref<UniqueIDBDatabaseConnection> UniqueIDBDatabaseConnection::create(UniqueIDBDatabase& database, IDBConnectionToClient& connection)
47 {
48     return adoptRef(*new UniqueIDBDatabaseConnection(database, connection));
49 }
50
51 UniqueIDBDatabaseConnection::UniqueIDBDatabaseConnection(UniqueIDBDatabase& database, IDBConnectionToClient& connection)
52     : m_identifier(nextDatabaseConnectionIdentifier())
53     , m_database(database)
54     , m_connectionToClient(connection)
55 {
56     m_database.server().registerDatabaseConnection(*this);
57 }
58
59 UniqueIDBDatabaseConnection::~UniqueIDBDatabaseConnection()
60 {
61     m_database.server().unregisterDatabaseConnection(*this);
62 }
63
64 bool UniqueIDBDatabaseConnection::hasNonFinishedTransactions() const
65 {
66     return !m_transactionMap.isEmpty();
67 }
68
69 void UniqueIDBDatabaseConnection::connectionClosedFromClient()
70 {
71     LOG(IndexedDB, "UniqueIDBDatabaseConnection::connectionClosedFromClient");
72
73     m_closePending = true;
74     m_database.connectionClosedFromClient(*this);
75 }
76
77 void UniqueIDBDatabaseConnection::fireVersionChangeEvent(uint64_t requestedVersion)
78 {
79     ASSERT(!m_closePending);
80     m_connectionToClient.fireVersionChangeEvent(*this, requestedVersion);
81 }
82
83 UniqueIDBDatabaseTransaction& UniqueIDBDatabaseConnection::createVersionChangeTransaction(uint64_t newVersion)
84 {
85     LOG(IndexedDB, "UniqueIDBDatabaseConnection::createVersionChangeTransaction");
86     ASSERT(!m_closePending);
87
88     IDBTransactionInfo info = IDBTransactionInfo::versionChange(m_connectionToClient, newVersion);
89
90     Ref<UniqueIDBDatabaseTransaction> transaction = UniqueIDBDatabaseTransaction::create(*this, info);
91     m_transactionMap.set(transaction->info().identifier(), &transaction.get());
92
93     return transaction.get();
94 }
95
96 void UniqueIDBDatabaseConnection::establishTransaction(const IDBTransactionInfo& info)
97 {
98     LOG(IndexedDB, "UniqueIDBDatabaseConnection::establishTransaction");
99
100     ASSERT(info.mode() != IndexedDB::TransactionMode::VersionChange);
101
102     // No transactions should ever come from the client after the client has already told us
103     // the connection is closing.
104     ASSERT(!m_closePending);
105
106     Ref<UniqueIDBDatabaseTransaction> transaction = UniqueIDBDatabaseTransaction::create(*this, info);
107     m_transactionMap.set(transaction->info().identifier(), &transaction.get());
108     m_database.enqueueTransaction(WTF::move(transaction));
109 }
110
111 void UniqueIDBDatabaseConnection::didAbortTransaction(UniqueIDBDatabaseTransaction& transaction, const IDBError& error)
112 {
113     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didAbortTransaction");
114
115     auto transactionIdentifier = transaction.info().identifier();
116
117     ASSERT(m_transactionMap.contains(transactionIdentifier));
118     m_transactionMap.remove(transactionIdentifier);
119
120     m_connectionToClient.didAbortTransaction(transactionIdentifier, error);
121 }
122
123 void UniqueIDBDatabaseConnection::didCommitTransaction(UniqueIDBDatabaseTransaction& transaction, const IDBError& error)
124 {
125     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didCommitTransaction");
126
127     auto transactionIdentifier = transaction.info().identifier();
128
129     ASSERT(m_transactionMap.contains(transactionIdentifier));
130     m_transactionMap.remove(transactionIdentifier);
131
132     m_connectionToClient.didCommitTransaction(transactionIdentifier, error);
133 }
134
135 void UniqueIDBDatabaseConnection::didCreateObjectStore(const IDBResultData& resultData)
136 {
137     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didCreateObjectStore");
138
139     m_connectionToClient.didCreateObjectStore(resultData);
140 }
141
142 void UniqueIDBDatabaseConnection::didDeleteObjectStore(const IDBResultData& resultData)
143 {
144     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didDeleteObjectStore");
145
146     m_connectionToClient.didDeleteObjectStore(resultData);
147 }
148
149 void UniqueIDBDatabaseConnection::didClearObjectStore(const IDBResultData& resultData)
150 {
151     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didClearObjectStore");
152
153     m_connectionToClient.didClearObjectStore(resultData);
154 }
155
156 void UniqueIDBDatabaseConnection::didCreateIndex(const IDBResultData& resultData)
157 {
158     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didCreateIndex");
159
160     m_connectionToClient.didCreateIndex(resultData);
161 }
162
163 } // namespace IDBServer
164 } // namespace WebCore
165
166 #endif // ENABLE(INDEXED_DATABASE)