// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #pragma once #include "sqlitebasestatement.h" namespace Sqlite { template class ReadStatement final : protected StatementImplementation { using Base = StatementImplementation; public: ReadStatement(Utils::SmallStringView sqlStatement, Database &database) : Base{sqlStatement, database} { checkIsReadOnlyStatement(); Base::checkBindingParameterCount(BindParameterCount); Base::checkColumnCount(ResultCount); } using Base::optionalValue; using Base::range; using Base::rangeWithTransaction; using Base::readCallback; using Base::readTo; using Base::toValue; using Base::value; using Base::values; template auto valueWithTransaction(const QueryTypes &...queryValues) { DeferredTransaction transaction{Base::database()}; auto resultValue = Base::template value(queryValues...); transaction.commit(); return resultValue; } template auto optionalValueWithTransaction(const QueryTypes &...queryValues) { DeferredTransaction transaction{Base::database()}; auto resultValue = Base::template optionalValue(queryValues...); transaction.commit(); return resultValue; } template auto valuesWithTransaction(std::size_t reserveSize, const QueryTypes &...queryValues) { DeferredTransaction transaction{Base::database()}; auto resultValues = Base::template values(reserveSize, queryValues...); transaction.commit(); return resultValues; } template void readCallbackWithTransaction(Callable &&callable, const QueryTypes &...queryValues) { DeferredTransaction transaction{Base::database()}; Base::readCallback(std::forward(callable), queryValues...); transaction.commit(); } template void readToWithTransaction(Container &container, const QueryTypes &...queryValues) { DeferredTransaction transaction{Base::database()}; Base::readTo(container, queryValues...); transaction.commit(); } protected: void checkIsReadOnlyStatement() { if (!Base::isReadOnlyStatement()) throw NotReadOnlySqlStatement(); } }; template ReadStatement(ReadStatement &) -> ReadStatement; template ReadStatement(const ReadStatement &) -> ReadStatement; } // namespace Sqlite