PQtransactionStatus.argtypes = [PGconn_ptr]
PQtransactionStatus.restype = c_int
+PQparameterStatus = pq.PQparameterStatus
+PQparameterStatus.argtypes = [PGconn_ptr, c_char_p]
+PQparameterStatus.restype = c_char_p
+
PQerrorMessage = pq.PQerrorMessage
PQerrorMessage.argtypes = [PGconn_ptr]
PQerrorMessage.restype = c_char_p
+#!/usr/bin/env python3
"""
libpq Python wrapper using ctypes bindings.
rv = impl.PQtransactionStatus(self.pgconn_ptr)
return TransactionStatus(rv)
+ def parameter_status(self, name):
+ rv = impl.PQparameterStatus(self.pgconn_ptr, self._encode(name))
+ return self._decode(rv)
+
@property
def error_message(self):
return self._decode(impl.PQerrorMessage(self.pgconn_ptr))
return impl.PQsocket(self.pgconn_ptr)
def _encode(self, s):
- # TODO: encode in client encoding
- return s.encode("utf8")
+ if isinstance(s, bytes):
+ return s
+ elif isinstance(s, str):
+ # TODO: encode in client encoding
+ return s.encode("utf8")
+ else:
+ raise TypeError("expected bytes or str, got %r instead" % s)
def _decode(self, b):
if b is None:
-pytest_plugins = ("tests.fix_db",)
+pytest_plugins = ("tests.fix_db", "tests.fix_tempenv")
@pytest.fixture
def pgconn(pq, dsn):
+ """Return a PGconn connection open to `--test-dsn`."""
return pq.PGconn.connect(dsn)
--- /dev/null
+import os
+import pytest
+
+
+class TempEnv:
+ def __init__(self):
+ self._prev = {}
+
+ def get(self, item, default):
+ return os.environ.get(self, item, default)
+
+ def __getitem__(self, item):
+ return os.environ[item]
+
+ def __setitem__(self, item, value):
+ self._prev.setdefault(item, os.environ.get(item))
+ os.environ[item] = value
+
+ def __delitem__(self, item):
+ self._prev.setdefault(item, os.environ.get(item))
+ del os.environ[item]
+
+ def restore(self):
+ for k, v in self._prev.items():
+ if v is not None:
+ os.environ[k] = v
+ else:
+ if k in os.environ:
+ del os.environ[k]
+
+
+@pytest.fixture
+def tempenv():
+ """Allow to change the env vars temporarily."""
+ env = TempEnv()
+ yield env
+ env.restore()
-import os
from select import select
import pytest
assert conn.status == ConnStatus.CONNECTION_BAD
-def test_defaults(pq):
- oldport = os.environ.get("PGPORT")
- try:
- os.environ["PGPORT"] = "15432"
- defs = pq.PGconn.get_defaults()
- finally:
- if oldport is not None:
- os.environ["PGPORT"] = oldport
- else:
- del os.environ["PGPORT"]
-
+def test_defaults(pq, tempenv):
+ tempenv["PGPORT"] = "15432"
+ defs = pq.PGconn.get_defaults()
assert len(defs) > 20
port = [d for d in defs if d.keyword == "port"][0]
assert port.envvar == "PGPORT"
# TODO: test other states
pgconn.finish()
assert pgconn.transaction_status == pq.TransactionStatus.PQTRANS_UNKNOWN
+
+
+def test_parameter_status(pq, dsn, tempenv):
+ tempenv["PGAPPNAME"] = "psycopg3 tests"
+ pgconn = pq.PGconn.connect(dsn)
+ assert pgconn.parameter_status('application_name') == "psycopg3 tests"
+ assert pgconn.parameter_status('wat') is None