Compare commits

..

No commits in common. 'c9' and 'c8-beta-stream-2.7' have entirely different histories.

2
.gitignore vendored

@ -1 +1 @@
SOURCES/psycopg2-2.8.6.tar.gz
SOURCES/psycopg2-2.7.5.tar.gz

@ -1 +1 @@
6230aedfe58e8d5d132b01ac065f47284b21d78c SOURCES/psycopg2-2.8.6.tar.gz
4f77e3efcf9a0970be5120352274315f7bd1c754 SOURCES/psycopg2-2.7.5.tar.gz

@ -0,0 +1,470 @@
Only in psycopg2-2.7.5_patched/: cscope.in.out
Only in psycopg2-2.7.5_patched/: cscope.out
Only in psycopg2-2.7.5_patched/: cscope.po.out
diff -ur psycopg2-2.7.5/psycopg/connection.h psycopg2-2.7.5_patched/psycopg/connection.h
--- psycopg2-2.7.5/psycopg/connection.h 2018-06-17 18:07:41.000000000 +0200
+++ psycopg2-2.7.5_patched/psycopg/connection.h 2023-06-27 14:47:59.000000000 +0200
@@ -108,6 +108,7 @@
* for a green connection. If NULL, the connection is idle. */
PyObject *async_cursor;
int async_status; /* asynchronous execution status */
+ PGresult *pgres;
/* notice processing */
PyObject *notice_list;
diff -ur psycopg2-2.7.5/psycopg/connection_int.c psycopg2-2.7.5_patched/psycopg/connection_int.c
--- psycopg2-2.7.5/psycopg/connection_int.c 2018-06-17 18:07:41.000000000 +0200
+++ psycopg2-2.7.5_patched/psycopg/connection_int.c 2023-07-03 12:51:23.000000000 +0200
@@ -891,11 +891,14 @@
/* Advance to the next state after a call to a pq_is_busy* function */
static int
-_conn_poll_advance_read(connectionObject *self, int busy)
+_conn_poll_advance_read(connectionObject *self)
{
- int res;
+ int res, busy;
Dprintf("conn_poll: poll reading");
+
+ busy = pq_get_result_async(self);
+
switch (busy) {
case 0: /* result is ready */
res = PSYCO_POLL_OK;
@@ -909,7 +912,7 @@
res = PSYCO_POLL_ERROR;
break;
default:
- Dprintf("conn_poll: unexpected result from pq_is_busy: %d", busy);
+ Dprintf("conn_poll: unexpected result from pq_get_result_async: %d", busy);
res = PSYCO_POLL_ERROR;
break;
}
@@ -935,21 +938,21 @@
case ASYNC_READ:
Dprintf("conn_poll: async_status = ASYNC_READ");
if (self->async) {
- res = _conn_poll_advance_read(self, pq_is_busy(self));
+ res = _conn_poll_advance_read(self);
}
else {
/* we are a green connection being polled as result of a query.
this means that our caller has the lock and we are being called
from the callback. If we tried to acquire the lock now it would
be a deadlock. */
- res = _conn_poll_advance_read(self, pq_is_busy_locked(self));
+ res = _conn_poll_advance_read(self);
}
break;
case ASYNC_DONE:
Dprintf("conn_poll: async_status = ASYNC_DONE");
/* We haven't asked anything: just check for notifications. */
- res = _conn_poll_advance_read(self, pq_is_busy(self));
+ res = _conn_poll_advance_read(self);
break;
default:
@@ -972,7 +975,6 @@
_conn_poll_setup_async(connectionObject *self)
{
int res = PSYCO_POLL_ERROR;
- PGresult *pgres;
switch (self->status) {
case CONN_STATUS_CONNECTING:
@@ -1023,12 +1025,11 @@
res = _conn_poll_query(self);
if (res == PSYCO_POLL_OK) {
res = PSYCO_POLL_ERROR;
- pgres = pq_get_last_result(self);
- if (pgres == NULL || PQresultStatus(pgres) != PGRES_COMMAND_OK ) {
+ if (self->pgres == NULL || PQresultStatus(self->pgres) != PGRES_COMMAND_OK ) {
PyErr_SetString(OperationalError, "can't set datestyle to ISO");
break;
}
- CLEARPGRES(pgres);
+ CLEARPGRES(self->pgres);
Dprintf("conn_poll: status -> CONN_STATUS_READY");
self->status = CONN_STATUS_READY;
@@ -1089,8 +1090,9 @@
}
curs = (cursorObject *)py_curs;
- CLEARPGRES(curs->pgres);
- curs->pgres = pq_get_last_result(self);
+ PQclear(curs->pgres);
+ curs->pgres = self->pgres;
+ self->pgres = NULL;
/* fetch the tuples (if there are any) and build the result. We
* don't care if pq_fetch return 0 or 1, but if there was an error,
diff -ur psycopg2-2.7.5/psycopg/cursor_type.c psycopg2-2.7.5_patched/psycopg/cursor_type.c
--- psycopg2-2.7.5/psycopg/cursor_type.c 2018-06-17 18:07:41.000000000 +0200
+++ psycopg2-2.7.5_patched/psycopg/cursor_type.c 2023-06-27 15:08:58.000000000 +0200
@@ -49,7 +49,6 @@
static PyObject *
psyco_curs_close(cursorObject *self)
{
- EXC_IF_ASYNC_IN_PROGRESS(self, close);
if (self->closed) {
goto exit;
@@ -59,6 +58,8 @@
char buffer[128];
PGTransactionStatusType status;
+ EXC_IF_ASYNC_IN_PROGRESS(self, close_named);
+
if (!self->query) {
Dprintf("skipping named cursor close because unused");
goto close;
diff -ur psycopg2-2.7.5/psycopg/green.c psycopg2-2.7.5_patched/psycopg/green.c
--- psycopg2-2.7.5/psycopg/green.c 2018-06-17 18:07:41.000000000 +0200
+++ psycopg2-2.7.5_patched/psycopg/green.c 2023-06-27 15:10:35.000000000 +0200
@@ -177,10 +177,12 @@
goto end;
}
- /* Now we can read the data without fear of blocking. */
- result = pq_get_last_result(conn);
+ /* the result is now in the connection: take its ownership */
+ result = conn->pgres;
+ conn->pgres = NULL;
end:
+ CLEARPGRES(conn->pgres);
conn->async_status = ASYNC_DONE;
Py_CLEAR(conn->async_cursor);
return result;
diff -ur psycopg2-2.7.5/psycopg/pqpath.c psycopg2-2.7.5_patched/psycopg/pqpath.c
--- psycopg2-2.7.5/psycopg/pqpath.c 2018-06-17 18:07:41.000000000 +0200
+++ psycopg2-2.7.5_patched/psycopg/pqpath.c 2023-07-03 12:39:47.000000000 +0200
@@ -842,80 +842,6 @@
return rv;
}
-
-/* pq_is_busy - consume input and return connection status
-
- a status of 1 means that a call to pq_fetch will block, while a status of 0
- means that there is data available to be collected. -1 means an error, the
- exception will be set accordingly.
-
- this function locks the connection object
- this function call Py_*_ALLOW_THREADS macros */
-
-int
-pq_is_busy(connectionObject *conn)
-{
- int res;
- Dprintf("pq_is_busy: consuming input");
-
- Py_BEGIN_ALLOW_THREADS;
- pthread_mutex_lock(&(conn->lock));
-
- if (PQconsumeInput(conn->pgconn) == 0) {
- Dprintf("pq_is_busy: PQconsumeInput() failed");
- pthread_mutex_unlock(&(conn->lock));
- Py_BLOCK_THREADS;
-
- /* if the libpq says pgconn is lost, close the py conn */
- if (CONNECTION_BAD == PQstatus(conn->pgconn)) {
- conn->closed = 2;
- }
-
- PyErr_SetString(OperationalError, PQerrorMessage(conn->pgconn));
- return -1;
- }
-
- res = PQisBusy(conn->pgconn);
-
- Py_BLOCK_THREADS;
- conn_notifies_process(conn);
- conn_notice_process(conn);
- Py_UNBLOCK_THREADS;
-
- pthread_mutex_unlock(&(conn->lock));
- Py_END_ALLOW_THREADS;
-
- return res;
-}
-
-/* pq_is_busy_locked - equivalent to pq_is_busy but we already have the lock
- *
- * The function should be called with the lock and holding the GIL.
- */
-
-int
-pq_is_busy_locked(connectionObject *conn)
-{
- Dprintf("pq_is_busy_locked: consuming input");
-
- if (PQconsumeInput(conn->pgconn) == 0) {
- Dprintf("pq_is_busy_locked: PQconsumeInput() failed");
-
- /* if the libpq says pgconn is lost, close the py conn */
- if (CONNECTION_BAD == PQstatus(conn->pgconn)) {
- conn->closed = 2;
- }
-
- PyErr_SetString(OperationalError, PQerrorMessage(conn->pgconn));
- return -1;
- }
-
- /* notices and notifies will be processed at the end of the loop we are in
- * (async reading) by pq_fetch. */
-
- return PQisBusy(conn->pgconn);
-}
-
/* pq_flush - flush output and return connection status
a status of 1 means that a some data is still pending to be flushed, while a
@@ -1094,6 +1020,8 @@
Dprintf("pq_send_query: sending ASYNC query:");
Dprintf(" %-.200s", query);
+ CLEARPGRES(conn->pgres);
+
if (0 == (rv = PQsendQuery(conn->pgconn, query))) {
Dprintf("pq_send_query: error: %s", PQerrorMessage(conn->pgconn));
}
@@ -1998,3 +1926,90 @@
return ex;
}
+/* pq_get_result_async - read an available result without blocking.
+ *
+ * Return 0 if the result is ready, 1 if it will block, -1 on error.
+ * The last result will be returned in pgres.
+ *
+ * The function should be called with the lock and holding the GIL.
+ */
+
+RAISES_NEG int
+pq_get_result_async(connectionObject *conn)
+{
+ int rv = -1;
+
+ Dprintf("pq_get_result_async: calling PQconsumeInput()");
+ if (PQconsumeInput(conn->pgconn) == 0) {
+ Dprintf("pq_get_result_async: PQconsumeInput() failed");
+
+ /* if the libpq says pgconn is lost, close the py conn */
+ if (CONNECTION_BAD == PQstatus(conn->pgconn)) {
+ conn->closed = 2;
+ }
+
+ PyErr_SetString(OperationalError, PQerrorMessage(conn->pgconn));
+ goto exit;
+ }
+
+ conn_notifies_process(conn);
+ conn_notice_process(conn);
+
+ for (;;) {
+ int busy;
+ PGresult *res;
+ ExecStatusType status;
+
+ Dprintf("pq_get_result_async: calling PQisBusy()");
+ busy = PQisBusy(conn->pgconn);
+
+ if (busy) {
+ /* try later */
+ Dprintf("pq_get_result_async: PQisBusy() = 1");
+ rv = 1;
+ goto exit;
+ }
+
+ if (!(res = PQgetResult(conn->pgconn))) {
+ Dprintf("pq_get_result_async: got no result");
+ /* the result is ready: it was the previously read one */
+ rv = 0;
+ goto exit;
+ }
+
+ status = PQresultStatus(res);
+ Dprintf("pq_get_result_async: got result %s", PQresStatus(status));
+
+ /* Store the result outside because we want to return the last non-null
+ * one and we may have to do it across poll calls. However if there is
+ * an error in the stream of results we want to handle the *first*
+ * error. So don't clobber it with the following ones. */
+ if (conn->pgres && PQresultStatus(conn->pgres) == PGRES_FATAL_ERROR) {
+ Dprintf("previous pgres is error: discarding");
+ PQclear(res);
+ }
+ else {
+ PQclear(conn->pgres);
+ conn->pgres = res;
+ }
+
+ switch (status) {
+ case PGRES_COPY_OUT:
+ case PGRES_COPY_IN:
+ case PGRES_COPY_BOTH:
+ /* After entering copy mode, libpq will make a phony
+ * PGresult for us every time we query for it, so we need to
+ * break out of this endless loop. */
+ rv = 0;
+ goto exit;
+
+ default:
+ /* keep on reading to check if there are other results or
+ * we have finished. */
+ continue;
+ }
+ }
+
+exit:
+ return rv;
+}
diff -ur psycopg2-2.7.5/psycopg/pqpath.h psycopg2-2.7.5_patched/psycopg/pqpath.h
--- psycopg2-2.7.5/psycopg/pqpath.h 2018-06-17 18:07:41.000000000 +0200
+++ psycopg2-2.7.5_patched/psycopg/pqpath.h 2023-07-03 12:38:19.000000000 +0200
@@ -59,9 +59,8 @@
const char *cmd, const char *tid,
PGresult **pgres, char **error,
PyThreadState **tstate);
-HIDDEN int pq_is_busy(connectionObject *conn);
-HIDDEN int pq_is_busy_locked(connectionObject *conn);
HIDDEN int pq_flush(connectionObject *conn);
+RAISES_NEG HIDDEN int pq_get_result_async(connectionObject *conn);
HIDDEN void pq_clear_async(connectionObject *conn);
RAISES_NEG HIDDEN int pq_set_non_blocking(connectionObject *conn, int arg);
diff -ur psycopg2-2.7.5/tests/test_async.py psycopg2-2.7.5_patched/tests/test_async.py
--- psycopg2-2.7.5/tests/test_async.py 2018-06-17 18:07:41.000000000 +0200
+++ psycopg2-2.7.5_patched/tests/test_async.py 2023-06-27 16:18:11.000000000 +0200
@@ -99,7 +99,6 @@
self.assertEquals(cur.fetchone()[0], "a")
@slow
- @skip_before_postgres(8, 2)
def test_async_callproc(self):
cur = self.conn.cursor()
cur.callproc("pg_sleep", (0.1, ))
@@ -406,6 +405,15 @@
cur.execute("delete from table1")
self.wait(cur)
+ def test_stop_on_first_error(self):
+ cur = self.conn.cursor()
+ cur.execute("select 1; select x; select 1/0; select 2")
+ self.assertRaises(psycopg2.ProgrammingError, self.wait, cur)
+
+ cur.execute("select 1")
+ self.wait(cur)
+ self.assertEqual(cur.fetchone(), (1,))
+
def test_error_two_cursors(self):
cur = self.conn.cursor()
cur2 = self.conn.cursor()
@@ -450,6 +458,36 @@
else:
self.fail("no exception raised")
+ @slow
+ def test_non_block_after_notification(self):
+ from select import select
+
+ cur = self.conn.cursor()
+ cur.execute("""
+ select 1;
+ do $$
+ begin
+ raise notice 'hello';
+ end
+ $$ language plpgsql;
+ select pg_sleep(1);
+ """)
+
+ polls = 0
+ while True:
+ state = self.conn.poll()
+ if state == psycopg2.extensions.POLL_OK:
+ break
+ elif state == psycopg2.extensions.POLL_READ:
+ select([self.conn], [], [], 0.1)
+ elif state == psycopg2.extensions.POLL_WRITE:
+ select([], [self.conn], [], 0.1)
+ else:
+ raise Exception("Unexpected result from poll: %r", state)
+ polls += 1
+
+ self.assert_(polls >= 8, polls)
+
def test_suite():
return unittest.TestLoader().loadTestsFromName(__name__)
diff -ur psycopg2-2.7.5/tests/test_green.py psycopg2-2.7.5_patched/tests/test_green.py
--- psycopg2-2.7.5/tests/test_green.py 2018-06-17 18:07:41.000000000 +0200
+++ psycopg2-2.7.5_patched/tests/test_green.py 2023-06-27 16:57:21.000000000 +0200
@@ -22,12 +22,14 @@
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
# License for more details.
+import select
import unittest
import psycopg2
import psycopg2.extensions
import psycopg2.extras
from testutils import ConnectingTestCase, slow
+from psycopg2.extensions import POLL_OK, POLL_READ, POLL_WRITE
class ConnectionStub(object):
@@ -55,10 +57,10 @@
ConnectingTestCase.tearDown(self)
psycopg2.extensions.set_wait_callback(self._cb)
- def set_stub_wait_callback(self, conn):
+ def set_stub_wait_callback(self, conn, cb=None):
stub = ConnectionStub(conn)
psycopg2.extensions.set_wait_callback(
- lambda conn: psycopg2.extras.wait_select(stub))
+ lambda conn: (cb or psycopg2.extras.wait_select)(stub))
return stub
@slow
@@ -111,6 +113,35 @@
curs.execute("select 1")
self.assertEqual(curs.fetchone()[0], 1)
+ @slow
+ def test_non_block_after_notification(self):
+ def wait(conn):
+ while 1:
+ state = conn.poll()
+ if state == POLL_OK:
+ break
+ elif state == POLL_READ:
+ select.select([conn.fileno()], [], [], 0.1)
+ elif state == POLL_WRITE:
+ select.select([], [conn.fileno()], [], 0.1)
+ else:
+ raise conn.OperationalError("bad state from poll: %s" % state)
+
+ stub = self.set_stub_wait_callback(self.conn, wait)
+ cur = self.conn.cursor()
+ cur.execute("""
+ select 1;
+ do $$
+ begin
+ raise notice 'hello';
+ end
+ $$ language plpgsql;
+ select pg_sleep(1);
+ """)
+
+ polls = stub.polls.count(POLL_READ)
+ self.assert_(polls > 8, polls)
+
class CallbackErrorTestCase(ConnectingTestCase):
def setUp(self):

@ -1,28 +1,14 @@
%bcond_with python36_module
%if 0%{?fedora}
%bcond_without python3
%bcond_without python3_debug
%if 0%{?fedora} > 31
%bcond_with python2
%bcond_with python2_debug
%else
%bcond_without python2
%bcond_without python2_debug
%endif
%bcond_without python2
%bcond_without python3
%else
%if 0%{?rhel} > 7
%bcond_with python2
%bcond_without python3
%bcond_with python2_debug
%bcond_without python3_debug
%else
%bcond_without python2
%bcond_with python3
%bcond_without python2_debug
%bcond_with python3_debug
%endif
%bcond_with python2
%bcond_without python3
%endif
%bcond_without tests
%bcond_without check
%global srcname psycopg2
%global sum A PostgreSQL database adapter for Python
@ -31,13 +17,10 @@ programming language. At its core it fully implements the Python DB \
API 2.0 specifications. Several extensions allow access to many of the \
features offered by PostgreSQL.
%global python_runtimes \\\
%{?with_python2:python2} \\\
%{?with_python2_debug:python2-debug} \\\
%{?with_python3:python3} \\\
%{?with_python3_debug:python3-debug}
%global python_runtimes %{?with_python2:python2 python2-debug} \\\
%{?with_python3:python3.6 python3.6-debug}
%{!?with_python2:%{!?with_python3:%{error:one python version needed}}}
%{!?with_python2:%{!?with_python3:%{error:one python version eneeded}}}
# Python 2.5+ is not supported by Zope, so it does not exist in
# recent Fedora releases. That's why zope subpackage is disabled.
@ -49,24 +32,31 @@ features offered by PostgreSQL.
Summary: %{sum}
Name: python-%{srcname}
Version: 2.8.6
Release: 6%{?dist}
Version: 2.7.5
Release: 8%{?dist}
# The exceptions allow linking to OpenSSL and PostgreSQL's libpq
License: LGPLv3+ with exceptions
Url: http://initd.org/psycopg/
Group: Applications/Databases
Url: http://www.psycopg.org/psycopg/
Source0: http://www.psycopg.org/psycopg/tarballs/PSYCOPG-2-7/psycopg2-%{version}.tar.gz
Source0: http://initd.org/psycopg/tarballs/PSYCOPG-2-8/psycopg2-%{version}.tar.gz
# Related to https://bugzilla.redhat.com/show_bug.cgi?id=1909674
Patch1: psycopg2_get_result_async.patch
%{?with_python2:BuildRequires: python2-devel python2-setuptools}
%{?with_python3:BuildRequires: python3-devel python3-setuptools}
%{?with_python2_debug:BuildRequires: python2-debug}
%{?with_python3_debug:BuildRequires: python3-debug}
%{?with_python2:BuildRequires: python2-debug python2-devel}
%if %{with python36_module}
%{?with_python3:BuildRequires: python36-debug python36-devel}
%{?with_python3:BuildRequires: python36-rpm-macros}
%else
%{?with_python3:BuildRequires: python3-debug python3-devel}
%endif
BuildRequires: gcc
BuildRequires: pkgconfig(libpq)
BuildRequires: gcc
BuildRequires: pkgconfig(libpq)
# For testsuite
%if %{with tests}
%if %{with check}
BuildRequires: postgresql-test-rpm-macros
%endif
@ -76,7 +66,6 @@ Conflicts: python-psycopg2-zope < %{version}
%{desc}
%if %{with python2}
%package -n python2-%{srcname}
%{?python_provide:%python_provide python2-%{srcname}}
Summary: %{sum} 2
@ -92,10 +81,8 @@ Requires: python2-%srcname = %version-%release
%description -n python2-%{srcname}-tests
%desc
This sub-package delivers set of tests for the adapter.
%endif
%if %{with python2_debug}
%package -n python2-%{srcname}-debug
Summary: A PostgreSQL database adapter for Python 2 (debug build)
# Require the base package, as we're sharing .py/.pyc files:
@ -105,7 +92,6 @@ Requires: python2-%{srcname} = %{version}-%{release}
%description -n python2-%{srcname}-debug
This is a build of the psycopg PostgreSQL database adapter for the debug
build of Python 2.
%endif
%if %{with python3}
@ -124,10 +110,8 @@ Requires: python3-%srcname = %version-%release
%description -n python3-%{srcname}-tests
%desc
This sub-package delivers set of tests for the adapter.
%endif
%if %{with python3_debug}
%package -n python3-psycopg2-debug
Summary: A PostgreSQL database adapter for Python 3 (debug build)
# Require base python 3 package, as we're sharing .py/.pyc files:
@ -136,17 +120,15 @@ Requires: python3-psycopg2 = %{version}-%{release}
%description -n python3-%{srcname}-debug
This is a build of the psycopg PostgreSQL database adapter for the debug
build of Python 3.
%endif
%endif # python3
%package doc
Summary: Documentation for psycopg python PostgreSQL database adapter
Group: Documentation
%{?with_python2:Provides: python2-%{srcname}-doc = %{version}-%{release}}
%{?with_python3:Provides: python3-%{srcname}-doc = %{version}-%{release}}
# For a smoother upgrade from RHEL 8
%{?with_python3:Obsoletes: python39-psycopg2-doc < %{version}-%{release}}
%description doc
Documentation and example files for the psycopg python PostgreSQL
database adapter.
@ -157,6 +139,7 @@ database adapter.
Summary: Zope Database Adapter ZPsycopgDA
# The exceptions allow linking to OpenSSL and PostgreSQL's libpq
License: GPLv2+ with exceptions or ZPLv1.0
Group: Applications/Databases
Requires: %{name} = %{version}-%{release}
Requires: zope
@ -170,7 +153,6 @@ Zope Database Adapter for PostgreSQL, called ZPsycopgDA
%build
export CFLAGS=${RPM_OPT_FLAGS} LDFLAGS=${RPM_LD_FLAGS}
for python in %{python_runtimes} ; do
$python setup.py build
done
@ -180,7 +162,7 @@ for i in `find doc -iname "*.html"`; do sed -i 's/\r//' $i; done
for i in `find doc -iname "*.css"`; do sed -i 's/\r//' $i; done
# Get rid of a "hidden" file that rpmlint complains about
%{__rm} -f doc/html/.buildinfo
rm -f doc/html/.buildinfo
# We can not build docs now:
# https://www.postgresql.org/message-id/2741387.dvL6Cb0VMB@nb.usersys.redhat.com
@ -188,7 +170,7 @@ for i in `find doc -iname "*.css"`; do sed -i 's/\r//' $i; done
%check
%if %{with tests}
%if %{with check}
export PGTESTS_LOCALE=C.UTF-8
%postgresql_tests_run
@ -196,7 +178,7 @@ export PSYCOPG2_TESTDB=${PGTESTS_DATABASES##*:}
export PSYCOPG2_TESTDB_HOST=$PGHOST
export PSYCOPG2_TESTDB_PORT=$PGPORT
cmd="import tests; tests.unittest.main(defaultTest='tests.test_suite')"
cmd="from psycopg2 import tests; tests.unittest.main(defaultTest='tests.test_suite')"
%if %{with python2}
PYTHONPATH=%buildroot%python2_sitearch %__python2 -c "$cmd" --verbose
@ -204,32 +186,17 @@ PYTHONPATH=%buildroot%python2_sitearch %__python2 -c "$cmd" --verbose
%if %{with python3}
PYTHONPATH=%buildroot%python3_sitearch %__python3 -c "$cmd" --verbose
%endif
%endif
%endif # check
%install
export CFLAGS=${RPM_OPT_FLAGS} LDFLAGS=${RPM_LD_FLAGS}
for python in %{python_runtimes} ; do
$python setup.py install --no-compile --root %{buildroot}
done
# Upstream removed tests from the package so we need to add them manually
%if %{with python2}
cp -r tests/ %{buildroot}%{python2_sitearch}/%{srcname}/tests/
for i in `find %{buildroot}%{python2_sitearch}/%{srcname}/tests/ -iname "*.py"`; do
sed -i 's|#!/usr/bin/env python|#!/usr/bin/python2|' $i
done
%endif
%if %{with python3}
cp -r tests/ %{buildroot}%{python3_sitearch}/%{srcname}/tests/
for i in `find %{buildroot}%{python3_sitearch}/%{srcname}/tests/ -iname "*.py"`; do
sed -i 's|#!/usr/bin/env python|#!/usr/bin/python3|' $i
done
%endif
%if %zope
%{__install} -d %{buildroot}%{ZPsycopgDAdir}
%{__cp} -pr ZPsycopgDA/* %{buildroot}%{ZPsycopgDAdir}
install -d %{buildroot}%{ZPsycopgDAdir}
cp -pr ZPsycopgDA/* %{buildroot}%{ZPsycopgDAdir}
%endif
# This test is skipped on 3.7 and has a syntax error so brp-python-bytecompile would choke on it
@ -249,14 +216,12 @@ done
%files -n python2-%{srcname}-tests
%{python2_sitearch}/psycopg2/tests
%endif
%if %{with python2_debug}
%files -n python2-%{srcname}-debug
%license LICENSE
%{python2_sitearch}/psycopg2/_psycopg_d.so
%endif
%endif # python2
%if %{with python3}
@ -265,7 +230,7 @@ done
%doc AUTHORS NEWS README.rst
%dir %{python3_sitearch}/psycopg2
%{python3_sitearch}/psycopg2/*.py
%{python3_sitearch}/psycopg2/_psycopg.cpython-%{python3_version_nodots}[!d]*.so
%{python3_sitearch}/psycopg2/_psycopg.cpython-3?m*.so
%dir %{python3_sitearch}/psycopg2/__pycache__
%{python3_sitearch}/psycopg2/__pycache__/*.py{c,o}
%{python3_sitearch}/psycopg2-%{version}-py3*.egg-info
@ -273,19 +238,17 @@ done
%files -n python3-%{srcname}-tests
%{python3_sitearch}/psycopg2/tests
%endif
%if %{with python3_debug}
%files -n python3-psycopg2-debug
%license LICENSE
%{python3_sitearch}/psycopg2/_psycopg.cpython-%{python3_version_nodots}d*.so
%endif
%{python3_sitearch}/psycopg2/_psycopg.cpython-3?dm*.so
%endif # python3
%files doc
%license LICENSE
%doc doc
%doc doc examples/
%if %zope
@ -301,102 +264,50 @@ done
%changelog
* Tue Feb 08 2022 Tomáš Hrnčiar <thrnciar@redhat.com> - 2.8.6-6
- Add automatically generated Obsoletes tag with the python39- prefix
for smoother upgrade from RHEL8
- Add manual Obsoletes for python39-psycopg2-doc
- Related: rhbz#1990421
* Tue Aug 10 2021 Mohan Boddu <mboddu@redhat.com> - 2.8.6-5
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
Related: rhbz#1991688
* Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 2.8.6-4
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
* Mon Feb 08 2021 Pavel Raiskup <praiskup@redhat.com> - 2.8.6-3
- rebuild for libpq ABI fix rhbz#1908268
* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 2.8.6-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Thu Sep 17 2020 Patrik Novotný <panovotn@redhat.com> - 2.8.6-1
- Rebase to upstream version 2.8.6
* Wed Jul 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 2.8.5-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Sat May 23 2020 Miro Hrončok <mhroncok@redhat.com> - 2.8.5-2
- Rebuilt for Python 3.9
* Tue Apr 21 2020 Patrik Novotný <panovotn@redhat.com> - 2.8.5-1
- Rebase to upstream version 2.8.5
* Thu Jan 30 2020 Fedora Release Engineering <releng@fedoraproject.org> - 2.8.4-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Wed Nov 06 2019 Lumír Balhar <lbalhar@redhat.com> - 2.8.4-1
- New upstream version 2.8.4
- bcond check renamed to bcond tests
* Wed Jun 28 2023 Filip Janus <fjanus@redhat.com> - 2.7.5-8
- Added patch for support pq_get_result_async()
- Resolves: #1909674
* Sun Oct 20 2019 Miro Hrončok <mhroncok@redhat.com> - 2.8.3-2
- Package python2-psycopg2 removed on Fedora 32+ (rhbz#1761216)
* Thu Apr 25 2019 Tomas Orsava <torsava@redhat.com> - 2.7.5-7
- Bumping due to problems with modular RPM upgrade path
- Resolves: rhbz#1695587
* Mon Sep 09 2019 Devrim Gündüz <devrim@gunduz.org> - 2.8.3-1
- Update to 2.8.3
* Wed Sep 26 2018 Tomas Orsava <torsava@redhat.com> - 2.7.5-6
- Use the fully versioned binaries during build
- Related: rhbz#1619153
* Mon Sep 09 2019 Miro Hrončok <mhroncok@redhat.com> - 2.7.7-5
- Package python2-psycopg2-debug removed on Fedora 32+ (rhbz#1747670)
* Mon Sep 17 2018 Tomas Orsava <torsava@redhat.com> - 2.7.5-5
- Require python2-psycopg2 instead of python-psycopg2 from the
python2-psycopg2-debug subpackage
- Resolves: rhbz#1628242
* Fri Aug 16 2019 Miro Hrončok <mhroncok@redhat.com> - 2.7.7-4
- Rebuilt for Python 3.8
* Fri Jul 26 2019 Fedora Release Engineering <releng@fedoraproject.org> - 2.7.7-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Tue May 14 2019 Miro Hrončok <mhroncok@redhat.com> - 2.7.7-2
- Fixes for 3.8.0a4 rebuild
Resolves: 1693641
* Tue Feb 05 2019 Pavel Raiskup <praiskup@redhat.com> - 2.7.7-1
- update to the latest upstream release
* Sat Feb 02 2019 Fedora Release Engineering <releng@fedoraproject.org> - 2.7.5-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Wed Oct 03 2018 Pavel Raiskup <praiskup@redhat.com> - 2.7.5-5
- prepare --without=debugrpms option (rhbz#1635166)
- get the python2 packages back for a while (rhbz#1634973)
* Wed Oct 03 2018 Pavel Raiskup <praiskup@redhat.com> - 2.7.5-4
- drop python2* on f30+ (rhbz#1634973)
- use proper compiler/linker flags (rhbz#1631713)
- correct the (build)requires
* Thu Aug 02 2018 Pavel Raiskup <praiskup@redhat.com> - 2.7.5-4
- re-enable testsuite
* Tue Jul 17 2018 Pavel Raiskup <praiskup@redhat.com> - 2.7.5-3
- standalone installable doc subpackage
* Wed Aug 01 2018 Lumír Balhar <lbalhar@redhat.com> - 2.7.5-3
- Disable failing tests
* Sat Jul 14 2018 Fedora Release Engineering <releng@fedoraproject.org> - 2.7.5-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
* Wed Jul 18 2018 Tomas Orsava <torsava@redhat.com> - 2.7.5-2
- BuildRequire also python36-rpm-macros as part of the python36 module build
* Mon Jul 02 2018 Miro Hrončok <mhroncok@redhat.com> - 2.7.5-2
- Rebuilt for Python 3.7
* Tue Jul 17 2018 Pavel Raiskup <praiskup@redhat.com> - 2.7.5-1
- sync with fedora rawhide
* Mon Jun 18 2018 Pavel Raiskup <praiskup@redhat.com> - 2.7.5-1
- rebase to latest upstream release, per release notes:
http://initd.org/psycopg/articles/2018/06/17/psycopg-275-released/
* Tue May 01 2018 Tomas Orsava <torsava@redhat.com> - 2.7.4-5
- Let the doc subpackage be standalone installable
* Sat Jun 16 2018 Miro Hrončok <mhroncok@redhat.com> - 2.7.4-5
- Rebuilt for Python 3.7
* Wed Apr 25 2018 Tomas Orsava <torsava@redhat.com> - 2.7.4-4
- Make requires on python36-devel/debug dependant on a python36_module bcond
* Mon May 21 2018 Pavel Raiskup <praiskup@redhat.com> - 2.7.4-4
- fix for python 3.7, by mhroncok
* Mon Apr 23 2018 Tomas Orsava <torsava@redhat.com> - 2.7.4-3
- Revert switching Python 3 subpackages to the python3X- prefix
- Switch only the requires for python3-devel/debug to the python36-prefix:
the rest of the packages in the python36 collection will have the python3
prefix to be unified with the Python 3 packages for Platform-Python
* Fri Apr 13 2018 Pavel Raiskup <praiskup@redhat.com> - 2.7.4-3
- depend on postgresql-test-rpm-macros
* Fri Apr 13 2018 Pavel Raiskup <praiskup@redhat.com> - 2.7.4-2
- re-enable testsuite
* Wed Apr 18 2018 Tomas Orsava <torsava@redhat.com> - 2.7.4-2
- Switch the Python 3 subpackages to the python3X- prefix using
the %{python3_pkgversion} macro
* Mon Feb 12 2018 Pavel Raiskup <praiskup@redhat.com> - 2.7.4-1
- rebase to latest upstream release, per release notes:

Loading…
Cancel
Save