]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Added public pgconn_ptr, pgresult_ptr attributes
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sat, 23 May 2020 03:08:34 +0000 (15:08 +1200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sat, 23 May 2020 03:08:34 +0000 (15:08 +1200)
psycopg3/pq/pq_cython.pyx
tests/fix_pq.py
tests/pq/test_pgconn.py
tests/pq/test_pgresult.py

index e9f77ee324a7b1855fe1f108b383582c6b90f0ac..d982dd47ea0e6e296dc186357898951f16ae9280 100644 (file)
@@ -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 <long><void *>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 <long><void *>self.pgresult_ptr
+        else:
+            return None
+
     @property
     def status(self) -> ExecStatus:
         cdef int rv = impl.PQresultStatus(self.pgresult_ptr)
index 929d762a30f2f054a0b6f612f6d345d5456315ce..aaf93304600c045b0cb8aa48a61f096a4177bde3 100644 (file)
@@ -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.
index 473f8c459331fb9e9a20142391ae3ecd465327da..6dcace393079fc9a61e6faadbce2f2e0c2707cf2 100644 (file)
@@ -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
index 6d32defb82a0489120864e853cbc7c5c597a471e..d3b70ed0bd0110e5bb050c10f14c51cdc14777f0 100644 (file)
@@ -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""