public inbox for [email protected]
help / color / mirror / Atom feedFrom: Dominique Devienne <[email protected]>
To: Igor Korot <[email protected]>
Cc: pgsql-generallists.postgresql.org <[email protected]>
Subject: Re: libpq usage from C++
Date: Mon, 16 Mar 2026 11:25:15 +0100
Message-ID: <CAFCRh-8+GXA+j0qyccc+Yj3TWZy7Uy1v8V_ohqC8D9u7+j3ZUg@mail.gmail.com> (raw)
In-Reply-To: <CA+FnnTzfegG8E3JoB0P9cFMZLS2__+0ZtixyGHtxxmSXKk=o6A@mail.gmail.com>
References: <CA+FnnTzfegG8E3JoB0P9cFMZLS2__+0ZtixyGHtxxmSXKk=o6A@mail.gmail.com>
On Sat, Mar 14, 2026 at 5:41 AM Igor Korot <[email protected]> wrote:
> Does anybody use libpq from C++?
Yes
> C++ introduces STL.
> C++ introduces smart-pointers.
> Is there a simple way of using those writing libpq communication?
> Or should I just forget about them and use good old "dump pointers"?
Using an existing wrapper is simplest, of course.
We wrote our own. To each its own. E.g.
PS: Avoid the fwd-decl by using the actual libpq headers instead.
extern "C" {
struct pg_conn;
struct pg_result;
typedef struct pg_conn PGconn;
typedef struct pg_result PGresult;
typedef struct _PQconninfoOption PQconninfoOption;
typedef struct pgNotify PGnotify;
void PQfreemem(void *ptr);
void PQclear(PGresult* res);
void PQfinish(PGconn* conn);
void PQconninfoFree(PQconninfoOption* conn);
} // extern "C"
namespace acme::postgresql {
struct PGDeleterFunctor {
void operator()(PGresult* r) {
if (r != nullptr) {
PQclear(r);
}
}
void operator()(PGconn* c) {
if (c != nullptr) {
PQfinish(c);
}
}
void operator()(PQconninfoOption* c) {
if (c != nullptr) {
PQconninfoFree(c);
}
}
void operator()(PGnotify* n) {
if (n != nullptr) {
PQfreemem(n);
}
}
};
using PGresult_uptr = std::unique_ptr<PGresult, PGDeleterFunctor>;
using PGconn_uptr = std::unique_ptr<PGconn, PGDeleterFunctor>;
using PGconninfo_uptr = std::unique_ptr<PQconninfoOption, PGDeleterFunctor>;
using PGnotify_uptr = std::unique_ptr<PGnotify, PGDeleterFunctor>;
...
}
Then we have higher-level wrappers that compose those RAII low-level ones. --DD
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected], [email protected]
Subject: Re: libpq usage from C++
In-Reply-To: <CAFCRh-8+GXA+j0qyccc+Yj3TWZy7Uy1v8V_ohqC8D9u7+j3ZUg@mail.gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox