From: Mike Bayer Date: Sun, 12 Oct 2008 14:39:11 +0000 (+0000) Subject: - String's (and Unicode's, UnicodeText's, etc.) convert_unicode X-Git-Tag: rel_0_4_8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bfc90aa6c69511fc71aa6079ecc86e9315b042b7;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - String's (and Unicode's, UnicodeText's, etc.) convert_unicode logic disabled in the sqlite dialect, to adjust for pysqlite 2.5.0's new requirement that only Python unicode objects are accepted; http://itsystementwicklung.de/pipermail/list-pysqlite/2008-March/000018.html --- diff --git a/CHANGES b/CHANGES index 433f812ad1..62077572bb 100644 --- a/CHANGES +++ b/CHANGES @@ -27,6 +27,12 @@ CHANGES - sqlite - Supplied a custom strftime() function which handles dates before 1900. [ticket:968] + + - String's (and Unicode's, UnicodeText's, etc.) + convert_unicode logic disabled in the sqlite dialect, + to adjust for pysqlite 2.5.0's new requirement that + only Python unicode objects are accepted; + http://itsystementwicklung.de/pipermail/list-pysqlite/2008-March/000018.html - oracle - has_sequence() now takes schema name into account diff --git a/lib/sqlalchemy/databases/sqlite.py b/lib/sqlalchemy/databases/sqlite.py index aef819d0c7..04f59a8398 100644 --- a/lib/sqlalchemy/databases/sqlite.py +++ b/lib/sqlalchemy/databases/sqlite.py @@ -126,15 +126,43 @@ class SLTime(DateTimeMixin, sqltypes.Time): return tup and datetime.time(*tup[3:7]) return process -class SLText(sqltypes.Text): +class SLUnicodeMixin(object): + def bind_processor(self, dialect): + if self.convert_unicode or dialect.convert_unicode: + if self.assert_unicode is None: + assert_unicode = dialect.assert_unicode + else: + assert_unicode = self.assert_unicode + + if not assert_unicode: + return None + + def process(value): + if not isinstance(value, (unicode, sqltypes.NoneType)): + if assert_unicode == 'warn': + util.warn("Unicode type received non-unicode bind " + "param value %r" % value) + return value + else: + raise exceptions.InvalidRequestError("Unicode type received non-unicode bind param value %r" % value) + else: + return value + return process + else: + return None + + def result_processor(self, dialect): + return None + +class SLText(SLUnicodeMixin, sqltypes.Text): def get_col_spec(self): return "TEXT" -class SLString(sqltypes.String): +class SLString(SLUnicodeMixin, sqltypes.String): def get_col_spec(self): return "VARCHAR(%(length)s)" % {'length' : self.length} -class SLChar(sqltypes.CHAR): +class SLChar(SLUnicodeMixin, sqltypes.CHAR): def get_col_spec(self): return "CHAR(%(length)s)" % {'length' : self.length} diff --git a/test/dialect/sqlite.py b/test/dialect/sqlite.py index 91cd2c254b..eb9ecabc18 100644 --- a/test/dialect/sqlite.py +++ b/test/dialect/sqlite.py @@ -46,6 +46,25 @@ class TestTypes(TestBase, AssertsExecutionResults): self.assertEquals(bp(dt), '2008-06-27 12:00:00.000125') self.assertEquals(rp(bp(dt)), dt) + + def test_no_convert_unicode(self): + """test no utf-8 encoding occurs""" + + dialect = sqlite.dialect() + for t in ( + String(convert_unicode=True), + CHAR(convert_unicode=True), + Unicode(), + UnicodeText(), + String(assert_unicode=True, convert_unicode=True), + CHAR(assert_unicode=True, convert_unicode=True), + Unicode(assert_unicode=True), + UnicodeText(assert_unicode=True) + ): + + bindproc = t.dialect_impl(dialect).bind_processor(dialect) + assert not bindproc or isinstance(bindproc(u"some string"), unicode) + def test_type_reflection(self): # (ask_for, roundtripped_as_if_different)