From: Mike Bayer Date: Sun, 12 Oct 2008 14:39:20 +0000 (+0000) Subject: - String's (and Unicode's, UnicodeText's, etc.) convert_unicode X-Git-Tag: rel_0_5rc2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4ca89fd3c4129551174aadd686db9f96bac0ba61;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 22e96cafc0..19c2d40b37 100644 --- a/CHANGES +++ b/CHANGES @@ -71,6 +71,12 @@ CHANGES strptime/strftime, to generically support pre-1900 dates, dates with microseconds. [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 + - mysql - Temporary tables are now reflectable. diff --git a/lib/sqlalchemy/databases/sqlite.py b/lib/sqlalchemy/databases/sqlite.py index 6689db8f1e..35f07b784f 100644 --- a/lib/sqlalchemy/databases/sqlite.py +++ b/lib/sqlalchemy/databases/sqlite.py @@ -130,15 +130,43 @@ class SLTime(DateTimeMixin, sqltypes.Time): def result_processor(self, dialect): return self._result_processor(datetime.time, self._reg) -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, NoneType)): + if assert_unicode == 'warn': + util.warn("Unicode type received non-unicode bind " + "param value %r" % value) + return value + else: + raise exc.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" + (self.length and "(%d)" % self.length or "") -class SLChar(sqltypes.CHAR): +class SLChar(SLUnicodeMixin, sqltypes.CHAR): def get_col_spec(self): return "CHAR" + (self.length and "(%d)" % self.length or "") diff --git a/test/dialect/sqlite.py b/test/dialect/sqlite.py index 2c5f32ff92..bc6891ac63 100644 --- a/test/dialect/sqlite.py +++ b/test/dialect/sqlite.py @@ -28,6 +28,24 @@ class TestTypes(TestBase, AssertsExecutionResults): bp = sldt.bind_processor(None) self.assertEquals(bp(dt), '2008-06-27 12:00:00.125') 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) @testing.uses_deprecated('Using String type with no length') def test_type_reflection(self):