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>
19USERVER_NAMESPACE_BEGIN
156 static constexpr std::size_t kDefaultRowsInChunk = 1024;
159 explicit Transaction(
160 detail::ConnectionPtr&& conn,
162 OptionalCommandControl trx_cmd_ctl = {},
163 detail::SteadyClock::time_point trx_start_time = detail::SteadyClock::now()
166 void SetName(std::string name);
186 template <
typename... Args>
187 ResultSet Execute(
const Query& query,
const Args&... args) {
188 return Execute(OptionalCommandControl{}, query, args...);
202 template <
typename... Args>
203 ResultSet Execute(OptionalCommandControl statement_cmd_ctl,
const Query& query,
const Args&... args) {
204 detail::StaticQueryParameters<
sizeof...(args)> params;
205 params.Write(GetConnectionUserTypes(), args...);
206 return DoExecute(query, detail::QueryParameters{params}, statement_cmd_ctl);
220 return Execute(OptionalCommandControl{}
, query
, store
);
250 template <
typename Container>
267 template <
typename Container>
278 template <
typename Container>
279 void ExecuteBulk(
const Query& query,
const Container& args, std::size_t chunk_rows = kDefaultRowsInChunk);
289 template <
typename Container>
291 OptionalCommandControl statement_cmd_ctl,
293 const Container& args,
294 std::size_t chunk_rows = kDefaultRowsInChunk
311 template <
typename Container>
312 void ExecuteDecomposeBulk(
const Query& query,
const Container& args, std::size_t chunk_rows = kDefaultRowsInChunk);
328 template <
typename Container>
330 OptionalCommandControl statement_cmd_ctl,
332 const Container& args,
333 std::size_t chunk_rows = kDefaultRowsInChunk
341 template <
typename... Args>
343 return MakePortal(OptionalCommandControl{}, query, args...);
351 template <
typename... Args>
352 Portal MakePortal(OptionalCommandControl statement_cmd_ctl,
const Query& query,
const Args&... args) {
353 detail::StaticQueryParameters<
sizeof...(args)> params;
354 params.Write(GetConnectionUserTypes(), args...);
355 return MakePortal(PortalName{}, query, detail::QueryParameters{params}, statement_cmd_ctl);
377 void SetParameter(
const std::string& param_name,
const std::string& value);
393 TimeoutDuration GetConnStatementTimeoutDebug()
const;
397 DoExecute(
const Query& query,
const detail::QueryParameters& params, OptionalCommandControl statement_cmd_ctl);
401 const detail::QueryParameters& params,
402 OptionalCommandControl statement_cmd_ctl
405 const UserTypes& GetConnectionUserTypes()
const;
408 detail::ConnectionPtr conn_;
411template <
typename Container>
413 return io::DecomposeContainerByColumns(args).Perform([&query,
this](
const auto&... args) {
414 return this->Execute(query, args...);
418template <
typename Container>
421 return io::DecomposeContainerByColumns(args).Perform([&query, &statement_cmd_ctl,
this](
const auto&... args) {
422 return this->Execute(statement_cmd_ctl, query, args...);
426template <
typename Container>
428 auto split = io::SplitContainer(args, chunk_rows);
429 for (
auto&& chunk : split) {
430 Execute(query, chunk);
434template <
typename Container>
436 OptionalCommandControl statement_cmd_ctl,
438 const Container& args,
439 std::size_t chunk_rows
441 auto split = io::SplitContainer(args, chunk_rows);
442 for (
auto&& chunk : split) {
443 Execute(statement_cmd_ctl, query, chunk);
447template <
typename Container>
449 io::SplitContainerByColumns(args, chunk_rows).Perform([&query,
this](
const auto&... args) {
450 this->Execute(query, args...);
454template <
typename Container>
456 OptionalCommandControl statement_cmd_ctl,
458 const Container& args,
459 std::size_t chunk_rows
461 io::SplitContainerByColumns(args, chunk_rows).Perform([&query, &statement_cmd_ctl,
this](
const auto&... args) {
462 this->Execute(statement_cmd_ctl, query, args...);