Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w258d-000rYm-1w for pgsql-general@arkaria.postgresql.org; Mon, 16 Mar 2026 10:25:32 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w258c-009FeB-22 for pgsql-general@arkaria.postgresql.org; Mon, 16 Mar 2026 10:25:31 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w258c-009Fe2-11 for pgsql-general@lists.postgresql.org; Mon, 16 Mar 2026 10:25:31 +0000 Received: from mail-pg1-x532.google.com ([2607:f8b0:4864:20::532]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w258a-00000000NpJ-3gDl for pgsql-general@lists.postgresql.org; Mon, 16 Mar 2026 10:25:30 +0000 Received: by mail-pg1-x532.google.com with SMTP id 41be03b00d2f7-c70f91776fcso1681321a12.0 for ; Mon, 16 Mar 2026 03:25:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1773656728; cv=none; d=google.com; s=arc-20240605; b=kKUGf2v+XCBgkGo+FEH1cdrLtaDKAUbkZmRcQzAp5rDCqJd5a5fCcRSrTdbMFrWcb4 pedW5teQ3cQqU5o1dnM1scvoKRNUBEL7IxhPd+hS+6JQxdKcGzk1sto4QI6sNZvZhMjg FHDlZl1nwf+IQR/UEuwza1PYcln7lwDbkeokBGu19VIGne/4TYbpe49zZjkG5fawtnQA zzI7AfAOlrNzruZ4U3NuK8MlC3GLzvfKgX0basFVPGhG30Z8W14xxRNVlQzlTordIPWG xL7PScpinF8nXV40E3iuo15ZcF/Ke0Qk12b48tDvL9Iri1H/tJlrxZbcrNtniK1lJvcm ml9w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=SJgAR3e6TGUED4E+ONrK221xjX5vvJ6ukIQ4FawQX4Y=; fh=MqX3/PjeIRWyveucHIwmT3MEzIvphFWgoM5FEnVDTkI=; b=HxGOeVvvkVH2kQk7PHQFvWBVoWWFCKfOA+N8zVjnccbHK1LPU8ypDwhsi3zGL39U4A Uka0VFUNsltw64t3qIHylUvKuj9CTpmk+vFX40LDWpDi8BH2eoJZsbBZ4H/PBXVXk6h5 WofZv4W3tcD6cbsob0ZcRMj9HaMRP0XJNfsRbj64tH7pcI7tkQGb3y96iXhRJTR+k17G ZsxUEQeyfM84i0dNyNzWew8dm0VFx4/5GsJhBqUL11/WxP/iW0Q5BY/8F7+GtcjSijSh mtJGXMgj24uRCePVbrO+pjMaw6EhpUkXQWlhESj74b7AgNwlThobbfEbtbAh0Qci1Qcc 7x+Q==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773656728; x=1774261528; darn=lists.postgresql.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=SJgAR3e6TGUED4E+ONrK221xjX5vvJ6ukIQ4FawQX4Y=; b=V9H8B0zZ2YZuU+gWQiS1jT4Q+cTDjsVFnoAdiGuVsIOCLtO1dGugNBNEUIv44Aj7WU v0+fXAJ22e7rG1nFZ++m1nwl7PtEQhTtEo1xZyC5jmZauMseX6zr5nWP66P+JJVIhbG2 TOinRKWI8kzLwtMNaHsav8VJJaNztfyVssy3N5hP5I37tEd+h34JxjSeHzxVfLuXJsXy hMXft2tzpdk5ly9TktGS8JDZ0U9G9n49SH2YlJkpagtfW8tA0cFPJLIgZOzfLA9Qf+1/ NUW1qBpx6/39THQsm2ixvbVvZMeObqPPYzVDDmnZAuDujOVw84ZqF6oD6DXI3NZojF+m lnSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773656728; x=1774261528; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=SJgAR3e6TGUED4E+ONrK221xjX5vvJ6ukIQ4FawQX4Y=; b=VqCk6SKUGjYeQAb0CHmVYVkDFbOYN6G7wZ/cxYj/KybAbs9x74G8VDxV+bwo1FJpIf ncxjhoBetIw1YXv9iTw9LKaPIajC3wwZBE09limL832Joxqy6zcegPUmW6k+TdsSkTbw IpNoAhu+AJFohUxiCz5KOCPCFVn3oS0CFURBB24XQm1EnWjA64KZyDSYnSm//g1rH3vZ bdPHi1kURBUS5Rx4ByWX/xQ6P5djxIrvGnMNwx4ivtJd60sJ1U3jSAPYzuxyLR20bnmM Qm1VCJLa5US22SLS1dVVLLIOjg20Av8CI4Bd3PSgJTB3X90QK9zIHltCAySC+/0DSy5s Ebdw== X-Gm-Message-State: AOJu0Yxf3ghKJ4VZF3ruLKWYbBImRvj7v2LatYBCVA2brFgV2BI4jhDV /vMscN2IO6MYw2iJyiV7r+832unLuiPKv/ndJAIAkOwmdKG9LMlNPyxqy/FkLKGyLqmbmoZaT/r 5G+sVmTPYC6qZhYhOiuMDOL3yD2fLWlh7NXSU X-Gm-Gg: ATEYQzyG0y7w3gL0eAd3/7n/zTHdtOwfUFbgig/7/01Sphq1bPNb5pSsY0bYk7QfcOI fnRMrP85dTPSc5MSijmrP/EdZKRjED9XEeMN5krqXF+3RUc5scSCVYyCr40ScES1GfsLqYlQiLT SgDYwQTueO9cSUrmkP0k8IiVNqNF26LJhhmCtoien83kGS3rfRsOoAGA6V76/NxOW8w0koCGcei gTsAoLeSJNp82RFsNjXaw2HWTlGUBuaVTQR1VJDbGVBeDF4H30MHEaJ5PgSPezuSCDtwp6eeXTF SaecqmNAYw== X-Received: by 2002:a17:903:2ec6:b0:2ae:c9be:5f2c with SMTP id d9443c01a7336-2aecaa15da9mr123148265ad.21.1773656728107; Mon, 16 Mar 2026 03:25:28 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Dominique Devienne Date: Mon, 16 Mar 2026 11:25:15 +0100 X-Gm-Features: AaiRm53DWlqyP8jJQ2o2JLRBgqAnHrQOWNeB7Ao15L04ra6imHlln-KR0jz8kF8 Message-ID: Subject: Re: libpq usage from C++ To: Igor Korot Cc: "pgsql-generallists.postgresql.org" Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Sat, Mar 14, 2026 at 5:41=E2=80=AFAM Igor Korot wro= te: > 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 !=3D nullptr) { PQclear(r); } } void operator()(PGconn* c) { if (c !=3D nullptr) { PQfinish(c); } } void operator()(PQconninfoOption* c) { if (c !=3D nullptr) { PQconninfoFree(c); } } void operator()(PGnotify* n) { if (n !=3D nullptr) { PQfreemem(n); } } }; using PGresult_uptr =3D std::unique_ptr; using PGconn_uptr =3D std::unique_ptr; using PGconninfo_uptr =3D std::unique_ptr; using PGnotify_uptr =3D std::unique_ptr; ... } Then we have higher-level wrappers that compose those RAII low-level ones. = --DD