Commit aed11333 authored by Malcolm Tredinnick's avatar Malcolm Tredinnick
Browse files

[1.0.X] Fixed #6052 -- Worked around a bug in MySQLdb with regards to handling

SafeUnicode (handle SafeString similarly, just to be safe). Based on a patch
from sfllaw.

Backport of r9467 from trunk.


git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@9469 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent d7e18567
Loading
Loading
Loading
Loading
+11 −9
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ from django.db.backends.mysql.client import DatabaseClient
from django.db.backends.mysql.creation import DatabaseCreation
from django.db.backends.mysql.introspection import DatabaseIntrospection
from django.db.backends.mysql.validation import DatabaseValidation
from django.utils.safestring import SafeString, SafeUnicode

# Raise exceptions for database warnings if DEBUG is on
from django.conf import settings
@@ -39,12 +40,11 @@ if settings.DEBUG:
DatabaseError = Database.DatabaseError
IntegrityError = Database.IntegrityError

# MySQLdb-1.2.1 supports the Python boolean type, and only uses datetime
# module for time-related columns; older versions could have used mx.DateTime
# or strings if there were no datetime module. However, MySQLdb still returns
# TIME columns as timedelta -- they are more like timedelta in terms of actual
# behavior as they are signed and include days -- and Django expects time, so
# we still need to override that.
# MySQLdb-1.2.1 returns TIME columns as timedelta -- they are more like
# timedelta in terms of actual behavior as they are signed and include days --
# and Django expects time, so we still need to override that. We also need to
# add special handling for SafeUnicode and SafeString as MySQLdb's type
# checking is too tight to catch those (see Django ticket #6052).
django_conversions = conversions.copy()
django_conversions.update({
    FIELD_TYPE.TIME: util.typecast_time,
@@ -260,6 +260,8 @@ class DatabaseWrapper(BaseDatabaseWrapper):
                kwargs['port'] = int(settings.DATABASE_PORT)
            kwargs.update(self.options)
            self.connection = Database.connect(**kwargs)
            self.connection.encoders[SafeUnicode] = self.connection.encoders[unicode]
            self.connection.encoders[SafeString] = self.connection.encoders[str]
        cursor = CursorWrapper(self.connection.cursor())
        return cursor

+4 −3
Original line number Diff line number Diff line
# coding: utf-8
"""
32. Callable defaults

@@ -19,7 +20,7 @@ class Article(models.Model):
    def __unicode__(self):
        return self.headline

__test__ = {'API_TESTS':"""
__test__ = {'API_TESTS': u"""
>>> from datetime import datetime

# No articles are in the system yet.
@@ -51,8 +52,8 @@ True

# make sure that SafeString/SafeUnicode fields work
>>> from django.utils.safestring import SafeUnicode, SafeString
>>> a.headline = SafeUnicode(u'SafeUnicode Headline')
>>> a.headline = SafeUnicode(u'Iñtërnâtiônàlizætiøn1')
>>> a.save()
>>> a.headline = SafeString(u'SafeString Headline')
>>> a.headline = SafeString(u'Iñtërnâtiônàlizætiøn1'.encode('utf-8'))
>>> a.save()
"""}