def _pq_fetch(self): pgstatus = libpq.PQresultStatus(self._pgres) if pgstatus != libpq.PGRES_FATAL_ERROR: self._statusmessage = ffi.string(libpq.PQcmdStatus(self._pgres)) else: self._statusmessage = None self._no_tuples = True self._rownumber = 0 if pgstatus == libpq.PGRES_COMMAND_OK: rowcount = ffi.string(libpq.PQcmdTuples(self._pgres)) if not rowcount or not rowcount[0]: self._rowcount = -1 else: self._rowcount = int(rowcount) self._lastrowid = libpq.PQoidValue(self._pgres) self._clear_pgres() elif pgstatus == libpq.PGRES_TUPLES_OK: self._rowcount = libpq.PQntuples(self._pgres) return self._pq_fetch_tuples() elif pgstatus == libpq.PGRES_COPY_IN: return self._pq_fetch_copy_in() elif pgstatus == libpq.PGRES_COPY_OUT: return self._pq_fetch_copy_out() elif pgstatus == libpq.PGRES_EMPTY_QUERY: self._clear_pgres() raise ProgrammingError("can't execute an empty query") else: raise self._conn._create_exception(cursor=self)
def pq_clear_async(conn): pgconn = conn._pgconn while True: pgres = libpq.PQgetResult(pgconn) if not pgres: break if libpq.PQresultStatus(pgres) == libpq.PGRES_FATAL_ERROR: raise conn._create_exception() libpq.PQclear(pgres)
def _get_guc(self, name): """Return the value of a configuration parameter.""" with self._lock: query = 'SHOW %s' % name if _green_callback: pgres = self._execute_green(query) else: pgres = libpq.PQexec(self._pgconn, query) if not pgres or libpq.PQresultStatus(pgres) != libpq.PGRES_TUPLES_OK: raise exceptions.OperationalError("can't fetch %s" % name) rv = ffi.string(libpq.PQgetvalue(pgres, 0, 0)) libpq.PQclear(pgres) return rv
def _poll_setup_async(self): """Advance to the next state during an async connection setup If the connection is green, this is performed by the regular sync code so the queries are sent by conn_setup() while in CONN_STATUS_READY state. """ if self.status == consts.STATUS_CONNECTING: util.pq_set_non_blocking(self._pgconn, 1, True) self._equote = self._get_equote() self._get_encoding() self._have_cancel_key() self._autocommit = True # If the current datestyle is not compatible (not ISO) then # force it to ISO if not self._iso_compatible_datestyle(): self.status = consts.STATUS_DATESTYLE if libpq.PQsendQuery(self._pgconn, b"SET DATESTYLE TO 'ISO'"): self._async_status = consts.ASYNC_WRITE return consts.POLL_WRITE else: raise self._create_exception() self.status = consts.STATUS_READY return consts.POLL_OK if self.status == consts.STATUS_DATESTYLE: res = self._poll_query() if res != consts.POLL_OK: return res pgres = util.pq_get_last_result(self._pgconn) if not pgres or \ libpq.PQresultStatus(pgres) != libpq.PGRES_COMMAND_OK: raise exceptions.OperationalError("can't set datetyle to ISO") libpq.PQclear(pgres) self.status = consts.STATUS_READY return consts.POLL_OK return consts.POLL_ERROR
def _execute_command(self, command): with self._lock: if _green_callback: pgres = self._execute_green(command) else: pgres = libpq.PQexec(self._pgconn, ascii_to_bytes(command)) if not pgres: raise self._create_exception() try: pgstatus = libpq.PQresultStatus(pgres) if pgstatus != libpq.PGRES_COMMAND_OK: exc = self._create_exception(pgres=pgres) pgres = None # ownership transferred to exc raise exc finally: if pgres: libpq.PQclear(pgres)