From d4462932ff26ea69ca7fa54d7b1c589227bebc2c Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Fri, 7 Aug 2020 01:51:29 +0100 Subject: [PATCH] Allow overriding of Py loaders by C loaders Only registering our toy bytea loader for the moment, other will follow a similar pattern. --- psycopg3/psycopg3/adapt.py | 17 +++++++++++++---- psycopg3_c/psycopg3_c/types/text.pyx | 8 +++----- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/psycopg3/psycopg3/adapt.py b/psycopg3/psycopg3/adapt.py index 933963524..6700dbec2 100644 --- a/psycopg3/psycopg3/adapt.py +++ b/psycopg3/psycopg3/adapt.py @@ -46,7 +46,9 @@ class Dumper: f"dumpers should be registered on classes, got {src} instead" ) - if not (isinstance(dumper, type) and issubclass(dumper, Dumper)): + if not ( + isinstance(dumper, type) and issubclass(dumper, _dumper_classes) + ): raise TypeError( f"dumpers should be Dumper subclasses, got {dumper} instead" ) @@ -100,12 +102,14 @@ class Loader: ) -> LoaderType: if not isinstance(oid, int): raise TypeError( - f"typeloaders should be registered on oid, got {oid} instead" + f"loaders should be registered on oid, got {oid} instead" ) - if not (isinstance(loader, type) and issubclass(loader, Loader)): + if not ( + isinstance(loader, type) and issubclass(loader, _loader_classes) + ): raise TypeError( - f"dumpers should be Loader subclasses, got {loader} instead" + f"loaders should be Loader subclasses, got {loader} instead" ) where = context.loaders if context is not None else Loader.globals @@ -135,6 +139,10 @@ class Loader: return binary_ +_dumper_classes = (Dumper,) +_loader_classes = (Loader,) + + def _connection_from_context( context: AdaptContext, ) -> Optional[BaseConnection]: @@ -157,6 +165,7 @@ if pq.__impl__ == "c": from psycopg3_c import _psycopg3 Transformer = _psycopg3.Transformer + _loader_classes = (Loader, _psycopg3.PyxLoader) # type: ignore else: from . import transform diff --git a/psycopg3_c/psycopg3_c/types/text.pyx b/psycopg3_c/psycopg3_c/types/text.pyx index 2ce27567c..ec600bfe6 100644 --- a/psycopg3_c/psycopg3_c/types/text.pyx +++ b/psycopg3_c/psycopg3_c/types/text.pyx @@ -67,8 +67,6 @@ cdef class BinaryByteaLoader(PyxLoader): cdef void register_text_c_loaders(): logger.debug("registering optimised text c loaders") - from psycopg3.types import text - register_c_loader(text.StringLoader.load, load_text, get_context_text) - register_c_loader(text.UnknownLoader.load, load_text, get_context_text) - register_c_loader(text.load_bytea_text, load_bytea_text) - register_c_loader(text.load_bytea_binary, load_bytea_binary) + from psycopg3.adapt import Loader + from psycopg3.types import builtins + Loader.register_binary(builtins['bytea'].oid, BinaryByteaLoader) -- 2.47.2