From: Daniele Varrazzo Date: Sun, 21 Feb 2021 01:16:28 +0000 (+0100) Subject: Fix return error without exception on PQsocket call of broken connection X-Git-Tag: 3.0.dev0~104 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=434f303331487806d91a761657607d9c12c42c0b;p=thirdparty%2Fpsycopg.git Fix return error without exception on PQsocket call of broken connection Still some weirdness here around: the method raises an exception on my box (both with unix and tcp socket) but it seems to raise still a valid number on certain databases on Travis. Make sure, in the test, at least that it is a reasonable value. --- diff --git a/psycopg3/psycopg3/pq/pq_ctypes.py b/psycopg3/psycopg3/pq/pq_ctypes.py index f017beb42..1a58bc98b 100644 --- a/psycopg3/psycopg3/pq/pq_ctypes.py +++ b/psycopg3/psycopg3/pq/pq_ctypes.py @@ -207,7 +207,10 @@ class PGconn: @property def socket(self) -> int: - return self._call_int(impl.PQsocket) + rv = self._call_int(impl.PQsocket) + if rv == -1: + raise e.OperationalError("the connection is lost") + return rv @property def backend_pid(self) -> int: diff --git a/psycopg3_c/psycopg3_c/pq/pgconn.pyx b/psycopg3_c/psycopg3_c/pq/pgconn.pyx index f277d13ef..ccd431c1c 100644 --- a/psycopg3_c/psycopg3_c/pq/pgconn.pyx +++ b/psycopg3_c/psycopg3_c/pq/pgconn.pyx @@ -160,7 +160,10 @@ cdef class PGconn: @property def socket(self) -> int: - return _call_int(self, libpq.PQsocket) + rv = _call_int(self, libpq.PQsocket) + if rv == -1: + raise PQerror("the connection is lost") + return rv @property def backend_pid(self) -> int: @@ -506,12 +509,12 @@ cdef char *_call_bytes(PGconn pgconn, conn_bytes_f func) except NULL: return rv -cdef int _call_int(PGconn pgconn, conn_int_f func) except -1: +cdef int _call_int(PGconn pgconn, conn_int_f func) except -2: """ Call one of the pgconn libpq functions returning an int. """ if not _ensure_pgconn(pgconn): - return -1 + return -2 return func(pgconn.pgconn_ptr) diff --git a/tests/pq/test_pgconn.py b/tests/pq/test_pgconn.py index e122cd092..c45fbfcc1 100644 --- a/tests/pq/test_pgconn.py +++ b/tests/pq/test_pgconn.py @@ -295,6 +295,20 @@ def test_server_version(pgconn): pgconn.server_version +def test_socket(pgconn): + socket = pgconn.socket + assert socket > 0 + pgconn.exec_( + f"select pg_terminate_backend({pgconn.backend_pid})".encode("utf8") + ) + # TODO: on my box it raises OperationalError as it should. Not on Travis, + # so let's see if at least an ok value comes out of it. + try: + assert pgconn.socket == socket + except psycopg3.OperationalError: + pass + + def test_error_message(pgconn): assert pgconn.error_message == b"" res = pgconn.exec_(b"wat")