def _pq_fetch(self): pgstatus = libpq.PQresultStatus(self._pgres) self._statusmessage = libpq.PQcmdStatus(self._pgres) self._no_tuples = True self._rownumber = 0 if pgstatus == libpq.PGRES_COMMAND_OK: rowcount = 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: raise ProgrammingError("can't execute an empty query") else: raise self._conn._create_exception(pgres=self._pgres)
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._cancel = libpq.PQgetCancel(self._pgconn) if self._cancel is None: raise exceptions.OperationalError("can't get cancellation key") self._autocommit = True # If the current datestyle is not compatible (not ISO) then # force it to ISO datestyle = libpq.PQparameterStatus(self._pgconn, 'DateStyle') if not datestyle or not datestyle.startswith('ISO'): self.status = consts.STATUS_DATESTYLE if libpq.PQsendQuery(self._pgconn, "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, command) if not pgres: raise self._create_exception() try: pgstatus = libpq.PQresultStatus(pgres) if pgstatus != libpq.PGRES_COMMAND_OK: raise self._create_exception(pgres=pgres) finally: 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 = libpq.PQgetvalue(pgres, 0, 0) libpq.PQclear(pgres) return rv