5#include <userver/utils/fast_pimpl.hpp>
6#include <userver/utils/trx_tracker.hpp>
8#include <userver/storages/sqlite/cursor_result_set.hpp>
9#include <userver/storages/sqlite/impl/binder_help.hpp>
10#include <userver/storages/sqlite/options.hpp>
11#include <userver/storages/sqlite/query.hpp>
12#include <userver/storages/sqlite/result_set.hpp>
13#include <userver/storages/sqlite/savepoint.hpp>
14#include <userver/storages/sqlite/sqlite_fwd.hpp>
16USERVER_NAMESPACE_BEGIN
18namespace storages::sqlite {
25class Transaction
final {
29 Transaction(
const Transaction& other) =
delete;
30 Transaction(Transaction&& other)
noexcept;
31 Transaction& operator=(Transaction&&)
noexcept;
44 template <
typename... Args>
70 template <
typename Container>
71 void ExecuteMany(
const Query& query,
const Container& params)
const;
86 template <
typename T,
typename... Args>
87 CursorResultSet<T>
GetCursor(std::size_t batch_size,
const Query& query,
const Args&... args)
const;
93 Savepoint
Save(std::string name)
const;
102 ResultSet DoExecute(impl::io::ParamsBinderBase& params)
const;
103 void AssertValid()
const;
105 void AccountQueryExecute()
const noexcept;
106 void AccountQueryFailed()
const noexcept;
109 utils::trx_tracker::TransactionLock trx_lock_;
112template <
typename... Args>
115 AccountQueryExecute();
117 auto params_binder = impl::BindHelper::UpdateParamsBindings(query, *connection_, args...);
118 return DoExecute(params_binder);
119 }
catch (
const std::exception& err) {
120 AccountQueryFailed();
128 AccountQueryExecute();
130 auto params_binder = impl::BindHelper::UpdateRowAsParamsBindings(query, *connection_, row);
131 return DoExecute(params_binder);
132 }
catch (
const std::exception& err) {
133 AccountQueryFailed();
138template <
typename Container>
139void Transaction::
ExecuteMany(
const Query& query,
const Container& params)
const {
141 AccountQueryExecute();
142 for (
const auto& row : params) {
144 auto params_binder = impl::BindHelper::UpdateRowAsParamsBindings(query, *connection_, row);
145 DoExecute(params_binder);
146 }
catch (
const std::exception& err) {
147 AccountQueryFailed();
153template <
typename T,
typename... Args>
154CursorResultSet<T> Transaction::
GetCursor(std::size_t batch_size,
const Query& query,
const Args&... args)
const {
156 AccountQueryExecute();
158 auto params_binder = impl::BindHelper::UpdateParamsBindings(query, *connection_, args...);
159 return CursorResultSet<T>{DoExecute(params_binder, connection_), batch_size};
160 }
catch (
const std::exception& err) {
161 AccountQueryFailed();