summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--psycopg/connection_int.c7
-rwxr-xr-xtests/test_async.py10
3 files changed, 18 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 46cf5b5..14b5051 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 7851b0a..5069e64 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 09604b5..981b49f 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__)