]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- oracle:
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 10 Mar 2007 23:31:40 +0000 (23:31 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 10 Mar 2007 23:31:40 +0000 (23:31 +0000)
    - 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.

CHANGES
lib/sqlalchemy/databases/oracle.py
lib/sqlalchemy/engine/default.py
test/sql/defaults.py
test/sql/testtypes.py
test/testbase.py

diff --git a/CHANGES b/CHANGES
index 799690921799c531172356fe1ba97401d896bd36..d8d4f4e5645b70caf0d2f687bb5195bc29144432 100644 (file)
--- a/CHANGES
+++ b/CHANGES
     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
index 8d112fc460b108189c55825dee67576db15ec8d2..966834eb251252944c79924a5c017a64591736cf 100644 (file)
@@ -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:
index ef0a6cc57b8d10394ef2f29931d1f269cc305951..c6e0d9dc4eed7154a6b7ac040485248d878c5f67 100644 (file)
@@ -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):
index f82ca7f5f39fe6c6eec6a1364fb1b125f3f35209..0bc1a6b2e10d8bbad74a240cfe0a8bd3621e85eb 100644 (file)
@@ -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()
index 411e39406e1924a3e6be5ae5f65164e9bb2c406a..97e95d38926c0081a5b284ab39c6f55a9ba90a05 100644 (file)
@@ -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)
index 1dbd654c7163a44b9b81b319c403be1b70b92ef2..47ddaec8bca2b76dac7bafbd02dea896e5f44b48 100644 (file)
@@ -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':