Update of /cvsroot/sqlobject/SQLObject/SQLObject
In directory sc8-pr-cvs1:/tmp/cvs-serv6652/SQLObject
Modified Files:
Col.py Converters.py DBConnection.py SQLBuilder.py
Log Message:
* Renamed sqlRepr() function to sqlrepr(), and sqlRepr magic method to
__sqlrepr. Added db argument to both.
* Made string and boolean quoting database-sensitive.
* Added TRUE and FALSE objects, which are distinct from 1 and 0 even on
Python versions without bool types. (True and False are used if they
are distinctive)
Index: Col.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/Col.py,v
retrieving revision 1.30
retrieving revision 1.31
diff -C2 -d -r1.30 -r1.31
*** Col.py 6 Oct 2003 00:37:13 -0000 1.30
--- Col.py 11 Oct 2003 07:39:43 -0000 1.31
***************
*** 126,130 ****
if self._default is NoDefault:
return NoDefault
! elif hasattr(self._default, 'sqlRepr'):
return self._default
elif callable(self._default):
--- 126,130 ----
if self._default is NoDefault:
return NoDefault
! elif hasattr(self._default, '__sqlrepr__'):
return self._default
elif callable(self._default):
***************
*** 276,282 ****
def fromPython(self, value, state):
if value:
! return 't'
else:
! return 'f'
class SOBoolCol(SOCol):
--- 276,282 ----
def fromPython(self, value, state):
if value:
! return SQLBuilder.TRUE
else:
! return SQLBuilder.FALSE
class SOBoolCol(SOCol):
***************
*** 363,371 ****
def _mysqlType(self):
! return "ENUM(%s)" % ', '.join(map(SQLBuilder.sqlRepr, self.enumValues))
def _postgresType(self):
length = max(map(len, self.enumValues))
! enumValues = ', '.join(map(SQLBuilder.sqlRepr, self.enumValues))
checkConstraint = "CHECK (%s in (%s))" % (self.dbName, enumValues)
return "VARCHAR(%i) %s" % (length, checkConstraint)
--- 363,371 ----
def _mysqlType(self):
! return "ENUM(%s)" % ', '.join([SQLBuilder.sqlrepr(v, 'mysql') for v in self.enumValues])
def _postgresType(self):
length = max(map(len, self.enumValues))
! enumValues = ', '.join([SQLBuilder.sqlrepr(v, 'postgres') for v in self.enumValues])
checkConstraint = "CHECK (%s in (%s))" % (self.dbName, enumValues)
return "VARCHAR(%i) %s" % (length, checkConstraint)
Index: Converters.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/Converters.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** Converters.py 26 Sep 2003 07:12:59 -0000 1.6
--- Converters.py 11 Oct 2003 07:39:43 -0000 1.7
***************
*** 17,21 ****
datetime = None
! True, False = (1==1), (0==1)
from types import InstanceType, ClassType, TypeType
--- 17,36 ----
datetime = None
! if type(1==1) == type(1):
! class BOOL:
! def __init__(self, value):
! self.value = not not value
! def __nonzero__(self):
! return self.value
! def __repr__(self):
! if self:
! return 'TRUE'
! else:
! return 'FALSE'
! TRUE = BOOL(1)
! FALSE = BOOL(0)
! else:
! TRUE = 1==1
! FALSE = 0==1
from types import InstanceType, ClassType, TypeType
***************
*** 36,40 ****
def isoStr(val):
! """Gets rid of time zone information"""
val = origISOStr(val)
if val.find('+') == -1:
--- 51,58 ----
def isoStr(val):
! """
! Gets rid of time zone information
! (@@: should we convert to GMT?)
! """
val = origISOStr(val)
if val.find('+') == -1:
***************
*** 65,71 ****
lookupConverter = converters.lookupConverter
! def StringLikeConverter(value):
! for orig, repl in sqlStringReplace:
! value = value.replace(orig, repl)
return "'%s'" % value
--- 83,94 ----
lookupConverter = converters.lookupConverter
! def StringLikeConverter(value, db):
! if db in ('mysql', 'postgres'):
! for orig, repl in sqlStringReplace:
! value = value.replace(orig, repl)
! elif db in ('sqlite', 'firebird'):
! value = value.replace("'", "''")
! else:
! assert 0, "Database %s unknown" % db
return "'%s'" % value
***************
*** 73,77 ****
registerConverter(type(u""), StringLikeConverter)
! def IntConverter(value):
return repr(int(value))
--- 96,100 ----
registerConverter(type(u""), StringLikeConverter)
! def IntConverter(value, db):
return repr(int(value))
***************
*** 79,92 ****
registerConverter(type(0L), IntConverter)
! def BoolConverter(value):
! if value:
! return '1'
else:
! return '0'
! if type(True) != type(1):
! registerConverter(type(True), BoolConverter)
! def FloatConverter(value):
return repr(value)
--- 102,120 ----
registerConverter(type(0L), IntConverter)
! def BoolConverter(value, db):
! if db in ('postgres'):
! if value:
! return "'t'"
! else:
! return "'f'"
else:
! if value:
! return '1'
! else:
! return '0'
! registerConverter(type(TRUE), BoolConverter)
! def FloatConverter(value, db):
return repr(value)
***************
*** 94,109 ****
if DateTimeType:
! def DateTimeConverter(value):
return "'%s'" % isoStr(value)
registerConverter(DateTimeType, DateTimeConverter)
! def NoneConverter(value):
return "NULL"
registerConverter(type(None), NoneConverter)
! def SequenceConverter(value):
! return "(%s)" % ", ".join(map(sqlRepr, value))
registerConverter(type(()), SequenceConverter)
--- 122,137 ----
if DateTimeType:
! def DateTimeConverter(value, db):
return "'%s'" % isoStr(value)
registerConverter(DateTimeType, DateTimeConverter)
! def NoneConverter(value, db):
return "NULL"
registerConverter(type(None), NoneConverter)
! def SequenceConverter(value, db):
! return "(%s)" % ", ".join([sqlrepr(v, db) for v in value])
registerConverter(type(()), SequenceConverter)
***************
*** 111,115 ****
if hasattr(time, 'struct_time'):
! def StructTimeConverter(value):
return time.strftime("'%Y-%m-%d %H:%M:%S'", value)
--- 139,143 ----
if hasattr(time, 'struct_time'):
! def StructTimeConverter(value, db):
return time.strftime("'%Y-%m-%d %H:%M:%S'", value)
***************
*** 117,138 ****
if datetime:
! def DateTimeConverter(value):
return value.strftime("'%Y-%m-%d %H:%M:%s'")
registerConverter(datetime.datetime, DateTimeConverter)
! def TimeConverter(value):
return value.strftime("'%H:%M:%s'")
registerConverter(datetime.time, TimeConverter)
! def DateConverter(value):
return value.strftime("'%Y-%m-%d'")
registerConverter(datetime.date, DateConverter)
! def sqlRepr(obj):
try:
! reprFunc = obj.sqlRepr
except AttributeError:
converter = lookupConverter(obj)
--- 145,166 ----
if datetime:
! def DateTimeConverter(value, db):
return value.strftime("'%Y-%m-%d %H:%M:%s'")
registerConverter(datetime.datetime, DateTimeConverter)
! def TimeConverter(value, db):
return value.strftime("'%H:%M:%s'")
registerConverter(datetime.time, TimeConverter)
! def DateConverter(value, db):
return value.strftime("'%Y-%m-%d'")
registerConverter(datetime.date, DateConverter)
! def sqlrepr(obj, db=None):
try:
! reprFunc = obj.__sqlrepr__
except AttributeError:
converter = lookupConverter(obj)
***************
*** 140,145 ****
raise ValueError, "Unknown SQL builtin type: %s for %s" % \
(type(obj), repr(obj))
! return converter(obj)
else:
! return reprFunc()
--- 168,173 ----
raise ValueError, "Unknown SQL builtin type: %s for %s" % \
(type(obj), repr(obj))
! return converter(obj, db)
else:
! return reprFunc(db)
Index: DBConnection.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/DBConnection.py,v
retrieving revision 1.52
retrieving revision 1.53
diff -C2 -d -r1.52 -r1.53
*** DBConnection.py 1 Oct 2003 01:53:48 -0000 1.52
--- DBConnection.py 11 Oct 2003 07:39:43 -0000 1.53
***************
*** 13,16 ****
--- 13,17 ----
import Col
from Join import sorter
+ from Converters import sqlrepr
# We set these up as globals, which will be set if we end up
***************
*** 60,63 ****
--- 61,66 ----
"""
+ dbName = None
+
def __init__(self, **kw):
self._pool = []
***************
*** 149,153 ****
return ("INSERT INTO %s (%s) VALUES (%s)" %
(table, ', '.join(names),
! ', '.join(map(SQLBuilder.sqlRepr, values))))
def transaction(self):
--- 152,156 ----
return ("INSERT INTO %s (%s) VALUES (%s)" %
(table, ', '.join(names),
! ', '.join([self.sqlrepr(v) for v in values])))
def transaction(self):
***************
*** 215,219 ****
if desc:
lst = [SQLBuilder.DESC(i) for i in lst]
! return ', '.join([SQLBuilder.sqlRepr(i) for i in lst])
def clauseQuote(s):
--- 218,222 ----
if desc:
lst = [SQLBuilder.DESC(i) for i in lst]
! return ', '.join([self.sqlrepr(i) for i in lst])
def clauseQuote(s):
***************
*** 295,302 ****
self.query("UPDATE %s SET %s WHERE %s = %s" %
(so._table,
! ", ".join(["%s = %s" % (dbName, SQLBuilder.sqlRepr(value))
for dbName, value in values]),
so._idName,
! SQLBuilder.sqlRepr(so.id)))
def _SO_selectOne(self, so, columnNames):
--- 298,305 ----
self.query("UPDATE %s SET %s WHERE %s = %s" %
(so._table,
! ", ".join(["%s = %s" % (dbName, self.sqlrepr(value))
for dbName, value in values]),
so._idName,
! self.sqlrepr(so.id)))
def _SO_selectOne(self, so, columnNames):
***************
*** 305,309 ****
so._table,
so._idName,
! SQLBuilder.sqlRepr(so.id)))
def _SO_selectOneAlt(self, cls, columnNames, column, value):
--- 308,312 ----
so._table,
so._idName,
! self.sqlrepr(so.id)))
def _SO_selectOneAlt(self, cls, columnNames, column, value):
***************
*** 312,316 ****
cls._table,
column,
! SQLBuilder.sqlRepr(value)))
def _SO_delete(self, so):
--- 315,319 ----
cls._table,
column,
! self.sqlrepr(value)))
def _SO_delete(self, so):
***************
*** 318,322 ****
(so._table,
so._idName,
! SQLBuilder.sqlRepr(so.id)))
def _SO_selectJoin(self, soClass, column, value):
--- 321,325 ----
(so._table,
so._idName,
! self.sqlrepr(so.id)))
def _SO_selectJoin(self, soClass, column, value):
***************
*** 325,329 ****
soClass._table,
column,
! SQLBuilder.sqlRepr(value)))
def _SO_intermediateJoin(self, table, getColumn, joinColumn, value):
--- 328,332 ----
soClass._table,
column,
! self.sqlrepr(value)))
def _SO_intermediateJoin(self, table, getColumn, joinColumn, value):
***************
*** 332,336 ****
table,
joinColumn,
! SQLBuilder.sqlRepr(value)))
def _SO_intermediateDelete(self, table, firstColumn, firstValue,
--- 335,339 ----
table,
joinColumn,
! self.sqlrepr(value)))
def _SO_intermediateDelete(self, table, firstColumn, firstValue,
***************
*** 339,345 ****
(table,
firstColumn,
! SQLBuilder.sqlRepr(firstValue),
secondColumn,
! SQLBuilder.sqlRepr(secondValue)))
def _SO_intermediateInsert(self, table, firstColumn, firstValue,
--- 342,348 ----
(table,
firstColumn,
! self.sqlrepr(firstValue),
secondColumn,
! self.sqlrepr(secondValue)))
def _SO_intermediateInsert(self, table, firstColumn, firstValue,
***************
*** 349,362 ****
firstColumn,
secondColumn,
! SQLBuilder.sqlRepr(firstValue),
! SQLBuilder.sqlRepr(secondValue)))
def _SO_columnClause(self, soClass, kw):
return ' '.join(['%s = %s' %
(soClass._SO_columnDict[key].dbName,
! SQLBuilder.sqlRepr(value))
for key, value
in kw.items()])
class Transaction(object):
--- 352,368 ----
firstColumn,
secondColumn,
! self.sqlrepr(firstValue),
! self.sqlrepr(secondValue)))
def _SO_columnClause(self, soClass, kw):
return ' '.join(['%s = %s' %
(soClass._SO_columnDict[key].dbName,
! self.sqlrepr(value))
for key, value
in kw.items()])
+ def sqlrepr(self, v):
+ return sqlrepr(v, self.dbName)
+
class Transaction(object):
***************
*** 428,431 ****
--- 434,438 ----
supportTransactions = False
+ dbName = 'mysql'
def __init__(self, db, user, passwd='', host='localhost', **kw):
***************
*** 525,528 ****
--- 532,536 ----
supportTransactions = True
+ dbName = 'postgres'
def __init__(self, dsn=None, host=None, db=None,
***************
*** 678,681 ****
--- 686,690 ----
supportTransactions = True
+ dbName = 'sqlite'
def __init__(self, filename, autoCommit=1, **kw):
***************
*** 742,745 ****
--- 751,755 ----
supportTransactions = False
+ dbName = 'firebird'
def __init__(self, host, db, user='sysdba',
***************
*** 1013,1016 ****
--- 1023,1027 ----
supportTransactions = False
+ dbName = 'dbm'
def __init__(self, path, **kw):
Index: SQLBuilder.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/SQLBuilder.py,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** SQLBuilder.py 1 Aug 2003 01:29:46 -0000 1.11
--- SQLBuilder.py 11 Oct 2003 07:39:43 -0000 1.12
***************
*** 43,47 ****
formed with it will produce SQL statements.
! The ``sqlRepr(obj)`` function gets the SQL representation of these
objects, as well as the proper SQL representation of basic Python
types (None==NULL).
--- 43,47 ----
formed with it will produce SQL statements.
! The ``sqlrepr(obj)`` function gets the SQL representation of these
objects, as well as the proper SQL representation of basic Python
types (None==NULL).
***************
*** 70,74 ****
import re, fnmatch
import operator
! from Converters import sqlRepr, registerConverter
safeSQLRE = re.compile(r'^[a-zA-Z][a-zA-Z0-9_\.]*$')
--- 70,74 ----
import re, fnmatch
import operator
! from Converters import sqlrepr, registerConverter, TRUE, FALSE
safeSQLRE = re.compile(r'^[a-zA-Z][a-zA-Z0-9_\.]*$')
***************
*** 153,159 ****
def __repr__(self):
! return self.sqlRepr()
def __str__(self):
! return self.sqlRepr()
def __cmp__(self, other):
--- 153,159 ----
def __repr__(self):
! return self.__sqlrepr__(None)
def __str__(self):
! return self.__sqlrepr__(None)
def __cmp__(self, other):
***************
*** 166,169 ****
--- 166,171 ----
def endswith(self, s):
return ENDSWITH(self, s)
+ def contains(self, s):
+ return CONTAINSSTRING(self, s)
def components(self):
***************
*** 187,191 ****
def SQLExprConverter(value):
! return value.sqlRepr()
registerConverter(SQLExpression, SQLExprConverter)
--- 189,193 ----
def SQLExprConverter(value):
! return value.__sqlrepr__()
registerConverter(SQLExpression, SQLExprConverter)
***************
*** 216,221 ****
self.expr1 = expr1
self.expr2 = expr2
! def sqlRepr(self):
! return "(%s %s %s)" % (sqlRepr(self.expr1), self.op, sqlRepr(self.expr2))
def components(self):
return [self.expr1, self.expr2]
--- 218,223 ----
self.expr1 = expr1
self.expr2 = expr2
! def __sqlrepr__(self, db):
! return "(%s %s %s)" % (sqlrepr(self.expr1, db), self.op, sqlrepr(self.expr2, db))
def components(self):
return [self.expr1, self.expr2]
***************
*** 248,253 ****
self.expr = expr
self.args = args
! def sqlRepr(self):
! return "%s%s" % (sqlRepr(self.expr), sqlRepr(self.args))
def components(self):
return [self.expr] + list(self.args)
--- 250,255 ----
self.expr = expr
self.args = args
! def __sqlrepr__(self, db):
! return "%s%s" % (sqlrepr(self.expr, db), sqlrepr(self.args, db))
def components(self):
return [self.expr] + list(self.args)
***************
*** 261,266 ****
self.prefix = prefix
self.expr = expr
! def sqlRepr(self):
! return "%s %s" % (self.prefix, sqlRepr(self.expr))
def components(self):
return [self.expr]
--- 263,268 ----
self.prefix = prefix
self.expr = expr
! def __sqlrepr__(self, db):
! return "%s %s" % (self.prefix, sqlrepr(self.expr, db))
def components(self):
return [self.expr]
***************
*** 279,283 ****
def __init__(self, const):
self.const = const
! def sqlRepr(self):
return self.const
def execute(self, executor):
--- 281,285 ----
def __init__(self, const):
self.const = const
! def __sqlrepr__(self, db):
return self.const
def execute(self, executor):
***************
*** 287,291 ****
class SQLTrueClauseClass(SQLExpression):
! def sqlRepr(self):
return "1 = 1"
def execute(self, executor):
--- 289,293 ----
class SQLTrueClauseClass(SQLExpression):
! def __sqlrepr__(self, db):
return "1 = 1"
def execute(self, executor):
***************
*** 313,317 ****
raise AttributeError
return Field(self.tableName, attr)
! def sqlRepr(self):
return str(self.tableName)
def execute(self, executor):
--- 315,319 ----
raise AttributeError
return Field(self.tableName, attr)
! def __sqlrepr__(self, db):
return str(self.tableName)
def execute(self, executor):
***************
*** 338,342 ****
self.tableName = tableName
self.fieldName = fieldName
! def sqlRepr(self):
return self.tableName + "." + self.fieldName
def tablesUsedImmediate(self):
--- 340,344 ----
self.tableName = tableName
self.fieldName = fieldName
! def __sqlrepr__(self, db):
return self.tableName + "." + self.fieldName
def tablesUsedImmediate(self):
***************
*** 375,380 ****
self.limit = limit
! def sqlRepr(self):
! select = "SELECT %s" % ", ".join(map(sqlRepr, self.items))
tables = {}
--- 377,382 ----
self.limit = limit
! def __sqlrepr__(self, db):
! select = "SELECT %s" % ", ".join([sqlrepr(v, db) for v in self.items])
tables = {}
***************
*** 390,402 ****
if self.whereClause is not NoDefault:
! select += " WHERE %s" % sqlRepr(self.whereClause)
if self.groupBy is not NoDefault:
! select += " GROUP BY %s" % sqlRepr(self.groupBy)
if self.having is not NoDefault:
! select += " HAVING %s" % sqlRepr(self.having)
if self.orderBy is not NoDefault:
! select += " ORDER BY %s" % sqlRepr(self.orderBy)
if self.limit is not NoDefault:
! select += " LIMIT %s" % sqlRepr(self.limit)
return select
--- 392,404 ----
if self.whereClause is not NoDefault:
! select += " WHERE %s" % sqlrepr(self.whereClause, db)
if self.groupBy is not NoDefault:
! select += " GROUP BY %s" % sqlrepr(self.groupBy, db)
if self.having is not NoDefault:
! select += " HAVING %s" % sqlrepr(self.having, db)
if self.orderBy is not NoDefault:
! select += " ORDER BY %s" % sqlrepr(self.orderBy, db)
if self.limit is not NoDefault:
! select += " LIMIT %s" % sqlrepr(self.limit, db)
return select
***************
*** 413,417 ****
else:
self.valueList = [values]
! def sqlRepr(self):
if not self.valueList:
return ''
--- 415,419 ----
else:
self.valueList = [values]
! def __sqlrepr__(self, db):
if not self.valueList:
return ''
***************
*** 437,441 ****
elif not allowNonDict:
raise TypeError, "You can't mix non-dictionaries with dictionaries in an INSERT if you don't provide a template (%s)" % repr(value)
! insert += "(%s)" % ", ".join(map(sqlRepr, value))
return insert
--- 439,443 ----
elif not allowNonDict:
raise TypeError, "You can't mix non-dictionaries with dictionaries in an INSERT if you don't provide a template (%s)" % repr(value)
! insert += "(%s)" % ", ".join([sqlrepr(v, db) for v in value])
return insert
***************
*** 456,460 ****
self.template = template
self.whereClause = where
! def sqlRepr(self):
update = "%s %s" % (self.sqlName(), self.table)
update += " SET"
--- 458,462 ----
self.template = template
self.whereClause = where
! def __sqlrepr__(self, db):
update = "%s %s" % (self.sqlName(), self.table)
update += " SET"
***************
*** 466,470 ****
else:
update += ","
! update += " %s=%s" % (self.template[i], sqlRepr(self.values[i]))
else:
for key, value in self.values.items():
--- 468,472 ----
else:
update += ","
! update += " %s=%s" % (self.template[i], sqlrepr(self.values[i], db))
else:
for key, value in self.values.items():
***************
*** 473,477 ****
else:
update += ","
! update += " %s=%s" % (key, sqlRepr(value))
if self.whereClause is not NoDefault:
update += " WHERE %s" % repr(self.whereClause)
--- 475,479 ----
else:
update += ","
! update += " %s=%s" % (key, sqlrepr(value, db))
if self.whereClause is not NoDefault:
update += " WHERE %s" % repr(self.whereClause)
***************
*** 490,498 ****
raise TypeError, "You must give a where clause or pass in None to indicate no where clause"
self.whereClause = where
! def sqlRepr(self):
if self.whereClause is None:
return "DELETE FROM %s" % self.table
return "DELETE FROM %s WHERE %s" \
! % (self.table, sqlRepr(self.whereClause))
registerConverter(Delete, SQLExprConverter)
--- 492,500 ----
raise TypeError, "You must give a where clause or pass in None to indicate no where clause"
self.whereClause = where
! def __sqlrepr__(self, db):
if self.whereClause is None:
return "DELETE FROM %s" % self.table
return "DELETE FROM %s WHERE %s" \
! % (self.table, sqlrepr(self.whereClause, db))
registerConverter(Delete, SQLExprConverter)
***************
*** 513,520 ****
self.expr = expr
! def sqlRepr(self):
if isinstance(self.expr, DESC):
! return sqlRepr(self.expr.expr)
! return '%s DESC' % sqlRepr(self.expr)
def AND(*ops):
--- 515,522 ----
self.expr = expr
! def __sqlrepr__(self, db):
if isinstance(self.expr, DESC):
! return sqlrepr(self.expr.expr, db)
! return '%s DESC' % sqlrepr(self.expr, db)
def AND(*ops):
|