5#include <userver/utils/fast_pimpl.hpp>
7#include <userver/storages/sqlite/cursor_result_set.hpp>
8#include <userver/storages/sqlite/impl/binder_help.hpp>
9#include <userver/storages/sqlite/options.hpp>
10#include <userver/storages/sqlite/query.hpp>
11#include <userver/storages/sqlite/result_set.hpp>
12#include <userver/storages/sqlite/savepoint.hpp>
13#include <userver/storages/sqlite/sqlite_fwd.hpp>
15USERVER_NAMESPACE_BEGIN
17namespace storages::sqlite {
24class Transaction
final {
28 Transaction(
const Transaction& other) =
delete;
29 Transaction(Transaction&& other)
noexcept;
30 Transaction& operator=(Transaction&&)
noexcept;
43 template <
typename... Args>
69 template <
typename Container>
70 void ExecuteMany(
const Query& query,
const Container& params)
const;
85 template <
typename T,
typename... Args>
86 CursorResultSet<T>
GetCursor(std::size_t batch_size,
const Query& query,
const Args&... args)
const;
92 Savepoint
Save(std::string name)
const;
101 ResultSet DoExecute(impl::io::ParamsBinderBase& params)
const;
102 void AssertValid()
const;
104 void AccountQueryExecute()
const noexcept;
105 void AccountQueryFailed()
const noexcept;
110template <
typename... Args>
113 AccountQueryExecute();
115 auto params_binder = impl::BindHelper::UpdateParamsBindings(query, *connection_, args...);
116 return DoExecute(params_binder);
117 }
catch (
const std::exception& err) {
118 AccountQueryFailed();
126 AccountQueryExecute();
128 auto params_binder = impl::BindHelper::UpdateRowAsParamsBindings(query, *connection_, row);
129 return DoExecute(params_binder);
130 }
catch (
const std::exception& err) {
131 AccountQueryFailed();
136template <
typename Container>
137void Transaction::
ExecuteMany(
const Query& query,
const Container& params)
const {
139 AccountQueryExecute();
140 for (
const auto& row : params) {
142 auto params_binder = impl::BindHelper::UpdateRowAsParamsBindings(query, *connection_, row);
143 DoExecute(params_binder);
144 }
catch (
const std::exception& err) {
145 AccountQueryFailed();
151template <
typename T,
typename... Args>
152CursorResultSet<T> Transaction::
GetCursor(std::size_t batch_size,
const Query& query,
const Args&... args)
const {
154 AccountQueryExecute();
156 auto params_binder = impl::BindHelper::UpdateParamsBindings(query, *connection_, args...);
157 return CursorResultSet<T>{DoExecute(params_binder, connection_), batch_size};
158 }
catch (
const std::exception& err) {
159 AccountQueryFailed();