Move basic IDBBackingStoreTransaction operations to IDBServerConnection
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / leveldb / IDBServerConnectionLevelDB.cpp
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 #include "config.h"
27 #include "IDBServerConnectionLevelDB.h"
28
29 #if ENABLE(INDEXED_DATABASE)
30 #if USE(LEVELDB)
31
32 #include "IDBBackingStoreLevelDB.h"
33 #include "IDBBackingStoreTransactionLevelDB.h"
34 #include <wtf/MainThread.h>
35
36 namespace WebCore {
37
38 IDBServerConnectionLevelDB::IDBServerConnectionLevelDB(IDBBackingStoreLevelDB* backingStore)
39     : m_backingStore(backingStore)
40     , m_closed(false)
41 {
42 }
43
44 IDBServerConnectionLevelDB::~IDBServerConnectionLevelDB()
45 {
46 }
47
48 IDBBackingStoreInterface* IDBServerConnectionLevelDB::deprecatedBackingStore()
49 {
50     return m_backingStore.get();
51 }
52
53 IDBBackingStoreTransactionInterface* IDBServerConnectionLevelDB::deprecatedBackingStoreTransaction(int64_t transactionID)
54 {
55     if (!m_backingStore)
56         return 0;
57     return m_backingStore->deprecatedBackingStoreTransaction(transactionID);
58 }
59
60 bool IDBServerConnectionLevelDB::isClosed()
61 {
62     return m_closed;
63 }
64
65 void IDBServerConnectionLevelDB::getOrEstablishIDBDatabaseMetadata(const String& name, GetIDBDatabaseMetadataFunction callback)
66 {
67     RefPtr<IDBServerConnection> self(this);
68     m_backingStore->getOrEstablishIDBDatabaseMetadata(name, [self, this, callback](const IDBDatabaseMetadata& metadata, bool success) {
69         callback(metadata, success);
70     });
71 }
72
73 void IDBServerConnectionLevelDB::deleteDatabase(const String& name, BoolCallbackFunction successCallback)
74 {
75     RefPtr<IDBServerConnection> self(this);
76     m_backingStore->deleteDatabase(name, [self, this, successCallback](bool success) {
77         successCallback(success);
78     });
79 }
80
81 void IDBServerConnectionLevelDB::close()
82 {
83     m_backingStore.clear();
84     m_closed = true;
85 }
86
87 void IDBServerConnectionLevelDB::openTransaction(int64_t transactionID, const HashSet<int64_t>&, IndexedDB::TransactionMode, BoolCallbackFunction successCallback)
88 {
89     if (!m_backingStore) {
90         callOnMainThread([successCallback]() {
91             successCallback(false);
92         });
93         return;
94     }
95
96     m_backingStore->establishBackingStoreTransaction(transactionID);
97     callOnMainThread([successCallback]() {
98         successCallback(true);
99     });
100 }
101
102 void IDBServerConnectionLevelDB::beginTransaction(int64_t transactionID, std::function<void()> completionCallback)
103 {
104     RefPtr<IDBBackingStoreTransactionLevelDB> transaction = m_backingStoreTransactions.get(transactionID);
105     ASSERT(transaction);
106
107     transaction->begin();
108     callOnMainThread(completionCallback);
109 }
110
111 void IDBServerConnectionLevelDB::commitTransaction(int64_t transactionID, BoolCallbackFunction successCallback)
112 {
113     RefPtr<IDBBackingStoreTransactionLevelDB> transaction = m_backingStoreTransactions.get(transactionID);
114     ASSERT(transaction);
115
116     bool result = transaction->commit();
117     callOnMainThread([successCallback, result]() {
118         successCallback(result);
119     });
120 }
121
122 void IDBServerConnectionLevelDB::resetTransaction(int64_t transactionID, std::function<void()> completionCallback)
123 {
124     RefPtr<IDBBackingStoreTransactionLevelDB> transaction = m_backingStoreTransactions.get(transactionID);
125     ASSERT(transaction);
126
127     transaction->resetTransaction();
128     callOnMainThread(completionCallback);
129 }
130
131 void IDBServerConnectionLevelDB::rollbackTransaction(int64_t transactionID, std::function<void()> completionCallback)
132 {
133     RefPtr<IDBBackingStoreTransactionLevelDB> transaction = m_backingStoreTransactions.get(transactionID);
134     ASSERT(transaction);
135
136     transaction->rollback();
137     callOnMainThread(completionCallback);
138 }
139
140 } // namespace WebCore
141
142 #endif // USE(LEVELDB)
143 #endif // ENABLE(INDEXED_DATABASE)