From: Jörg Breitbart Date: Tue, 9 Sep 2025 17:08:32 +0000 (+0200) Subject: resort back to col-row iteration X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3b6973f9d850df32e01a6e67b563310e7c21873b;p=thirdparty%2Fpsycopg.git resort back to col-row iteration --- diff --git a/psycopg_c/psycopg_c/_psycopg/transform.pyx b/psycopg_c/psycopg_c/_psycopg/transform.pyx index f699fdc62..78b1579e4 100644 --- a/psycopg_c/psycopg_c/_psycopg/transform.pyx +++ b/psycopg_c/psycopg_c/_psycopg/transform.pyx @@ -441,50 +441,36 @@ cdef class Transformer: cdef object record # not 'tuple' as it would check on assignment cdef object records = PyList_New(row1 - row0) - for row in range(row0, row1): - record = PyTuple_New(self._nfields) - Py_INCREF(record) - PyList_SET_ITEM(records, row - row0, record) cdef PyObject *loader # borrowed RowLoader - cdef PyObject *brecord # borrowed + cdef tuple brecord row_loaders = self._row_loaders # avoid an incref/decref per item - for col in range(self._nfields): - loader = PyList_GET_ITEM(row_loaders, col) - if (loader).cloader is not None: - for row in range(row0, row1): - brecord = PyList_GET_ITEM(records, row - row0) - attval = &(ires.tuples[row][col]) - if attval.len == -1: # NULL_LEN - pyval = None - else: - pyval = (loader).cloader.cload( - attval.value, attval.len) - - Py_INCREF(pyval) - PyTuple_SET_ITEM(brecord, col, pyval) - - else: - for row in range(row0, row1): - brecord = PyList_GET_ITEM(records, row - row0) - attval = &(ires.tuples[row][col]) - if attval.len == -1: # NULL_LEN - pyval = None - else: - b = PyMemoryView_FromObject( - ViewBuffer._from_buffer( - self._pgresult, - attval.value, attval.len)) - pyval = PyObject_CallFunctionObjArgs( - (loader).loadfunc, b, NULL) - - Py_INCREF(pyval) - PyTuple_SET_ITEM(brecord, col, pyval) + for row in range(row0, row1): + brecord = PyTuple_New(self._nfields) + for col in range(self._nfields): + loader = PyList_GET_ITEM(row_loaders, col) + attval = &(ires.tuples[row][col]) + if attval.len == -1: # NULL_LEN + pyval = None + elif (loader).cloader is not None: + pyval = (loader).cloader.cload( + attval.value, attval.len) + else: + b = PyMemoryView_FromObject( + ViewBuffer._from_buffer( + self._pgresult, + attval.value, attval.len)) + pyval = PyObject_CallFunctionObjArgs( + (loader).loadfunc, b, NULL) + Py_INCREF(pyval) + PyTuple_SET_ITEM(brecord, col, pyval) + Py_INCREF(brecord) + PyList_SET_ITEM(records, row - row0, brecord) if make_row is not tuple: for i in range(row1 - row0): - brecord = PyList_GET_ITEM(records, i) + brecord = PyList_GET_ITEM(records, i) record = PyObject_CallFunctionObjArgs( make_row, brecord, NULL) Py_INCREF(record)