13 #ifndef PQXX_CONNECTION_HXX
14 #define PQXX_CONNECTION_HXX
16 #if !defined(PQXX_HEADER_PRE)
17 # error "Include libpqxx headers as <pqxx/header>, not <pqxx/header.hxx>."
24 #include <initializer_list>
29 #include <string_view>
95 class connection_dbtransaction;
121 { std::get<0>(*std::cbegin(t)) } ->
ZString;
122 { std::get<1>(*std::cbegin(t)) } ->
ZString;
124 std::tuple_size_v<std::remove_cvref_t<decltype(*std::cbegin(t))>> == 2u);
342 template<pqxx::ZString STRING, ZKey_ZValues MAPPING>
344 STRING
const &connection_string, MAPPING &&
params = empty_params_t(),
354 template<pqxx::ZString STRING>
356 STRING
const &connection_string,
sl loc = sl::current()) :
357 connection{connection_string, empty_params_t(), loc}
361 template<ZKey_ZValues MAPPING>
379 close(m_created_loc);
381 catch (std::exception
const &)
409 [[nodiscard]]
bool is_open() const noexcept;
412 PQXX_ZARGS void process_notice(
char const[]) noexcept;
417 void process_notice(
zview) noexcept;
420 void trace(std::FILE *) noexcept;
434 [[nodiscard]]
char const *dbname() const noexcept;
438 [[nodiscard]]
char const *username() const noexcept;
444 [[nodiscard]]
PQXX_PURE char const *hostname() const noexcept;
447 [[nodiscard, deprecated("Use port_number().")]]
PQXX_PURE char const *
448 port() const noexcept;
451 [[nodiscard]]
PQXX_PURE std::optional<
int>
452 port_number(
sl loc =
sl::current()) const;
455 [[nodiscard]]
PQXX_PURE int backendpid() const & noexcept;
468 [[nodiscard]]
PQXX_PURE int sock() const & noexcept;
474 [[nodiscard]]
PQXX_PURE int protocol_version() const noexcept;
489 [[nodiscard]]
PQXX_PURE int server_version() const noexcept;
514 [[nodiscard]] std::
string get_client_encoding(
sl loc =
sl::current()) const;
520 void set_client_encoding(
zview encoding,
sl loc =
sl::current()) &
522 set_client_encoding(encoding.c_str(), loc);
530 set_client_encoding(
char const encoding[],
sl = sl::current()) &;
533 [[nodiscard]]
int encoding_id(
sl = sl::current())
const;
565 template<
typename TYPE>
567 std::string_view var, TYPE
const &value,
sl loc = sl::current()) &
569 if constexpr (has_null<TYPE>())
573 std::format(
"Attempted to set variable {} to null.", var), loc};
575 exec(
std::format(
"SET {}={}", quote_name(var), quote(value, loc)), loc);
585 std::string get_var(std::string_view var,
sl loc = sl::current());
598 template<not_borrowed TYPE>
602 return from_string<TYPE>(get_var(var, loc), c);
713 int get_notifs(
sl = sl::current());
740 int await_notification(
sl = sl::current());
765 int await_notification(
766 std::time_t seconds = 10,
long microseconds = 0,
sl = sl::current());
843 [[nodiscard]] std::string
846 return encrypt_password(user.
c_str(), password.
c_str(), algorithm.
c_str());
849 [[nodiscard]]
PQXX_ZARGS std::string encrypt_password(
850 char const user[],
char const password[],
char const *algorithm =
nullptr);
903 prepare(name.
c_str(), definition.
c_str(), loc);
914 std::string
const &name, std::string
const &definition,
915 sl loc = sl::current()) &
917 prepare(name.c_str(), definition.c_str(), loc);
926 char const name[],
char const definition[],
sl loc = sl::current()) &;
942 std::string_view name, std::string_view definition,
943 sl loc = sl::current()) &
945 std::string
const n{name}, d{definition};
946 prepare(n.c_str(), d.c_str(), loc);
950 [[deprecated(
"Either name your statement, or just parameterise it.")]]
951 PQXX_ZARGS void prepare(
char const definition[],
sl loc = sl::current()) &;
952 [[deprecated(
"Either name your statement, or just parameterise it.")]]
956 prepare(definition.
c_str(), loc);
961 void unprepare(std::string_view name,
sl loc = sl::current());
969 [[nodiscard]] std::string adorn_name(std::string_view);
978 esc(
char const text[],
sl loc = sl::current())
const
980 return esc(std::string_view{
text}, loc);
995 [[nodiscard]] std::string_view
996 esc(std::string_view text, std::span<char> buffer,
sl loc = sl::current())
998 auto const size{std::size(
text)}, space{std::size(buffer)};
999 auto const needed{2 * size + 1};
1003 "Not enough room to escape string of {} byte(s): need {} bytes of "
1004 "buffer space, but buffer size is {}.",
1005 size, needed, size),
1007 return {std::data(buffer), esc_to_buf(
text, buffer, loc)};
1014 [[nodiscard]] std::string
1015 esc(std::string_view text,
sl loc = sl::current())
const;
1019 template<binary DATA> [[nodiscard]] std::string
esc(DATA
const &data)
const
1021 return esc_raw(data);
1036 template<binary DATA>
1038 esc(DATA
const &data, std::span<char> buffer,
sl loc = sl::current())
const
1040 auto const size{std::size(data)}, space{std::size(buffer)};
1045 "Not enough room to escape binary string of {} byte(s): need {} ",
1046 " bytes of buffer space, but buffer size is {}.", size, needed,
1050 bytes_view const view{std::data(data), std::size(data)};
1054 return zview{std::data(buffer), needed - 1};
1059 [[nodiscard]] std::string esc_raw(
bytes_view)
const;
1063 template<binary DATA>
1064 [[nodiscard]] std::string
esc_raw(DATA
const &data)
const
1066 return esc_raw(
bytes_view{std::data(data), std::size(data)});
1070 template<binary DATA>
1071 [[nodiscard]]
zview esc_raw(DATA
const &data, std::span<char> buffer)
const
1095 [[nodiscard]] std::string quote_raw(
bytes_view)
const;
1099 template<binary DATA>
1102 return quote_raw(
bytes_view{std::data(data), std::size(data)});
1107 [[nodiscard]] std::string quote_name(std::string_view identifier)
const;
1114 [[nodiscard]] std::string quote_table(std::string_view name)
const;
1126 [[nodiscard]] std::string quote_table(
table_path)
const;
1137 template<pqxx::
char_
strings STRINGS>
1139 quote_columns(STRINGS
const &columns,
sl = sl::current())
const;
1146 template<
typename T>
1147 [[nodiscard]]
inline std::string quote(T
const &t,
sl = sl::current())
const;
1176 [[nodiscard]] std::string esc_like(
1177 std::string_view text,
char escape_char =
'\\',
1178 sl loc = sl::current())
const;
1186 void cancel_query(
sl = sl::current());
1188 #if defined(_WIN32) || __has_include(<fcntl.h>)
1194 void set_blocking(
bool block,
sl = sl::current()) &;
1227 m_notice_waiters->notice_handler = std::move(handler);
1236 [[nodiscard, deprecated(
"Use a notice handler instead.")]]
1237 std::vector<errorhandler *> get_errorhandlers()
const;
1246 [[nodiscard]] std::string connection_string()
const;
1257 void close(
sl = sl::current());
1284 return std::exchange(m_conn,
nullptr);
1301 [[deprecated(
"To set session variables, use set_session_var.")]]
void
1303 std::string_view var, std::string_view value,
sl loc = sl::current()) &;
1309 [[deprecated(
"Use get_var instead.")]] std::string
1310 get_variable(std::string_view,
sl loc = sl::current());
1314 using empty_params_t =
1315 std::initializer_list<std::pair<char const *, char const *>>;
1334 std::pair<bool, bool> poll_connect(
sl);
1338 std::vector<const char *>
const &override_keys,
1339 std::vector<const char *>
const &override_values,
sl);
1341 void set_up_notice_handlers();
1344 void complete_connection(
sl);
1348 std::string_view desc,
sl = sl::current());
1352 sl loc = sl::current())
1354 return make_result(pgr, query,
"", loc);
1357 PQXX_PRIVATE [[nodiscard]]
int status() const noexcept;
1364 [[nodiscard]] std::
size_t
1365 esc_to_buf(std::string_view text, std::span<
char> buf,
sl loc) const;
1367 friend class internal::gate::const_connection_largeobject;
1368 [[nodiscard]]
char const *err_msg() const noexcept;
1371 std::string_view statement, internal::c_params const &,
1372 sl loc =
sl::current());
1375 void check_movable(
sl) const;
1377 void check_overwritable(
sl) const;
1379 friend class internal::gate::connection_errorhandler;
1383 friend class internal::gate::connection_transaction;
1384 result exec(std::string_view query,
sl loc) {
return exec(query,
"", loc); }
1385 result exec(std::string_view, std::string_view,
sl);
1387 exec(std::shared_ptr<std::string>
const &, std::string_view,
sl);
1390 return exec(query,
"", loc);
1393 PQXX_PRIVATE void register_transaction(transaction_base *);
1394 PQXX_PRIVATE void unregister_transaction(transaction_base *) noexcept;
1403 std::pair<std::unique_ptr<
char[], void (*)(
void const *)>, std::size_t>
1423 PQXX_PRIVATE [[nodiscard]]
bool is_busy() const noexcept;
1424 internal::pq::
PGresult *get_result();
1426 friend class internal::gate::connection_dbtransaction;
1427 friend class internal::gate::connection_sql_cursor;
1430 exec_params(std::string_view query, internal::c_params const &args,
sl);
1433 internal::pq::
PGconn *m_conn =
nullptr;
1446 std::shared_ptr<
pqxx::internal::notice_waiters> m_notice_waiters;
1450 using receiver_list =
1453 receiver_list m_receivers;
1469 int m_unique_id = 0;
1530 [[nodiscard]]
int sock() const & noexcept {
return m_conn.sock(); }
1548 [[nodiscard]] constexpr
bool done() const & noexcept
1550 return not m_reading and not m_writing;
1566 bool m_reading{
false};
1567 bool m_writing{
true};
1571 template<
typename T>
1582 else if constexpr (binary<T>)
1584 return quote_raw(t);
1595 std::string buf{
'\''};
1596 buf.resize(2 + 2 * std::size(
text) + 1);
1597 auto const content_bytes{
1598 esc_to_buf(
text, {std::begin(buf) + 1, std::end(buf)}, loc)};
1599 auto const closing_quote{1 + content_bytes};
1600 buf[closing_quote] =
'\'';
1601 auto const end{closing_quote + 1};
1608 template<pqxx::
char_
strings STRINGS>
1614 ","sv, std::cbegin(columns), std::cend(columns),
1615 [
this](
auto col) {
return this->quote_name(*col); }, c);
1619 template<pqxx::ZString STRING, ZKey_ZValues MAPPING>
1621 STRING
const &connection_string, MAPPING &&
params,
sl loc) :
1638 [[maybe_unused]]
static auto const version_check{
1653 auto [keys, values]{parsed_string.parse()};
1656 for (
auto const &[org_key, org_value] :
params)
1669 auto const it{std::ranges::find_if(keys, [key](
char const *existing) {
1670 return std::strcmp(existing, key) == 0;
1673 if (it == keys.end())
1676 keys.push_back(key);
1677 values.push_back(value);
1683 static_cast<std::size_t
>(std::distance(keys.begin(), it))};
1684 values[idx] = value;
1689 keys.push_back(
nullptr);
1690 values.push_back(
nullptr);
1692 init(keys, values, loc);
An ongoing, non-blocking stepping stone to a connection.
Definition: connection.hxx:1518
connecting(connecting &&)=default
connection produce(sl=sl::current()) &&
Produce the completed connection object.
int sock() const &noexcept
Get the socket. The socket may change during the connection process.
Definition: connection.hxx:1530
constexpr bool done() const &noexcept
Is our connection finished?
Definition: connection.hxx:1548
connecting(connecting const &)=delete
constexpr bool wait_to_write() const &noexcept
Should we currently wait to be able to write to the socket?
Definition: connection.hxx:1539
connecting & operator=(connecting &&)=default
connecting & operator=(connecting const &)=delete
constexpr bool wait_to_read() const &noexcept
Should we currently wait to be able to read from the socket?
Definition: connection.hxx:1533
connecting(zview connection_string=""_zv, sl=sl::current())
Start connecting.
void process(sl loc=sl::current()) &
Progress towards completion (but don't block).
Connection to a database.
Definition: connection.hxx:273
std::string encrypt_password(zview user, zview password, zview algorithm)
Encrypt a password for a given user.
Definition: connection.hxx:844
void set_session_var(std::string_view var, TYPE const &value, sl loc=sl::current()) &
Set one of the session variables to a new value.
Definition: connection.hxx:566
encoding_group get_encoding_group(sl loc=sl::current()) const
Read the curent client encoding's pqxx::encoding_group.
Definition: connection.hxx:536
std::string quote(T const &t, sl=sl::current()) const
Represent object as SQL string, including quoting & escaping.
Definition: connection.hxx:1572
std::string_view esc(std::string_view text, std::span< char > buffer, sl loc=sl::current())
Escape string for use as SQL string literal, into buffer.
Definition: connection.hxx:996
std::string esc(DATA const &data) const
Escape binary string for use as SQL string literal on this connection.
Definition: connection.hxx:1019
internal::pq::PGconn * release_raw_connection() &&
Release the raw connection without closing it.
Definition: connection.hxx:1282
zview esc_raw(DATA const &data, std::span< char > buffer) const
Escape binary string for use as SQL string literal, into buffer.
Definition: connection.hxx:1071
void set_notice_handler(std::function< void(zview)> handler)
Set a notice handler to the connection.
Definition: connection.hxx:1225
std::string quote_raw(DATA const &data) const
Escape and quote a string of binary data.
Definition: connection.hxx:1100
~connection()
Definition: connection.hxx:375
void prepare(zview definition, sl loc=sl::current()) &
Definition: connection.hxx:953
void prepare(zview name, zview definition, sl loc=sl::current()) &
Define a prepared statement.
Definition: connection.hxx:901
bytes unesc_bin(std::string_view text, sl loc=sl::current()) const
Unescape binary data, e.g. from a bytea field.
Definition: connection.hxx:1086
std::function< void(notification)> notification_handler
A handler callback for incoming notifications on a given channel.
Definition: connection.hxx:776
zview esc(DATA const &data, std::span< char > buffer, sl loc=sl::current()) const
Escape binary string for use as SQL string literal, into buffer.
Definition: connection.hxx:1038
connection(sl loc=sl::current())
Definition: connection.hxx:331
connection(STRING const &connection_string, sl loc=sl::current())
Connect to a database, passing a connection string.
Definition: connection.hxx:355
std::string connection_string() const
Return a connection string encapsulating this connection's options.
Definition: connection.cxx:1430
TYPE get_var_as(std::string_view var, sl loc=sl::current())
Read currently applicable value of a configuration variable.
Definition: connection.hxx:599
connection & operator=(connection const &)=delete
connection(MAPPING &¶ms, sl loc=sl::current())
Connect to a database, passing connection parameters.
Definition: connection.hxx:362
std::string esc_raw(DATA const &data) const
Escape binary string for use as SQL string literal on this connection.
Definition: connection.hxx:1064
static connection seize_raw_connection(internal::pq::PGconn *raw_conn, sl loc=sl::current())
Seize control of a raw libpq connection.
Definition: connection.hxx:1268
void prepare(std::string const &name, std::string const &definition, sl loc=sl::current()) &
Define a prepared statement.
Definition: connection.hxx:913
connection(connection const &)=delete
PQXX_ZARGS std::string esc(char const text[], sl loc=sl::current()) const
Escape string for use as SQL string literal on this connection.
Definition: connection.hxx:978
void prepare(std::string_view name, std::string_view definition, sl loc=sl::current()) &
Define a prepared statement.
Definition: connection.hxx:941
std::string quote_columns(STRINGS const &columns, sl=sl::current()) const
Quote and comma-separate a series of column names.
Definition: connection.hxx:1610
Definition: errorhandler.hxx:46
Parse a connection string into option keys and their values.
Definition: connection-string.hxx:11
Definition: connection-errorhandler.hxx:15
Definition: connection-largeobject.hxx:18
Definition: connection-notification_receiver.hxx:19
Definition: connection-pipeline.hxx:11
Definition: connection-sql_cursor.hxx:15
Definition: connection-stream_from.hxx:17
Definition: connection-stream_to.hxx:12
Definition: connection-transaction.hxx:14
Definition: connection-largeobject.hxx:33
Definition: notification.hxx:60
Build a parameter list for a parameterised or prepared statement.
Definition: params.hxx:65
Result set containing data returned by a query or command.
Definition: result.hxx:101
Marker-type wrapper: zero-terminated std::string_view.
Definition: zview.hxx:55
constexpr char const * c_str() const &noexcept
Return as C string.
Definition: zview.hxx:150
Something is out of range, similar to std::out_of_range.
Definition: except.hxx:651
The caller attempted to set a variable to null, which is not allowed.
Definition: except.hxx:358
Interface definition (and common code) for "transaction" classes.
Definition: transaction_base.hxx:151
Definition: connection.hxx:94
void PGconn
Placeholder for libpq's connection type.
Definition: types.hxx:429
void PGresult
Placeholder for libpq's result type.
Definition: types.hxx:431
Private namespace for libpqxx's internal use; do not access.
Definition: connection.cxx:333
PQXX_COLD PQXX_LIBEXPORT void skip_init_ssl(int skips) noexcept
Control OpenSSL/crypto library initialisation.
Definition: connection.cxx:185
constexpr PQXX_ZARGS char const * as_c_string(char const str[]) noexcept
Get a raw C string pointer.
Definition: util.hxx:406
constexpr PQXX_PURE pqxx::encoding_group get_encoding_group(encoding_group const &enc, sl=sl::current()) noexcept
Identity function for encoding_group, for regularity.
Definition: params.hxx:29
void unesc_bin(std::string_view escaped_data, std::span< std::byte > buffer, sl loc)
Reconstitute binary data from its escaped version.
Definition: util.cxx:194
int check_libpqxx_version(int apps_major, int apps_minor, int apps_patch, std::string_view apps_version)
Check library binary version against application's expectations.
Definition: util.cxx:258
constexpr PQXX_PURE std::size_t size_esc_bin(std::size_t binary_bytes) noexcept
Compute buffer size needed to escape binary data for use as a BYTEA.
Definition: util.hxx:493
constexpr encoding_group enc_group(std::string_view encoding_name, sl loc)
Look up encoding group for an encoding by name.
Definition: encodings.cxx:56
constexpr PQXX_PURE std::size_t size_unesc_bin(std::size_t escaped_bytes) noexcept
Compute binary size from the size of its escaped version.
Definition: util.hxx:505
void esc_bin(bytes_view binary_data, std::span< char > buffer) noexcept
Hex-escape binary data into a buffer.
Definition: util.cxx:159
The home of all libpqxx classes, functions, templates, etc.
Definition: array.cxx:26
std::span< std::byte const > bytes_view
Type alias for a view of bytes.
Definition: types.hxx:188
constexpr int const version_patch
Libpqxx patch version number. (E.g. for libpqxx 9.3.1, this will be 1.)
Definition: version.hxx:49
constexpr int const version_minor
Minor libpqxx version number. (E.g. for libpqxx 9.3.1, this will be 3.)
Definition: version.hxx:42
concept ZKey_ZValues
Concept: T is a range of pairs of zero-terminated strings.
Definition: connection.hxx:120
std::source_location sl
Convenience alias for std::source_location. It's just too long.
Definition: types.hxx:38
PQXX_LIBEXPORT std::string to_string(field_ref const &value, ctx)
Convert a field_ref to a string.
Definition: field.hxx:891
void skip_init_ssl() noexcept
Control initialisation of OpenSSL and libcrypto libraries.
Definition: connection.hxx:225
bytes_view binary_cast(TYPE const &data)
Cast binary data to a type that libpqxx will recognise as binary.
Definition: util.hxx:260
std::initializer_list< std::string_view > table_path
Representation of a PostgreSQL table path.
Definition: connection.hxx:240
encoding_group
Definition: encoding_group.hxx:40
concept ZString
Concept: T is a known zero-terminated string type.
Definition: zview.hxx:33
std::string separated_list(std::string_view sep, ITER begin, ITER end, ACCESS access, ctx c={})
Represent sequence of values as a string, joined by a given separator.
Definition: separated_list.hxx:41
connection & conn
The connection which received the notification.
Definition: connection.hxx:150
constexpr bool is_null(TYPE const &value) noexcept
Is value a null?
Definition: strconv.hxx:764
requires(pqxx::internal::to_buf_7< TYPE > or pqxx::internal::to_buf_8< TYPE >) const eval bool supports_to_buf_8()
Is the libpqxx 8 version of to_buf() supported for TYPE?
Definition: strconv.hxx:417
int backend_pid
Process ID of the backend that sent the notification.
Definition: connection.hxx:176
constexpr int const version_major
Major libpqxx version number. (E.g. for libpqxx 9.3.1, this will be 9.)
Definition: version.hxx:38
skip_init
Flags for skipping initialisation of SSL-related libraries.
Definition: connection.hxx:189
@ crypto
Skip initialisation of libcrypto.
Definition: connection.hxx:197
@ openssl
Skip initialisation of OpenSSL library.
Definition: connection.hxx:194
@ nothing
A do-nothing flag that does not affect anything.
Definition: connection.hxx:191
zview channel
Channel name.
Definition: connection.hxx:158
constexpr std::string_view const version
Full libpqxx version string.
Definition: version.hxx:24
std::vector< std::byte > bytes
Type alias for a container containing bytes.
Definition: util.hxx:240
zview payload
Optional payload text.
Definition: connection.hxx:163
error_verbosity
Error verbosity levels.
Definition: connection.hxx:245
format
Format code: is data text or binary?
Definition: types.hxx:121
An incoming notification.
Definition: connection.hxx:141
Contextual parameters for string conversions implementations.
Definition: strconv.hxx:163