def __next__(self): try: return next(self._row_iter) except AttributeError: if self._context is None: raise ProgrammingError("A query hasn't been issued.") else: raise except StopIteration as e: if self._context is None: raise ProgrammingError("A query hasn't been issued.") elif len(self._context.columns) == 0: raise ProgrammingError("no result set") else: raise e
def tpc_rollback(self, xid=None): """When called with no arguments, .tpc_rollback() rolls back a TPC transaction. It may be called before or after .tpc_prepare(). When called with a transaction ID xid, it rolls back the given transaction. If an invalid transaction ID is provided, a ProgrammingError is raised. This form should be called outside of a transaction, and is intended for use in recovery. On return, the TPC transaction is ended. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ if xid is None: xid = self._xid if xid is None: raise ProgrammingError( "Cannot tpc_rollback() without a TPC prepared transaction!") try: previous_autocommit_mode = self.autocommit self.autocommit = True if xid in self.tpc_recover(): # a two-phase rollback self.execute_unnamed("ROLLBACK PREPARED '%s';" % (xid[1], )) else: # a single-phase rollback self.rollback() finally: self.autocommit = previous_autocommit_mode self._xid = None
def tpc_commit(self, xid=None): """When called with no arguments, .tpc_commit() commits a TPC transaction previously prepared with .tpc_prepare(). If .tpc_commit() is called prior to .tpc_prepare(), a single phase commit is performed. A transaction manager may choose to do this if only a single resource is participating in the global transaction. When called with a transaction ID xid, the database commits the given transaction. If an invalid transaction ID is provided, a ProgrammingError will be raised. This form should be called outside of a transaction, and is intended for use in recovery. On return, the TPC transaction is ended. This function is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. """ if xid is None: xid = self._xid if xid is None: raise ProgrammingError("Cannot tpc_commit() without a TPC transaction!") try: previous_autocommit_mode = self.autocommit self.autocommit = True if xid in self.tpc_recover(): self.execute_unnamed("COMMIT PREPARED '%s';" % (xid[1],)) else: # a single-phase commit self.commit() finally: self.autocommit = previous_autocommit_mode self._xid = None
def fetchone(self): """Fetch the next row of a query result set. This method is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :returns: A row as a sequence of field values, or ``None`` if no more rows are available. """ try: return next(self) except StopIteration: return None except TypeError: raise ProgrammingError("attempting to use unexecuted cursor") except AttributeError: raise ProgrammingError("attempting to use unexecuted cursor")
def fetchall(self): """Fetches all remaining rows of a query result. This method is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :returns: A sequence, each entry of which is a sequence of field values making up a row. """ try: return tuple(self) except TypeError: raise ProgrammingError("attempting to use unexecuted cursor")
def __init__(self, *args, **kwargs): try: super().__init__(*args, **kwargs) except DatabaseError as e: msg = e.args[0] if isinstance(msg, dict): response_code = msg["C"] if response_code == "28000": cls = InterfaceError elif response_code == "23505": cls = IntegrityError else: cls = ProgrammingError raise cls(msg) else: raise ProgrammingError(msg) self._run_cursor = Cursor(self, paramstyle="named")
def fetchmany(self, num=None): """Fetches the next set of rows of a query result. This method is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :param size: The number of rows to fetch when called. If not provided, the :attr:`arraysize` attribute value is used instead. :returns: A sequence, each entry of which is a sequence of field values making up a row. If no more rows are available, an empty sequence will be returned. """ try: return tuple(islice(self, self.arraysize if num is None else num)) except TypeError: raise ProgrammingError("attempting to use unexecuted cursor")
def execute(self, operation, args=(), stream=None): """Executes a database operation. Parameters may be provided as a sequence, or as a mapping, depending upon the value of :data:`pg8000.paramstyle`. This method is part of the `DBAPI 2.0 specification <http://www.python.org/dev/peps/pep-0249/>`_. :param operation: The SQL statement to execute. :param args: If :data:`paramstyle` is ``qmark``, ``numeric``, or ``format``, this argument should be an array of parameters to bind into the statement. If :data:`paramstyle` is ``named``, the argument should be a dict mapping of parameters. If the :data:`paramstyle` is ``pyformat``, the argument value may be either an array or a mapping. :param stream: This is a pg8000 extension for use with the PostgreSQL `COPY <http://www.postgresql.org/docs/current/static/sql-copy.html>`_ command. For a COPY FROM the parameter must be a readable file-like object, and for COPY TO it must be writable. .. versionadded:: 1.9.11 """ try: if not self._c.in_transaction and not self._c.autocommit: self._c.execute_unnamed("begin transaction") statement, vals = convert_paramstyle(self.paramstyle, operation, args) self._context = self._c.execute_unnamed( statement, vals=vals, input_oids=self._input_oids, stream=stream) rows = [] if self._context.rows is None else self._context.rows self._row_iter = iter(rows) self._input_oids = None except AttributeError as e: if self._c is None: raise InterfaceError("Cursor closed") elif self._c._sock is None: raise InterfaceError("connection is closed") else: raise e except DatabaseError as e: msg = e.args[0] if isinstance(msg, dict): response_code = msg["C"] if response_code == "28000": cls = InterfaceError elif response_code == "23505": cls = IntegrityError else: cls = ProgrammingError raise cls(msg) else: raise ProgrammingError(msg) self.input_types = [] return self