/* * Copyright (C) 2016 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "IDBGetAllResult.h" #if ENABLE(INDEXED_DATABASE) #include namespace WebCore { template void isolatedCopyOfVariant(const WTF::Variant, Vector, std::nullptr_t>& source, WTF::Variant, Vector, std::nullptr_t>& target) { target = Vector(); auto& sourceVector = WTF::get>(source); auto& targetVector = WTF::get>(target); targetVector.reserveInitialCapacity(sourceVector.size()); for (auto& element : sourceVector) targetVector.uncheckedAppend(element.isolatedCopy()); } IDBGetAllResult::IDBGetAllResult(const IDBGetAllResult& that, IsolatedCopyTag) { isolatedCopy(that, *this); } IDBGetAllResult IDBGetAllResult::isolatedCopy() const { return { *this, IsolatedCopy }; } void IDBGetAllResult::isolatedCopy(const IDBGetAllResult& source, IDBGetAllResult& destination) { destination.m_type = source.m_type; if (WTF::holds_alternative(source.m_results)) return; switch (source.m_type) { case IndexedDB::GetAllType::Keys: isolatedCopyOfVariant(source.m_results, destination.m_results); break; case IndexedDB::GetAllType::Values: isolatedCopyOfVariant(source.m_results, destination.m_results); break; } } void IDBGetAllResult::addKey(IDBKeyData&& key) { ASSERT(m_type == IndexedDB::GetAllType::Keys); ASSERT(WTF::holds_alternative>(m_results)); WTF::get>(m_results).append(WTFMove(key)); } void IDBGetAllResult::addValue(IDBValue&& value) { ASSERT(m_type == IndexedDB::GetAllType::Values); ASSERT(WTF::holds_alternative>(m_results)); WTF::get>(m_results).append(WTFMove(value)); } const Vector& IDBGetAllResult::keys() const { ASSERT(m_type == IndexedDB::GetAllType::Keys); ASSERT(WTF::holds_alternative>(m_results)); return WTF::get>(m_results); } const Vector& IDBGetAllResult::values() const { ASSERT(m_type == IndexedDB::GetAllType::Values); ASSERT(WTF::holds_alternative>(m_results)); return WTF::get>(m_results); } Vector IDBGetAllResult::allBlobFilePaths() const { ASSERT(m_type == IndexedDB::GetAllType::Values); HashSet pathSet; for (auto& value : WTF::get>(m_results)) { for (auto& path : value.blobFilePaths()) pathSet.add(path); } Vector paths; copyToVector(pathSet, paths); return paths; } } // namespace WebCore #endif // ENABLE(INDEXED_DATABASE)