Skip to content

Commit

Permalink
Fixed #15802 -- pyscopg2 sometimes fail to close the connection when …
Browse files Browse the repository at this point in the history
…it's already closed by the server, Thanks Rick van Hattem

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16708 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
Honza_Kral authored and Honza_Kral committed Aug 29, 2011
1 parent 016cd71 commit 5269c7f
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions django/db/backends/postgresql_psycopg2/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from django.db.backends.postgresql_psycopg2.version import get_version
from django.db.backends.postgresql_psycopg2.introspection import DatabaseIntrospection
from django.utils.safestring import SafeUnicode, SafeString
from django.utils.log import getLogger

try:
import psycopg2 as Database
Expand All @@ -29,6 +30,8 @@
psycopg2.extensions.register_adapter(SafeString, psycopg2.extensions.QuotedString)
psycopg2.extensions.register_adapter(SafeUnicode, psycopg2.extensions.QuotedString)

logger = getLogger('django.db.backends')

class CursorWrapper(object):
"""
A thin wrapper around psycopg2's normal cursor class so that we can catch
Expand Down Expand Up @@ -114,6 +117,24 @@ def check_constraints(self, table_names=None):
self.cursor().execute('SET CONSTRAINTS ALL IMMEDIATE')
self.cursor().execute('SET CONSTRAINTS ALL DEFERRED')

def close(self):
if self.connection is None:
return

try:
self.connection.close()
self.connection = None
except psycopg2.Error:
# In some cases (database restart, network connection lost etc...)
# the connection to the database is lost without giving Django a
# notification. If we don't set self.connection to None, the error
# will occur a every request.
self.connection = None
logger.warning('psycopg2 error while closing the connection.',
exc_info=sys.exc_info()
)
raise

def _get_pg_version(self):
if self._pg_version is None:
self._pg_version = get_version(self.connection)
Expand Down

0 comments on commit 5269c7f

Please sign in to comment.