From: Daniele Varrazzo Date: Thu, 6 Aug 2020 21:22:52 +0000 (+0100) Subject: Creating a Cython Loader with the same interface as Python X-Git-Tag: 3.0.dev0~458^2~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0466a5a0ff8ad925129a8ea39d4ad45bea447ea7;p=thirdparty%2Fpsycopg.git Creating a Cython Loader with the same interface as Python Added C implementation of the BinaryByteaLoader to test the interface --- diff --git a/psycopg3_c/psycopg3_c/adapt.pyx b/psycopg3_c/psycopg3_c/adapt.pyx index 08f6409bd..6b68b908d 100644 --- a/psycopg3_c/psycopg3_c/adapt.pyx +++ b/psycopg3_c/psycopg3_c/adapt.pyx @@ -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 diff --git a/psycopg3_c/psycopg3_c/types/text.pyx b/psycopg3_c/psycopg3_c/types/text.pyx index d3738fc0b..2ce27567c 100644 --- a/psycopg3_c/psycopg3_c/types/text.pyx +++ b/psycopg3_c/psycopg3_c/types/text.pyx @@ -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