9#include <userver/storages/postgres/detail/connection_ptr.hpp>
10#include <userver/storages/postgres/detail/query_parameters.hpp>
11#include <userver/storages/postgres/detail/time_types.hpp>
12#include <userver/storages/postgres/options.hpp>
13#include <userver/storages/postgres/parameter_store.hpp>
14#include <userver/storages/postgres/portal.hpp>
15#include <userver/storages/postgres/postgres_fwd.hpp>
16#include <userver/storages/postgres/query.hpp>
17#include <userver/storages/postgres/result_set.hpp>
18#include <userver/utils/trx_tracker.hpp>
20USERVER_NAMESPACE_BEGIN
161 static constexpr std::size_t kDefaultRowsInChunk = 1024;
164 explicit Transaction(
165 detail::ConnectionPtr&& conn,
167 OptionalCommandControl trx_cmd_ctl = {},
168 detail::SteadyClock::time_point trx_start_time = detail::SteadyClock::now()
171 void SetName(std::string name);
191 template <
typename... Args>
192 ResultSet Execute(
const Query& query,
const Args&... args) {
193 return Execute(OptionalCommandControl{}, query, args...);
207 template <
typename... Args>
208 ResultSet Execute(OptionalCommandControl statement_cmd_ctl,
const Query& query,
const Args&... args) {
209 detail::StaticQueryParameters<
sizeof...(args)> params;
210 params.Write(GetConnectionUserTypes(), args...);
211 return DoExecute(query, detail::QueryParameters{params}, statement_cmd_ctl);
225 return Execute(OptionalCommandControl{}
, query
, store
);
255 template <
typename Container>
272 template <
typename Container>
283 template <
typename Container>
284 void ExecuteBulk(
const Query& query,
const Container& args, std::size_t chunk_rows = kDefaultRowsInChunk);
294 template <
typename Container>
296 OptionalCommandControl statement_cmd_ctl,
298 const Container& args,
299 std::size_t chunk_rows = kDefaultRowsInChunk
316 template <
typename Container>
317 void ExecuteDecomposeBulk(
const Query& query,
const Container& args, std::size_t chunk_rows = kDefaultRowsInChunk);
333 template <
typename Container>
335 OptionalCommandControl statement_cmd_ctl,
337 const Container& args,
338 std::size_t chunk_rows = kDefaultRowsInChunk
346 template <
typename... Args>
348 return MakePortal(OptionalCommandControl{}, query, args...);
356 template <
typename... Args>
357 Portal MakePortal(OptionalCommandControl statement_cmd_ctl,
const Query& query,
const Args&... args) {
358 detail::StaticQueryParameters<
sizeof...(args)> params;
359 params.Write(GetConnectionUserTypes(), args...);
360 return MakePortal(PortalName{}, query, detail::QueryParameters{params}, statement_cmd_ctl);
382 void SetParameter(
const std::string& param_name,
const std::string& value);
398 TimeoutDuration GetConnStatementTimeoutDebug()
const;
403 const detail::QueryParameters& params,
404 OptionalCommandControl statement_cmd_ctl
409 const detail::QueryParameters& params,
410 OptionalCommandControl statement_cmd_ctl
413 const UserTypes& GetConnectionUserTypes()
const;
416 detail::ConnectionPtr conn_;
417 USERVER_NAMESPACE::utils::
trx_tracker::TransactionLock trx_lock_;
420template <
typename Container>
422 return io::DecomposeContainerByColumns(args).Perform([&query,
this](
const auto&... args) {
423 return this->Execute(query, args...);
427template <
typename Container>
429 OptionalCommandControl statement_cmd_ctl,
431 const Container& args
433 return io::DecomposeContainerByColumns(args).Perform([&query, &statement_cmd_ctl,
this](
const auto&... args) {
434 return this->Execute(statement_cmd_ctl, query, args...);
438template <
typename Container>
440 auto split = io::SplitContainer(args, chunk_rows);
441 for (
auto&& chunk : split) {
442 Execute(query, chunk);
446template <
typename Container>
448 OptionalCommandControl statement_cmd_ctl,
450 const Container& args,
451 std::size_t chunk_rows
453 auto split = io::SplitContainer(args, chunk_rows);
454 for (
auto&& chunk : split) {
455 Execute(statement_cmd_ctl, query, chunk);
459template <
typename Container>
461 io::SplitContainerByColumns(args, chunk_rows).Perform([&query,
this](
const auto&... args) {
462 this->Execute(query, args...);
466template <
typename Container>
468 OptionalCommandControl statement_cmd_ctl,
470 const Container& args,
471 std::size_t chunk_rows
473 io::SplitContainerByColumns(args, chunk_rows).Perform([&query, &statement_cmd_ctl,
this](
const auto&... args) {
474 this->Execute(statement_cmd_ctl, query, args...);