Meaningful connection errors report a meaningful message

Fixes issue #173.
This commit is contained in:
Daniele Varrazzo 2013-10-16 15:28:16 +01:00
parent 345077d5f7
commit 1e623a951c
3 changed files with 18 additions and 1 deletions

2
NEWS
View File

@ -6,6 +6,8 @@ What's new in psycopg 2.5.2
- Fixed segfault pickling the exception raised on connection error - Fixed segfault pickling the exception raised on connection error
(:ticket:`#170`). (:ticket:`#170`).
- Meaningful connection errors report a meaningful message, thanks to
Alexey Borzenkov (:ticket:`#173`).
What's new in psycopg 2.5.1 What's new in psycopg 2.5.1

View File

@ -642,6 +642,7 @@ static int
_conn_poll_connecting(connectionObject *self) _conn_poll_connecting(connectionObject *self)
{ {
int res = PSYCO_POLL_ERROR; int res = PSYCO_POLL_ERROR;
const char *msg;
Dprintf("conn_poll: poll connecting"); Dprintf("conn_poll: poll connecting");
switch (PQconnectPoll(self->pgconn)) { switch (PQconnectPoll(self->pgconn)) {
@ -656,7 +657,11 @@ _conn_poll_connecting(connectionObject *self)
break; break;
case PGRES_POLLING_FAILED: case PGRES_POLLING_FAILED:
case PGRES_POLLING_ACTIVE: 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; res = PSYCO_POLL_ERROR;
break; break;
} }

View File

@ -449,6 +449,16 @@ class AsyncTests(ConnectingTestCase):
self.wait(self.conn) self.wait(self.conn)
self.assertEqual(cur.fetchone(), (42,)) 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(): def test_suite():
return unittest.TestLoader().loadTestsFromName(__name__) return unittest.TestLoader().loadTestsFromName(__name__)