]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Allow overriding of Py loaders by C loaders
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Fri, 7 Aug 2020 00:51:29 +0000 (01:51 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sun, 23 Aug 2020 18:24:02 +0000 (19:24 +0100)
Only registering our toy bytea loader for the moment, other will follow
a similar pattern.

psycopg3/psycopg3/adapt.py
psycopg3_c/psycopg3_c/types/text.pyx

index 9339635248bb2c994d6954b05c51346802e37696..6700dbec2cfd625ee90097a31d363f4a184fa8d5 100644 (file)
@@ -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
 
index 2ce27567cce0b2df7997958752902dbb73284b26..ec600bfe6cd9af512c413784b987706d6419908c 100644 (file)
@@ -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)