13 #ifndef PQXX_H_CONNECTION 14 #define PQXX_H_CONNECTION 16 #include "pqxx/compiler-public.hxx" 17 #include "pqxx/internal/compiler-internal-pre.hxx" 22 #include <initializer_list> 26 #include <string_view> 30 #if defined(PQXX_HAVE_CONCEPTS) && __has_include(<ranges>) 34 #include "pqxx/errorhandler.hxx" 35 #include "pqxx/except.hxx" 36 #include "pqxx/prepared_statement.hxx" 37 #include "pqxx/separated_list.hxx" 38 #include "pqxx/strconv.hxx" 39 #include "pqxx/util.hxx" 40 #include "pqxx/zview.hxx" 74 #if defined(PQXX_HAVE_CONCEPTS) 77 concept ZKey_ZValues = std::ranges::input_range<T> and requires()
79 {std::tuple_size<typename std::ranges::iterator_t<T>::value_type>::value};
81 and std::tuple_size_v<typename std::ranges::iterator_t<T>::value_type> == 2 and
85 std::get<0>(*std::cbegin(t))
89 std::get<1>(*std::cbegin(t))
93 #endif // PQXX_HAVE_CONCEPTS 99 class connection_dbtransaction;
100 class connection_errorhandler;
101 class connection_largeobject;
102 class connection_notification_receiver;
103 class connection_pipeline;
104 class connection_sql_cursor;
105 class connection_stream_from;
106 class connection_stream_to;
107 class connection_transaction;
108 class const_connection_largeobject;
127 deprecated(
"Use connection::encrypt_password instead.")]] std::string
133 deprecated(
"Use connection::encrypt_password instead.")]]
inline std::string
136 #include "pqxx/internal/ignore-deprecated-pre.hxx" 138 #include "pqxx/internal/ignore-deprecated-post.hxx" 209 #if defined(PQXX_HAVE_CONCEPTS) 226 template<
internal::ZKey_ZValues MAPPING>
228 #endif // PQXX_HAVE_CONCEPTS 236 catch (std::exception
const &)
244 connection &operator=(connection &&rhs);
246 connection(connection
const &) =
delete;
247 connection &operator=(connection
const &) =
delete;
254 [[nodiscard]]
bool PQXX_PURE is_open()
const noexcept;
257 void process_notice(
char const[]) noexcept;
262 void process_notice(
zview) noexcept;
265 void trace(std::FILE *) noexcept;
277 [[nodiscard]]
char const *dbname()
const;
281 [[nodiscard]]
char const *username()
const;
284 [[nodiscard]]
char const *hostname()
const;
287 [[nodiscard]]
char const *port()
const;
290 [[nodiscard]]
int PQXX_PURE backendpid()
const noexcept;
308 [[nodiscard]]
int PQXX_PURE sock()
const noexcept;
314 [[nodiscard]]
int PQXX_PURE protocol_version()
const noexcept;
329 [[nodiscard]]
int PQXX_PURE server_version()
const noexcept;
353 [[nodiscard]] std::string get_client_encoding()
const;
362 set_client_encoding(encoding.
c_str());
369 void set_client_encoding(
char const encoding[]);
372 [[nodiscard]]
int PQXX_PRIVATE encoding_id()
const;
392 void set_variable(std::string_view var, std::string_view value);
398 std::string get_variable(std::string_view);
431 int await_notification();
442 int await_notification(std::time_t seconds,
long microseconds);
475 [[nodiscard]] std::string
483 char const user[],
char const password[],
char const *algorithm =
nullptr);
543 void prepare(
char const name[],
char const definition[]);
553 void prepare(
char const definition[]);
557 void unprepare(std::string_view name);
565 [[nodiscard]] std::string adorn_name(std::string_view);
578 [[nodiscard]] std::string
esc(
char const text[], std::size_t maxlen)
const 580 return esc(std::string_view(text, maxlen));
585 [[nodiscard]] std::string
esc(
char const text[])
const 587 return esc(std::string_view(text));
595 [[nodiscard]] std::string esc(std::string_view
text)
const;
601 [[deprecated(
"Use std::byte for binary data.")]] std::string
602 esc_raw(
unsigned char const bin[], std::size_t len)
const;
606 [[nodiscard]] std::string esc_raw(std::basic_string_view<std::byte>)
const;
615 return unesc_raw(text.
c_str());
623 [[nodiscard]] std::string unesc_raw(
char const text[])
const;
628 [[deprecated(
"Use quote(std::basic_string_view<std::byte>).")]]
630 quote_raw(
unsigned char const bin[], std::size_t len)
const;
633 [[deprecated(
"Use quote(std::basic_string_view<std::byte>).")]]
634 std::string quote_raw(std::basic_string_view<std::byte>)
const;
638 [[nodiscard]] std::string quote_name(std::string_view identifier)
const;
645 [[nodiscard]] std::string quote_table(std::string_view name)
const;
657 [[nodiscard]] std::string quote_table(
table_path)
const;
669 template<
typename CONTAINER>
670 inline std::enable_if_t<
671 std::is_convertible_v<typename CONTAINER::value_type, std::string_view>,
673 quote_columns(CONTAINER
const &columns)
const;
681 [[nodiscard]]
inline std::string quote(T
const &t)
const;
684 [[nodiscard, deprecated(
"Use std::byte for binary data.")]] std::string
689 [[nodiscard]] std::string
690 quote(std::basic_string_view<std::byte> bytes)
const;
717 [[nodiscard]] std::string
718 esc_like(std::string_view text,
char escape_char =
'\\')
const;
753 [[nodiscard]] std::vector<errorhandler *> get_errorhandlers()
const;
762 [[nodiscard]] std::string connection_string()
const;
772 void init(
char const options[]);
774 void init(
char const *params[],
char const *values[]);
775 void complete_init();
778 void wait_read(std::time_t seconds,
long microseconds)
const;
781 internal::pq::PGresult *pgr, std::shared_ptr<std::string>
const &query,
782 std::string_view desc =
""sv);
784 void PQXX_PRIVATE set_up_state();
786 int PQXX_PRIVATE PQXX_PURE status()
const noexcept;
793 std::size_t esc_to_buf(std::string_view text,
char *buf)
const;
795 friend class internal::gate::const_connection_largeobject;
796 char const *PQXX_PURE err_msg() const noexcept;
798 void PQXX_PRIVATE process_notice_raw(
char const msg[]) noexcept;
800 result exec_prepared(
std::string_view statement, internal::c_params const &);
803 void check_movable() const;
805 void check_overwritable() const;
807 friend class internal::gate::connection_errorhandler;
808 void PQXX_PRIVATE register_errorhandler(
errorhandler *);
809 void PQXX_PRIVATE unregister_errorhandler(errorhandler *) noexcept;
811 friend class internal::gate::connection_transaction;
812 result PQXX_PRIVATE exec(
std::string_view,
std::string_view = ""sv);
814 PQXX_PRIVATE exec(
std::shared_ptr<
std::
string>,
std::string_view = ""sv);
816 void PQXX_PRIVATE unregister_transaction(transaction_base *) noexcept;
818 friend class internal::gate::connection_stream_from;
819 std::pair<
std::unique_ptr<
char,
std::function<
void(
char *)>>,
std::
size_t>
820 PQXX_PRIVATE read_copy_line();
822 friend class internal::gate::connection_stream_to;
823 void PQXX_PRIVATE write_copy_line(
std::string_view);
824 void PQXX_PRIVATE end_copy_write();
826 friend class internal::gate::connection_largeobject;
827 internal::pq::PGconn *raw_connection()
const {
return m_conn; }
829 friend class internal::gate::connection_notification_receiver;
833 friend class internal::gate::connection_pipeline;
834 void PQXX_PRIVATE start_exec(
char const query[]);
835 bool PQXX_PRIVATE consume_input() noexcept;
836 bool PQXX_PRIVATE is_busy() const noexcept;
837 internal::pq::PGresult *get_result();
839 friend class internal::gate::connection_dbtransaction;
840 friend class internal::gate::connection_sql_cursor;
842 result exec_params(
std::string_view query, internal::c_params const &args);
845 internal::pq::PGconn *m_conn =
nullptr;
859 using receiver_list =
862 receiver_list m_receivers;
873 template<typename T> inline
std::
string connection::quote(T const &t)
const 889 std::string buf{
'\''};
890 buf.resize(2 + 2 * std::size(text) + 1);
891 auto const content_bytes{esc_to_buf(text, buf.data() + 1)};
892 auto const closing_quote{1 + content_bytes};
893 buf[closing_quote] =
'\'';
894 auto const end{closing_quote + 1};
901 template<
typename CONTAINER>
902 inline std::enable_if_t<
903 std::is_convertible_v<typename CONTAINER::value_type, std::string_view>,
908 ","sv, std::cbegin(columns), std::cend(columns),
909 [
this](
auto col) {
return this->quote_name(*col); });
913 #if defined(PQXX_HAVE_CONCEPTS) 914 template<
internal::ZKey_ZValues MAPPING>
919 std::vector<char const *> keys, values;
920 if constexpr (std::ranges::sized_range<MAPPING>)
922 auto const size{std::ranges::size(params) + 1};
924 values.reserve(size);
926 for (
auto const &[key, value] : params)
931 keys.push_back(
nullptr);
932 values.push_back(
nullptr);
933 init(keys.data(), values.data());
935 #endif // PQXX_HAVE_CONCEPTS 941 PQXX_LIBEXPORT
void wait_read(internal::pq::PGconn
const *);
943 internal::pq::PGconn
const *, std::time_t seconds,
long microseconds);
944 PQXX_LIBEXPORT
void wait_write(internal::pq::PGconn
const *);
947 #include "pqxx/internal/compiler-internal-post.hxx"
void check_version()
Definition: util.hxx:171
Internal items for libpqxx' own use. Do not use these yourself.
Definition: composite.hxx:73
error_verbosity
Error verbosity levels.
Definition: connection.hxx:143
void wait_read(internal::pq::PGconn const *)
Definition: connection.cxx:991
std::string to_string(field const &value)
Convert a field to a string.
Definition: result.cxx:503
std::string esc(char const text[], std::size_t maxlen) const
Escape string for use as SQL string literal on this connection.
Definition: connection.hxx:578
connection(zview options)
Connect to a database, using options string.
Definition: connection.hxx:196
Result set containing data returned by a query or command.
Definition: result.hxx:70
Definition: connection.hxx:97
constexpr char const * c_str() const noexcept
Either a null pointer, or a zero-terminated text buffer.
Definition: zview.hxx:85
constexpr char const * as_c_string(char const str[]) noexcept
Get a raw C string pointer.
Definition: zview.hxx:121
The home of all libpqxx classes, functions, templates, etc.
Definition: array.hxx:25
std::string unesc_raw(zview text) const
Unescape binary data, e.g. from a table field or notification payload.
Definition: connection.hxx:613
std::initializer_list< std::string_view > table_path
Representation of a PostgreSQL table path.
Definition: connection.hxx:122
std::enable_if_t< std::is_convertible_v< typename CONTAINER::value_type, std::string_view >, std::string > quote_columns(CONTAINER const &columns) const
Quote and comma-separate a series of column names.
Definition: connection.hxx:905
std::string encrypt_password(zview user, zview password, zview algorithm)
Encrypt a password for a given user.
Definition: connection.hxx:477
std::string encrypt_password(char const user[], char const password[])
Encrypt a password.
Definition: connection.cxx:95
bool is_null(TYPE const &value) noexcept
Is value null?
Definition: strconv.hxx:353
Binary data corresponding to PostgreSQL's "BYTEA" binary-string type.
Definition: binarystring.hxx:56
connection()
Definition: connection.hxx:186
Traits describing a type's "null value," if any.
Definition: strconv.hxx:86
void set_client_encoding(zview encoding)
Set client-side character encoding, by name.
Definition: connection.hxx:360
Base class for error-handler callbacks.
Definition: errorhandler.hxx:52
void wait_write(internal::pq::PGconn const *)
Definition: connection.cxx:1010
~connection()
Definition: connection.hxx:230
Interface definition (and common code) for "transaction" classes.
Definition: transaction_base.hxx:74
void prepare(zview name, zview definition)
Define a prepared statement.
Definition: connection.hxx:534
Connection to a database.
Definition: connection.hxx:183
void prepare(zview definition)
Definition: connection.hxx:554
connection(char const options[])
Connect to a database, using options string.
Definition: connection.hxx:189
Build a parameter list for a parameterised or prepared statement.
Definition: prepared_statement.hxx:121
Marker-type wrapper: zero-terminated std::string_view.
Definition: zview.hxx:37
std::string separated_list(std::string_view sep, ITER begin, ITER end, ACCESS access)
Represent sequence of values as a string, joined by a given separator.
Definition: separated_list.hxx:42
Definition: notification.hxx:55
std::string esc(char const text[]) const
Escape string for use as SQL string literal on this connection.
Definition: connection.hxx:585