]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
feat: add `Transformer.encoding` attribute
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sun, 13 Mar 2022 02:16:21 +0000 (03:16 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Tue, 10 May 2022 17:13:26 +0000 (19:13 +0200)
psycopg/psycopg/_transform.py
psycopg/psycopg/abc.py
psycopg_c/psycopg_c/_psycopg.pyi
psycopg_c/psycopg_c/_psycopg/transform.pyx

index 4f93f3639e3c6bb70cce1f8d69d51caf68a1ca4d..76a9ca48988fdd38bed84eb5c3da7b5f6bc627fc 100644 (file)
@@ -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
index 0bbcebe29d51e5bfc4b62d66c01182465163b8b1..4716ab5504fd47be064dab297a0cbe04b75008ca 100644 (file)
@@ -204,6 +204,10 @@ class Transformer(Protocol):
     def connection(self) -> Optional["BaseConnection[Any]"]:
         ...
 
+    @property
+    def encoding(self) -> str:
+        ...
+
     @property
     def adapters(self) -> "AdaptersMap":
         ...
index 3bcd4961d76b5d5346d3565edb8f23c82d5f805c..cd150e3a19d4fcea25eda9ae30187a07b2af6f2d 100644 (file)
@@ -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]: ...
index 9544de84f0fae65c05f8133e4efe4e35024fc30a..f7f0ffbdacf3198c5ef86b146b9211608c062407 100644 (file)
@@ -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