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
-~----------~----~----~----~------~----~------~--~---

Reply via email to