Replace WTF::move with WTFMove
[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 - %" PRIu64, m_identifier);
72
73     m_closePending = true;
74     m_database.connectionClosedFromClient(*this);
75 }
76
77 void UniqueIDBDatabaseConnection::didFireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier)
78 {
79     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didFireVersionChangeEvent");
80
81     m_database.didFireVersionChangeEvent(*this, requestIdentifier);
82 }
83
84 void UniqueIDBDatabaseConnection::fireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion)
85 {
86     ASSERT(!m_closePending);
87     m_connectionToClient.fireVersionChangeEvent(*this, requestIdentifier, requestedVersion);
88 }
89
90 UniqueIDBDatabaseTransaction& UniqueIDBDatabaseConnection::createVersionChangeTransaction(uint64_t newVersion)
91 {
92     LOG(IndexedDB, "UniqueIDBDatabaseConnection::createVersionChangeTransaction");
93     ASSERT(!m_closePending);
94
95     IDBTransactionInfo info = IDBTransactionInfo::versionChange(m_connectionToClient, m_database.info(), newVersion);
96
97     Ref<UniqueIDBDatabaseTransaction> transaction = UniqueIDBDatabaseTransaction::create(*this, info);
98     m_transactionMap.set(transaction->info().identifier(), &transaction.get());
99
100     return transaction.get();
101 }
102
103 void UniqueIDBDatabaseConnection::establishTransaction(const IDBTransactionInfo& info)
104 {
105     LOG(IndexedDB, "UniqueIDBDatabaseConnection::establishTransaction");
106
107     ASSERT(info.mode() != IndexedDB::TransactionMode::VersionChange);
108
109     // No transactions should ever come from the client after the client has already told us
110     // the connection is closing.
111     ASSERT(!m_closePending);
112
113     Ref<UniqueIDBDatabaseTransaction> transaction = UniqueIDBDatabaseTransaction::create(*this, info);
114     m_transactionMap.set(transaction->info().identifier(), &transaction.get());
115     m_database.enqueueTransaction(WTFMove(transaction));
116 }
117
118 void UniqueIDBDatabaseConnection::didAbortTransaction(UniqueIDBDatabaseTransaction& transaction, const IDBError& error)
119 {
120     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didAbortTransaction");
121
122     auto transactionIdentifier = transaction.info().identifier();
123
124     ASSERT(m_transactionMap.contains(transactionIdentifier));
125     m_transactionMap.remove(transactionIdentifier);
126
127     m_connectionToClient.didAbortTransaction(transactionIdentifier, error);
128 }
129
130 void UniqueIDBDatabaseConnection::didCommitTransaction(UniqueIDBDatabaseTransaction& transaction, const IDBError& error)
131 {
132     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didCommitTransaction");
133
134     auto transactionIdentifier = transaction.info().identifier();
135
136     ASSERT(m_transactionMap.contains(transactionIdentifier));
137     m_transactionMap.remove(transactionIdentifier);
138
139     m_connectionToClient.didCommitTransaction(transactionIdentifier, error);
140 }
141
142 void UniqueIDBDatabaseConnection::didCreateObjectStore(const IDBResultData& resultData)
143 {
144     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didCreateObjectStore");
145
146     m_connectionToClient.didCreateObjectStore(resultData);
147 }
148
149 void UniqueIDBDatabaseConnection::didDeleteObjectStore(const IDBResultData& resultData)
150 {
151     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didDeleteObjectStore");
152
153     m_connectionToClient.didDeleteObjectStore(resultData);
154 }
155
156 void UniqueIDBDatabaseConnection::didClearObjectStore(const IDBResultData& resultData)
157 {
158     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didClearObjectStore");
159
160     m_connectionToClient.didClearObjectStore(resultData);
161 }
162
163 void UniqueIDBDatabaseConnection::didCreateIndex(const IDBResultData& resultData)
164 {
165     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didCreateIndex");
166
167     m_connectionToClient.didCreateIndex(resultData);
168 }
169
170 void UniqueIDBDatabaseConnection::didDeleteIndex(const IDBResultData& resultData)
171 {
172     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didDeleteIndex");
173
174     m_connectionToClient.didDeleteIndex(resultData);
175 }
176
177 } // namespace IDBServer
178 } // namespace WebCore
179
180 #endif // ENABLE(INDEXED_DATABASE)