From: Daniele Varrazzo Date: Sat, 23 May 2020 03:08:34 +0000 (+1200) Subject: Added public pgconn_ptr, pgresult_ptr attributes X-Git-Tag: 3.0.dev0~495 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8cc1da25653418092112c77efd770f9d063c31ea;p=thirdparty%2Fpsycopg.git Added public pgconn_ptr, pgresult_ptr attributes --- diff --git a/psycopg3/pq/pq_cython.pyx b/psycopg3/pq/pq_cython.pyx index e9f77ee32..d982dd47e 100644 --- a/psycopg3/pq/pq_cython.pyx +++ b/psycopg3/pq/pq_cython.pyx @@ -80,6 +80,13 @@ cdef class PGconn: impl.PQfinish(self.pgconn_ptr) self.pgconn_ptr = NULL + @property + def pgconn_ptr(self) -> Optional[int]: + if self.pgconn_ptr: + return self.pgconn_ptr + else: + return None + @property def info(self) -> List["ConninfoOption"]: self._ensure_pgconn() @@ -560,6 +567,13 @@ cdef class PGresult: impl.PQclear(self.pgresult_ptr) self.pgresult_ptr = NULL + @property + def pgresult_ptr(self) -> Optional[int]: + if self.pgresult_ptr: + return self.pgresult_ptr + else: + return None + @property def status(self) -> ExecStatus: cdef int rv = impl.PQresultStatus(self.pgresult_ptr) diff --git a/tests/fix_pq.py b/tests/fix_pq.py index 929d762a3..aaf933046 100644 --- a/tests/fix_pq.py +++ b/tests/fix_pq.py @@ -36,6 +36,15 @@ def pq(request): return pq +@pytest.fixture +def libpq(): + """Return a ctypes wrapper to access the libpq.""" + import ctypes.util + + libname = ctypes.util.find_library("pq") + return ctypes.pydll.LoadLibrary(libname) + + def check_libpq_version(got, want): """ Verify if the libpq version is a version accepted. diff --git a/tests/pq/test_pgconn.py b/tests/pq/test_pgconn.py index 473f8c459..6dcace393 100644 --- a/tests/pq/test_pgconn.py +++ b/tests/pq/test_pgconn.py @@ -1,5 +1,6 @@ import gc import os +import ctypes import logging import weakref from select import select @@ -82,6 +83,19 @@ def test_weakref(pq, dsn): assert w() is None +def test_pgconn_ptr(pgconn, libpq): + pgconn.pgconn_ptr is not None + + f = libpq.PQserverVersion + f.argtypes = [ctypes.c_void_p] + f.restype = ctypes.c_int + ver = f(pgconn.pgconn_ptr) + assert ver == pgconn.server_version + + pgconn.finish() + assert pgconn.pgconn_ptr is None + + def test_info(pq, dsn, pgconn): info = pgconn.info assert len(info) > 20 diff --git a/tests/pq/test_pgresult.py b/tests/pq/test_pgresult.py index 6d32defb8..d3b70ed0b 100644 --- a/tests/pq/test_pgresult.py +++ b/tests/pq/test_pgresult.py @@ -1,3 +1,4 @@ +import ctypes import pytest @@ -24,6 +25,19 @@ def test_clear(pq, pgconn): assert res.status == pq.ExecStatus.FATAL_ERROR +def test_pgresult_ptr(pgconn, libpq): + res = pgconn.exec_(b"select 1") + assert res.pgresult_ptr is not None + + f = libpq.PQcmdStatus + f.argtypes = [ctypes.c_void_p] + f.restype = ctypes.c_char_p + assert f(res.pgresult_ptr) == b"SELECT 1" + + res.clear() + assert res.pgresult_ptr is None + + def test_error_message(pgconn): res = pgconn.exec_(b"select 1") assert res.error_message == b""