43351be0aab8655b9c3d9d700c2de336dbed71e7
[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::didAbortTransaction(UniqueIDBDatabaseTransaction& transaction, const IDBError& error)
97 {
98     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didAbortTransaction");
99
100     auto transactionIdentifier = transaction.info().identifier();
101
102     ASSERT(m_transactionMap.contains(transactionIdentifier));
103     m_transactionMap.remove(transactionIdentifier);
104
105     m_connectionToClient.didAbortTransaction(transactionIdentifier, error);
106 }
107
108 void UniqueIDBDatabaseConnection::didCommitTransaction(UniqueIDBDatabaseTransaction& transaction, const IDBError& error)
109 {
110     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didCommitTransaction");
111
112     auto transactionIdentifier = transaction.info().identifier();
113
114     ASSERT(m_transactionMap.contains(transactionIdentifier));
115     m_transactionMap.remove(transactionIdentifier);
116
117     m_connectionToClient.didCommitTransaction(transactionIdentifier, error);
118 }
119
120 } // namespace IDBServer
121 } // namespace WebCore
122
123 #endif // ENABLE(INDEXED_DATABASE)