From 00c163bfb13d273e61dcb7ec78ac96338c916de7 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 22 Apr 2013 19:33:39 -0400 Subject: [PATCH] Opened up the checking for "disconnect" with psycopg2/libpq to check for all the various "disconnect" messages within the full exception hierarchy. Specifically the "closed the connection unexpectedly" message has now been seen in at least three different exception types. [ticket:2712] --- doc/build/changelog/changelog_08.rst | 10 +++++ .../dialects/postgresql/psycopg2.py | 39 ++++++++++--------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst index 1f89984527..a3b7ffcb52 100644 --- a/doc/build/changelog/changelog_08.rst +++ b/doc/build/changelog/changelog_08.rst @@ -6,6 +6,16 @@ .. changelog:: :version: 0.8.1 + .. change:: + :tags: bug, postgresql + :tickets: 2712 + + Opened up the checking for "disconnect" with psycopg2/libpq + to check for all the various "disconnect" messages within + the full exception hierarchy. Specifically the + "closed the connection unexpectedly" message has now been + seen in at least three different exception types. + .. change:: :tags: bug, sql, mysql :tickets: 2682 diff --git a/lib/sqlalchemy/dialects/postgresql/psycopg2.py b/lib/sqlalchemy/dialects/postgresql/psycopg2.py index 1f118067fa..f5e122a1bf 100644 --- a/lib/sqlalchemy/dialects/postgresql/psycopg2.py +++ b/lib/sqlalchemy/dialects/postgresql/psycopg2.py @@ -421,23 +421,26 @@ class PGDialect_psycopg2(PGDialect): return ([], opts) def is_disconnect(self, e, connection, cursor): - if isinstance(e, self.dbapi.OperationalError): - # 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 'terminating connection' in str(e) or \ - '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): - # 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): - # 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 + if isinstance(e, self.dbapi.Error): + str_e = str(e) + for msg in [ + # these error messages from libpq: interfaces/libpq/fe-misc.c + # and interfaces/libpq/fe-secure.c. + # TODO: these are sent through gettext in libpq and we can't + # check within other locales - consider using connection.closed + 'terminating connection', + 'closed the connection', + 'connection not open', + 'could not receive data from server', + # psycopg2 client errors, psycopg2/conenction.h, psycopg2/cursor.h + 'connection already closed', + 'cursor already closed', + # not sure where this path is originally from, it may + # be obsolete. It really says "losed", not "closed". + 'losed the connection unexpectedly' + ]: + if msg in str_e: + return True + return False dialect = PGDialect_psycopg2 -- 2.47.3