From: Daniele Varrazzo Date: Fri, 7 Aug 2020 00:51:29 +0000 (+0100) Subject: Allow overriding of Py loaders by C loaders X-Git-Tag: 3.0.dev0~458^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d4462932ff26ea69ca7fa54d7b1c589227bebc2c;p=thirdparty%2Fpsycopg.git Allow overriding of Py loaders by C loaders Only registering our toy bytea loader for the moment, other will follow a similar pattern. --- 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)