for i in range(nf):
oid = result.ftype(i)
fmt = result.fformat(i)
- rc.append(self.get_loader(oid, fmt).load)
+ rc.append(self.get_loader(oid, fmt).load) # type: ignore
def set_row_types(
self, types: Sequence[int], formats: Sequence[Format]
if status == TransactionStatus.UNKNOWN:
return
- status = TransactionStatus(status) # in case we got an int
+ status = TransactionStatus(status)
warnings.warn(
f"connection {self} was deleted while still open."
f" Please use 'with' or '.close()' to close the connection",
), "The Transformer doesn't have a PGresult set"
self._pgresult: "PGresult" = self.transformer.pgresult
- self.format = self._pgresult.binary_tuples
+ self.format = Format(self._pgresult.binary_tuples)
self._encoding = self.connection.client_encoding
self._first_row = True
self._finished = False
def status(self) -> Optional[pq.ExecStatus]:
# TODO: do we want this?
res = self.pgresult
- return res.status if res else None
+ return pq.ExecStatus(res.status) if res else None
@property
def query(self) -> Optional[bytes]:
pgq.convert(query, params)
return pgq
- _status_ok = {
+ _status_ok = (
ExecStatus.TUPLES_OK,
ExecStatus.COMMAND_OK,
ExecStatus.EMPTY_QUERY,
- }
- _status_copy = {
+ )
+ _status_copy = (
ExecStatus.COPY_IN,
ExecStatus.COPY_OUT,
ExecStatus.COPY_BOTH,
- }
+ )
def _execute_results(self, results: Sequence["PGresult"]) -> None:
"""
if not results:
raise e.InternalError("got no result from the query")
- statuses = {res.status for res in results}
- badstats = statuses - self._status_ok
- if not badstats:
- self._results = list(results)
- self.pgresult = results[0]
- nrows = self.pgresult.command_tuples
- if nrows is not None:
- if self._rowcount < 0:
- self._rowcount = nrows
- else:
- self._rowcount += nrows
+ for res in results:
+ if res.status not in self._status_ok:
+ return self._raise_from_results(results)
- return
+ self._results = list(results)
+ self.pgresult = results[0]
+ nrows = self.pgresult.command_tuples
+ if nrows is not None:
+ if self._rowcount < 0:
+ self._rowcount = nrows
+ else:
+ self._rowcount += nrows
+
+ return
+ def _raise_from_results(self, results: Sequence["PGresult"]) -> None:
+ statuses = {res.status for res in results}
+ badstats = statuses.difference(self._status_ok)
if results[-1].status == ExecStatus.FATAL_ERROR:
raise e.error_from_result(
results[-1], encoding=self._conn.client_encoding
)
- elif badstats & self._status_copy:
+ elif statuses.intersection(self._status_copy):
raise e.ProgrammingError(
"COPY cannot be used with execute(); use copy() insead"
)
else:
raise e.InternalError(
f"got unexpected status from query:"
- f" {', '.join(sorted(s.name for s in sorted(badstats)))}"
+ f" {', '.join(sorted(ExecStatus(s).name for s in badstats))}"
)
def _send_prepare(self, name: bytes, query: PostgresQuery) -> None:
"""
conn = pq.PGconn.connect_start(conninfo.encode("utf8"))
- logger.debug("connection started, status %s", conn.status.name)
while 1:
if conn.status == ConnStatus.BAD:
raise e.OperationalError(
)
status = conn.connect_poll()
- logger.debug("connection polled, status %s", conn.status.name)
if status == PollingStatus.OK:
break
elif status == PollingStatus.READING:
from . import _pq_ctypes as impl
from .misc import PGnotify, ConninfoOption, PQerror, PGresAttDesc
from .misc import error_message, connection_summary
-from ._enums import ConnStatus, DiagnosticField, ExecStatus, Format
-from ._enums import Ping, PollingStatus, TransactionStatus
+from ._enums import Format
if TYPE_CHECKING:
from . import proto
raise MemoryError("couldn't allocate PGconn")
return cls(pgconn_ptr)
- def connect_poll(self) -> PollingStatus:
- rv = self._call_int(impl.PQconnectPoll)
- return PollingStatus(rv)
+ def connect_poll(self) -> int:
+ return self._call_int(impl.PQconnectPoll)
def finish(self) -> None:
self.pgconn_ptr, p = None, self.pgconn_ptr
if not impl.PQresetStart(self.pgconn_ptr):
raise PQerror("couldn't reset connection")
- def reset_poll(self) -> PollingStatus:
- rv = self._call_int(impl.PQresetPoll)
- return PollingStatus(rv)
+ def reset_poll(self) -> int:
+ return self._call_int(impl.PQresetPoll)
@classmethod
- def ping(self, conninfo: bytes) -> Ping:
+ def ping(self, conninfo: bytes) -> int:
if not isinstance(conninfo, bytes):
raise TypeError(f"bytes expected, got {type(conninfo)} instead")
- rv = impl.PQping(conninfo)
- return Ping(rv)
+ return impl.PQping(conninfo)
@property
def db(self) -> bytes:
return self._call_bytes(impl.PQoptions)
@property
- def status(self) -> ConnStatus:
- rv = impl.PQstatus(self.pgconn_ptr)
- return ConnStatus(rv)
+ def status(self) -> int:
+ return impl.PQstatus(self.pgconn_ptr)
@property
- def transaction_status(self) -> TransactionStatus:
- rv = impl.PQtransactionStatus(self.pgconn_ptr)
- return TransactionStatus(rv)
+ def transaction_status(self) -> int:
+ return impl.PQtransactionStatus(self.pgconn_ptr)
def parameter_status(self, name: bytes) -> Optional[bytes]:
self._ensure_pgconn()
command: bytes,
param_values: Optional[Sequence[Optional[bytes]]],
param_types: Optional[Sequence[int]] = None,
- param_formats: Optional[Sequence[Format]] = None,
- result_format: Format = Format.TEXT,
+ param_formats: Optional[Sequence[int]] = None,
+ result_format: int = Format.TEXT,
) -> "PGresult":
args = self._query_params_args(
command, param_values, param_types, param_formats, result_format
command: bytes,
param_values: Optional[Sequence[Optional[bytes]]],
param_types: Optional[Sequence[int]] = None,
- param_formats: Optional[Sequence[Format]] = None,
- result_format: Format = Format.TEXT,
+ param_formats: Optional[Sequence[int]] = None,
+ result_format: int = Format.TEXT,
) -> None:
args = self._query_params_args(
command, param_values, param_types, param_formats, result_format
self,
name: bytes,
param_values: Optional[Sequence[Optional[bytes]]],
- param_formats: Optional[Sequence[Format]] = None,
- result_format: Format = Format.TEXT,
+ param_formats: Optional[Sequence[int]] = None,
+ result_format: int = Format.TEXT,
) -> None:
# repurpose this function with a cheeky replacement of query with name,
# drop the param_types from the result
command: bytes,
param_values: Optional[Sequence[Optional[bytes]]],
param_types: Optional[Sequence[int]] = None,
- param_formats: Optional[Sequence[Format]] = None,
- result_format: Format = Format.TEXT,
+ param_formats: Optional[Sequence[int]] = None,
+ result_format: int = Format.TEXT,
) -> Any:
if not isinstance(command, bytes):
raise TypeError(f"bytes expected, got {type(command)} instead")
else:
return nbytes, b""
- def make_empty_result(self, exec_status: ExecStatus) -> "PGresult":
+ def make_empty_result(self, exec_status: int) -> "PGresult":
rv = impl.PQmakeEmptyPGresult(self.pgconn_ptr, exec_status)
if not rv:
raise MemoryError("couldn't allocate empty PGresult")
impl.PQclear(p)
@property
- def status(self) -> ExecStatus:
- rv = impl.PQresultStatus(self.pgresult_ptr)
- return ExecStatus(rv)
+ def status(self) -> int:
+ return impl.PQresultStatus(self.pgresult_ptr)
@property
def error_message(self) -> bytes:
return impl.PQresultErrorMessage(self.pgresult_ptr)
- def error_field(self, fieldcode: DiagnosticField) -> Optional[bytes]:
+ def error_field(self, fieldcode: int) -> Optional[bytes]:
return impl.PQresultErrorField(self.pgresult_ptr, fieldcode)
@property
def ftablecol(self, column_number: int) -> int:
return impl.PQftablecol(self.pgresult_ptr, column_number)
- def fformat(self, column_number: int) -> Format:
- return Format(impl.PQfformat(self.pgresult_ptr, column_number))
+ def fformat(self, column_number: int) -> int:
+ return impl.PQfformat(self.pgresult_ptr, column_number)
def ftype(self, column_number: int) -> int:
return impl.PQftype(self.pgresult_ptr, column_number)
return impl.PQfsize(self.pgresult_ptr, column_number)
@property
- def binary_tuples(self) -> Format:
- return Format(impl.PQbinaryTuples(self.pgresult_ptr))
+ def binary_tuples(self) -> int:
+ return impl.PQbinaryTuples(self.pgresult_ptr)
def get_value(
self, row_number: int, column_number: int
from typing import TYPE_CHECKING
from typing_extensions import Protocol
-from ._enums import ConnStatus, DiagnosticField, ExecStatus, Format
-from ._enums import Ping, PollingStatus, TransactionStatus
+from ._enums import Format
if TYPE_CHECKING:
from .misc import PGnotify, ConninfoOption, PGresAttDesc
def connect_start(cls, conninfo: bytes) -> "PGconn":
...
- def connect_poll(self) -> PollingStatus:
+ def connect_poll(self) -> int:
...
def finish(self) -> None:
def reset_start(self) -> None:
...
- def reset_poll(self) -> PollingStatus:
+ def reset_poll(self) -> int:
...
@classmethod
- def ping(self, conninfo: bytes) -> Ping:
+ def ping(self, conninfo: bytes) -> int:
...
@property
...
@property
- def status(self) -> ConnStatus:
+ def status(self) -> int:
...
@property
- def transaction_status(self) -> TransactionStatus:
+ def transaction_status(self) -> int:
...
def parameter_status(self, name: bytes) -> Optional[bytes]:
command: bytes,
param_values: Optional[Sequence[Optional[bytes]]],
param_types: Optional[Sequence[int]] = None,
- param_formats: Optional[Sequence[Format]] = None,
- result_format: Format = Format.TEXT,
+ param_formats: Optional[Sequence[int]] = None,
+ result_format: int = Format.TEXT,
) -> "PGresult":
...
command: bytes,
param_values: Optional[Sequence[Optional[bytes]]],
param_types: Optional[Sequence[int]] = None,
- param_formats: Optional[Sequence[Format]] = None,
- result_format: Format = Format.TEXT,
+ param_formats: Optional[Sequence[int]] = None,
+ result_format: int = Format.TEXT,
) -> None:
...
self,
name: bytes,
param_values: Optional[Sequence[Optional[bytes]]],
- param_formats: Optional[Sequence[Format]] = None,
- result_format: Format = Format.TEXT,
+ param_formats: Optional[Sequence[int]] = None,
+ result_format: int = Format.TEXT,
) -> None:
...
def get_copy_data(self, async_: int) -> Tuple[int, bytes]:
...
- def make_empty_result(self, exec_status: ExecStatus) -> "PGresult":
+ def make_empty_result(self, exec_status: int) -> "PGresult":
...
...
@property
- def status(self) -> ExecStatus:
+ def status(self) -> int:
...
@property
def error_message(self) -> bytes:
...
- def error_field(self, fieldcode: DiagnosticField) -> Optional[bytes]:
+ def error_field(self, fieldcode: int) -> Optional[bytes]:
...
@property
def ftablecol(self, column_number: int) -> int:
...
- def fformat(self, column_number: int) -> Format:
+ def fformat(self, column_number: int) -> int:
...
def ftype(self, column_number: int) -> int:
...
@property
- def binary_tuples(self) -> Format:
+ def binary_tuples(self) -> int:
...
def get_value(
return PGconn._from_ptr(pgconn)
- def connect_poll(self) -> PollingStatus:
- cdef int rv = _call_int(self, <conn_int_f>libpq.PQconnectPoll)
- return PollingStatus(rv)
+ def connect_poll(self) -> int:
+ return _call_int(self, <conn_int_f>libpq.PQconnectPoll)
def finish(self) -> None:
if self.pgconn_ptr is not NULL:
if not libpq.PQresetStart(self.pgconn_ptr):
raise PQerror("couldn't reset connection")
- def reset_poll(self) -> PollingStatus:
- cdef int rv = _call_int(self, <conn_int_f>libpq.PQresetPoll)
- return PollingStatus(rv)
+ def reset_poll(self) -> int:
+ return _call_int(self, <conn_int_f>libpq.PQresetPoll)
@classmethod
- def ping(self, const char *conninfo) -> Ping:
- cdef int rv = libpq.PQping(conninfo)
- return Ping(rv)
+ def ping(self, const char *conninfo) -> int:
+ return libpq.PQping(conninfo)
@property
def db(self) -> bytes:
return ConnStatus(rv)
@property
- def transaction_status(self) -> TransactionStatus:
- cdef int rv = libpq.PQtransactionStatus(self.pgconn_ptr)
- return TransactionStatus(rv)
+ def transaction_status(self) -> int:
+ return libpq.PQtransactionStatus(self.pgconn_ptr)
def parameter_status(self, name: bytes) -> Optional[bytes]:
_ensure_pgconn(self)
command: bytes,
param_values: Optional[Sequence[Optional[bytes]]],
param_types: Optional[Sequence[int]] = None,
- param_formats: Optional[Sequence[Format]] = None,
- result_format: Format = Format.TEXT,
+ param_formats: Optional[Sequence[int]] = None,
+ result_format: int = Format.TEXT,
) -> PGresult:
_ensure_pgconn(self)
command: bytes,
param_values: Optional[Sequence[Optional[bytes]]],
param_types: Optional[Sequence[int]] = None,
- param_formats: Optional[Sequence[Format]] = None,
- result_format: Format = Format.TEXT,
+ param_formats: Optional[Sequence[int]] = None,
+ result_format: int = Format.TEXT,
) -> None:
_ensure_pgconn(self)
self,
name: bytes,
param_values: Optional[Sequence[Optional[bytes]]],
- param_formats: Optional[Sequence[Format]] = None,
- result_format: Format = Format.TEXT,
+ param_formats: Optional[Sequence[int]] = None,
+ result_format: int = Format.TEXT,
) -> None:
_ensure_pgconn(self)
else:
return nbytes, b""
- def make_empty_result(self, exec_status: ExecStatus) -> PGresult:
+ def make_empty_result(self, exec_status: int) -> PGresult:
cdef libpq.PGresult *rv = libpq.PQmakeEmptyPGresult(
self.pgconn_ptr, exec_status)
if not rv:
cdef (int, libpq.Oid *, char * const*, int *, int *) _query_params_args(
list param_values: Optional[Sequence[Optional[bytes]]],
param_types: Optional[Sequence[int]],
- list param_formats: Optional[Sequence[Format]],
+ list param_formats: Optional[Sequence[int]],
) except *:
cdef int i
return None
@property
- def status(self) -> ExecStatus:
- cdef int rv = libpq.PQresultStatus(self.pgresult_ptr)
- return ExecStatus(rv)
+ def status(self) -> int:
+ return libpq.PQresultStatus(self.pgresult_ptr)
@property
def error_message(self) -> bytes:
return libpq.PQresultErrorMessage(self.pgresult_ptr)
- def error_field(self, fieldcode: DiagnosticField) -> Optional[bytes]:
+ def error_field(self, int fieldcode) -> Optional[bytes]:
cdef char * rv = libpq.PQresultErrorField(self.pgresult_ptr, fieldcode)
if rv is not NULL:
return rv