4d2624d5519b3629aaa9efcbf6464367ad3a9b7b
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / IDBGetAllResult.cpp
1 /*
2  * Copyright (C) 2016 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 "IDBGetAllResult.h"
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include <wtf/HashSet.h>
32
33 namespace WebCore {
34
35 template<typename T> void isolatedCopyOfVariant(const WTF::Variant<Vector<IDBKeyData>, Vector<IDBValue>, std::nullptr_t>& source, WTF::Variant<Vector<IDBKeyData>, Vector<IDBValue>, std::nullptr_t>& target)
36 {
37     target = Vector<T>();
38     auto& sourceVector = WTF::get<Vector<T>>(source);
39     auto& targetVector = WTF::get<Vector<T>>(target);
40     targetVector.reserveInitialCapacity(sourceVector.size());
41     for (auto& element : sourceVector)
42         targetVector.uncheckedAppend(element.isolatedCopy());
43 }
44
45 IDBGetAllResult::IDBGetAllResult(const IDBGetAllResult& that, IsolatedCopyTag)
46 {
47     isolatedCopy(that, *this);
48 }
49
50 IDBGetAllResult IDBGetAllResult::isolatedCopy() const
51 {
52     return { *this, IsolatedCopy };
53 }
54
55 void IDBGetAllResult::isolatedCopy(const IDBGetAllResult& source, IDBGetAllResult& destination)
56 {
57     destination.m_type = source.m_type;
58
59     if (WTF::holds_alternative<std::nullptr_t>(source.m_results))
60         return;
61
62     switch (source.m_type) {
63     case IndexedDB::GetAllType::Keys:
64         isolatedCopyOfVariant<IDBKeyData>(source.m_results, destination.m_results);
65         break;
66     case IndexedDB::GetAllType::Values:
67         isolatedCopyOfVariant<IDBValue>(source.m_results, destination.m_results);
68         break;
69     }
70 }
71
72 void IDBGetAllResult::addKey(IDBKeyData&& key)
73 {
74     ASSERT(m_type == IndexedDB::GetAllType::Keys);
75     ASSERT(WTF::holds_alternative<Vector<IDBKeyData>>(m_results));
76     WTF::get<Vector<IDBKeyData>>(m_results).append(WTFMove(key));
77 }
78
79 void IDBGetAllResult::addValue(IDBValue&& value)
80 {
81     ASSERT(m_type == IndexedDB::GetAllType::Values);
82     ASSERT(WTF::holds_alternative<Vector<IDBValue>>(m_results));
83     WTF::get<Vector<IDBValue>>(m_results).append(WTFMove(value));
84 }
85
86 const Vector<IDBKeyData>& IDBGetAllResult::keys() const
87 {
88     ASSERT(m_type == IndexedDB::GetAllType::Keys);
89     ASSERT(WTF::holds_alternative<Vector<IDBKeyData>>(m_results));
90     return WTF::get<Vector<IDBKeyData>>(m_results);
91 }
92
93 const Vector<IDBValue>& IDBGetAllResult::values() const
94 {
95     ASSERT(m_type == IndexedDB::GetAllType::Values);
96     ASSERT(WTF::holds_alternative<Vector<IDBValue>>(m_results));
97     return WTF::get<Vector<IDBValue>>(m_results);
98 }
99
100 Vector<String> IDBGetAllResult::allBlobFilePaths() const
101 {
102     ASSERT(m_type == IndexedDB::GetAllType::Values);
103
104     HashSet<String> pathSet;
105     for (auto& value : WTF::get<Vector<IDBValue>>(m_results)) {
106         for (auto& path : value.blobFilePaths())
107             pathSet.add(path);
108     }
109
110     return copyToVector(pathSet);
111 }
112
113 } // namespace WebCore
114
115 #endif // ENABLE(INDEXED_DATABASE)