diff options
Diffstat (limited to 'Source/WebCore/Modules/indexeddb/shared/IDBRequestData.cpp')
-rw-r--r-- | Source/WebCore/Modules/indexeddb/shared/IDBRequestData.cpp | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.cpp b/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.cpp new file mode 100644 index 000000000..574ea8b01 --- /dev/null +++ b/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.cpp @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2015 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 "IDBRequestData.h" + +#if ENABLE(INDEXED_DATABASE) + +#include "IDBConnectionToServer.h" +#include "IDBDatabase.h" +#include "IDBOpenDBRequest.h" + +namespace WebCore { + +IDBRequestData::IDBRequestData() +{ +} + +IDBRequestData::IDBRequestData(const IDBClient::IDBConnectionProxy& connectionProxy, const IDBOpenDBRequest& request) + : m_serverConnectionIdentifier(connectionProxy.serverConnectionIdentifier()) + , m_requestIdentifier(std::make_unique<IDBResourceIdentifier>(connectionProxy, request)) + , m_databaseIdentifier(request.databaseIdentifier()) + , m_requestedVersion(request.version()) + , m_requestType(request.requestType()) +{ +} + +IDBRequestData::IDBRequestData(IDBClient::TransactionOperation& operation) + : m_serverConnectionIdentifier(operation.transaction().database().connectionProxy().serverConnectionIdentifier()) + , m_requestIdentifier(std::make_unique<IDBResourceIdentifier>(operation.identifier())) + , m_transactionIdentifier(std::make_unique<IDBResourceIdentifier>(operation.transactionIdentifier())) + , m_objectStoreIdentifier(operation.objectStoreIdentifier()) + , m_indexIdentifier(operation.indexIdentifier()) +{ + if (m_indexIdentifier) + m_indexRecordType = operation.indexRecordType(); + + if (operation.cursorIdentifier()) + m_cursorIdentifier = std::make_unique<IDBResourceIdentifier>(*operation.cursorIdentifier()); +} + +IDBRequestData::IDBRequestData(const IDBRequestData& other) + : m_serverConnectionIdentifier(other.m_serverConnectionIdentifier) + , m_objectStoreIdentifier(other.m_objectStoreIdentifier) + , m_indexIdentifier(other.m_indexIdentifier) + , m_indexRecordType(other.m_indexRecordType) + , m_databaseIdentifier(other.m_databaseIdentifier) + , m_requestedVersion(other.m_requestedVersion) + , m_requestType(other.m_requestType) +{ + if (other.m_requestIdentifier) + m_requestIdentifier = std::make_unique<IDBResourceIdentifier>(*other.m_requestIdentifier); + if (other.m_transactionIdentifier) + m_transactionIdentifier = std::make_unique<IDBResourceIdentifier>(*other.m_transactionIdentifier); + if (other.m_cursorIdentifier) + m_cursorIdentifier = std::make_unique<IDBResourceIdentifier>(*other.m_cursorIdentifier); +} + +IDBRequestData::IDBRequestData(const IDBRequestData& that, IsolatedCopyTag) +{ + isolatedCopy(that, *this); +} + + +IDBRequestData IDBRequestData::isolatedCopy() const +{ + return { *this, IsolatedCopy }; +} + +void IDBRequestData::isolatedCopy(const IDBRequestData& source, IDBRequestData& destination) +{ + destination.m_serverConnectionIdentifier = source.m_serverConnectionIdentifier; + destination.m_objectStoreIdentifier = source.m_objectStoreIdentifier; + destination.m_indexIdentifier = source.m_indexIdentifier; + destination.m_indexRecordType = source.m_indexRecordType; + destination.m_requestedVersion = source.m_requestedVersion; + destination.m_requestType = source.m_requestType; + + destination.m_databaseIdentifier = source.m_databaseIdentifier.isolatedCopy(); + + if (source.m_requestIdentifier) + destination.m_requestIdentifier = std::make_unique<IDBResourceIdentifier>(*source.m_requestIdentifier); + if (source.m_transactionIdentifier) + destination.m_transactionIdentifier = std::make_unique<IDBResourceIdentifier>(*source.m_transactionIdentifier); + if (source.m_cursorIdentifier) + destination.m_cursorIdentifier = std::make_unique<IDBResourceIdentifier>(*source.m_cursorIdentifier); +} + +uint64_t IDBRequestData::serverConnectionIdentifier() const +{ + ASSERT(m_serverConnectionIdentifier); + return m_serverConnectionIdentifier; +} + +IDBResourceIdentifier IDBRequestData::requestIdentifier() const +{ + ASSERT(m_requestIdentifier); + return *m_requestIdentifier; +} + +IDBResourceIdentifier IDBRequestData::transactionIdentifier() const +{ + ASSERT(m_transactionIdentifier); + return *m_transactionIdentifier; +} + +IDBResourceIdentifier IDBRequestData::cursorIdentifier() const +{ + ASSERT(m_cursorIdentifier); + return *m_cursorIdentifier; +} + +uint64_t IDBRequestData::objectStoreIdentifier() const +{ + ASSERT(m_objectStoreIdentifier); + return m_objectStoreIdentifier; +} + +uint64_t IDBRequestData::indexIdentifier() const +{ + ASSERT(m_objectStoreIdentifier || m_indexIdentifier); + return m_indexIdentifier; +} + +IndexedDB::IndexRecordType IDBRequestData::indexRecordType() const +{ + ASSERT(m_indexIdentifier); + return m_indexRecordType; +} + +uint64_t IDBRequestData::requestedVersion() const +{ + return m_requestedVersion; +} + +} // namespace WebCore + +#endif // ENABLE(INDEXED_DATABASE) |