From: Mike Bayer Date: Sat, 10 Mar 2007 23:31:40 +0000 (+0000) Subject: - oracle: X-Git-Tag: rel_0_3_6~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=320cb9b75f763355ed798c80d245998ce57e21cc;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - oracle: - got binary working for any size input ! cx_oracle works fine, it was my fault as BINARY was being passed and not BLOB for setinputsizes (also unit tests werent even setting input sizes). - auto_setinputsizes defaults to True for Oracle, fixed cases where it improperly propigated bad types. --- diff --git a/CHANGES b/CHANGES index 7996909217..d8d4f4e564 100644 --- a/CHANGES +++ b/CHANGES @@ -25,6 +25,12 @@ duplicate column names are present. - fixed use_alter flag on ForeignKeyConstraint [ticket:503] - fixed usage of 2.4-only "reversed" in topological.py [ticket:506] +- oracle: + - got binary working for any size input ! cx_oracle works fine, + it was my fault as BINARY was being passed and not BLOB for + setinputsizes (also unit tests werent even setting input sizes). + - auto_setinputsizes defaults to True for Oracle, fixed cases where + it improperly propigated bad types. - orm: - the full featureset of the SelectResults extension has been merged into a new set of methods available off of Query. These methods diff --git a/lib/sqlalchemy/databases/oracle.py b/lib/sqlalchemy/databases/oracle.py index 8d112fc460..966834eb25 100644 --- a/lib/sqlalchemy/databases/oracle.py +++ b/lib/sqlalchemy/databases/oracle.py @@ -51,6 +51,9 @@ class OracleTimestamp(sqltypes.DateTime): return dialect.TIMESTAMP class OracleText(sqltypes.TEXT): + def get_dbapi_type(self, dbapi): + return dbapi.CLOB + def get_col_spec(self): return "CLOB" @@ -68,17 +71,13 @@ class OracleChar(sqltypes.CHAR): class OracleBinary(sqltypes.Binary): def get_dbapi_type(self, dbapi): - return dbapi.BINARY + return dbapi.BLOB def get_col_spec(self): return "BLOB" def convert_bind_param(self, value, dialect): - if value is None: - return None - else: - # this is RAWTOHEX - return ''.join(["%.2X" % ord(c) for c in value]) + return value def convert_result_value(self, value, dialect): if value is None: @@ -149,7 +148,7 @@ class OracleExecutionContext(default.DefaultExecutionContext): self.set_input_sizes(proxy(), parameters) class OracleDialect(ansisql.ANSIDialect): - def __init__(self, use_ansi=True, auto_setinputsizes=False, module=None, threaded=True, **kwargs): + def __init__(self, use_ansi=True, auto_setinputsizes=True, module=None, threaded=True, **kwargs): self.use_ansi = use_ansi self.threaded = threaded if module is None: diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py index ef0a6cc57b..c6e0d9dc4e 100644 --- a/lib/sqlalchemy/engine/default.py +++ b/lib/sqlalchemy/engine/default.py @@ -193,14 +193,18 @@ class DefaultExecutionContext(base.ExecutionContext): for params in plist[0:1]: for key in params.positional: typeengine = params.binds[key].type - inputsizes.append(typeengine.get_dbapi_type(self.dialect.module)) + dbtype = typeengine.dialect_impl(self.dialect).get_dbapi_type(self.dialect.module) + if dbtype is not None: + inputsizes.append(dbtype) cursor.setinputsizes(*inputsizes) else: inputsizes = {} for params in plist[0:1]: for key in params.keys(): typeengine = params.binds[key].type - inputsizes[key] = typeengine.get_dbapi_type(self.dialect.module) + dbtype = typeengine.dialect_impl(self.dialect).get_dbapi_type(self.dialect.module) + if dbtype is not None: + inputsizes[key] = dbtype cursor.setinputsizes(**inputsizes) def _process_defaults(self, engine, proxy, compiled, parameters): diff --git a/test/sql/defaults.py b/test/sql/defaults.py index f82ca7f5f3..0bc1a6b2e1 100644 --- a/test/sql/defaults.py +++ b/test/sql/defaults.py @@ -24,13 +24,13 @@ class DefaultTest(PersistTest): # also correct for "current_date" compatible as column default, value differences currenttime = func.current_date(type=Date, engine=db); if is_oracle: - ts = db.func.trunc(func.sysdate(), column("'DAY'")).scalar() + ts = db.func.trunc(func.sysdate(), literal_column("'DAY'")).scalar() f = select([func.count(1) + 5], engine=db).scalar() f2 = select([func.count(1) + 14], engine=db).scalar() # TODO: engine propigation across nested functions not working - currenttime = func.trunc(currenttime, column("'DAY'"), engine=db) + currenttime = func.trunc(currenttime, literal_column("'DAY'"), engine=db) def1 = currenttime - def2 = func.trunc(text("sysdate"), column("'DAY'")) + def2 = func.trunc(text("sysdate"), literal_column("'DAY'")) deftype = Date elif use_function_defaults: f = select([func.count(1) + 5], engine=db).scalar() diff --git a/test/sql/testtypes.py b/test/sql/testtypes.py index 411e39406e..97e95d3892 100644 --- a/test/sql/testtypes.py +++ b/test/sql/testtypes.py @@ -203,12 +203,8 @@ class BinaryTest(AssertMixin): testobj1 = pickleable.Foo('im foo 1') testobj2 = pickleable.Foo('im foo 2') - if db.name == 'oracle': - stream1 =self.load_stream('binary_data_one.dat', len=2000) - stream2 =self.load_stream('binary_data_two.dat', len=2000) - else: - stream1 =self.load_stream('binary_data_one.dat') - stream2 =self.load_stream('binary_data_two.dat') + stream1 =self.load_stream('binary_data_one.dat') + stream2 =self.load_stream('binary_data_two.dat') binary_table.insert().execute(primary_id=1, misc='binary_data_one.dat', data=stream1, data_slice=stream1[0:100], pickled=testobj1) binary_table.insert().execute(primary_id=2, misc='binary_data_two.dat', data=stream2, data_slice=stream2[0:99], pickled=testobj2) binary_table.insert().execute(primary_id=3, misc='binary_data_two.dat', data=None, data_slice=stream2[0:99], pickled=None) diff --git a/test/testbase.py b/test/testbase.py index 1dbd654c71..47ddaec8bc 100644 --- a/test/testbase.py +++ b/test/testbase.py @@ -75,7 +75,7 @@ def parse_argv(): db_uri = 'oracle://scott:tiger@127.0.0.1:1521' elif DBTYPE == 'oracle8': db_uri = 'oracle://scott:tiger@127.0.0.1:1521' - opts = {'use_ansi':False, 'auto_setinputsizes':True} + opts = {'use_ansi':False} elif DBTYPE == 'mssql': db_uri = 'mssql://scott:tiger@SQUAWK\\SQLEXPRESS/test' elif DBTYPE == 'firebird':