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.
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 "")
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):