From: Daniele Varrazzo Date: Fri, 8 Jan 2021 03:57:22 +0000 (+0100) Subject: Further C code streamlining X-Git-Tag: 3.0.dev0~193 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=293530ba3e12584366cef5ed496037e6243b74ca;p=thirdparty%2Fpsycopg.git Further C code streamlining --- diff --git a/psycopg3_c/psycopg3_c/_psycopg3/transform.pyx b/psycopg3_c/psycopg3_c/_psycopg3/transform.pyx index 1d5c21e32..f7e5d5e36 100644 --- a/psycopg3_c/psycopg3_c/_psycopg3/transform.pyx +++ b/psycopg3_c/psycopg3_c/_psycopg3/transform.pyx @@ -130,33 +130,27 @@ cdef class Transformer: cdef dict binary_loaders = {} # these are used more as Python object than C - cdef object oid - cdef object fmt + cdef PyObject *oid + cdef PyObject *fmt cdef PyObject *ptr + cdef PyObject *cache for i in range(ntypes): - oid = PyList_GET_ITEM(types, i) - fmt = PyList_GET_ITEM(formats, i) - if fmt == 0: - ptr = PyDict_GetItem(text_loaders, oid) - if ptr != NULL: - loader = ptr - else: - loader = self._get_row_loader(oid, fmt) - PyDict_SetItem(text_loaders, oid, loader) + oid = PyList_GET_ITEM(types, i) + fmt = PyList_GET_ITEM(formats, i) + cache = (binary_loaders if fmt else text_loaders) + ptr = PyDict_GetItem(cache, oid) + if ptr != NULL: + loader = ptr else: - ptr = PyDict_GetItem(binary_loaders, oid) - if ptr != NULL: - loader = ptr - else: - loader = self._get_row_loader(oid, fmt) - PyDict_SetItem(binary_loaders, oid, loader) + loader = self._get_row_loader(oid, fmt) + PyDict_SetItem(cache, oid, loader) Py_INCREF(loader) PyList_SET_ITEM(loaders, i, loader) self._row_loaders = loaders - cdef RowLoader _get_row_loader(self, object oid, object fmt): + cdef RowLoader _get_row_loader(self, PyObject *oid, PyObject *fmt): cdef RowLoader row_loader = RowLoader() loader = self._c_get_loader(oid, fmt) row_loader.pyloader = loader.load @@ -179,10 +173,12 @@ cdef class Transformer: if ptr != NULL: return ptr - dumper_class = self.adapters.get_dumper(cls, format) - if dumper_class: - d = dumper_class(cls, self) - cache[cls] = d + dumper_class = PyObject_CallFunctionObjArgs( + self.adapters.get_dumper, cls, format, NULL) + if dumper_class is not None: + d = PyObject_CallFunctionObjArgs( + dumper_class, cls, self, NULL) + PyDict_SetItem(cache, cls, d) return d raise e.ProgrammingError( @@ -346,23 +342,25 @@ cdef class Transformer: return rv def get_loader(self, oid: int, format: Format) -> "Loader": - return self._c_get_loader(oid, format) + return self._c_get_loader(oid, format) - cdef object _c_get_loader(self, object oid, object format): - cdef dict cache + cdef object _c_get_loader(self, PyObject *oid, PyObject *fmt): cdef PyObject *ptr + cdef PyObject *cache - cache = self._binary_loaders if format else self._text_loaders - ptr = PyDict_GetItem(cache, oid) + cache = ( + self._binary_loaders if fmt == 0 else self._text_loaders) + ptr = PyDict_GetItem(cache, oid) if ptr != NULL: return ptr - loader_cls = self.adapters.get_loader(oid, format) - if not loader_cls: - loader_cls = self.adapters.get_loader(oids.INVALID_OID, format) - if not loader_cls: + loader_cls = self.adapters.get_loader(oid, fmt) + if loader_cls is None: + loader_cls = self.adapters.get_loader(oids.INVALID_OID, fmt) + if loader_cls is None: raise e.InterfaceError("unknown oid loader not found") - loader = loader_cls(oid, self) - PyDict_SetItem(cache, oid, loader) + loader = PyObject_CallFunctionObjArgs( + loader_cls, oid, self, NULL) + PyDict_SetItem(cache, oid, loader) return loader