libpq usage from C++

Started by Igor Korot22 days ago4 messagesgeneral
Jump to latest
#1Igor Korot
ikorot01@gmail.com

Hi, ALL,

Does anybody use libpq from C++?

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"?

Thank you.

#2Ron
ronljohnsonjr@gmail.com
In reply to: Igor Korot (#1)
Re: libpq usage from C++

On Sat, Mar 14, 2026 at 12:41 AM Igor Korot <ikorot01@gmail.com> wrote:

Hi, ALL,

Does anybody use libpq from C++?

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"?

Maybe use an existing libpq wrapper for c++?

--
Death to <Redacted>, and butter sauce.
Don't boil me, I'm still alive.
<Redacted> lobster!

#3Adrian Klaver
adrian.klaver@aklaver.com
In reply to: Igor Korot (#1)
Re: libpq usage from C++

On 3/13/26 9:40 PM, Igor Korot wrote:

Hi, ALL,

Does anybody use libpq from C++?

Search engine of choice:

libpq c++

yields:

https://pqxx.org/development/libpqxx/

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"?

Thank you.

--
Adrian Klaver
adrian.klaver@aklaver.com

#4Dominique Devienne
ddevienne@gmail.com
In reply to: Igor Korot (#1)
Re: libpq usage from C++

On Sat, Mar 14, 2026 at 5:41 AM Igor Korot <ikorot01@gmail.com> 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