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/internal/encoding_group.hxx"
31 #include "pqxx/isolation.hxx"
32 #include "pqxx/result.hxx"
33 #include "pqxx/row.hxx"
53 transactionfocus() =
delete;
54 transactionfocus(
const transactionfocus &) =
delete;
55 transactionfocus &operator=(
const transactionfocus &) =
delete;
59 void unregister_me() noexcept;
60 void reg_pending_error(const std::
string &) noexcept;
61 bool registered() const noexcept {
return m_registered; }
81 { add_binary_param(v,
true);
return *
this; }
83 { add_param(v,
true);
return *
this; }
85 { add_binary_param(v, nonnull);
return *
this; }
88 { add_param(v, nonnull);
return *
this; }
98 const std::string m_query;
107 class transaction_subtransaction;
108 class transaction_tablereader;
109 class transaction_sql_cursor;
110 class transaction_stream_from;
111 class transaction_tablewriter;
112 class transaction_stream_to;
113 class transaction_transactionfocus;
174 std::string esc(
const char str[])
const {
return conn().esc(str); }
177 std::string
esc(
const char str[],
size_t maxlen)
const
178 {
return conn().esc(str, maxlen); }
180 std::string
esc(
const std::string &str)
const {
return conn().esc(str); }
194 std::string
esc_raw(
const unsigned char data[],
size_t len)
const
195 {
return conn().esc_raw(data, len); }
197 std::string esc_raw(
const std::string &)
const;
204 {
return conn().unesc_raw(text); }
211 {
return conn().unesc_raw(text); }
215 template<
typename T> std::string
quote(
const T &t)
const
216 {
return conn().quote(t); }
219 std::string
quote_raw(
const unsigned char str[],
size_t len)
const
220 {
return conn().quote_raw(str, len); }
222 std::string quote_raw(
const std::string &str)
const;
226 {
return conn().quote_name(identifier); }
229 std::string
esc_like(
const std::string &str,
char escape_char=
'\\')
const
230 {
return conn().esc_like(str, escape_char); }
250 const std::string &Query,
251 const std::string &Desc=std::string{});
254 const std::stringstream &Query,
255 const std::string &Desc=std::string{})
256 {
return exec(Query.str(), Desc); }
265 const std::string &Query,
266 const std::string &Desc=std::string{})
267 {
return exec_n(0, Query, Desc); }
276 row exec1(
const std::string &Query,
const std::string &Desc=std::string{})
277 {
return exec_n(1, Query, Desc).
front(); }
287 const std::string &Query,
288 const std::string &Desc=std::string{});
319 template<
typename ...Args>
323 return internal_exec_params(
324 query, internal::params(std::forward<Args>(args)...));
330 template<
typename ...Args>
333 return exec_params_n(1, query, std::forward<Args>(args)...).
front();
339 template<
typename ...Args>
342 return exec_params_n(0, query, std::forward<Args>(args)...);
348 template<
typename ...Args>
351 const auto r = exec_params(query, std::forward<Args>(args)...);
352 check_rowcount_params(rows, r.size());
366 parameterized(
const std::string &query);
395 template<
typename ...Args>
398 return internal_exec_prepared(
399 statement, internal::params(std::forward<Args>(args)...));
405 template<
typename ...Args>
408 return exec_prepared_n(1, statement, std::forward<Args>(args)...).
front();
414 template<
typename ...Args>
417 return exec_prepared_n(0, statement, std::forward<Args>(args)...);
424 template<
typename ...Args>
427 const std::string &statement,
430 const auto r = exec_prepared(statement, std::forward<Args>(args)...);
431 check_rowcount_prepared(statement, rows, r.size());
475 prepared(
const std::string &statement=std::string{});
483 void process_notice(
const char Msg[])
const
485 { m_conn.process_notice(Msg); }
488 { m_conn.process_notice(Msg); }
502 void set_variable(
const std::string &Var,
const std::string &Val);
514 std::string get_variable(
const std::string &);
535 virtual
void do_begin() =0;
537 virtual
result do_exec(const
char Query[]) =0;
539 virtual
void do_commit() =0;
541 virtual
void do_abort() =0;
554 result direct_exec(const
char C[],
int Retries=0);
557 void reactivation_avoidance_clear() noexcept
558 {m_reactivation_avoidance.
clear();}
596 PQXX_PRIVATE
void activate();
598 PQXX_PRIVATE
void CheckPendingError();
600 template<
typename T>
bool parm_is_null(T *p)
const noexcept
601 {
return p ==
nullptr; }
602 template<
typename T>
bool parm_is_null(T)
const noexcept
605 result internal_exec_prepared(
606 const std::string &statement,
607 const internal::params &args);
609 result internal_exec_params(
610 const std::string &query,
611 const internal::params &args);
614 void check_rowcount_prepared(
615 const std::string &statement,
616 size_t expected_rows,
620 void check_rowcount_params(
621 size_t expected_rows,
size_t actual_rows);
623 friend class pqxx::internal::gate::transaction_transactionfocus;
626 PQXX_PRIVATE
void register_pending_error(
const std::string &) noexcept;
628 friend class pqxx::internal::gate::transaction_tablereader;
629 friend class pqxx::internal::gate::transaction_stream_from;
630 PQXX_PRIVATE
void BeginCopyRead(
const std::string &,
const std::string &);
631 bool read_copy_line(std::string &);
633 friend class pqxx::internal::gate::transaction_tablewriter;
634 friend class pqxx::internal::gate::transaction_stream_to;
635 PQXX_PRIVATE
void BeginCopyWrite(
636 const std::string &Table,
637 const std::string &Columns);
638 void write_copy_line(
const std::string &);
639 void end_copy_write();
641 friend class pqxx::internal::gate::transaction_subtransaction;
646 Status m_status = st_nascent;
647 bool m_registered =
false;
648 std::map<std::string, std::string> m_vars;
649 std::string m_pending_error;
654 #include "pqxx/compiler-internal-post.hxx"
void set_variable(const std::string &Var, const std::string &Val)
Set session variable in this connection.
Definition: transaction_base.cxx:367
prepare::invocation prepared(const std::string &statement=std::string{})
Execute prepared statement.
Definition: transaction_base.cxx:332
result exec0(const std::string &Query, const std::string &Desc=std::string{})
Execute query, which should zero rows of data.
Definition: transaction_base.hxx:264
PQXX_PURE size_type size() const noexcept
Definition: result.cxx:94
std::string esc_like(const std::string &str, char escape_char='\\') const
Escape string for literal LIKE match.
Definition: transaction_base.hxx:229
void register_me()
Definition: transaction_base.cxx:555
Helper class to construct an invocation of a parameterised statement.
Definition: transaction_base.hxx:73
result exec(const std::string &Query, const std::string &Desc=std::string{})
Execute query.
Definition: transaction_base.cxx:249
virtual ~transaction_base()=0
Definition: transaction_base.cxx:69
row exec_params1(const std::string &query, Args &&... args)
Definition: transaction_base.hxx:331
Private namespace for libpqxx's internal use; do not access.
Definition: connection_base.hxx:43
std::string get_variable(const std::string &)
Get currently applicable value of variable.
Definition: transaction_base.cxx:378
result exec_prepared0(const std::string &statement, Args &&... args)
Execute a prepared statement, and expect a result with zero rows.
Definition: transaction_base.hxx:415
void reg_pending_error(const std::string &) noexcept
Definition: transaction_base.cxx:571
void process_notice(const std::string &Msg) const
Have connection process warning message.
Definition: transaction_base.hxx:487
row exec_prepared1(const std::string &statement, Args &&... args)
Execute a prepared statement, and expect a single-row result.
Definition: transaction_base.hxx:406
result exec()
Definition: transaction_base.cxx:40
internal::parameterized_invocation parameterized(const std::string &query)
Parameterize a statement.
Definition: transaction_base.cxx:323
result exec_prepared(const std::string &statement, Args &&... args)
Execute a prepared statement, with optional arguments.
Definition: transaction_base.hxx:396
Run-time failure encountered by libpqxx, similar to std::runtime_error.
Definition: except.hxx:89
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:177
Result set containing data returned by a query or command.
Definition: result.hxx:69
parameterized_invocation & operator()(const T &v, bool nonnull)
Definition: transaction_base.hxx:87
parameterized_invocation & operator()(const T &v)
Definition: transaction_base.hxx:82
void abort()
Abort the transaction.
Definition: transaction_base.cxx:174
void Begin()
Begin transaction (to be called by implementing class)
Definition: transaction_base.cxx:386
result exec_params_n(size_t rows, const std::string &query, Args &&...args)
Definition: transaction_base.hxx:349
internal::reactivation_avoidance_counter m_reactivation_avoidance
Resources allocated in this transaction that make reactivation impossible.
Definition: transaction_base.hxx:564
transaction_base & m_trans
Definition: transaction_base.hxx:63
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:219
parameterized_invocation(connection_base &, const std::string &query)
Definition: transaction_base.cxx:31
void commit()
Commit the transaction.
Definition: transaction_base.cxx:98
Helper class for passing parameters to, and executing, prepared statements.
Definition: prepared_statement.hxx:81
void End() noexcept
End transaction. To be called by implementing class' destructor.
Definition: transaction_base.cxx:408
parameterized_invocation & operator()()
Definition: transaction_base.hxx:79
parameterized_invocation & operator()(const binarystring &v)
Definition: transaction_base.hxx:80
Query returned an unexpected number of rows.
Definition: except.hxx:262
Definition: connection_base.hxx:48
transaction_base()=delete
parameterized_invocation & operator()(const binarystring &v, bool nonnull)
Definition: transaction_base.hxx:84
std::string quote_name(const std::string &identifier) const
Escape an SQL identifier for use in a query.
Definition: transaction_base.hxx:225
Internal error in libpqxx library.
Definition: except.hxx:207
Binary data corresponding to PostgreSQL's "BYTEA" binary-string type.
Definition: binarystring.hxx:53
Exception class for lost or failed backend connection.
Definition: except.hxx:118
std::string quote(const T &t) const
Represent object as SQL string, including quoting & escaping.
Definition: transaction_base.hxx:215
std::string unesc_raw(const char *text) const
Unescape binary data, e.g. from a table field or notification payload.
Definition: transaction_base.hxx:210
result direct_exec(const char C[], int Retries=0)
Execute query on connection directly.
Definition: transaction_base.cxx:462
connection_base & conn() const
Connection this transaction is running in.
Definition: transaction_base.hxx:492
result exec_params(const std::string &query, Args &&...args)
Execute an SQL statement with parameters.
Definition: transaction_base.hxx:321
Helper base class: object descriptions for error messages and such.
Definition: util.hxx:233
reference front() const noexcept
Definition: row.cxx:59
std::string esc(const std::string &str) const
Escape string for use as SQL string literal in this transaction.
Definition: transaction_base.hxx:180
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:194
result exec_n(size_t rows, const std::string &Query, const std::string &Desc=std::string{})
Execute query, expect given number of rows.
Definition: transaction_base.cxx:277
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:425
void clear() noexcept
Definition: result.hxx:121
Definition: transaction_base.hxx:43
std::string to_string(const field &Obj)
Convert a field to a string.
Definition: result.cxx:451
result exec_params0(const std::string &query, Args &&...args)
Definition: transaction_base.hxx:340
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:203
connection_base abstract base class; represents a connection to a database.
Definition: connection_base.hxx:139
row exec1(const std::string &Query, const std::string &Desc=std::string{})
Execute query returning a single row of data.
Definition: transaction_base.hxx:276
void unregister_me() noexcept
Definition: transaction_base.cxx:563
"Help, I don't know whether transaction was committed successfully!"
Definition: except.hxx:159
Interface definition (and common code) for "transaction" classes.
Definition: transaction_base.hxx:136
The home of all libpqxx classes, functions, templates, etc.
Definition: array.hxx:25
Reference to one row in a result.
Definition: row.hxx:40
transactionfocus(transaction_base &t)
Definition: transaction_base.hxx:46
Error in usage of libpqxx library, similar to std::logic_error.
Definition: except.hxx:218
result exec(const std::stringstream &Query, const std::string &Desc=std::string{})
Definition: transaction_base.hxx:253
Traits class to describe an isolation level; primarly for libpqxx's own use.
Definition: isolation.hxx:65
Ensure proper opening/closing of GUEST objects related to a "host" object.
Definition: util.hxx:274