From: Daniele Varrazzo Date: Sun, 2 Jan 2022 15:37:09 +0000 (+0100) Subject: Fix py_codecs data type X-Git-Tag: pool-3.1~61 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a2c2f9c216d6d9686818fbb213219bb8a71f8bb7;p=thirdparty%2Fpsycopg.git Fix py_codecs data type It doesn't contain str anymore since 3.0.4. A stricter definition revealed a couple of wrong usages of the mapping. Use more consistently the higher level `conninfo_encoding()` function instead of directly the mapping. --- diff --git a/psycopg/psycopg/_encodings.py b/psycopg/psycopg/_encodings.py index 411966678..1d0032b5d 100644 --- a/psycopg/psycopg/_encodings.py +++ b/psycopg/psycopg/_encodings.py @@ -5,7 +5,7 @@ Mappings between PostgreSQL and Python encodings. # Copyright (C) 2020-2021 The Psycopg Team import codecs -from typing import Dict, Union, TYPE_CHECKING +from typing import Dict, TYPE_CHECKING from .errors import NotSupportedError @@ -59,7 +59,7 @@ _py_codecs = { "WIN874": "cp874", } -py_codecs: Dict[Union[bytes, str], str] = {} +py_codecs: Dict[bytes, str] = {} py_codecs.update((k.encode(), v) for k, v in _py_codecs.items()) # Add an alias without underscore, for lenient lookups diff --git a/psycopg/psycopg/generators.py b/psycopg/psycopg/generators.py index c988fd52e..2d5b48b17 100644 --- a/psycopg/psycopg/generators.py +++ b/psycopg/psycopg/generators.py @@ -24,7 +24,7 @@ from .pq import ConnStatus, PollingStatus, ExecStatus from .abc import PQGen, PQGenConn from .pq.abc import PGconn, PGresult from .waiting import Wait, Ready -from ._encodings import py_codecs, conninfo_encoding +from ._encodings import pgconn_encoding, conninfo_encoding logger = logging.getLogger(__name__) @@ -194,9 +194,7 @@ def copy_from(pgconn: PGconn) -> PQGen[Union[memoryview, PGresult]]: raise e.ProgrammingError("you cannot mix COPY with other operations") result = results[0] if result.status != ExecStatus.COMMAND_OK: - encoding = py_codecs.get( - pgconn.parameter_status(b"client_encoding") or "", "utf-8" - ) + encoding = pgconn_encoding(pgconn) raise e.error_from_result(result, encoding=encoding) return result @@ -223,9 +221,7 @@ def copy_end(pgconn: PGconn, error: Optional[bytes]) -> PQGen[PGresult]: # Retrieve the final result of copy (result,) = yield from fetch_many(pgconn) if result.status != ExecStatus.COMMAND_OK: - encoding = py_codecs.get( - pgconn.parameter_status(b"client_encoding") or "", "utf-8" - ) + encoding = pgconn_encoding(pgconn) raise e.error_from_result(result, encoding=encoding) return result diff --git a/psycopg/psycopg/pq/misc.py b/psycopg/psycopg/pq/misc.py index 952d9779e..989cd498d 100644 --- a/psycopg/psycopg/pq/misc.py +++ b/psycopg/psycopg/pq/misc.py @@ -8,7 +8,7 @@ from typing import cast, NamedTuple, Optional, Union from .abc import PGconn, PGresult from ._enums import ConnStatus, TransactionStatus -from .._encodings import py_codecs +from .._encodings import pgconn_encoding class PGnotify(NamedTuple): @@ -62,9 +62,7 @@ def error_message(obj: Union[PGconn, PGresult], encoding: str = "utf8") -> str: # obj is a PGconn obj = cast(PGconn, obj) if obj.status == ConnStatus.OK: - encoding = py_codecs.get( - obj.parameter_status(b"client_encoding") or "", "utf-8" - ) + encoding = pgconn_encoding(obj) bmsg = obj.error_message # strip severity and whitespaces