From 0209d57f49c9ade95e3ca0f30fe82aa713ccdc55 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Fri, 12 Feb 2021 02:08:18 +0100 Subject: [PATCH] Dropped Transformer.pgresult setter, use set_result Can pass a boolean to tell it to skip setting row loaders --- psycopg3/psycopg3/_transform.py | 24 +++++++------ psycopg3/psycopg3/cursor.py | 2 +- psycopg3/psycopg3/proto.py | 5 +-- psycopg3_c/psycopg3_c/_psycopg3.pyi | 5 +-- psycopg3_c/psycopg3_c/_psycopg3/transform.pyx | 35 ++++++++++--------- 5 files changed, 39 insertions(+), 32 deletions(-) diff --git a/psycopg3/psycopg3/_transform.py b/psycopg3/psycopg3/_transform.py index 3663d8ec1..fe688bedb 100644 --- a/psycopg3/psycopg3/_transform.py +++ b/psycopg3/psycopg3/_transform.py @@ -77,31 +77,35 @@ class Transformer(AdaptContext): def pgresult(self) -> Optional["PGresult"]: return self._pgresult - @pgresult.setter - def pgresult(self, result: Optional["PGresult"]) -> None: + def set_pgresult( + self, result: Optional["PGresult"], set_loaders: bool = True + ) -> None: self._pgresult = result - rc = self._row_loaders = [] self._ntuples: int self._nfields: int if not result: self._nfields = self._ntuples = 0 + if set_loaders: + self._row_loaders = [] return nf = self._nfields = result.nfields self._ntuples = result.ntuples - for i in range(nf): - oid = result.ftype(i) - fmt = result.fformat(i) - rc.append(self.get_loader(oid, fmt).load) # type: ignore + if set_loaders: + rc = self._row_loaders = [] + for i in range(nf): + oid = result.ftype(i) + fmt = result.fformat(i) + rc.append(self.get_loader(oid, fmt).load) # type: ignore def set_row_types( self, types: Sequence[int], formats: Sequence[pq.Format] ) -> None: - rc: List[LoadFunc] = [None] * len(types) # type: ignore[list-item] - for i in range(len(rc)): - rc[i] = self.get_loader(types[i], formats[i]).load + rc: List[LoadFunc] = [] + for i in range(len(types)): + rc.append(self.get_loader(types[i], formats[i]).load) self._row_loaders = rc diff --git a/psycopg3/psycopg3/cursor.py b/psycopg3/psycopg3/cursor.py index b341f03a6..585b11cec 100644 --- a/psycopg3/psycopg3/cursor.py +++ b/psycopg3/psycopg3/cursor.py @@ -127,7 +127,7 @@ class BaseCursor(Generic[ConnectionType]): def pgresult(self, result: Optional["PGresult"]) -> None: self._pgresult = result if result and self._tx: - self._tx.pgresult = result + self._tx.set_pgresult(result) @property def description(self) -> Optional[List[Column]]: diff --git a/psycopg3/psycopg3/proto.py b/psycopg3/psycopg3/proto.py index b1e966cb5..58e610d28 100644 --- a/psycopg3/psycopg3/proto.py +++ b/psycopg3/psycopg3/proto.py @@ -85,8 +85,9 @@ class Transformer(Protocol): def pgresult(self) -> Optional[pq.proto.PGresult]: ... - @pgresult.setter - def pgresult(self, result: Optional[pq.proto.PGresult]) -> None: + def set_pgresult( + self, result: Optional[pq.proto.PGresult], set_loaders: bool = True + ) -> None: ... def set_row_types( diff --git a/psycopg3_c/psycopg3_c/_psycopg3.pyi b/psycopg3_c/psycopg3_c/_psycopg3.pyi index 6f6c41938..5b9adf88a 100644 --- a/psycopg3_c/psycopg3_c/_psycopg3.pyi +++ b/psycopg3_c/psycopg3_c/_psycopg3.pyi @@ -23,8 +23,9 @@ class Transformer(proto.AdaptContext): def adapters(self) -> AdaptersMap: ... @property def pgresult(self) -> Optional[PGresult]: ... - @pgresult.setter - def pgresult(self, result: Optional[PGresult]) -> None: ... + def set_pgresult( + self, result: Optional["PGresult"], set_loaders: bool = True + ) -> None: ... def set_row_types( self, types: Sequence[int], formats: Sequence[pq.Format] ) -> None: ... diff --git a/psycopg3_c/psycopg3_c/_psycopg3/transform.pyx b/psycopg3_c/psycopg3_c/_psycopg3/transform.pyx index f92c94d50..166873ec3 100644 --- a/psycopg3_c/psycopg3_c/_psycopg3/transform.pyx +++ b/psycopg3_c/psycopg3_c/_psycopg3/transform.pyx @@ -96,15 +96,13 @@ cdef class Transformer: def pgresult(self) -> Optional[PGresult]: return self._pgresult - @pgresult.setter - def pgresult(self, result: Optional[PGresult]) -> None: - self.set_pgresult(result) - - cdef void set_pgresult(self, pq.PGresult result): + cpdef void set_pgresult(self, pq.PGresult result, object set_loaders = True): self._pgresult = result if result is None: self._nfields = self._ntuples = 0 + if set_loaders: + self._row_loaders = [] return cdef libpq.PGresult *res = self._pgresult.pgresult_ptr @@ -113,18 +111,21 @@ cdef class Transformer: cdef int i cdef object tmp - cdef list types = PyList_New(self._nfields) - cdef list formats = PyList_New(self._nfields) - for i in range(self._nfields): - tmp = libpq.PQftype(res, i) - Py_INCREF(tmp) - PyList_SET_ITEM(types, i, tmp) - - tmp = libpq.PQfformat(res, i) - Py_INCREF(tmp) - PyList_SET_ITEM(formats, i, tmp) - - self._c_set_row_types(self._nfields, types, formats) + cdef list types + cdef list formats + if set_loaders: + types = PyList_New(self._nfields) + formats = PyList_New(self._nfields) + for i in range(self._nfields): + tmp = libpq.PQftype(res, i) + Py_INCREF(tmp) + PyList_SET_ITEM(types, i, tmp) + + tmp = libpq.PQfformat(res, i) + Py_INCREF(tmp) + PyList_SET_ITEM(formats, i, tmp) + + self._c_set_row_types(self._nfields, types, formats) def set_row_types(self, types: Sequence[int], formats: Sequence[Format]) -> None: -- 2.47.2