def result_processor(self, dialect, coltype):
if not dialect.auto_convert_lobs:
# return the cx_oracle.LOB directly.
- # don't even call super.result_processor here.
return None
super_process = super(_LOBMixin, self).result_processor(dialect, coltype)
- lob = dialect.dbapi.LOB
if super_process:
def process(value):
- if isinstance(value, lob):
+ if value is not None:
return super_process(value.read())
else:
return super_process(value)
else:
def process(value):
- if isinstance(value, lob):
+ if value is not None:
return value.read()
else:
return value
def get_dbapi_type(self, dbapi):
return dbapi.CLOB
-class _OracleUnicodeText(_LOBMixin, sqltypes.UnicodeText):
+class _OracleUnicodeText(sqltypes.UnicodeText):
def get_dbapi_type(self, dbapi):
return dbapi.NCLOB
+ def result_processor(self, dialect, coltype):
+ if not dialect.auto_convert_lobs:
+ # return the cx_oracle.LOB directly.
+ return None
+
+ if dialect._cx_oracle_native_nvarchar:
+ def process(value):
+ if value is not None:
+ return value.read()
+ else:
+ return value
+ return process
+ else:
+ return super(_OracleUnicodeText, self).result_processor(dialect, coltype)
+
class _OracleInteger(sqltypes.Integer):
def result_processor(self, dialect, coltype):
def to_int(val):
return None
-class _OracleRaw(_LOBMixin, oracle.RAW):
+class _OracleRaw(oracle.RAW):
pass
# it would be nice if we could not use it otherwise.
oracle.NUMBER : oracle.NUMBER, # don't let this get converted
oracle.RAW: _OracleRaw,
+ sqltypes.Unicode: _OracleNVarChar,
sqltypes.NVARCHAR : _OracleNVarChar,
}
dbapi_type)
if result_processor is not None:
out_parameters[name] = \
- result_processor(self.out_parameters[name].getvalue(), dbapi_type)
+ result_processor(self.out_parameters[name].getvalue())
else:
out_parameters[name] = self.out_parameters[name].getvalue()
else:
return None
def result_processor(self, dialect, coltype):
- if (not dialect.returns_unicode_strings or self.convert_unicode == 'force') \
- and (self.convert_unicode or dialect.convert_unicode):
+ wants_unicode = self.convert_unicode or dialect.convert_unicode
+ needs_convert = wants_unicode and \
+ (not dialect.returns_unicode_strings or
+ self.convert_unicode == 'force')
+
+ if needs_convert:
+ # note we *assume* that we do not have a unicode object
+ # here, instead of an expensive isinstance() check.
def process(value):
- if value is not None and not isinstance(value, unicode):
+ if value is not None:
return value.decode(dialect.encoding)
else:
return value
(Unicode(), Unicode),
(Text(), cx_oracle._OracleText),
(UnicodeText(), cx_oracle._OracleUnicodeText),
- (NCHAR(), NCHAR),
+ (NCHAR(), cx_oracle._OracleNVarChar),
(oracle.RAW(50), cx_oracle._OracleRaw),
]:
assert isinstance(start.dialect_impl(dialect), test), "wanted %r got %r" % (test, start.dialect_impl(dialect))
unicode_table.insert().execute(unicode_varchar=unicodedata,unicode_text=unicodedata)
x = unicode_table.select().execute().first()
- self.assert_(isinstance(x['unicode_varchar'], unicode) and x['unicode_varchar'] == unicodedata)
- self.assert_(isinstance(x['unicode_text'], unicode) and x['unicode_text'] == unicodedata)
+ assert isinstance(x['unicode_varchar'], unicode)
+ assert isinstance(x['unicode_text'], unicode)
+ eq_(x['unicode_varchar'], unicodedata)
+ eq_(x['unicode_text'], unicodedata)
def test_round_trip_executemany(self):
# cx_oracle was producing different behavior for cursor.executemany()