Author: Honza_Kral
Date: 2011-08-29 08:55:06 -0700 (Mon, 29 Aug 2011)
New Revision: 16708

Modified:
   django/trunk/django/db/backends/postgresql_psycopg2/base.py
Log:
Fixed #15802 -- pyscopg2 sometimes fail to close the connection when it's 
already closed by the server, Thanks Rick van Hattem

Modified: django/trunk/django/db/backends/postgresql_psycopg2/base.py
===================================================================
--- django/trunk/django/db/backends/postgresql_psycopg2/base.py 2011-08-28 
14:43:51 UTC (rev 16707)
+++ django/trunk/django/db/backends/postgresql_psycopg2/base.py 2011-08-29 
15:55:06 UTC (rev 16708)
@@ -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
@@ -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
@@ -114,6 +117,24 @@
         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)

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to