Update of /cvsroot/sqlobject/SQLObject/SQLObject
In directory sc8-pr-cvs1:/tmp/cvs-serv18491/SQLObject
Modified Files:
DBConnection.py SQLBuilder.py SQLObject.py
Added Files:
Converters.py
Log Message:
Refactored sqlRepr function into a separate module and added some tests. Also, some whitespace cleaning as I go visiting files.
--- NEW FILE: Converters.py ---
try:
import mx.DateTime.ISO
origISOStr = mx.DateTime.ISO.strGMT
from mx.DateTime import DateTimeType
except ImportError:
try:
import DateTime.ISO
origISOStr = DateTime.ISO.strGMT
from DateTime import DateTimeType
except ImportError:
origISOStr = None
DateTimeType = None
from types import InstanceType, ClassType, TypeType
########################################
## Quoting
########################################
sqlStringReplace = [
('\\', '\\\\'),
('\'', '\\\''),
('\000', '\\0'),
('\b', '\\b'),
('\n', '\\n'),
('\r', '\\r'),
('\t', '\\t'),
]
def isoStr(val):
"""Gets rid of time zone information"""
val = origISOStr(val)
if val.find('+') == -1:
return val
else:
return val[:val.find('+')]
class ConverterRegistry:
def __init__(self):
self.basic = {}
self.klass = {}
def registerConverter(self, typ, func):
if type(typ) is ClassType:
self.klass[typ] = func
else:
self.basic[typ] = func
def lookupConverter(self, value, default=None):
if type(value) == InstanceType:
# lookup on klasses dict
return self.klass.get(value.__class__, default)
return self.basic.get(type(value), default)
converters = ConverterRegistry()
registerConverter = converters.registerConverter
lookupConverter = converters.lookupConverter
def StringLikeConverter(value):
for orig, repl in sqlStringReplace:
value = value.replace(orig, repl)
return "'%s'" % value
registerConverter(type(""), StringLikeConverter)
registerConverter(type(u""), StringLikeConverter)
def IntConverter(value):
return repr(int(value))
registerConverter(type(1), IntConverter)
registerConverter(type(0L), IntConverter)
def FloatConverter(value):
return repr(value)
registerConverter(type(1.0), FloatConverter)
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)
registerConverter(type([]), SequenceConverter)
def sqlRepr(obj):
converter = lookupConverter(obj)
if converter is None:
raise ValueError, "Unknown SQL builtin type: %s for %s" % \
(type(obj), repr(obj))
return converter(obj)
Index: DBConnection.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/DBConnection.py,v
retrieving revision 1.40
retrieving revision 1.41
diff -C2 -d -r1.40 -r1.41
*** DBConnection.py 15 Jul 2003 02:27:19 -0000 1.40
--- DBConnection.py 18 Jul 2003 03:15:50 -0000 1.41
***************
*** 471,475 ****
% (idName, table, c.lastoid()))
return c.fetchone()[0]
!
def _queryAddLimitOffset(self, query, start, end):
if not start:
--- 471,475 ----
% (idName, table, c.lastoid()))
return c.fetchone()[0]
!
def _queryAddLimitOffset(self, query, start, end):
if not start:
***************
*** 481,485 ****
def createColumn(self, soClass, col):
return col.postgresCreateSQL()
!
def createIDColumn(self, soClass):
return '%s SERIAL PRIMARY KEY' % soClass._idName
--- 481,485 ----
def createColumn(self, soClass, col):
return col.postgresCreateSQL()
!
def createIDColumn(self, soClass):
return '%s SERIAL PRIMARY KEY' % soClass._idName
***************
*** 505,509 ****
def columnsFromSchema(self, tableName, soClass):
!
keyQuery = """
SELECT pg_catalog.pg_get_constraintdef(oid) as condef
--- 505,509 ----
def columnsFromSchema(self, tableName, soClass):
!
keyQuery = """
SELECT pg_catalog.pg_get_constraintdef(oid) as condef
***************
*** 568,572 ****
# Pooling doesn't work with transactions...
kw['pool'] = 0
! # use only one connection for sqlite - supports multiple
# cursors per connection
self._conn = sqlite.connect(self.filename)
--- 568,572 ----
# Pooling doesn't work with transactions...
kw['pool'] = 0
! # use only one connection for sqlite - supports multiple
# cursors per connection
self._conn = sqlite.connect(self.filename)
***************
*** 627,631 ****
* ``_SO_createJoinTable(join)``
"""
!
def queryInsertID(self, table, idName, names, values):
id = self._newID(table)
--- 627,631 ----
* ``_SO_createJoinTable(join)``
"""
!
def queryInsertID(self, table, idName, names, values):
id = self._newID(table)
***************
*** 819,823 ****
else:
db[join2 + str(id2)] = str(id1)
!
def _SO_intermediateDelete(self, table, join1, id1, join2, id2):
db = self._openTable(table)
--- 819,823 ----
else:
db[join2 + str(id2)] = str(id1)
!
def _SO_intermediateDelete(self, table, join1, id1, join2, id2):
db = self._openTable(table)
***************
*** 877,881 ****
except IndexError:
raise StopIteration
!
for idList in self.comboIter:
self.idList = idList
--- 877,881 ----
except IndexError:
raise StopIteration
!
for idList in self.comboIter:
self.idList = idList
***************
*** 897,901 ****
except StopIteration:
return results
!
def _iterAllCombinations(l):
--- 897,901 ----
except StopIteration:
return results
!
def _iterAllCombinations(l):
Index: SQLBuilder.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/SQLBuilder.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** SQLBuilder.py 5 Jul 2003 03:49:52 -0000 1.7
--- SQLBuilder.py 18 Jul 2003 03:15:50 -0000 1.8
***************
*** 68,129 ****
True, False = (1==1), (0==1)
- ########################################
- ## Quoting
- ########################################
-
- sqlStringReplace = [
- ('\\', '\\\\'),
- ('\'', '\\\''),
- ('\000', '\\0'),
- ('\b', '\\b'),
- ('\n', '\\n'),
- ('\r', '\\r'),
- ('\t', '\\t'),
- ]
-
- try:
- import mx.DateTime.ISO
- origISOStr = mx.DateTime.ISO.strGMT
- from mx.DateTime import DateTimeType
- except ImportError:
- try:
- import DateTime.ISO
- origISOStr = DateTime.ISO.strGMT
- from DateTime import DateTimeType
- except ImportError:
- origISOStr = None
- DateTimeType = None
import re, fnmatch
import operator
!
! def isoStr(val):
! """Gets rid of time zone information"""
! val = origISOStr(val)
! if val.find('+') == -1:
! return val
! else:
! return val[:val.find('+')]
!
! def sqlRepr(obj):
! t = type(obj)
! if isinstance(obj, SQLExpression):
! return obj.sqlRepr()
! elif t is type("") or t is type(u""):
! for orig, repl in sqlStringReplace:
! obj = obj.replace(orig, repl)
! return "'%s'" % obj
! elif t is type(0L) or t is type(1):
! return repr(int(obj))
! elif t is type(1.0):
! return repr(obj)
! elif DateTimeType and t is DateTimeType:
! return "'%s'" % isoStr(obj)
! elif obj is None:
! return "NULL"
! elif t is type(()) or t is type([]):
! return "(%s)" % ", ".join(map(sqlRepr, obj))
! else:
! raise ValueError, "Unknown SQL builtin type: %s for %s" % \
! (t, repr(obj))
safeSQLRE = re.compile(r'^[a-zA-Z][a-zA-Z0-9_\.]*$')
--- 68,74 ----
True, False = (1==1), (0==1)
import re, fnmatch
import operator
! from Converters import sqlRepr, registerConverter
safeSQLRE = re.compile(r'^[a-zA-Z][a-zA-Z0-9_\.]*$')
***************
*** 237,240 ****
--- 182,194 ----
return []
+ #######################################
+ # Converter for SQLExpression instances
+ #######################################
+
+ def SQLExprConverter(value):
+ return value.sqlRepr()
+
+ registerConverter(SQLExpression, SQLExprConverter)
+
def tablesUsedDict(obj):
if hasattr(obj, "tablesUsedDict"):
***************
*** 414,418 ****
if tables:
select += " FROM %s" % ", ".join(tables)
!
if self.whereClause is not NoDefault:
select += " WHERE %s" % sqlRepr(self.whereClause)
--- 368,372 ----
if tables:
select += " FROM %s" % ", ".join(tables)
!
if self.whereClause is not NoDefault:
select += " WHERE %s" % sqlRepr(self.whereClause)
Index: SQLObject.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/SQLObject.py,v
retrieving revision 1.48
retrieving revision 1.49
diff -C2 -d -r1.48 -r1.49
*** SQLObject.py 17 Jul 2003 01:23:57 -0000 1.48
--- SQLObject.py 18 Jul 2003 03:15:50 -0000 1.49
***************
*** 76,80 ****
newNeedList.append((needClass, setCls))
needSet[registryName] = newNeedList
!
def setNeedSet():
global needSet
--- 76,80 ----
newNeedList.append((needClass, setCls))
needSet[registryName] = newNeedList
!
def setNeedSet():
global needSet
***************
*** 117,121 ****
def __new__(cls, className, bases, d):
!
global classRegistry, needSet
--- 117,121 ----
def __new__(cls, className, bases, d):
!
global classRegistry, needSet
***************
*** 496,500 ****
setattr(cls, setterName(name)[:-2], setter)
cls._SO_plainForeignSetters[name[:-2]] = 1
!
# We'll need to put in a real reference at
# some point. See needSet at the top of the
--- 496,500 ----
setattr(cls, setterName(name)[:-2], setter)
cls._SO_plainForeignSetters[name[:-2]] = 1
!
# We'll need to put in a real reference at
# some point. See needSet at the top of the
***************
*** 570,574 ****
meth = join.joinMethodName
cls._SO_joinDict[joinDef] = join
!
cls._SO_joinList.append(join)
index = len(cls._SO_joinList)-1
--- 570,574 ----
meth = join.joinMethodName
cls._SO_joinDict[joinDef] = join
!
cls._SO_joinList.append(join)
index = len(cls._SO_joinList)-1
***************
*** 664,669 ****
raise SQLObjectNotFound, "The object %s by the ID %s does not exist" % (self.__class__.__name__, self.id)
self._SO_selectInit(selectResults)
!
!
def _SO_setValue(self, name, value):
# This is the place where we actually update the
--- 664,669 ----
raise SQLObjectNotFound, "The object %s by the ID %s does not exist" % (self.__class__.__name__, self.id)
self._SO_selectInit(selectResults)
!
!
def _SO_setValue(self, name, value):
# This is the place where we actually update the
***************
*** 681,688 ****
[(self._SO_columnDict[name].dbName,
value)])
!
if self._cacheValues:
setattr(self, instanceName(name), value)
!
def set(self, **kw):
# set() is used to update multiple values at once,
--- 681,688 ----
[(self._SO_columnDict[name].dbName,
value)])
!
if self._cacheValues:
setattr(self, instanceName(name), value)
!
def set(self, **kw):
# set() is used to update multiple values at once,
***************
*** 693,697 ****
self._SO_createValues.update(kw)
return
!
self._SO_writeLock.acquire()
--- 693,697 ----
self._SO_createValues.update(kw)
return
!
self._SO_writeLock.acquire()
***************
*** 730,734 ****
assert results != None, "%s with id %s is not in the database" \
% (self.__class__.__name__, self.id)
! return results[0]
def _SO_foreignKey(self, id, joinClass):
--- 730,734 ----
assert results != None, "%s with id %s is not in the database" \
% (self.__class__.__name__, self.id)
! return results[0]
def _SO_foreignKey(self, id, joinClass):
***************
*** 756,760 ****
# passed:
for column in inst._SO_columns:
!
# If a foreign key is given, we get the ID of the object
# and put that in instead
--- 756,760 ----
# passed:
for column in inst._SO_columns:
!
# If a foreign key is given, we get the ID of the object
# and put that in instead
***************
*** 813,817 ****
del self._SO_createValues
del self._SO_creating
!
# Do the insert -- most of the SQL in this case is left
# up to DBConnection, since getting a new ID is
--- 813,817 ----
del self._SO_createValues
del self._SO_creating
!
# Do the insert -- most of the SQL in this case is left
# up to DBConnection, since getting a new ID is
***************
*** 831,835 ****
[cls._idName] +
[col.dbName for col in cls._SO_columns],
! dbIDName,
value)
if not result:
--- 831,835 ----
[cls._idName] +
[col.dbName for col in cls._SO_columns],
! dbIDName,
value)
if not result:
***************
*** 915,919 ****
cls._connection.clearTable(cls._table)
clearTable = classmethod(clearTable)
!
def destroySelf(self):
# Kills this object. Kills it dead!
--- 915,919 ----
cls._connection.clearTable(cls._table)
clearTable = classmethod(clearTable)
!
def destroySelf(self):
# Kills this object. Kills it dead!
***************
*** 925,929 ****
obj = cls(id)
obj.destroySelf()
!
delete = classmethod(delete)
--- 925,929 ----
obj = cls(id)
obj.destroySelf()
!
delete = classmethod(delete)
***************
*** 958,962 ****
def instanceName(name):
return '_SO_val_%s' % name
!
class SelectResults(object):
--- 958,962 ----
def instanceName(name):
return '_SO_val_%s' % name
!
class SelectResults(object):
***************
*** 1088,1093 ****
count = min(self.ops['end'] - self.ops.get('start', 0), count)
return count
!
!
--- 1088,1093 ----
count = min(self.ops['end'] - self.ops.get('start', 0), count)
return count
!
!
|