From 09cf64dda42fb71579a5508c5df7639e81ea421c Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Wed, 16 Oct 2013 15:28:16 +0100 Subject: [PATCH] Meaningful connection errors report a meaningful message Fixes issue #173. --- NEWS | 2 ++ psycopg/connection_int.c | 7 ++++++- tests/test_async.py | 10 ++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 46cf5b5b..14b50512 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,8 @@ What's new in psycopg 2.5.2 - Fixed segfault pickling the exception raised on connection error (:ticket:`#170`). +- Meaningful connection errors report a meaningful message, thanks to + Alexey Borzenkov (:ticket:`#173`). What's new in psycopg 2.5.1 diff --git a/psycopg/connection_int.c b/psycopg/connection_int.c index 7851b0aa..5069e640 100644 --- a/psycopg/connection_int.c +++ b/psycopg/connection_int.c @@ -642,6 +642,7 @@ static int _conn_poll_connecting(connectionObject *self) { int res = PSYCO_POLL_ERROR; + const char *msg; Dprintf("conn_poll: poll connecting"); switch (PQconnectPoll(self->pgconn)) { @@ -656,7 +657,11 @@ _conn_poll_connecting(connectionObject *self) break; case PGRES_POLLING_FAILED: case PGRES_POLLING_ACTIVE: - PyErr_SetString(OperationalError, "asynchronous connection failed"); + msg = PQerrorMessage(self->pgconn); + if (!(msg && *msg)) { + msg = "asynchronous connection failed"; + } + PyErr_SetString(OperationalError, msg); res = PSYCO_POLL_ERROR; break; } diff --git a/tests/test_async.py b/tests/test_async.py index 09604b5c..981b49fe 100755 --- a/tests/test_async.py +++ b/tests/test_async.py @@ -449,6 +449,16 @@ class AsyncTests(ConnectingTestCase): self.wait(self.conn) self.assertEqual(cur.fetchone(), (42,)) + def test_async_connection_error_message(self): + try: + cnn = psycopg2.connect('dbname=thisdatabasedoesntexist', async=True) + self.wait(cnn) + except psycopg2.Error, e: + self.assertNotEqual(str(e), "asynchronous connection failed", + "connection error reason lost") + else: + self.fail("no exception raised") + def test_suite(): return unittest.TestLoader().loadTestsFromName(__name__)