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 "IDBResultData.h"
28
29#if ENABLE(INDEXED_DATABASE)
30
31#include "UniqueIDBDatabase.h"
32#include "UniqueIDBDatabaseConnection.h"
33#include "UniqueIDBDatabaseTransaction.h"
34
35namespace WebCore {
36
37IDBResultData::IDBResultData()
38{
39}
40
41IDBResultData::IDBResultData(const IDBResourceIdentifier& requestIdentifier)
42 : m_requestIdentifier(requestIdentifier)
43{
44}
45
46IDBResultData::IDBResultData(IDBResultType type, const IDBResourceIdentifier& requestIdentifier)
47 : m_type(type)
48 , m_requestIdentifier(requestIdentifier)
49{
50}
51
52IDBResultData::IDBResultData(const IDBResultData& other)
53 : m_type(other.m_type)
54 , m_requestIdentifier(other.m_requestIdentifier)
55 , m_error(other.m_error)
56 , m_databaseConnectionIdentifier(other.m_databaseConnectionIdentifier)
57 , m_resultInteger(other.m_resultInteger)
58{
59 if (other.m_databaseInfo)
60 m_databaseInfo = std::make_unique<IDBDatabaseInfo>(*other.m_databaseInfo);
61 if (other.m_transactionInfo)
62 m_transactionInfo = std::make_unique<IDBTransactionInfo>(*other.m_transactionInfo);
63 if (other.m_resultKey)
64 m_resultKey = std::make_unique<IDBKeyData>(*other.m_resultKey);
65 if (other.m_getResult)
66 m_getResult = std::make_unique<IDBGetResult>(*other.m_getResult);
67 if (other.m_getAllResult)
68 m_getAllResult = std::make_unique<IDBGetAllResult>(*other.m_getAllResult);
69}
70
71IDBResultData::IDBResultData(const IDBResultData& that, IsolatedCopyTag)
72{
73 isolatedCopy(that, *this);
74}
75
76IDBResultData IDBResultData::isolatedCopy() const
77{
78 return { *this, IsolatedCopy };
79}
80
81void IDBResultData::isolatedCopy(const IDBResultData& source, IDBResultData& destination)
82{
83 destination.m_type = source.m_type;
84 destination.m_requestIdentifier = source.m_requestIdentifier.isolatedCopy();
85 destination.m_error = source.m_error.isolatedCopy();
86 destination.m_databaseConnectionIdentifier = source.m_databaseConnectionIdentifier;
87 destination.m_resultInteger = source.m_resultInteger;
88
89 if (source.m_databaseInfo)
90 destination.m_databaseInfo = std::make_unique<IDBDatabaseInfo>(*source.m_databaseInfo, IDBDatabaseInfo::IsolatedCopy);
91 if (source.m_transactionInfo)
92 destination.m_transactionInfo = std::make_unique<IDBTransactionInfo>(*source.m_transactionInfo, IDBTransactionInfo::IsolatedCopy);
93 if (source.m_resultKey)
94 destination.m_resultKey = std::make_unique<IDBKeyData>(*source.m_resultKey, IDBKeyData::IsolatedCopy);
95 if (source.m_getResult)
96 destination.m_getResult = std::make_unique<IDBGetResult>(*source.m_getResult, IDBGetResult::IsolatedCopy);
97 if (source.m_getAllResult)
98 destination.m_getAllResult = std::make_unique<IDBGetAllResult>(*source.m_getAllResult, IDBGetAllResult::IsolatedCopy);
99}
100
101IDBResultData IDBResultData::error(const IDBResourceIdentifier& requestIdentifier, const IDBError& error)
102{
103 IDBResultData result { requestIdentifier };
104 result.m_type = IDBResultType::Error;
105 result.m_error = error;
106 return result;
107}
108
109IDBResultData IDBResultData::openDatabaseSuccess(const IDBResourceIdentifier& requestIdentifier, IDBServer::UniqueIDBDatabaseConnection& connection)
110{
111 IDBResultData result { requestIdentifier };
112 result.m_type = IDBResultType::OpenDatabaseSuccess;
113 result.m_databaseConnectionIdentifier = connection.identifier();
114 result.m_databaseInfo = std::make_unique<IDBDatabaseInfo>(connection.database()->info());
115 return result;
116}
117
118
119IDBResultData IDBResultData::openDatabaseUpgradeNeeded(const IDBResourceIdentifier& requestIdentifier, IDBServer::UniqueIDBDatabaseTransaction& transaction)
120{
121 IDBResultData result { requestIdentifier };
122 result.m_type = IDBResultType::OpenDatabaseUpgradeNeeded;
123 result.m_databaseConnectionIdentifier = transaction.databaseConnection().identifier();
124 result.m_databaseInfo = std::make_unique<IDBDatabaseInfo>(transaction.databaseConnection().database()->info());
125 result.m_transactionInfo = std::make_unique<IDBTransactionInfo>(transaction.info());
126 return result;
127}
128
129IDBResultData IDBResultData::deleteDatabaseSuccess(const IDBResourceIdentifier& requestIdentifier, const IDBDatabaseInfo& info)
130{
131 IDBResultData result {IDBResultType::DeleteDatabaseSuccess, requestIdentifier };
132 result.m_databaseInfo = std::make_unique<IDBDatabaseInfo>(info);
133 return result;
134}
135
136IDBResultData IDBResultData::createObjectStoreSuccess(const IDBResourceIdentifier& requestIdentifier)
137{
138 return { IDBResultType::CreateObjectStoreSuccess, requestIdentifier };
139}
140
141IDBResultData IDBResultData::deleteObjectStoreSuccess(const IDBResourceIdentifier& requestIdentifier)
142{
143 return { IDBResultType::DeleteObjectStoreSuccess, requestIdentifier };
144}
145
146IDBResultData IDBResultData::renameObjectStoreSuccess(const IDBResourceIdentifier& requestIdentifier)
147{
148 return { IDBResultType::RenameObjectStoreSuccess, requestIdentifier };
149}
150
151IDBResultData IDBResultData::clearObjectStoreSuccess(const IDBResourceIdentifier& requestIdentifier)
152{
153 return { IDBResultType::ClearObjectStoreSuccess, requestIdentifier };
154}
155
156IDBResultData IDBResultData::createIndexSuccess(const IDBResourceIdentifier& requestIdentifier)
157{
158 return { IDBResultType::CreateIndexSuccess, requestIdentifier };
159}
160
161IDBResultData IDBResultData::deleteIndexSuccess(const IDBResourceIdentifier& requestIdentifier)
162{
163 return { IDBResultType::DeleteIndexSuccess, requestIdentifier };
164}
165
166IDBResultData IDBResultData::renameIndexSuccess(const IDBResourceIdentifier& requestIdentifier)
167{
168 return { IDBResultType::RenameIndexSuccess, requestIdentifier };
169}
170
171IDBResultData IDBResultData::putOrAddSuccess(const IDBResourceIdentifier& requestIdentifier, const IDBKeyData& resultKey)
172{
173 IDBResultData result { IDBResultType::PutOrAddSuccess, requestIdentifier };
174 result.m_resultKey = std::make_unique<IDBKeyData>(resultKey);
175 return result;
176}
177
178IDBResultData IDBResultData::getRecordSuccess(const IDBResourceIdentifier& requestIdentifier, const IDBGetResult& getResult)
179{
180 IDBResultData result { IDBResultType::GetRecordSuccess, requestIdentifier };
181 result.m_getResult = std::make_unique<IDBGetResult>(getResult);
182 return result;
183}
184
185IDBResultData IDBResultData::getAllRecordsSuccess(const IDBResourceIdentifier& requestIdentifier, const IDBGetAllResult& getAllResult)
186{
187 IDBResultData result { IDBResultType::GetAllRecordsSuccess, requestIdentifier };
188 result.m_getAllResult = std::make_unique<IDBGetAllResult>(getAllResult);
189 return result;
190}
191
192IDBResultData IDBResultData::getCountSuccess(const IDBResourceIdentifier& requestIdentifier, uint64_t count)
193{
194 IDBResultData result { IDBResultType::GetRecordSuccess, requestIdentifier };
195 result.m_resultInteger = count;
196 return result;
197}
198
199IDBResultData IDBResultData::deleteRecordSuccess(const IDBResourceIdentifier& requestIdentifier)
200{
201 return { IDBResultType::DeleteRecordSuccess, requestIdentifier };
202}
203
204IDBResultData IDBResultData::openCursorSuccess(const IDBResourceIdentifier& requestIdentifier, const IDBGetResult& getResult)
205{
206 IDBResultData result { IDBResultType::OpenCursorSuccess, requestIdentifier };
207 result.m_getResult = std::make_unique<IDBGetResult>(getResult);
208 return result;
209}
210
211IDBResultData IDBResultData::iterateCursorSuccess(const IDBResourceIdentifier& requestIdentifier, const IDBGetResult& getResult)
212{
213 IDBResultData result { IDBResultType::IterateCursorSuccess, requestIdentifier };
214 result.m_getResult = std::make_unique<IDBGetResult>(getResult);
215 return result;
216}
217
218const IDBDatabaseInfo& IDBResultData::databaseInfo() const
219{
220 RELEASE_ASSERT(m_databaseInfo);
221 return *m_databaseInfo;
222}
223
224const IDBTransactionInfo& IDBResultData::transactionInfo() const
225{
226 RELEASE_ASSERT(m_transactionInfo);
227 return *m_transactionInfo;
228}
229
230const IDBGetResult& IDBResultData::getResult() const
231{
232 RELEASE_ASSERT(m_getResult);
233 return *m_getResult;
234}
235
236IDBGetResult& IDBResultData::getResultRef()
237{
238 RELEASE_ASSERT(m_getResult);
239 return *m_getResult;
240}
241
242const IDBGetAllResult& IDBResultData::getAllResult() const
243{
244 RELEASE_ASSERT(m_getAllResult);
245 return *m_getAllResult;
246}
247
248} // namespace WebCore
249
250#endif // ENABLE(INDEXED_DATABASE)
251