Meaningful connection errors report a meaningful message

Fixes issue #173.

Conflicts:

	NEWS
This commit is contained in:
Daniele Varrazzo 2013-10-16 15:28:16 +01:00
parent 00c1d867c2
commit fb5e14c701
3 changed files with 18 additions and 1 deletions

2
NEWS
View File

@ -6,6 +6,8 @@ What's new in psycopg 2.4.7
declared (:ticket:`#146`). declared (:ticket:`#146`).
- Fixed bad interaction of setup.py with other dependencies in - Fixed bad interaction of setup.py with other dependencies in
Distribute project on Python 3 (ticket #153). Distribute project on Python 3 (ticket #153).
- Meaningful connection errors report a meaningful message, thanks to
Alexey Borzenkov (:ticket:`#173`).
What's new in psycopg 2.4.6 What's new in psycopg 2.4.6

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

@ -448,6 +448,16 @@ class AsyncTests(unittest.TestCase):
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__)