|
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)
+
+
|