From 34d45aea87e53b3551934af2660085a1791bf815 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Fri, 5 Apr 2019 18:02:30 +0100 Subject: [PATCH 1/3] Bump to next dev release --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a45ee310..d3ec5394 100644 --- a/setup.py +++ b/setup.py @@ -47,7 +47,7 @@ except ImportError: # Take a look at https://www.python.org/dev/peps/pep-0440/ # for a consistent versioning pattern. -PSYCOPG_VERSION = '2.8' +PSYCOPG_VERSION = '2.8.1.dev0' # note: if you are changing the list of supported Python version please fix From 755a128ffbeef2813a1f5bcf1bbba629f37f0f49 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Fri, 5 Apr 2019 18:04:55 +0100 Subject: [PATCH 2/3] Handle ok poll() without a cursor having executed queries Close #887 --- NEWS | 7 +++++++ psycopg/connection_int.c | 8 +------- tests/test_async.py | 4 ++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index 87c5806d..da7950bd 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,13 @@ Current release --------------- +What's new in psycopg 2.8.1 +--------------------------- + +- Fixed "there's no async cursor" error polling a connection with no cursor + (:ticket:`#887`). + + What's new in psycopg 2.8 ------------------------- diff --git a/psycopg/connection_int.c b/psycopg/connection_int.c index 1f4115dd..cdc6f026 100644 --- a/psycopg/connection_int.c +++ b/psycopg/connection_int.c @@ -1045,12 +1045,6 @@ static cursorObject * _conn_get_async_cursor(connectionObject *self) { PyObject *py_curs; - if (!(self->async_cursor)) { - PyErr_SetString(PyExc_SystemError, - "unexpectedly, there's no async cursor here"); - goto error; - } - if (!(py_curs = PyWeakref_GetObject(self->async_cursor))) { PyErr_SetString(PyExc_SystemError, "got null dereferencing cursor weakref"); @@ -1108,7 +1102,7 @@ conn_poll(connectionObject *self) Dprintf("conn_poll: status -> CONN_STATUS_*"); res = _conn_poll_query(self); - if (res == PSYCO_POLL_OK && self->async) { + if (res == PSYCO_POLL_OK && self->async && self->async_cursor) { cursorObject *curs; /* An async query has just finished: parse the tuple in the diff --git a/tests/test_async.py b/tests/test_async.py index 21ef7fe5..618c1585 100755 --- a/tests/test_async.py +++ b/tests/test_async.py @@ -495,6 +495,10 @@ class AsyncTests(ConnectingTestCase): self.assert_(polls >= 8, polls) + def test_poll_noop(self): + self.conn.poll() + self.conn.poll() + def test_suite(): return unittest.TestLoader().loadTestsFromName(__name__) From 46106e1b78334114f533d4979e8d9267654f9cbd Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Fri, 5 Apr 2019 18:24:19 +0100 Subject: [PATCH 3/3] Test notifies are received ok polling an async cur --- tests/test_async.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/tests/test_async.py b/tests/test_async.py index 618c1585..f14468e4 100755 --- a/tests/test_async.py +++ b/tests/test_async.py @@ -497,7 +497,28 @@ class AsyncTests(ConnectingTestCase): def test_poll_noop(self): self.conn.poll() - self.conn.poll() + + @skip_before_postgres(9, 0) + def test_poll_conn_for_notification(self): + with self.conn.cursor() as cur: + cur.execute("listen test") + self.wait(cur) + + with self.sync_conn.cursor() as cur: + cur.execute("notify test, 'hello'") + self.sync_conn.commit() + + for i in range(10): + self.conn.poll() + + if self.conn.notifies: + n = self.conn.notifies.pop() + self.assertEqual(n.channel, 'test') + self.assertEqual(n.payload, 'hello') + break + time.sleep(0.1) + else: + self.fail("No notification received") def test_suite():