From: Daniele Varrazzo Date: Sun, 13 Mar 2022 02:16:21 +0000 (+0100) Subject: feat: add `Transformer.encoding` attribute X-Git-Tag: 3.1~109^2~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c678804640be46bb9c5f543d864de4fb929acc83;p=thirdparty%2Fpsycopg.git feat: add `Transformer.encoding` attribute --- diff --git a/psycopg/psycopg/_transform.py b/psycopg/psycopg/_transform.py index 4f93f3639..76a9ca489 100644 --- a/psycopg/psycopg/_transform.py +++ b/psycopg/psycopg/_transform.py @@ -15,6 +15,7 @@ from .abc import Buffer, LoadFunc, AdaptContext, PyFormat, DumperKey from .rows import Row, RowMaker from ._compat import TypeAlias from .postgres import INVALID_OID +from ._encodings import pgconn_encoding if TYPE_CHECKING: from .abc import Dumper, Loader @@ -75,6 +76,8 @@ class Transformer(AdaptContext): # the length of the result columns self._row_loaders: List[LoadFunc] = [] + self._encoding = "" + @classmethod def from_context(cls, context: Optional[AdaptContext]) -> "Transformer": """ @@ -91,6 +94,13 @@ class Transformer(AdaptContext): def connection(self) -> Optional["BaseConnection[Any]"]: return self._conn + @property + def encoding(self) -> str: + if not self._encoding: + conn = self.connection + self._encoding = pgconn_encoding(conn.pgconn) if conn else "utf-8" + return self._encoding + @property def adapters(self) -> "AdaptersMap": return self._adapters diff --git a/psycopg/psycopg/abc.py b/psycopg/psycopg/abc.py index 0bbcebe29..4716ab550 100644 --- a/psycopg/psycopg/abc.py +++ b/psycopg/psycopg/abc.py @@ -204,6 +204,10 @@ class Transformer(Protocol): def connection(self) -> Optional["BaseConnection[Any]"]: ... + @property + def encoding(self) -> str: + ... + @property def adapters(self) -> "AdaptersMap": ... diff --git a/psycopg_c/psycopg_c/_psycopg.pyi b/psycopg_c/psycopg_c/_psycopg.pyi index 3bcd4961d..cd150e3a1 100644 --- a/psycopg_c/psycopg_c/_psycopg.pyi +++ b/psycopg_c/psycopg_c/_psycopg.pyi @@ -27,6 +27,8 @@ class Transformer(abc.AdaptContext): @property def connection(self) -> Optional[BaseConnection[Any]]: ... @property + def encoding(self) -> str: ... + @property def adapters(self) -> AdaptersMap: ... @property def pgresult(self) -> Optional[PGresult]: ... diff --git a/psycopg_c/psycopg_c/_psycopg/transform.pyx b/psycopg_c/psycopg_c/_psycopg/transform.pyx index 9544de84f..f7f0ffbda 100644 --- a/psycopg_c/psycopg_c/_psycopg/transform.pyx +++ b/psycopg_c/psycopg_c/_psycopg/transform.pyx @@ -24,6 +24,7 @@ from typing import Any, Dict, Iterable, List, Optional, Sequence, Tuple from psycopg import errors as e from psycopg.pq import Format as PqFormat from psycopg.rows import Row, RowMaker +from psycopg._encodings import pgconn_encoding NoneType = type(None) @@ -74,6 +75,7 @@ cdef class Transformer: cdef readonly object adapters cdef readonly object types cdef readonly object formats + cdef str _encoding # mapping class -> Dumper instance (auto, text, binary) cdef dict _auto_dumpers @@ -116,6 +118,13 @@ cdef class Transformer: else: return cls(context) + @property + def encoding(self) -> str: + if not self._encoding: + conn = self.connection + self._encoding = pgconn_encoding(conn.pgconn) if conn else "utf-8" + return self._encoding + @property def pgresult(self) -> Optional[PGresult]: return self._pgresult