Merge branch 'fix-887'

This commit is contained in:
Daniele Varrazzo 2019-04-06 10:51:03 +01:00
commit 7b31b39fed
4 changed files with 34 additions and 8 deletions

7
NEWS
View File

@ -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
-------------------------

View File

@ -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

View File

@ -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

View File

@ -495,6 +495,31 @@ class AsyncTests(ConnectingTestCase):
self.assert_(polls >= 8, polls)
def test_poll_noop(self):
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():
return unittest.TestLoader().loadTestsFromName(__name__)