From f5a22aad4cd2704fe07311ceb145803d1901a3a6 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Mon, 27 Oct 2025 15:16:29 +0000 Subject: [PATCH] fix(c): allow set_loader_types to be any sequence --- psycopg_c/psycopg_c/_psycopg/transform.pyx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/psycopg_c/psycopg_c/_psycopg/transform.pyx b/psycopg_c/psycopg_c/_psycopg/transform.pyx index 21a41cde7..b1f530d4f 100644 --- a/psycopg_c/psycopg_c/_psycopg/transform.pyx +++ b/psycopg_c/psycopg_c/_psycopg/transform.pyx @@ -15,6 +15,8 @@ from cpython.list cimport PyList_GET_ITEM, PyList_GET_SIZE, PyList_New, PyList_S from cpython.bytes cimport PyBytes_AS_STRING from cpython.tuple cimport PyTuple_New, PyTuple_SET_ITEM from cpython.object cimport PyObject, PyObject_CallFunctionObjArgs +from cpython.sequence cimport PySequence_Fast, PySequence_Fast_GET_ITEM +from cpython.sequence cimport PySequence_Fast_GET_SIZE from typing import Sequence @@ -185,16 +187,15 @@ cdef class Transformer: self.formats = [format] * ntypes def set_loader_types(self, types: Sequence[int], format: PqFormat) -> None: - self._c_loader_types(len(types), types, format) - - cdef void _c_loader_types(self, Py_ssize_t ntypes, list types, object format): + cdef types_fast = PySequence_Fast(types, "'types' is not a valid sequence") + cdef Py_ssize_t ntypes = PySequence_Fast_GET_SIZE(types_fast) cdef list loaders = PyList_New(ntypes) # these are used more as Python object than C cdef PyObject *oid cdef PyObject *row_loader for i in range(ntypes): - oid = PyList_GET_ITEM(types, i) + oid = PySequence_Fast_GET_ITEM(types_fast, i) row_loader = self._c_get_loader(oid, format) Py_INCREF(row_loader) PyList_SET_ITEM(loaders, i, row_loader) -- 2.47.3