Thread: [SQL-CVS] SQLObject/SQLObject Col.py,1.30,1.31 Converters.py,1.6,1.7 DBConnection.py,1.52,1.53 SQLBu
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: <ian...@us...> - 2003-10-11 07:39:48
|
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): |