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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en.