Author: ericdm
Date: 2006-04-11 09:15:50 -0600 (Tue, 11 Apr 2006)
New Revision: 1690
Modified:
SQLObject/branches/trunk-oracle/setup.py
SQLObject/branches/trunk-oracle/sqlobject/__init__.py
SQLObject/branches/trunk-oracle/sqlobject/col.py
SQLObject/branches/trunk-oracle/sqlobject/conftest.py
SQLObject/branches/trunk-oracle/sqlobject/converters.py
SQLObject/branches/trunk-oracle/sqlobject/dbconnection.py
SQLObject/branches/trunk-oracle/sqlobject/index.py
SQLObject/branches/trunk-oracle/sqlobject/joins.py
SQLObject/branches/trunk-oracle/sqlobject/main.py
SQLObject/branches/trunk-oracle/sqlobject/sqlbuilder.py
SQLObject/branches/trunk-oracle/sqlobject/tests/dbtest.py
SQLObject/branches/trunk-oracle/sqlobject/tests/test_aliases.py
SQLObject/branches/trunk-oracle/sqlobject/tests/test_auto.py
SQLObject/branches/trunk-oracle/sqlobject/tests/test_auto_old.py
SQLObject/branches/trunk-oracle/sqlobject/tests/test_combining_joins.py
SQLObject/branches/trunk-oracle/sqlobject/tests/test_create_drop.py
SQLObject/branches/trunk-oracle/sqlobject/tests/test_cyclic_reference.py
SQLObject/branches/trunk-oracle/sqlobject/tests/test_datetime.py
SQLObject/branches/trunk-oracle/sqlobject/tests/test_indexes.py
SQLObject/branches/trunk-oracle/sqlobject/tests/test_joins.py
SQLObject/branches/trunk-oracle/sqlobject/tests/test_setters.py
SQLObject/branches/trunk-oracle/sqlobject/tests/test_slice.py
SQLObject/branches/trunk-oracle/sqlobject/tests/test_stringid.py
SQLObject/branches/trunk-oracle/sqlobject/tests/test_stringid_old.py
SQLObject/branches/trunk-oracle/sqlobject/tests/test_subqueries.py
Log:
Committing the initial changes for Oracle support.
Modified: SQLObject/branches/trunk-oracle/setup.py
===================================================================
--- SQLObject/branches/trunk-oracle/setup.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/setup.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -11,7 +11,7 @@
subpackages = ['firebird', 'include', 'include.pydispatch', 'inheritance',
'manager', 'maxdb', 'mysql', 'mssql', 'postgres', 'sqlite',
- 'sybase', 'util']
+ 'sybase', 'util', 'oracle']
import sys
# patch distutils if it can't cope with the "classifiers" keyword
@@ -65,6 +65,7 @@
'postgresql': ['psycopg'],
'mysql': ['MySQLdb'],
'sqlite': ['pysqlite'],
+ 'oracle': ['cx_Oracle'],
# Others?
},
**kw
Modified: SQLObject/branches/trunk-oracle/sqlobject/__init__.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/__init__.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/__init__.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -18,6 +18,11 @@
_warn('FirebirdConnection is deprecated; use connectionForURI("firebird://...") or "from sqlobject.firebird import builder; FirebirdConnection = builder()"')
return _firebird.builder()(*args, **kw)
+import oracle as _oracle
+def OracleConnection(*args, **kw):
+ _warn('OracleConnection is deprecated; use connectionForURI("oracle://...") or "from sqlobject.oracle import builder; OracleConnection = builder()"')
+ return _oracle.builder()(*args, **kw)
+
import mysql as _mysql
def MySQLConnection(*args, **kw):
_warn('MySQLConnection is deprecated; use connectionForURI("mysql://...") or "from sqlobject.mysql import builder; MySQLConnection = builder()"')
Modified: SQLObject/branches/trunk-oracle/sqlobject/col.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/col.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/col.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -325,6 +325,9 @@
def _maxdbType(self):
return self._sqlType()
+ def _oracleType(self):
+ return self._sqlType()
+
def mysqlCreateSQL(self):
return ' '.join([self.dbName, self._mysqlType()] + self._extraSQL())
@@ -352,6 +355,9 @@
def maxdbCreateSQL(self):
return ' '.join([self.dbName, self._maxdbType()] + self._extraSQL())
+ def oracleCreateSQL(self):
+ return ' '.join([self.dbName, self._oracleType()] + self._extraSQL())
+
def __get__(self, obj, type=None):
if obj is None:
# class attribute, return the descriptor itself
@@ -503,7 +509,15 @@
else:
return self._sqlType()
+ def _oracleType(self):
+ if not self.length:
+ return 'VARCHAR(1000)'
+ elif not self.varchar:
+ return 'CHAR(%i)' % self.length
+ else:
+ return 'VARCHAR(%i)' % self.length
+
class StringValidator(validators.Validator):
def to_python(self, value, state):
@@ -643,6 +657,9 @@
def _firebirdType(self):
return 'INT'
+ def _oracleType(self):
+ return 'NUMBER(1,0)'
+
def _maxdbType(self):
return "BOOLEAN"
@@ -690,6 +707,9 @@
def _mysqlType(self):
return "DOUBLE PRECISION"
+ def _oracleType(self):
+ return 'NUMBER'
+
class FloatCol(Col):
baseClass = SOFloatCol
@@ -711,6 +731,10 @@
key_type = {int: "INT NULL", str: "TEXT"}
return key_type[self.soClass.sqlmeta.idType]
+ def _oracleType(self):
+ key_type = {int: "INT", str: "VARCHAR(1000)"}
+ return key_type[self.soClass.sqlmeta.idType]
+
class KeyCol(Col):
baseClass = SOKeyCol
@@ -824,6 +848,41 @@
# @@: Code from above should be moved here
return None
+ def oracleCreateSQL(self):
+ sql = SOKeyCol.oracleCreateSQL(self)
+ return sql
+
+ def oracleCreateReferenceConstraint(self):
+ sTName = self.soClass.sqlmeta.table
+ other = findClass(self.foreignKey)
+ tName = other.sqlmeta.table
+ idName = other.sqlmeta.idName
+ #prevent constraint name > 30 characters
+ constName = str(sTName + '_' + self.dbName)
+ if len(constName) > 30:
+ from md5 import md5
+ constName = 'c' + md5(constName).hexdigest()[:29]
+ if self.cascade is not None:
+ if self.cascade == 'null':
+ action = 'ON DELETE SET NULL'
+ elif self.cascade:
+ action = 'ON DELETE CASCADE'
+ else:
+ action = ''
+ else:
+ action = ''
+ constraint = ('ALTER TABLE %(sTName)s ADD CONSTRAINT %(constName)s '
+ 'FOREIGN KEY (%(colName)s) '
+ 'REFERENCES %(tName)s (%(idName)s) '
+ '%(action)s' %
+ {'tName': tName,
+ 'constName': constName,
+ 'colName': self.dbName,
+ 'idName': idName,
+ 'action': action,
+ 'sTName': sTName})
+ return constraint
+
def mssqlCreateSQL(self):
sql = SOKeyCol.mssqlCreateSQL(self)
other = findClass(self.foreignKey)
@@ -901,6 +960,12 @@
#NB. Return a tuple, not a string here
return "VARCHAR(%i)" % (length), checkConstraint
+ def _oracleType(self):
+ length = max(map(self._getlength, self.enumValues))
+ enumValues = ', '.join([sqlbuilder.sqlrepr(v, 'oracle') for v in self.enumValues])
+ checkConstraint = "CHECK (%s in (%s))" % (self.dbName, enumValues)
+ return "VARCHAR(%i) %s" % (length, checkConstraint)
+
def _maxdbType(self):
raise "Enum type is not supported"
@@ -1036,6 +1101,10 @@
def _firebirdType(self):
return 'TIMESTAMP'
+ def _oracleType(self):
+ #return 'DATE'
+ return 'TIMESTAMP'
+
def _maxdbType(self):
return 'TIMESTAMP'
@@ -1102,6 +1171,9 @@
def _firebirdType(self):
return 'DATE'
+ def _oracleType(self):
+ return 'DATE'
+
def _maxdbType(self):
return 'DATE'
@@ -1156,6 +1228,9 @@
def _firebirdType(self):
return 'TIME'
+ def _oracleType(self):
+ return 'TIMESTAMP'
+
def _maxdbType(self):
return 'TIME'
@@ -1293,6 +1368,9 @@
def _mssqlType(self):
return "IMAGE"
+ def _oracleType(self):
+ return 'BLOB'
+
class BLOBCol(StringCol):
baseClass = SOBLOBCol
@@ -1333,6 +1411,9 @@
name=self.name, pickleProtocol=self.pickleProtocol)] + \
super(SOPickleCol, self).createValidators()
+ def _oracleType(self):
+ return 'BLOB'
+
class PickleCol(BLOBCol):
baseClass = SOPickleCol
Modified: SQLObject/branches/trunk-oracle/sqlobject/conftest.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/conftest.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/conftest.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -27,6 +27,7 @@
'sqlite': 'sqlite:/:memory:',
'sybase': 'sybase://test:test123@sybase/test?autoCommit=0',
'firebird': 'firebird://sysdba:masterkey@localhost/var/lib/firebird/data/test.gdb',
+ 'oracle': 'oracle://phoenix:phoenix@10.10.16.164/orcl',
'mssql': 'mssql://sa:@127.0.0.1/test'
}
Modified: SQLObject/branches/trunk-oracle/sqlobject/converters.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/converters.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/converters.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -112,7 +112,7 @@
if db in ('mysql', 'postgres'):
for orig, repl in sqlStringReplace:
value = value.replace(orig, repl)
- elif db in ('sqlite', 'firebird', 'sybase', 'maxdb', 'mssql'):
+ elif db in ('sqlite', 'firebird', 'sybase', 'maxdb', 'mssql', 'oracle'):
value = value.replace("'", "''")
else:
assert 0, "Database %s unknown" % db
@@ -161,15 +161,30 @@
if DateTimeType:
def DateTimeConverter(value, db):
- return "'%s'" % isoStr(value)
+ if db in ('oracle',):
+ #return "TO_DATE('%s', 'YYYY-MM-DD HH24:MI:SS')" % "%s" % isoStr(value)
+ return "TO_TIMESTAMP('%s', 'YYYY-MM-DD HH24:MI:SS')" % "%s" % isoStr(value).rstrip('.')
+ else:
+ return "'%s'" % isoStr(value)
registerConverter(DateTimeType, DateTimeConverter)
def TimeConverter(value, db):
- return "'%s'" % value.strftime("%T")
+ if db in ('oracle',):
+ return "TO_TIMESTAMP('%s', 'HH24:MI:SS')" % value.strftime('%H:%M:%S')
+ else:
+ return "'%s'" % value.strftime("%T")
registerConverter(DateTimeDeltaType, TimeConverter)
+ #def DateConverter(value, db):
+ # if db in ('oracle',):
+ # return "TO_DATE('%s', 'YYYY-MM-DD')" % value.strftime('%Y-%m-%d')
+ # else:
+ # return "'%4d-%02d-%02d'" % (value.year, value.month, value.day)
+#
+ #registerConverter(DateTimeType, DateConverter)
+
def NoneConverter(value, db):
return "NULL"
@@ -183,25 +198,39 @@
if hasattr(time, 'struct_time'):
def StructTimeConverter(value, db):
- return time.strftime("'%Y-%m-%d %H:%M:%S'", value)
+ if db in ('oracle',):
+ #return "TO_DATE('%s', 'YYYY-MM-DD HH24:MI:SS')" % time.strftime('%Y-%m-%d %H:%M:%S', value)
+ return "TO_TIMESTAMP('%s', 'HH24:MI:SS')" % time.strftime('%H:%M:%S', value)
+ else:
+ return time.strftime("'%Y-%m-%d %H:%M:%S'", value)
registerConverter(time.struct_time, StructTimeConverter)
if datetime:
def DateTimeConverter(value, db):
- return "'%4d-%02d-%02d %02d:%02d:%02d'" % (
- value.year, value.month, value.day,
- value.hour, value.minute, value.second)
+ if db in ('oracle',):
+ #return "TO_DATE('%s', 'YYYY-MM-DD HH24:MI:SS')" % value.strftime('%Y-%m-%d %H:%M:%S')
+ return "TO_TIMESTAMP('%s', 'YYYY-MM-DD HH24:MI:SS')" % value.strftime('%Y-%m-%d %H:%M:%S')
+ else:
+ return "'%4d-%02d-%02d %02d:%02d:%02d'" % (
+ value.year, value.month, value.day,
+ value.hour, value.minute, value.second)
registerConverter(datetime.datetime, DateTimeConverter)
def DateConverter(value, db):
- return "'%4d-%02d-%02d'" % (value.year, value.month, value.day)
+ if db in ('oracle',):
+ return "TO_DATE('%s', 'YYYY-MM-DD')" % value.strftime('%Y-%m-%d')
+ else:
+ return "'%4d-%02d-%02d'" % (value.year, value.month, value.day)
registerConverter(datetime.date, DateConverter)
def TimeConverter(value, db):
- return "'%02d:%02d:%02d'" % (value.hour, value.minute, value.second)
+ if db in ('oracle',):
+ return "TO_TIMESTAMP('%s', 'HH24:MI:SS')" % value.strftime('%H:%M:%S')
+ else:
+ return "'%02d:%02d:%02d'" % (value.hour, value.minute, value.second)
registerConverter(datetime.time, TimeConverter)
Modified: SQLObject/branches/trunk-oracle/sqlobject/dbconnection.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/dbconnection.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/dbconnection.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -220,7 +220,11 @@
self._pool = []
self._poolLock = threading.Lock()
DBConnection.__init__(self, **kw)
- self._binaryType = type(self.module.Binary(''))
+ try:
+ self._binaryType = type(self.module.Binary(''))
+ except:
+ #dirty hack because cx_Oracle doesn't implement Binary()
+ self._binaryType = type(self.module.BINARY)
def _runWithConnection(self, meth, *args):
conn = self.getConnection()
Modified: SQLObject/branches/trunk-oracle/sqlobject/index.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/index.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/index.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -100,7 +100,8 @@
', '.join(spec))
return ret
- postgresCreateIndexSQL = maxdbCreateIndexSQL = mssqlCreateIndexSQL = sybaseCreateIndexSQL = firebirdCreateIndexSQL = sqliteCreateIndexSQL
+ postgresCreateIndexSQL = maxdbCreateIndexSQL = mssqlCreateIndexSQL = sybaseCreateIndexSQL = firebirdCreateIndexSQL = oracleCreateIndexSQL = sqliteCreateIndexSQL
+
def mysqlCreateIndexSQL(self, soClass):
if self.unique:
uniqueOrIndex = 'UNIQUE'
Modified: SQLObject/branches/trunk-oracle/sqlobject/joins.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/joins.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/joins.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -4,6 +4,7 @@
import classregistry
from col import popKey
import events
+from md5 import md5
__all__ = ['MultipleJoin', 'SQLMultipleJoin', 'RelatedJoin', 'SQLRelatedJoin',
'SingleJoin', 'ManyToMany', 'OneToMany']
@@ -184,10 +185,13 @@
def _setOtherRelatedClass(self, otherClass):
if not self.intermediateTable:
- names = [self.soClass.sqlmeta.table,
- otherClass.sqlmeta.table]
+ #make a name that is unique and short enough that all databases
+ #can handle the length of the table name (*cough* *Oracle* *cough*)
+ #and ensure that the name starts with a letter
+ names = [self.soClass.sqlmeta.table, otherClass.sqlmeta.table]
names.sort()
- self.intermediateTable = '%s_%s' % (names[0], names[1])
+ textName = '%s_%s' % (names[0], names[1])
+ self.intermediateTable = 'j' + str(md5(textName).hexdigest())[:20]
if not self.otherColumn:
self.otherColumn = self.soClass.sqlmeta.style.tableReference(
otherClass.sqlmeta.table)
@@ -328,10 +332,13 @@
def _finishSet(self):
if self.intermediateTable is None:
- names = [self.soClass.sqlmeta.table,
- self.otherClass.sqlmeta.table]
+ #make a name that is unique and short enough that all databases
+ #can handle the length of the table name (*cough* *Oracle* *cough*)
+ #and ensure that the name starts with a letter
+ names = [self.soClass.sqlmeta.table, self.otherClass.sqlmeta.table]
names.sort()
- self.intermediateTable = '%s_%s' % (names[0], names[1])
+ textName = '%s_%s' % (names[0], names[1])
+ self.intermediateTable = 'j' + str(md5(textName).hexdigest())[:20]
if not self.otherColumn:
self.otherColumn = self.soClass.sqlmeta.style.tableReference(
self.otherClass.sqlmeta.table)
Modified: SQLObject/branches/trunk-oracle/sqlobject/main.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/main.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/main.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -698,7 +698,7 @@
_parent = None # A reference to the parent instance
childName = None # Children name (to be able to get a subclass)
# moved to sqlmeta in 0.8:
- _parentClass = _sqlmeta_attr('parentClass', 2)
+ parentClass = _sqlmeta_attr('parentClass', 2)
_childClasses = _sqlmeta_attr('childClasses', 2)
# The law of Demeter: the class should not call another classes by name
@@ -1228,6 +1228,7 @@
# Then we check if the column wasn't passed in, and
# if not we try to get the default.
if not kw.has_key(column.name) and not kw.has_key(column.foreignName):
+# if not foundColName and not foundFkName:
default = column.default
# If we don't get it, it's an error:
@@ -1362,11 +1363,15 @@
cls.sqlmeta.send(events.CreateTableSignal, cls, connection,
extra_sql, post_funcs)
constraints = conn.createTable(cls)
- if applyConstraints:
- for constraint in constraints:
- conn.query(constraint)
- else:
- extra_sql.extend(constraints)
+
+ #edm 3/29/06
+ if constraints:
+ if applyConstraints:
+ for constraint in constraints:
+ conn.query(constraint)
+ else:
+ extra_sql.extend(constraints)
+
if createJoinTables:
cls.createJoinTables(ifNotExists=ifNotExists,
connection=conn)
Modified: SQLObject/branches/trunk-oracle/sqlobject/sqlbuilder.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/sqlbuilder.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/sqlbuilder.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -384,7 +384,7 @@
return self.alias + "." + self.fieldName
def tablesUsedImmediate(self):
- return ["%s AS %s" % (self.tableName, self.alias)]
+ return ["%s %s" % (self.tableName, self.alias)]
class AliasTable(Table):
FieldClass = AliasField
@@ -660,12 +660,12 @@
def __init__(self, table1, table2, op=','):
if table1 and type(table1) <> str:
if isinstance(table1, Alias):
- table1 = "%s AS %s" % (table1.q.tableName, table1.q.alias)
+ table1 = "%s %s" % (table1.q.tableName, table1.q.alias)
else:
table1 = table1.sqlmeta.table
if type(table2) <> str:
if isinstance(table2, Alias):
- table2 = "%s AS %s" % (table2.q.tableName, table2.q.alias)
+ table2 = "%s %s" % (table2.q.tableName, table2.q.alias)
else:
table2 = table2.sqlmeta.table
self.table1 = table1
@@ -909,12 +909,19 @@
return "REGEXP"
elif db == 'postgres':
return "~"
+ elif db == 'oracle':
+ return 'REGEXP_LIKE'
else:
return "LIKE"
def __sqlrepr__(self, db):
- return "(%s %s %s)" % (
- sqlrepr(self.expr, db), self._get_op(db), sqlrepr(self.string, db)
- )
+ if db == 'oracle':
+ return "%s(%s, %s)" % (
+ self._get_op(db), sqlrepr(self.expr, db), sqlrepr(self.string, db)
+ )
+ else:
+ return "(%s %s %s)" % (
+ sqlrepr(self.expr, db), self._get_op(db), sqlrepr(self.string, db)
+ )
def execute(self, executor):
self.op = self._get_op(self.db)
return LIKE.execute(self, executor)
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/dbtest.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/dbtest.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/dbtest.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -40,7 +40,7 @@
'-blobData': 'mssql',
'-decimalColumn': 'mssql',
'-emptyTable': 'mssql',
- '-limitSelect' : 'mssql'
+ '-limitSelect' : 'mssql, oracle'
}
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/test_aliases.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/test_aliases.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/test_aliases.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -15,7 +15,7 @@
alias = Alias(JoinAlias)
select = JoinAlias.select(JoinAlias.q.parent == alias.q.name)
assert str(select) == \
- "SELECT join_alias.id, join_alias.name, join_alias.parent FROM join_alias AS join_alias_alias1, join_alias WHERE (join_alias.parent = join_alias_alias1.name)"
+ "SELECT join_alias.id, join_alias.name, join_alias.parent FROM join_alias join_alias_alias1, join_alias WHERE (join_alias.parent = join_alias_alias1.name)"
def test_2perform_join():
setupClass(JoinAlias)
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/test_auto.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/test_auto.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/test_auto.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -120,6 +120,23 @@
)
"""
+ oracleCreate = """
+ CREATE TABLE auto_test (
+ auto_id INT PRIMARY KEY,
+ first_name VARCHAR(100),
+ last_name VARCHAR(200) NOT NULL,
+ age INT DEFAULT 0,
+ created VARCHAR(40) NOT NULL,
+ happy char(1) DEFAULT 'Y' NOT NULL,
+ long_field VARCHAR(2000),
+ wannahavefun SMALLINT DEFAULT 0 NOT NULL
+ )
+ """
+
+ oracleCreateSequence = """
+ CREATE SEQUENCE auto_test_id_seq
+ """
+
mysqlDrop = """
DROP TABLE IF EXISTS auto_test
"""
@@ -134,12 +151,23 @@
mssqlDrop = sybaseDrop
+ oracleDrop = """
+ DROP TABLE auto_test
+ """
+
+ oracleDropSequence = """
+ DROP SEQUENCE auto_test_id_seq
+ """
+
def setup_method(self, meth):
conn = getConnection()
dbName = conn.dbName
creator = getattr(self, dbName + 'Create', None)
if creator:
conn.query(creator)
+ sequence = getattr(self, dbName + 'CreateSequence', None)
+ if sequence:
+ conn.query(sequence)
def teardown_method(self, meth):
conn = getConnection()
@@ -147,6 +175,9 @@
dropper = getattr(self, dbName + 'Drop', None)
if dropper:
conn.query(dropper)
+ sequenceDropper = getattr(self, dbName + 'DropSequence', None)
+ if sequenceDropper:
+ conn.query(sequenceDropper)
def test_classCreate(self):
if not supports('fromDatabase'):
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/test_auto_old.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/test_auto_old.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/test_auto_old.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -121,6 +121,23 @@
)
"""
+ oracleCreate = """
+ CREATE TABLE old_auto_test (
+ auto_id INT PRIMARY KEY,
+ first_name VARCHAR(100),
+ last_name VARCHAR(200) NOT NULL,
+ age INT DEFAULT 0,
+ created VARCHAR(40) NOT NULL,
+ happy char(1) DEFAULT 'Y' NOT NULL,
+ long_field VARCHAR(1000),
+ wannahavefun INT DEFAULT 0 NOT NULL
+ )
+ """
+
+ oracleCreateSequence = """
+ CREATE SEQUENCE old_auto_test_id_seq
+ """
+
mysqlDrop = """
DROP TABLE IF EXISTS old_auto_test
"""
@@ -136,12 +153,24 @@
mssqlDrop = """
DROP TABLE old_auto_test
"""
+
+ oracleDrop = """
+ DROP TABLE old_auto_test
+ """
+
+ oracleDropSequence = """
+ DROP SEQUENCE old_auto_test_id_seq
+ """
+
def setup_method(self, meth):
conn = getConnection()
dbName = conn.dbName
creator = getattr(self, dbName + 'Create', None)
if creator:
conn.query(creator)
+ sequence = getattr(self, dbName + 'CreateSequence', None)
+ if sequence:
+ conn.query(sequence)
def teardown_method(self, meth):
conn = getConnection()
@@ -149,6 +178,9 @@
dropper = getattr(self, dbName + 'Drop', None)
if dropper:
conn.query(dropper)
+ sequenceDropper = getattr(self, dbName + 'DropSequence', None)
+ if sequenceDropper:
+ conn.query(sequenceDropper)
def test_classCreate(self):
if not supports('fromDatabase'):
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/test_combining_joins.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/test_combining_joins.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/test_combining_joins.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -35,8 +35,8 @@
assert list(Complex.selectBy(name='c1')) == [c1]
assert list(cg1.unit_models) == [u1]
- assert list(cg2.unit_models) == [u1, u2, u2]
- assert list(cg2.unit_models.distinct()) == [u1, u2]
+ assert list(cg2.unit_models).sort() == [u1, u2, u2].sort()
+ assert list(cg2.unit_models.distinct()).sort() == [u1, u2].sort()
assert list(
cg2.unit_models.filter(UnitModel.q.name=='u1')) == [u1]
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/test_create_drop.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/test_create_drop.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/test_create_drop.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -6,7 +6,7 @@
idName = 'test_id_here'
table = 'test_create_drop_table'
name = StringCol()
- number = IntCol()
+ anumber = IntCol()
time = DateTimeCol()
short = StringCol(length=10)
blobcol = BLOBCol()
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/test_cyclic_reference.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/test_cyclic_reference.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/test_cyclic_reference.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -4,9 +4,9 @@
class TestCyclicReferenceA(SQLObject):
class sqlmeta(sqlmeta):
idName = 'test_id_here'
- table = 'test_cyclic_reference_a_table'
+ table = 'test_cyclic_reference_a'
name = StringCol()
- number = IntCol()
+ anumber = IntCol()
time = DateTimeCol()
short = StringCol(length=10)
blobcol = BLOBCol()
@@ -15,9 +15,9 @@
class TestCyclicReferenceB(SQLObject):
class sqlmeta(sqlmeta):
idName = 'test_id_here'
- table = 'test_cyclic_reference_b_table'
+ table = 'test_cyclic_reference_b'
name = StringCol()
- number = IntCol()
+ anumber = IntCol()
time = DateTimeCol()
short = StringCol(length=10)
blobcol = BLOBCol()
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/test_datetime.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/test_datetime.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/test_datetime.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -52,12 +52,14 @@
class DateTime2(SQLObject):
col1 = DateTimeCol()
col2 = DateCol(dateFormat=dateFormat)
+ #col2 = DateCol()
col3 = TimeCol()
def test_mxDateTime():
setupClass(DateTime2)
_now = now()
dt2 = DateTime2(col1=_now, col2=_now, col3=Time(_now.hour, _now.minute, int(_now.second)))
+ #dt2 = DateTime2(col1=_now, col2=Date(_now.year, _now.month, _now.day), col3=Time(_now.hour, _now.minute, int(_now.second)))
assert isinstance(dt2.col1, col.DateTimeType)
assert dt2.col1.year == _now.year
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/test_indexes.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/test_indexes.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/test_indexes.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -7,12 +7,14 @@
class SOIndex1(SQLObject):
name = StringCol(length=100)
- number = IntCol()
+ anumber = IntCol()
- nameIndex = DatabaseIndex('name', unique=True)
- nameIndex2 = DatabaseIndex(name, number)
+ #nameIndex = DatabaseIndex('name', unique=True)
+ nameIndex2 = DatabaseIndex(name, anumber)
+ #nameIndex3 = DatabaseIndex({'column': name,
+ # 'length': 3})
nameIndex3 = DatabaseIndex({'column': name,
- 'length': 3})
+ 'length': 3}, unique=True)
class SOIndex2(SQLObject):
@@ -25,10 +27,10 @@
n = 0
for name in 'blah blech boring yep yort snort'.split():
n += 1
- SOIndex1(name=name, number=n)
+ SOIndex1(name=name, anumber=n)
mod = SOIndex1._connection.module
try:
- SOIndex1(name='blah', number=0)
+ SOIndex1(name='blah', anumber=0)
except (mod.ProgrammingError, mod.IntegrityError, mod.OperationalError, mod.DatabaseError):
# expected
pass
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/test_joins.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/test_joins.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/test_joins.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -47,10 +47,10 @@
self.assertNamesEqual(z.personJoiners, [])
def assertZipsEqual(self, zips, dest):
- assert [a.zip for a in zips] == dest
+ assert [a.zip for a in zips].sort() == dest.sort()
def assertNamesEqual(self, people, dest):
- assert [p.name for p in people] == dest
+ assert [p.name for p in people].sort() == dest.sort()
def test_joinAttributeWithUnderscores(self):
# Make sure that the implicit setting of joinMethodName works
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/test_setters.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/test_setters.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/test_setters.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -1,7 +1,7 @@
from sqlobject import *
from sqlobject.tests.dbtest import *
-class TestPlainAndNonPlainSetter(SQLObject):
+class TestSetters(SQLObject):
firstName = StringCol(length=50, dbName='fname_col', default=None)
lastName = StringCol(length=50, dbName='lname_col', default=None)
@@ -14,8 +14,8 @@
return "%s %s" % (self.firstName, self.lastName)
def test_create():
- setupClass(TestPlainAndNonPlainSetter)
- t = TestPlainAndNonPlainSetter(name='John Doe')
+ setupClass(TestSetters)
+ t = TestSetters(name='John Doe')
assert t.firstName == 'John'
assert t.lastName == 'Doe'
- assert t.name == 'John Doe'
\ No newline at end of file
+ assert t.name == 'John Doe'
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/test_slice.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/test_slice.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/test_slice.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -7,45 +7,45 @@
class Counter(SQLObject):
- number = IntCol(notNull=True)
+ anumber = IntCol(notNull=True)
class TestSlice:
def setup_method(self, meth):
setupClass(Counter)
for i in range(100):
- Counter(number=i)
+ Counter(anumber=i)
def counterEqual(self, counters, value):
if not supports('limitSelect'):
return
- assert [c.number for c in counters] == value
+ assert [c.anumber for c in counters] == value
def test_1(self):
self.counterEqual(
- Counter.select(None, orderBy='number'), range(100))
+ Counter.select(None, orderBy='anumber'), range(100))
def test_2(self):
self.counterEqual(
- Counter.select(None, orderBy='number')[10:20],
+ Counter.select(None, orderBy='anumber')[10:20],
range(10, 20))
def test_3(self):
self.counterEqual(
- Counter.select(None, orderBy='number')[20:30][:5],
+ Counter.select(None, orderBy='anumber')[20:30][:5],
range(20, 25))
def test_4(self):
self.counterEqual(
- Counter.select(None, orderBy='number')[:-10],
+ Counter.select(None, orderBy='anumber')[:-10],
range(0, 90))
def test_5(self):
self.counterEqual(
- Counter.select(None, orderBy='number', reversed=True),
+ Counter.select(None, orderBy='anumber', reversed=True),
range(99, -1, -1))
def test_6(self):
self.counterEqual(
- Counter.select(None, orderBy='-number'),
+ Counter.select(None, orderBy='-anumber'),
range(99, -1, -1))
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/test_stringid.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/test_stringid.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/test_stringid.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -40,6 +40,13 @@
)
"""
+ oracleCreate = """
+ CREATE TABLE so_string_id (
+ id VARCHAR2(50) NOT NULL PRIMARY KEY,
+ val VARCHAR2(50) NULL
+ )
+ """
+
mssqlCreate = """
CREATE TABLE so_string_id (
id VARCHAR(50) PRIMARY KEY,
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/test_stringid_old.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/test_stringid_old.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/test_stringid_old.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -50,6 +50,17 @@
sqliteCreate = postgresCreate
+ oracleCreate = """
+ CREATE TABLE so_string_id (
+ id VARCHAR(50) PRIMARY KEY,
+ val VARCHAR(50) NULL
+ )
+ """
+
+ oracleCreateSequence = """
+ CREATE SEQUENCE so_string_id_ID_SEQ
+ """
+
mysqlDrop = """
DROP TABLE IF EXISTS so_string_id
"""
@@ -62,7 +73,15 @@
firebirdDrop = postgresDrop
mssqlDrop = postgresDrop
+ oracleDrop = """
+ DROP TABLE so_string_id
+ """
+ oracleDropSequence = """
+ DROP SEQUENCE so_string_id_ID_SEQ
+ """
+
+
def test_stringID():
setupClass(OldSOStringID)
t = OldSOStringID(id='hey', val='whatever')
Modified: SQLObject/branches/trunk-oracle/sqlobject/tests/test_subqueries.py
===================================================================
--- SQLObject/branches/trunk-oracle/sqlobject/tests/test_subqueries.py 2006-04-11 08:15:40 UTC (rev 1689)
+++ SQLObject/branches/trunk-oracle/sqlobject/tests/test_subqueries.py 2006-04-11 15:15:50 UTC (rev 1690)
@@ -19,10 +19,10 @@
def insert():
setup()
TestIn1(col1=None)
- TestIn1(col1='')
+ TestIn1(col1="A")
TestIn1(col1="test")
TestIn2(col2=None)
- TestIn2(col2='')
+ TestIn2(col2="A")
TestIn2(col2="test")
def test_1syntax_in():
|