Thread: [SQL-CVS] r135 - trunk/SQLObject
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: <sub...@co...> - 2004-06-14 12:01:53
|
Author: ahmedmo Date: 2004-06-14 03:59:20 -0400 (Mon, 14 Jun 2004) New Revision: 135 Added: trunk/SQLObject/converters.py Log: Added: trunk/SQLObject/converters.py =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- trunk/SQLObject/converters.py 2004-06-14 07:58:45 UTC (rev 134) +++ trunk/SQLObject/converters.py 2004-06-14 07:59:20 UTC (rev 135) @@ -0,0 +1,183 @@ +try: + import mx.DateTime.ISO + origISOStr =3D mx.DateTime.ISO.strGMT + from mx.DateTime import DateTimeType +except ImportError: + try: + import DateTime.ISO + origISOStr =3D DateTime.ISO.strGMT + from DateTime import DateTimeType + except ImportError: + origISOStr =3D None + DateTimeType =3D None +import time +try: + import datetime +except ImportError: + datetime =3D None + +try: + import Sybase + NumericType=3DSybase.NumericType +except ImportError: + NumericType =3D None=20 + +if type(1=3D=3D1) =3D=3D type(1): + class BOOL(object): + def __init__(self, value): + self.value =3D not not value + def __nonzero__(self): + return self.value + def __repr__(self): + if self: + return 'TRUE' + else: + return 'FALSE' + TRUE =3D BOOL(1) + FALSE =3D BOOL(0) +else: + TRUE =3D 1=3D=3D1 + FALSE =3D 0=3D=3D1 + +from types import InstanceType, ClassType, TypeType + +######################################## +## Quoting +######################################## + +sqlStringReplace =3D [ + ('\\', '\\\\'), + ("'", "''"), + ('\000', '\\0'), + ('\b', '\\b'), + ('\n', '\\n'), + ('\r', '\\r'), + ('\t', '\\t'), + ] + +def isoStr(val): + """ + Gets rid of time zone information + (@@: should we convert to GMT?) + """ + val =3D origISOStr(val) + if val.find('+') =3D=3D -1: + return val + else: + return val[:val.find('+')] + +class ConverterRegistry: + + def __init__(self): + self.basic =3D {} + self.klass =3D {} + + def registerConverter(self, typ, func): + if type(typ) is ClassType: + self.klass[typ] =3D func + else: + self.basic[typ] =3D func + + def lookupConverter(self, value, default=3DNone): + if type(value) =3D=3D InstanceType: + # lookup on klasses dict + return self.klass.get(value.__class__, default) + return self.basic.get(type(value), default) + +converters =3D ConverterRegistry() +registerConverter =3D converters.registerConverter +lookupConverter =3D converters.lookupConverter + +def StringLikeConverter(value, db): + if db in ('mysql', 'postgres', 'sybase'): + for orig, repl in sqlStringReplace: + value =3D value.replace(orig, repl) + elif db in ('sqlite', 'firebird','maxdb'): + value =3D value.replace("'", "''") + else: + assert 0, "Database %s unknown" % db + return "'%s'" % value + +registerConverter(type(""), StringLikeConverter) +registerConverter(type(u""), StringLikeConverter) + +def IntConverter(value, db): + return repr(int(value)) + +registerConverter(type(1), IntConverter) +registerConverter(type(0L), IntConverter) + +if NumericType: + registerConverter(NumericType, 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) + +registerConverter(type(1.0), FloatConverter) + +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) +registerConverter(type([]), SequenceConverter) + +if hasattr(time, 'struct_time'): + def StructTimeConverter(value, db): + return time.strftime("'%Y-%m-%d %H:%M:%S'", value) + + registerConverter(time.struct_time, StructTimeConverter) + +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=3DNone): + try: + reprFunc =3D obj.__sqlrepr__ + except AttributeError: + converter =3D lookupConverter(obj) + if converter is None: + raise ValueError, "Unknown SQL builtin type: %s for %s" % \ + (type(obj), repr(obj)) + return converter(obj, db) + else: + return reprFunc(db) + + |