PGconn_ptr = POINTER(PGconn_struct)
+class PQconninfoOption_struct(Structure):
+ _fields_ = [
+ ("keyword", c_char_p),
+ ("envvar", c_char_p),
+ ("compiled", c_char_p),
+ ("val", c_char_p),
+ ("label", c_char_p),
+ ("dispatcher", c_char_p),
+ ("dispsize", c_int),
+ ]
+
+
# Function definitions as explained in PostgreSQL 12 documentation
# 33.1. Database Connection Control Functions
PQconnectPoll.argtypes = [PGconn_ptr]
PQconnectPoll.restype = c_int
+PQconndefaults = pq.PQconndefaults
+PQconndefaults.argtypes = []
+PQconndefaults.restype = POINTER(PQconninfoOption_struct)
+
+PQconninfoFree = pq.PQconninfoFree
+PQconninfoFree.argtypes = [POINTER(PQconninfoOption_struct)]
+PQconninfoFree.restype = None
+
# 33.2. Connection Status Functions
# Copyright (C) 2020 The Psycopg Team
-from .pq_enums import ConnStatus, PostgresPollingStatus
+from collections import namedtuple
+from .pq_enums import ConnStatus, PostgresPollingStatus
from . import _pq_ctypes as impl
rv = impl.PQconnectPoll(self.pgconn_ptr)
return PostgresPollingStatus(rv)
+ @classmethod
+ def get_defaults(cls):
+ opts = impl.PQconndefaults()
+ if not opts:
+ raise MemoryError("couldn't allocate connection defaults")
+
+ def gets(opt, kw):
+ rv = getattr(opt, kw)
+ if rv is not None:
+ rv = rv.decode("utf8", "replace")
+ return rv
+
+ try:
+ rv = []
+ skws = "keyword envvar compiled val label dispatcher".split()
+ for opt in opts:
+ if not opt.keyword:
+ break
+ d = {kw: gets(opt, kw) for kw in skws}
+ d["dispsize"] = opt.dispsize
+ rv.append(ConninfoOption(**d))
+
+ finally:
+ impl.PQconninfoFree(opts)
+
+ return rv
+
@property
def status(self):
rv = impl.PQstatus(self.pgconn_ptr)
@property
def socket(self):
return impl.PQsocket(self.pgconn_ptr)
+
+
+ConninfoOption = namedtuple(
+ "ConninfoOption", "keyword envvar compiled val label dispatcher dispsize"
+)
assert False, rv
assert conn.status == ConnStatus.CONNECTION_BAD
+
+
+def test_defaults(pq):
+ defs = pq.PGconn.get_defaults()
+ assert len(defs) > 20
+ port = [d for d in defs if d.keyword == "port"][0]
+ assert port.envvar == "PGPORT"
+ assert port.compiled == "5432"
+ assert port.label == "Database-Port"
+ assert port.dispatcher == ""
+ assert port.dispsize == 6