]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Creating a Cython Loader with the same interface as Python
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Thu, 6 Aug 2020 21:22:52 +0000 (22:22 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sun, 23 Aug 2020 18:24:02 +0000 (19:24 +0100)
Added C implementation of the BinaryByteaLoader to test the interface

psycopg3_c/psycopg3_c/adapt.pyx
psycopg3_c/psycopg3_c/types/text.pyx

index 08f6409bd8d6a741a569df3b99860252d6439a0e..6b68b908df0c43605fadc110468a0704d5d500d5 100644 (file)
@@ -13,12 +13,42 @@ equivalent C implementations.
 
 # Copyright (C) 2020 The Psycopg Team
 
+from typing import Any
+
+from cpython.bytes cimport PyBytes_AsStringAndSize
+
 from psycopg3_c.adapt cimport cloader_func, get_context_func
+from psycopg3_c cimport libpq as impl
 
 import logging
 logger = logging.getLogger("psycopg3.adapt")
 
 
+# TODO: rename after dropping CLoader below
+cdef class PyxLoader:
+    cdef impl.Oid oid
+    cdef impl.PGconn* pgconn_ptr
+    cdef object context
+
+    def __init__(self, oid: int, context: "AdaptContext" = None):
+        from psycopg3.adapt import _connection_from_context
+
+        self.oid = oid
+        self.context = context
+        connection = _connection_from_context(context)
+        # TODO
+        self.pgconn_ptr = NULL
+
+    cdef object cload(self, const char *data, size_t length):
+        raise NotImplementedError()
+
+    def load(self, data: bytes) -> Any:
+        cdef char *buffer
+        cdef Py_ssize_t length
+        PyBytes_AsStringAndSize(data, &buffer, &length)
+        return self.cload(data, length)
+
+
 cdef class CLoader:
     cdef object pyloader
     cdef cloader_func cloader
index d3738fc0b9bc61d3bd932f7be9bcd1e1364846f7..2ce27567cce0b2df7997958752902dbb73284b26 100644 (file)
@@ -60,6 +60,11 @@ cdef object load_bytea_binary(const char *data, size_t length, void *context):
     return data[:length]
 
 
+cdef class BinaryByteaLoader(PyxLoader):
+    cdef object cload(self, const char *data, size_t length):
+        return data[:length]
+
+
 cdef void register_text_c_loaders():
     logger.debug("registering optimised text c loaders")
     from psycopg3.types import text