Modern IDB: Pipe through cursor functions from client to server.
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / shared / IDBResultData.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 "IDBResultData.h"
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "UniqueIDBDatabase.h"
32 #include "UniqueIDBDatabaseConnection.h"
33 #include "UniqueIDBDatabaseTransaction.h"
34
35 namespace WebCore {
36
37 IDBResultData::IDBResultData(const IDBResourceIdentifier& requestIdentifier)
38     : m_requestIdentifier(requestIdentifier)
39 {
40 }
41
42 IDBResultData::IDBResultData(IDBResultType type, const IDBResourceIdentifier& requestIdentifier)
43     : m_type(type)
44     , m_requestIdentifier(requestIdentifier)
45 {
46 }
47
48 IDBResultData::IDBResultData(const IDBResultData& other)
49     : m_type(other.m_type)
50     , m_requestIdentifier(other.m_requestIdentifier)
51     , m_error(other.m_error)
52     , m_databaseConnectionIdentifier(other.m_databaseConnectionIdentifier)
53     , m_resultInteger(other.m_resultInteger)
54 {
55     if (other.m_databaseInfo)
56         m_databaseInfo = std::make_unique<IDBDatabaseInfo>(*other.m_databaseInfo);
57     if (other.m_transactionInfo)
58         m_transactionInfo = std::make_unique<IDBTransactionInfo>(*other.m_transactionInfo);
59     if (other.m_resultKey)
60         m_resultKey = std::make_unique<IDBKeyData>(*other.m_resultKey);
61     if (other.m_getResult)
62         m_getResult = std::make_unique<IDBGetResult>(*other.m_getResult);
63 }
64
65 IDBResultData IDBResultData::error(const IDBResourceIdentifier& requestIdentifier, const IDBError& error)
66 {
67     IDBResultData result(requestIdentifier);
68     result.m_type = IDBResultType::Error;
69     result.m_error = error;
70     return WTF::move(result);
71 }
72
73 IDBResultData IDBResultData::openDatabaseSuccess(const IDBResourceIdentifier& requestIdentifier, IDBServer::UniqueIDBDatabaseConnection& connection)
74 {
75     IDBResultData result(requestIdentifier);
76     result.m_type = IDBResultType::OpenDatabaseSuccess;
77     result.m_databaseConnectionIdentifier = connection.identifier();
78     result.m_databaseInfo = std::make_unique<IDBDatabaseInfo>(connection.database().info());
79     return WTF::move(result);
80 }
81
82
83 IDBResultData IDBResultData::openDatabaseUpgradeNeeded(const IDBResourceIdentifier& requestIdentifier, IDBServer::UniqueIDBDatabaseTransaction& transaction)
84 {
85     IDBResultData result(requestIdentifier);
86     result.m_type = IDBResultType::OpenDatabaseUpgradeNeeded;
87     result.m_databaseConnectionIdentifier = transaction.databaseConnection().identifier();
88     result.m_databaseInfo = std::make_unique<IDBDatabaseInfo>(transaction.databaseConnection().database().info());
89     result.m_transactionInfo = std::make_unique<IDBTransactionInfo>(transaction.info());
90     return WTF::move(result);
91 }
92
93 IDBResultData IDBResultData::createObjectStoreSuccess(const IDBResourceIdentifier& requestIdentifier)
94 {
95     return { IDBResultType::CreateObjectStoreSuccess, requestIdentifier };
96 }
97
98 IDBResultData IDBResultData::deleteObjectStoreSuccess(const IDBResourceIdentifier& requestIdentifier)
99 {
100     return { IDBResultType::DeleteObjectStoreSuccess, requestIdentifier };
101 }
102
103 IDBResultData IDBResultData::clearObjectStoreSuccess(const IDBResourceIdentifier& requestIdentifier)
104 {
105     return { IDBResultType::ClearObjectStoreSuccess, requestIdentifier };
106 }
107
108 IDBResultData IDBResultData::createIndexSuccess(const IDBResourceIdentifier& requestIdentifier)
109 {
110     return { IDBResultType::CreateIndexSuccess, requestIdentifier };
111 }
112
113 IDBResultData IDBResultData::putOrAddSuccess(const IDBResourceIdentifier& requestIdentifier, const IDBKeyData& resultKey)
114 {
115     IDBResultData result(IDBResultType::PutOrAddSuccess, requestIdentifier);
116     result.m_resultKey = std::make_unique<IDBKeyData>(resultKey);
117     return result;
118 }
119
120 IDBResultData IDBResultData::getRecordSuccess(const IDBResourceIdentifier& requestIdentifier, const IDBGetResult& getResult)
121 {
122     IDBResultData result(IDBResultType::GetRecordSuccess, requestIdentifier);
123     result.m_getResult = std::make_unique<IDBGetResult>(getResult);
124     return result;
125 }
126
127 IDBResultData IDBResultData::getCountSuccess(const IDBResourceIdentifier& requestIdentifier, uint64_t count)
128 {
129     IDBResultData result(IDBResultType::GetRecordSuccess, requestIdentifier);
130     result.m_resultInteger = count;
131     return result;
132 }
133
134 IDBResultData IDBResultData::deleteRecordSuccess(const IDBResourceIdentifier& requestIdentifier)
135 {
136     return { IDBResultType::DeleteRecordSuccess, requestIdentifier };
137 }
138
139 IDBResultData IDBResultData::openCursorSuccess(const IDBResourceIdentifier& requestIdentifier, const IDBGetResult& getResult)
140 {
141     IDBResultData result(IDBResultType::OpenCursorSuccess, requestIdentifier);
142     result.m_getResult = std::make_unique<IDBGetResult>(getResult);
143     return result;
144 }
145
146 IDBResultData IDBResultData::iterateCursorSuccess(const IDBResourceIdentifier& requestIdentifier, const IDBGetResult& getResult)
147 {
148     IDBResultData result(IDBResultType::IterateCursorSuccess, requestIdentifier);
149     result.m_getResult = std::make_unique<IDBGetResult>(getResult);
150     return result;
151 }
152
153 const IDBDatabaseInfo& IDBResultData::databaseInfo() const
154 {
155     RELEASE_ASSERT(m_databaseInfo);
156     return *m_databaseInfo;
157 }
158
159 const IDBTransactionInfo& IDBResultData::transactionInfo() const
160 {
161     RELEASE_ASSERT(m_transactionInfo);
162     return *m_transactionInfo;
163 }
164
165 const IDBGetResult& IDBResultData::getResult() const
166 {
167     RELEASE_ASSERT(m_getResult);
168     return *m_getResult;
169 }
170
171 } // namespace WebCore
172
173 #endif // ENABLE(INDEXED_DATABASE)