summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES4
-rw-r--r--lib/sqlalchemy/dialects/postgresql/psycopg2.py14
2 files changed, 15 insertions, 3 deletions
diff --git a/CHANGES b/CHANGES
index 7a2a2f884..cf0c0eb01 100644
--- a/CHANGES
+++ b/CHANGES
@@ -234,6 +234,10 @@ CHANGES
than 63 characters using the same logic Postgresql uses.
[ticket:1083]
+ - Added an additional libpq message to the list of "disconnect"
+ exceptions, "could not receive data from server"
+ [ticket:2044]
+
0.6.6
=====
- orm
diff --git a/lib/sqlalchemy/dialects/postgresql/psycopg2.py b/lib/sqlalchemy/dialects/postgresql/psycopg2.py
index 21ce1211a..50ea9d437 100644
--- a/lib/sqlalchemy/dialects/postgresql/psycopg2.py
+++ b/lib/sqlalchemy/dialects/postgresql/psycopg2.py
@@ -297,11 +297,19 @@ class PGDialect_psycopg2(PGDialect):
def is_disconnect(self, e):
if isinstance(e, self.dbapi.OperationalError):
- return 'closed the connection' in str(e) or 'connection not open' in str(e)
+ # these error messages from libpq: interfaces/libpq/fe-misc.c.
+ # TODO: these are sent through gettext in libpq and we can't
+ # check within other locales - consider using connection.closed
+ return 'closed the connection' in str(e) or \
+ 'connection not open' in str(e) or \
+ 'could not receive data from server' in str(e)
elif isinstance(e, self.dbapi.InterfaceError):
- return 'connection already closed' in str(e) or 'cursor already closed' in str(e)
+ # psycopg2 client errors, psycopg2/conenction.h, psycopg2/cursor.h
+ return 'connection already closed' in str(e) or \
+ 'cursor already closed' in str(e)
elif isinstance(e, self.dbapi.ProgrammingError):
- # yes, it really says "losed", not "closed"
+ # not sure where this path is originally from, it may
+ # be obsolete. It really says "losed", not "closed".
return "losed the connection unexpectedly" in str(e)
else:
return False