Author: adrian
Date: 2006-12-26 23:14:02 -0600 (Tue, 26 Dec 2006)
New Revision: 4244
Modified:
django/trunk/django/db/backends/postgresql/base.py
Log:
Fixed #3115 -- Changed postgresql backend to convert all Unicode strings to
bytestrings according to DEFAULT_CHARSET. This is necessary because psycopg1
does not apply database quoting to Unicode strings
Modified: django/trunk/django/db/backends/postgresql/base.py
===================================================================
--- django/trunk/django/db/backends/postgresql/base.py 2006-12-27 04:23:40 UTC
(rev 4243)
+++ django/trunk/django/db/backends/postgresql/base.py 2006-12-27 05:14:02 UTC
(rev 4244)
@@ -20,6 +20,38 @@
# Import copy of _thread_local.py from Python 2.4
from django.utils._threading_local import local
+def smart_basestring(s, charset):
+ if isinstance(s, unicode):
+ return s.encode(charset)
+ return s
+
+class UnicodeCursorWrapper(object):
+ """
+ A thin wrapper around psycopg cursors that allows them to accept Unicode
+ strings as params.
+
+ This is necessary because psycopg doesn't apply any DB quoting to
+ parameters that are Unicode strings. If a param is Unicode, this will
+ convert it to a bytestring using DEFAULT_CHARSET before passing it to
+ psycopg.
+ """
+ def __init__(self, cursor, charset):
+ self.cursor = cursor
+ self.charset = charset
+
+ def execute(self, sql, params=()):
+ return self.cursor.execute(sql, [smart_basestring(p, self.charset) for
p in params])
+
+ def executemany(self, sql, param_list):
+ new_param_list = [[smart_basestring(p, self.charset) for p in params]
for params in param_list]
+ return self.cursor.executemany(sql, new_param_list)
+
+ def __getattr__(self, attr):
+ if self.__dict__.has_key(attr):
+ return self.__dict__[attr]
+ else:
+ return getattr(self.cursor, attr)
+
class DatabaseWrapper(local):
def __init__(self, **kwargs):
self.connection = None
@@ -45,6 +77,7 @@
self.connection.set_isolation_level(1) # make transactions
transparent to all cursors
cursor = self.connection.cursor()
cursor.execute("SET TIME ZONE %s", [settings.TIME_ZONE])
+ cursor = UnicodeCursorWrapper(cursor, settings.DEFAULT_CHARSET)
if settings.DEBUG:
return util.CursorDebugWrapper(cursor, self)
return cursor
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---