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