// 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) { return withImplicitTransaction(Base::database(), [&] { return Base::template value(queryValues...); }); } template auto optionalValueWithTransaction(const QueryTypes &...queryValues) { return withImplicitTransaction(Base::database(), [&] { return Base::template optionalValue(queryValues...); }); } template auto valuesWithTransaction(const QueryTypes &...queryValues) { return withImplicitTransaction(Base::database(), [&] { return Base::template values(queryValues...); }); } template void readCallbackWithTransaction(Callable &&callable, const QueryTypes &...queryValues) { withImplicitTransaction(Base::database(), [&] { Base::readCallback(std::forward(callable), queryValues...); }); } template void readToWithTransaction(Container &container, const QueryTypes &...queryValues) { withImplicitTransaction(Base::database(), [&] { Base::readTo(container, queryValues...); }); } protected: void checkIsReadOnlyStatement() { if (!Base::isReadOnlyStatement()) throw NotReadOnlySqlStatement(); } }; template ReadStatement(ReadStatement &) -> ReadStatement; template ReadStatement(const ReadStatement &) -> ReadStatement; } // namespace Sqlite