]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
fix up oracle handling of LOB/string [ticket:902], slight fixes to defaults.py but we
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 1 Jan 2008 00:43:24 +0000 (00:43 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 1 Jan 2008 00:43:24 +0000 (00:43 +0000)
will need to fix up result-type handling some more

CHANGES
lib/sqlalchemy/databases/oracle.py
test/dialect/oracle.py
test/sql/defaults.py

diff --git a/CHANGES b/CHANGES
index 402ef6e6e7a33e548afcc8c9d73169c741594328..b552745ab6571e6849d9ba07df5bcbe261490fd3 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -273,6 +273,8 @@ CHANGES
    
    - oracle
       - added disconnect detection support for Oracle
+      - some cleanup to binary/raw types so that cx_oracle.LOB is detected
+        on an ad-hoc basis [ticket:902]
    
    - MSSQL
       - PyODBC no longer has a global "set nocount on".
index c57ed006c92d6f8783fb9978b7a97955a6cef7a0..99cfbbb3ab4312403830c26700e4e6cf45297866 100644 (file)
@@ -95,11 +95,9 @@ class OracleText(sqltypes.TEXT):
 
     def result_processor(self, dialect):
         super_process = super(OracleText, self).result_processor(dialect)
+        lob = dialect.dbapi.LOB
         def process(value):
-            if value is None:
-                return None
-            elif hasattr(value, 'read'):
-                # cx_oracle doesnt seem to be consistent with CLOB returning LOB or str
+            if isinstance(value, lob):
                 if super_process:
                     return super_process(value.read())
                 else:
@@ -130,11 +128,12 @@ class OracleBinary(sqltypes.Binary):
         return None
 
     def result_processor(self, dialect):
+        lob = dialect.dbapi.LOB
         def process(value):
-            if value is None:
-                return None
-            else:
+            if isinstance(value, lob):
                 return value.read()
+            else:
+                return value
         return process
         
 class OracleBoolean(sqltypes.Boolean):
index c9c19f045b098b688228dd17b90f0d405daaffaf..64f86329ed5f3002882f46c3f55016edb756c718 100644 (file)
@@ -147,6 +147,15 @@ class TypesTest(SQLCompileTest):
         b = bindparam("foo", u"hello world!")
         assert b.type.dialect_impl(dialect).get_dbapi_type(dbapi) == 'STRING'
 
+    def test_reflect_raw(self):
+        types_table = Table(
+        'all_types', MetaData(testbase.db),
+            Column('owner', String(30), primary_key=True),
+            Column('type_name', String(30), primary_key=True),
+            autoload=True,
+            )
+        [[row[k] for k in row.keys()] for row in types_table.select().execute().fetchall()]
+
     def test_longstring(self):
         metadata = MetaData(testbase.db)
         testbase.db.execute("""
index bce499686194efeb3336ab0ecf40510c2f200e82..a67eea89465cf3bd4132fcc026dc12737f8cbc04 100644 (file)
@@ -40,13 +40,15 @@ class DefaultTest(PersistTest):
         currenttime = func.current_date(type_=Date, bind=db)
 
         if is_oracle:
-            ts = db.func.trunc(func.sysdate(), literal_column("'DAY'")).scalar()
+            ts = db.scalar(select([func.trunc(func.sysdate(), literal_column("'DAY'"), type_=Date).label('today')]))
+            assert isinstance(ts, datetime.date) and not isinstance(ts, datetime.datetime)
             f = select([func.length('abcdef')], bind=db).scalar()
             f2 = select([func.length('abcdefghijk')], bind=db).scalar()
             # TODO: engine propigation across nested functions not working
-            currenttime = func.trunc(currenttime, literal_column("'DAY'"), bind=db)
+            currenttime = func.trunc(currenttime, literal_column("'DAY'"), bind=db, type_=Date)
             def1 = currenttime
-            def2 = func.trunc(text("sysdate"), literal_column("'DAY'"))
+            def2 = func.trunc(text("sysdate"), literal_column("'DAY'"), type_=Date)
+
             deftype = Date
         elif use_function_defaults:
             f = select([func.length('abcdef')], bind=db).scalar()
@@ -146,10 +148,10 @@ class DefaultTest(PersistTest):
         t.insert().execute()
         t.insert().execute()
 
-        ctexec = currenttime.scalar()
+        ctexec = select([currenttime.label('now')], bind=testbase.db).scalar()
         l = t.select().execute()
         today = datetime.date.today()
-        self.assert_(l.fetchall() == [
+        self.assertEquals(l.fetchall(), [
             (51, 'imthedefault', f, ts, ts, ctexec, True, False, 12, today),
             (52, 'imthedefault', f, ts, ts, ctexec, True, False, 12, today),
             (53, 'imthedefault', f, ts, ts, ctexec, True, False, 12, today),