Update of /cvsroot/sqlobject/SQLObject/SQLObject
In directory sc8-pr-cvs1:/tmp/cvs-serv23081/SQLObject
Modified Files:
Tag: sybase-support-branch
Col.py DBConnection.py SQLObject.py
Log Message:
Branching for adding Sybase support
Index: Col.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/Col.py,v
retrieving revision 1.24
retrieving revision 1.24.2.1
diff -C2 -d -r1.24 -r1.24.2.1
*** Col.py 28 Jun 2003 22:21:21 -0000 1.24
--- Col.py 19 Aug 2003 12:53:10 -0000 1.24.2.1
***************
*** 162,165 ****
--- 162,168 ----
return ''
+ def _sybaseType(self):
+ return self._sqlType()
+
def mysqlCreateSQL(self):
return ' '.join([self.dbName, self._mysqlType()] + self._extraSQL())
***************
*** 171,174 ****
--- 174,180 ----
return ' '.join([self.dbName, self._sqliteType()] + self._extraSQL())
+ def sybaseCreateSQL(self):
+ return ' '.join([self.dbName, self._sybaseType()] + self._extraSQL())
+
class Col(object):
***************
*** 306,309 ****
--- 312,318 ----
return self._postgresType()
+ def _sybaseType(self):
+ return self._postgresType()
+
class EnumCol(Col):
baseClass = SOEnumCol
***************
*** 320,325 ****
--- 329,354 ----
return 'TIMESTAMP'
+ def _sybaseType(self):
+ return 'TIMESTAMP'
+
class DateTimeCol(Col):
baseClass = SODateTimeCol
+
+ class SODateCol(SOCol):
+
+ # 3-03 @@: provide constraints; right now we let the database
+ # do any parsing and checking. And DATE and TIME?
+
+ def _mysqlType(self):
+ return 'DATE'
+
+ def _postgresType(self):
+ return 'DATE'
+
+ def _sybaseType(self):
+ return 'DATE'
+
+ class DateCol(Col):
+ baseClass = SODateCol
class SODecimalCol(SOCol):
Index: DBConnection.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/DBConnection.py,v
retrieving revision 1.41
retrieving revision 1.41.2.1
diff -C2 -d -r1.41 -r1.41.2.1
*** DBConnection.py 18 Jul 2003 03:15:50 -0000 1.41
--- DBConnection.py 19 Aug 2003 12:53:10 -0000 1.41.2.1
***************
*** 7,10 ****
--- 7,11 ----
from Cache import CacheSet
import Col
+
try:
import cPickle as pickle
***************
*** 29,32 ****
--- 30,43 ----
except ImportError:
sqlite = None
+
+ try:
+ import Sybase
+ from Sybase import NumericType
+ from Converters import registerConverter, IntConverter
+ registerConverter(NumericType, IntConverter)
+
+ except ImportError:
+ Sybase = None
+
import re
import warnings
***************
*** 36,40 ****
__all__ = ['MySQLConnection', 'PostgresConnection', 'SQLiteConnection',
! 'DBMConnection']
_connections = {}
--- 47,51 ----
__all__ = ['MySQLConnection', 'PostgresConnection', 'SQLiteConnection',
! 'DBMConnection', 'SybaseConnection']
_connections = {}
***************
*** 605,608 ****
--- 616,720 ----
# turn it into a boolean:
return not not result
+
+ class SybaseConnection(DBAPI):
+
+ def __init__(self, db, user, passwd='', host='localhost', autoCommit=0, **kw):
+ assert Sybase, 'Sybase module cannot be found'
+ if not autoCommit and not kw.has_key('pool'):
+ # Pooling doesn't work with transactions...
+ kw['pool'] = 0
+ self.autoCommit=autoCommit
+ self.host = host
+ self.db = db
+ self.user = user
+ self.passwd = passwd
+ DBAPI.__init__(self, **kw)
+
+ def insert_id(self, conn):
+ """ Sybase adapter/cursor does not support the
+ insert_id method.
+ """
+ c = conn.cursor()
+ c.execute('SELECT @@IDENTITY')
+ return c.fetchone()[0]
+
+ def makeConnection(self):
+ return Sybase.connect(self.host, self.user, self.passwd,
+ database=self.db, auto_commit=self.autoCommit)
+
+ def _queryInsertID(self, conn, table, idName, names, values):
+ c = conn.cursor()
+ q = self._insertSQL(table, names, values)
+ if self.debug:
+ print 'QueryIns: %s' % q
+ c.execute(q)
+ return self.insert_id(conn)
+
+ def _queryAddLimitOffset(self, query, start, end):
+ if not start:
+ return "%s LIMIT %i" % (query, end)
+ if not end:
+ return "%s LIMIT %i, -1" % (query, start)
+ return "%s LIMIT %i, %i" % (query, start, end-start)
+
+ def createColumn(self, soClass, col):
+ return col.sybaseCreateSQL()
+
+ def createIDColumn(self, soClass):
+ #return '%s INT PRIMARY KEY AUTO_INCREMENT' % soClass._idName
+ return '%s NUMERIC(18,0) IDENTITY' % soClass._idName
+
+ def joinSQLType(self, join):
+ return 'NUMERIC(18,0) NOT NULL' #INT NOT NULL'
+
+ SHOW_TABLES="""SELECT name FROM sysobjects WHERE type='U'"""
+ def tableExists(self, tableName):
+ for (table,) in self.queryAll(self.SHOW_TABLES):
+ if table.lower() == tableName.lower():
+ return True
+ return False
+
+ def addColumn(self, tableName, column):
+ self.query('ALTER TABLE %s ADD COLUMN %s' %
+ (tableName,
+ column.sybaseCreateSQL()))
+
+ def delColumn(self, tableName, column):
+ self.query('ALTER TABLE %s DROP COLUMN %s' %
+ (tableName,
+ column.dbName))
+
+ SHOW_COLUMNS="""select 'column' = COL_NAME(id, colid)
+ from syscolumns
+ where id = OBJECT_ID(%s)
+ """
+ def columnsFromSchema(self, tableName, soClass):
+ colData = self.queryAll(self.SHOW_COLUMNS
+ % tableName)
+ results = []
+ for field, t, nullAllowed, key, default, extra in colData:
+ if field == 'id':
+ continue
+ colClass, kw = self.guessClass(t)
+ kw['name'] = soClass._style.dbColumnToPythonAttr(field)
+ kw['notNone'] = not nullAllowed
+ kw['default'] = default
+ # @@ skip key...
+ # @@ skip extra...
+ results.append(colClass(**kw))
+ return results
+
+ def guessClass(self, t):
+ if t.startswith('int'):
+ return Col.IntCol, {}
+ elif t.startswith('varchar'):
+ return Col.StringCol, {'length': int(t[8:-1])}
+ elif t.startswith('char'):
+ return Col.StringCol, {'length': int(t[5:-1]),
+ 'varchar': False}
+ elif t.startswith('datetime'):
+ return Col.DateTimeCol, {}
+ else:
+ return Col.Col, {}
########################################
Index: SQLObject.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/SQLObject.py,v
retrieving revision 1.50
retrieving revision 1.50.2.1
diff -C2 -d -r1.50 -r1.50.2.1
*** SQLObject.py 1 Aug 2003 01:19:34 -0000 1.50
--- SQLObject.py 19 Aug 2003 12:53:10 -0000 1.50.2.1
***************
*** 801,804 ****
--- 801,805 ----
# Then we finalize the process:
+ #import pdb; pdb.set_trace()
inst._SO_finishCreate()
return inst
|