14 #ifndef PQXX_H_TRANSACTION_BASE 15 #define PQXX_H_TRANSACTION_BASE 17 #include "pqxx/compiler-public.hxx" 18 #include "pqxx/compiler-internal-pre.hxx" 29 #include "pqxx/connection_base.hxx" 30 #include "pqxx/isolation.hxx" 31 #include "pqxx/result.hxx" 32 #include "pqxx/row.hxx" 58 void unregister_me() noexcept;
59 void reg_pending_error(
const std::string &) noexcept;
60 bool registered() const noexcept {
return m_registered; }
79 { add_binary_param(v,
true);
return *
this; }
81 { add_param(v,
true);
return *
this; }
83 { add_binary_param(v, nonnull);
return *
this; }
86 { add_param(v, nonnull);
return *
this; }
95 const std::string m_query;
104 class transaction_subtransaction;
105 class transaction_tablereader;
106 class transaction_tablewriter;
107 class transaction_transactionfocus;
168 std::string esc(
const char str[])
const {
return conn().esc(str); }
171 std::string
esc(
const char str[],
size_t maxlen)
const 172 {
return conn().esc(str, maxlen); }
174 std::string
esc(
const std::string &str)
const {
return conn().esc(str); }
188 std::string
esc_raw(
const unsigned char data[],
size_t len)
const 189 {
return conn().esc_raw(data, len); }
191 std::string esc_raw(
const std::string &)
const;
198 {
return conn().unesc_raw(text); }
205 {
return conn().unesc_raw(text); }
209 template<
typename T> std::string
quote(
const T &t)
const 210 {
return conn().quote(t); }
213 std::string
quote_raw(
const unsigned char str[],
size_t len)
const 214 {
return conn().quote_raw(str, len); }
216 std::string quote_raw(
const std::string &str)
const;
220 {
return conn().quote_name(identifier); }
240 const std::string &Query,
241 const std::string &Desc=std::string());
244 const std::stringstream &Query,
245 const std::string &Desc=std::string())
246 {
return exec(Query.str(), Desc); }
255 const std::string &Query,
256 const std::string &Desc=std::string())
257 {
return exec_n(0, Query, Desc); }
266 row exec1(
const std::string &Query,
const std::string &Desc=std::string())
267 {
return exec_n(1, Query, Desc).
front(); }
277 const std::string &Query,
278 const std::string &Desc=std::string());
309 template<
typename ...Args>
313 return internal_exec_params(query, internal::params(args...));
319 template<
typename ...Args>
322 return exec_params_n(1, query, args...).
front();
328 template<
typename ...Args>
331 return exec_params_n(0, query, args...);
337 template<
typename ...Args>
340 const auto r = exec_params(query, args...);
341 check_rowcount_params(rows, r.size());
383 template<
typename ...Args>
386 return internal_exec_prepared(statement, internal::params(args...));
392 template<
typename ...Args>
395 return exec_prepared_n(1, statement, args...).
front();
401 template<
typename ...Args>
404 return exec_prepared_n(0, statement, args...);
411 template<
typename ...Args>
414 const std::string &statement,
417 const auto r = exec_prepared(statement, args...);
418 check_rowcount_prepared(statement, rows, r.size());
469 void process_notice(
const char Msg[])
const 471 { m_conn.process_notice(Msg); }
474 { m_conn.process_notice(Msg); }
488 void set_variable(
const std::string &Var,
const std::string &Val);
500 std::string get_variable(
const std::string &);
521 virtual void do_begin() =0;
523 virtual result do_exec(
const char Query[]) =0;
525 virtual void do_commit() =0;
527 virtual void do_abort() =0;
540 result direct_exec(
const char C[],
int Retries=0);
544 {m_reactivation_avoidance.clear();}
582 PQXX_PRIVATE
void activate();
584 PQXX_PRIVATE
void CheckPendingError();
586 template<
typename T>
bool parm_is_null(T *p)
const noexcept
588 template<
typename T>
bool parm_is_null(T)
const noexcept
591 result internal_exec_prepared(
592 const std::string &statement,
593 const internal::params &args);
595 result internal_exec_params(
596 const std::string &query,
597 const internal::params &args);
600 void check_rowcount_prepared(
601 const std::string &statement,
602 size_t expected_rows,
606 void check_rowcount_params(
607 size_t expected_rows,
size_t actual_rows);
609 friend class pqxx::internal::gate::transaction_transactionfocus;
612 PQXX_PRIVATE
void register_pending_error(
const std::string &) noexcept;
614 friend class pqxx::internal::gate::transaction_tablereader;
615 PQXX_PRIVATE
void BeginCopyRead(
const std::string &,
const std::string &);
616 bool read_copy_line(std::string &);
618 friend class pqxx::internal::gate::transaction_tablewriter;
619 PQXX_PRIVATE
void BeginCopyWrite(
620 const std::string &Table,
621 const std::string &Columns);
622 void write_copy_line(
const std::string &);
623 void end_copy_write();
625 friend class pqxx::internal::gate::transaction_subtransaction;
630 Status m_status = st_nascent;
631 bool m_registered =
false;
632 std::map<std::string, std::string> m_vars;
633 std::string m_pending_error;
638 #include "pqxx/compiler-internal-post.hxx" Binary data corresponding to PostgreSQL's "BYTEA" binary-string type.
Definition: binarystring.hxx:53
result exec0(const std::string &Query, const std::string &Desc=std::string())
Execute query, which should zero rows of data.
Definition: transaction_base.hxx:254
transactionfocus(transaction_base &t)
Definition: transaction_base.hxx:45
std::string quote_raw(const unsigned char str[], size_t len) const
Binary-escape and quote a binarystring for use as an SQL constant.
Definition: transaction_base.hxx:213
Definition: connection_base.hxx:47
Reference to one row in a result.
Definition: row.hxx:40
reference front() const noexcept
Definition: row.cxx:56
row exec_prepared1(const std::string &statement, Args... args)
Execute a prepared statement, and expect a single-row result.
Definition: transaction_base.hxx:393
result exec_prepared0(const std::string &statement, Args... args)
Execute a prepared statement, and expect a result with zero rows.
Definition: transaction_base.hxx:402
Helper class for passing parameters to, and executing, prepared statements.
Definition: prepared_statement.hxx:30
The home of all libpqxx classes, functions, templates, etc.
Definition: array.hxx:22
Definition: transaction_base.hxx:42
Ensure proper opening/closing of GUEST objects related to a "host" object.
Definition: util.hxx:208
bool registered() const noexcept
Definition: transaction_base.hxx:60
void process_notice(const std::string &Msg) const
Have connection process warning message.
Definition: transaction_base.hxx:473
std::string unesc_raw(const char *text) const
Unescape binary data, e.g. from a table field or notification payload.
Definition: transaction_base.hxx:204
std::string quote_name(const std::string &identifier) const
Escape an SQL identifier for use in a query.
Definition: transaction_base.hxx:219
result exec_params_n(size_t rows, const std::string &query, Args ...args)
Definition: transaction_base.hxx:338
parameterized_invocation & operator()(const T &v, bool nonnull)
Definition: transaction_base.hxx:85
parameterized_invocation & operator()(const binarystring &v)
Definition: transaction_base.hxx:78
std::string esc_raw(const unsigned char data[], size_t len) const
Escape binary data for use as SQL string literal in this transaction.
Definition: transaction_base.hxx:188
connection_base & conn() const
Connection this transaction is running in.
Definition: transaction_base.hxx:478
Traits class to describe an isolation level; primarly for libpqxx's own use.
Definition: isolation.hxx:65
result exec(const std::stringstream &Query, const std::string &Desc=std::string())
Definition: transaction_base.hxx:243
Result set containing data returned by a query or command.
Definition: result.hxx:67
result exec_params0(const std::string &query, Args ...args)
Definition: transaction_base.hxx:329
result exec_prepared_n(size_t rows, const std::string &statement, Args... args)
Execute a prepared statement, expect a result with given number of rows.
Definition: transaction_base.hxx:412
Interface definition (and common code) for "transaction" classes.
Definition: transaction_base.hxx:130
std::string quote(const T &t) const
Represent object as SQL string, including quoting & escaping.
Definition: transaction_base.hxx:209
std::string esc(const std::string &str) const
Escape string for use as SQL string literal in this transaction.
Definition: transaction_base.hxx:174
internal::reactivation_avoidance_counter m_reactivation_avoidance
Resources allocated in this transaction that make reactivation impossible.
Definition: transaction_base.hxx:550
void reactivation_avoidance_clear() noexcept
Forget about any reactivation-blocking resources we tried to allocate.
Definition: transaction_base.hxx:543
Helper class to construct an invocation of a parameterised statement.
Definition: transaction_base.hxx:72
parameterized_invocation & operator()()
Definition: transaction_base.hxx:77
row exec1(const std::string &Query, const std::string &Desc=std::string())
Execute query returning a single row of data.
Definition: transaction_base.hxx:266
std::string unesc_raw(const std::string &text) const
Unescape binary data, e.g. from a table field or notification payload.
Definition: transaction_base.hxx:197
result exec_params(const std::string &query, Args ...args)
Execute an SQL statement with parameters.
Definition: transaction_base.hxx:311
parameterized_invocation & operator()(const binarystring &v, bool nonnull)
Definition: transaction_base.hxx:82
connection_base abstract base class; represents a connection to a database.
Definition: connection_base.hxx:138
result exec_prepared(const std::string &statement, Args... args)
Execute a prepared statement, with optional arguments.
Definition: transaction_base.hxx:384
Helper base class: object descriptions for error messages and such.
Definition: util.hxx:167
row exec_params1(const std::string &query, Args... args)
Definition: transaction_base.hxx:320
parameterized_invocation & operator()(const T &v)
Definition: transaction_base.hxx:80
transaction_base & m_trans
Definition: transaction_base.hxx:62
std::string esc(const char str[], size_t maxlen) const
Escape string for use as SQL string literal in this transaction.
Definition: transaction_base.hxx:171