13 #ifndef PQXX_H_CONNECTION
14 #define PQXX_H_CONNECTION
16 #include "pqxx/compiler-public.hxx"
17 #include "pqxx/internal/compiler-internal-pre.hxx"
25 #include <string_view>
28 #if __has_include(<ranges>)
32 #include "pqxx/errorhandler.hxx"
33 #include "pqxx/except.hxx"
34 #include "pqxx/prepared_statement.hxx"
35 #include "pqxx/strconv.hxx"
36 #include "pqxx/util.hxx"
37 #include "pqxx/zview.hxx"
71 #if defined(PQXX_HAVE_CONCEPTS)
74 concept ZKey_ZValues = std::ranges::input_range<T> and requires()
76 {std::tuple_size<typename std::ranges::iterator_t<T>::value_type>::value};
78 and std::tuple_size_v<typename std::ranges::iterator_t<T>::value_type> == 2 and
82 std::get<0>(*std::cbegin(t))
86 std::get<1>(*std::cbegin(t))
96 class connection_dbtransaction;
97 class connection_errorhandler;
98 class connection_largeobject;
99 class connection_notification_receiver;
100 class connection_pipeline;
101 class connection_sql_cursor;
102 class connection_stream_from;
103 class connection_stream_to;
104 class connection_transaction;
105 class const_connection_largeobject;
113 deprecated(
"Use connection::encrypt_password instead.")]] std::string
119 deprecated(
"Use connection::encrypt_password instead.")]]
inline std::string
122 #include "pqxx/internal/ignore-deprecated-pre.hxx"
124 #include "pqxx/internal/ignore-deprecated-post.hxx"
195 #if defined(PQXX_HAVE_CONCEPTS)
212 template<
internal::ZKey_ZValues MAPPING>
222 catch (std::exception
const &)
240 [[nodiscard]]
bool PQXX_PURE is_open() const noexcept;
243 void process_notice(
char const[]) noexcept;
248 void process_notice(
zview) noexcept;
251 void trace(std::FILE *) noexcept;
264 [[nodiscard]]
char const *dbname() const;
267 [[nodiscard]]
char const *username() const;
270 [[nodiscard]]
char const *hostname() const;
273 [[nodiscard]]
char const *port() const;
276 [[nodiscard]]
int PQXX_PURE backendpid() const noexcept;
294 [[nodiscard]]
int PQXX_PURE sock() const noexcept;
300 [[nodiscard]]
int PQXX_PURE protocol_version() const noexcept;
315 [[nodiscard]]
int PQXX_PURE server_version() const noexcept;
340 [[nodiscard]] std::
string get_client_encoding() const;
346 void set_client_encoding(
zview encoding)
348 set_client_encoding(encoding.c_str());
355 void set_client_encoding(
char const encoding[]);
358 [[nodiscard]]
int PQXX_PRIVATE encoding_id()
const;
378 void set_variable(std::string_view var, std::string_view value);
384 std::string get_variable(std::string_view);
417 int await_notification();
428 int await_notification(std::time_t seconds,
long microseconds);
462 [[nodiscard]] std::string
469 char const user[],
char const password[],
char const *algorithm =
nullptr);
529 void prepare(
char const name[],
char const definition[]);
539 void prepare(
char const definition[]);
543 void unprepare(std::string_view name);
551 [[nodiscard]] std::string adorn_name(std::string_view);
563 [[nodiscard]] std::string
esc(
char const text[], std::size_t maxlen)
const
565 return esc(std::string_view(text, maxlen));
569 [[nodiscard]] std::string
esc(
char const text[])
const
571 return esc(std::string_view(text));
578 [[nodiscard]] std::string esc(std::string_view text)
const;
583 [[nodiscard, deprecated(
"Use std::byte for binary data.")]] std::string
584 esc_raw(
unsigned char const bin[], std::size_t len)
const;
587 [[nodiscard]] std::string esc_raw(std::basic_string_view<std::byte>)
const;
595 return unesc_raw(text.
c_str());
602 [[nodiscard]] std::string unesc_raw(
char const text[])
const;
607 [[nodiscard, deprecated(
"Use std::byte for binary data.")]] std::string
608 quote_raw(
unsigned char const bin[], std::size_t len)
const;
611 [[nodiscard]] std::string quote_raw(std::basic_string_view<std::byte>)
const;
614 [[nodiscard]] std::string quote_name(std::string_view identifier)
const;
621 [[nodiscard]]
inline std::string quote(T
const &t)
const;
624 [[nodiscard, deprecated(
"Use std::byte for binary data.")]] std::string
628 [[nodiscard]] std::string
629 quote(std::basic_string_view<std::byte> bytes)
const;
655 [[nodiscard]] std::string
656 esc_like(std::string_view text,
char escape_char =
'\\')
const;
691 [[nodiscard]] std::vector<errorhandler *> get_errorhandlers()
const;
700 [[nodiscard]] std::string connection_string()
const;
710 void init(
char const options[]);
712 void init(
char const *params[],
char const *values[]);
713 void complete_init();
715 void wait_read()
const;
716 void wait_read(std::time_t seconds,
long microseconds)
const;
719 internal::pq::PGresult *pgr, std::shared_ptr<std::string>
const &query,
720 std::string_view desc =
""sv);
722 void PQXX_PRIVATE set_up_state();
724 int PQXX_PRIVATE PQXX_PURE status() const noexcept;
731 std::
size_t esc_to_buf(std::string_view text,
char *buf) const;
733 friend class internal::gate::const_connection_largeobject;
734 char const *PQXX_PURE err_msg() const noexcept;
736 void PQXX_PRIVATE process_notice_raw(
char const msg[]) noexcept;
738 result exec_prepared(std::string_view statement, internal::params const &);
741 void check_movable() const;
743 void check_overwritable() const;
745 friend class internal::gate::connection_errorhandler;
746 void PQXX_PRIVATE register_errorhandler(
errorhandler *);
747 void PQXX_PRIVATE unregister_errorhandler(
errorhandler *) noexcept;
749 friend class internal::gate::connection_transaction;
750 result PQXX_PRIVATE exec(std::string_view, std::string_view = ""sv);
752 PQXX_PRIVATE exec(std::shared_ptr<std::
string>, std::string_view = ""sv);
756 friend class internal::gate::connection_stream_from;
757 std::pair<std::unique_ptr<
char, std::function<
void(
char *)>>, std::
size_t>
758 PQXX_PRIVATE read_copy_line();
760 friend class internal::gate::connection_stream_to;
761 void PQXX_PRIVATE write_copy_line(std::string_view);
762 void PQXX_PRIVATE end_copy_write();
764 friend class internal::gate::connection_largeobject;
765 internal::pq::PGconn *raw_connection()
const {
return m_conn; }
767 friend class internal::gate::connection_notification_receiver;
771 friend class internal::gate::connection_pipeline;
772 void PQXX_PRIVATE start_exec(
char const query[]);
773 bool PQXX_PRIVATE consume_input() noexcept;
774 bool PQXX_PRIVATE is_busy() const noexcept;
775 internal::pq::PGresult *get_result();
777 friend class internal::gate::connection_dbtransaction;
778 friend class internal::gate::connection_sql_cursor;
780 result exec_params(std::string_view query, internal::params const &args);
783 internal::pq::PGconn *m_conn =
nullptr;
797 using receiver_list =
800 receiver_list m_receivers;
811 template<typename T> inline std::
string connection::quote(T const &t)
const
827 std::string buf{
'\''};
828 buf.resize(2 + 2 * std::size(text) + 1);
829 auto const content_bytes{esc_to_buf(text, buf.data() + 1)};
830 auto const closing_quote{1 + content_bytes};
831 buf[closing_quote] =
'\'';
832 auto const end{closing_quote + 1};
839 #if defined(PQXX_HAVE_CONCEPTS)
840 template<
internal::ZKey_ZValues MAPPING>
845 std::vector<char const *> keys, values;
846 if constexpr (std::ranges::sized_range<MAPPING>)
848 auto const size{std::ranges::size(params) + 1};
850 values.reserve(size);
852 for (
auto const &[key, value] : params)
857 keys.push_back(
nullptr);
858 values.push_back(
nullptr);
859 init(keys.data(), values.data());
867 PQXX_LIBEXPORT
void wait_read(internal::pq::PGconn
const *);
869 internal::pq::PGconn
const *, std::time_t seconds,
long microseconds);
870 PQXX_LIBEXPORT
void wait_write(internal::pq::PGconn
const *);
873 #include "pqxx/internal/compiler-internal-post.hxx"
The home of all libpqxx classes, functions, templates, etc.
Definition: array.hxx:26
void check_version()
Definition: util.hxx:167
std::string to_string(field const &value)
Convert a field to a string.
Definition: result.cxx:503
bool is_null(TYPE const &value) noexcept
Is value null?
Definition: strconv.hxx:353
error_verbosity
Error verbosity levels.
Definition: connection.hxx:130
std::string encrypt_password(char const user[], char const password[])
Encrypt a password.
Definition: connection.cxx:95
Internal items for libpqxx' own use. Do not use these yourself.
Definition: composite.hxx:74
void wait_write(internal::pq::PGconn const *)
Definition: connection.cxx:996
constexpr char const * as_c_string(char const str[]) noexcept
Get a raw C string pointer.
Definition: zview.hxx:121
void wait_read(internal::pq::PGconn const *)
Definition: connection.cxx:977
Definition: connection.hxx:95
Binary data corresponding to PostgreSQL's "BYTEA" binary-string type.
Definition: binarystring.hxx:57
Connection to a database.
Definition: connection.hxx:170
std::string encrypt_password(zview user, zview password, zview algorithm)
Encrypt a password for a given user.
Definition: connection.hxx:463
connection(char const options[])
Connect to a database, using options string.
Definition: connection.hxx:175
connection()
Definition: connection.hxx:172
~connection()
Definition: connection.hxx:216
void prepare(zview name, zview definition)
Define a prepared statement.
Definition: connection.hxx:520
connection(zview options)
Connect to a database, using options string.
Definition: connection.hxx:182
std::string esc(char const text[]) const
Escape string for use as SQL string literal on this connection.
Definition: connection.hxx:569
void prepare(zview definition)
Definition: connection.hxx:540
std::string unesc_raw(zview text) const
Unescape binary data, e.g. from a table field or notification payload.
Definition: connection.hxx:593
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:563
connection & operator=(connection const &)=delete
connection(connection const &)=delete
Base class for error-handler callbacks.
Definition: errorhandler.hxx:53
Definition: notification.hxx:56
Result set containing data returned by a query or command.
Definition: result.hxx:71
Traits describing a type's "null value," if any.
Definition: strconv.hxx:87
Interface definition (and common code) for "transaction" classes.
Definition: transaction_base.hxx:72
Marker-type wrapper: zero-terminated std::string_view.
Definition: zview.hxx:38
constexpr char const * c_str() const noexcept
Either a null pointer, or a zero-terminated text buffer.
Definition: zview.hxx:85