dabo Commit
Revision 1375
Date: 2005-09-22 16:44:38 -0700 (Thu, 22 Sep 2005)
Author: ed
Changed:
U trunk/dabo/biz/dBizobj.py
U trunk/dabo/db/dCursorMixin.py
Log:
Fixes a nasty bug that was failing to populate the PKs of newly added records
correctly in the local cursor copy.
Also property-ized AuxCursor and BackendObject in the cursor mixin class.
Diff:
Modified: trunk/dabo/biz/dBizobj.py
===================================================================
--- trunk/dabo/biz/dBizobj.py 2005-09-22 14:33:36 UTC (rev 1374)
+++ trunk/dabo/biz/dBizobj.py 2005-09-22 23:44:38 UTC (rev 1375)
@@ -162,7 +162,7 @@
crs.KeyField = self.KeyField
crs.Table = self.DataSource
crs.AutoPopulatePK = self.AutoPopulatePK
- crs.setBackendObject(cn.getBackendObject())
+ crs.BackendObject = cn.getBackendObject()
crs.sqlManager = self.SqlManager
crs.setSQL(self.SQL)
if self.RequeryOnLoad:
@@ -1414,7 +1414,7 @@
crs.KeyField = self.KeyField
crs.Table = self.DataSource
crs.AutoPopulatePK = self.AutoPopulatePK
- crs.setBackendObject(cn.getBackendObject())
+ crs.BackendObject = cn.getBackendObject()
return self._sqlMgrCursor
def _getUserSQL(self):
Modified: trunk/dabo/db/dCursorMixin.py
===================================================================
--- trunk/dabo/db/dCursorMixin.py 2005-09-22 14:33:36 UTC (rev 1374)
+++ trunk/dabo/db/dCursorMixin.py 2005-09-22 23:44:38 UTC (rev 1375)
@@ -101,7 +101,7 @@
def setSQL(self, sql):
pass
# This function isn't needed anymore
- #self.sql = self._getBackendObject().setSQL(sql)
+ #self.sql = self.BackendObject.setSQL(sql)
def clearSQL(self):
@@ -159,7 +159,7 @@
# Some backend programs do odd things to the description
# This allows each backend to handle these quirks individually.
- self._getBackendObject().massageDescription(self)
+ self.BackendObject.massageDescription(self)
if self.RowCount > 0:
self.RowNumber = max(0, self.RowNumber)
@@ -438,7 +438,7 @@
def __setNonUpdateFields(self):
"""Delegate this to the backend object."""
- self._getBackendObject().setNonUpdateFields(self)
+ self.BackendObject.setNonUpdateFields(self)
def isChanged(self, allRows=True):
@@ -791,12 +791,13 @@
self.setFieldVal(self.KeyField,
newPKVal)
#run the update
- res = self._getAuxCursor().execute(sql)
+ aux = self.AuxCursor
+ res = aux.execute(sql)
if newrec and self.AutoPopulatePK and (newPKVal is
None):
# Call the database backend-specific code to
retrieve the
# most recently generated PK value.
- newPKVal = self.getLastInsertID()
+ newPKVal = aux.getLastInsertID()
if newPKVal:
self.setFieldVal(self.KeyField,
newPKVal)
@@ -807,7 +808,7 @@
if not res:
# Different backends may cause res to
be None
# even if the save is successful.
-
self._getBackendObject().noResultsOnSave()
+ self.BackendObject.noResultsOnSave()
rec[k.CURSOR_MEMENTO].setMemento(rec)
@@ -818,7 +819,7 @@
retrieve a new PK if the backend supports this. We use the
auxiliary cursor so as not to alter the current data.
"""
- return self._getBackendObject().pregenPK(self._getAuxCursor())
+ return self.BackendObject.pregenPK(self.AuxCursor)
def makeUpdDiff(self, rec, isnew=False):
@@ -906,7 +907,7 @@
# some backends(PostgreSQL) don't return information
about number of deleted rows
# try to fetch it before
sql = "select count(*) as cnt from %s where %s" %
(self.Table, pkWhere)
- aux = self._getAuxCursor()
+ aux = self.AuxCursor
aux.execute(sql)
res = aux.getFieldVal('cnt')
if res:
@@ -916,7 +917,7 @@
if not res:
# Nothing was deleted
- self._getBackendObject().noResultsOnDelete()
+ self.BackendObject.noResultsOnDelete()
else:
# Delete the record from the current dataset
self.removeRow(delRowNum)
@@ -937,7 +938,7 @@
to disk even without starting a transaction. This is the method
to call to accomplish this.
"""
- self._getBackendObject().flush(self)
+ self.BackendObject.flush(self)
def setDefaults(self, vals):
@@ -983,7 +984,7 @@
"""Get the empty description from the backend object,
as different backends handle empty recordsets differently.
"""
- dscrp = self._getBackendObject().getStructureDescription(self)
+ dscrp = self.BackendObject.getStructureDescription(self)
for fld in dscrp:
fldname = fld[0]
try:
@@ -1148,7 +1149,7 @@
Optionally pass in a record object, otherwise use the current
record.
"""
- tblPrefix =
self._getBackendObject().getWhereTablePrefix(self.Table)
+ tblPrefix = self.BackendObject.getWhereTablePrefix(self.Table)
if not rec:
rec = self._records[self.RowNumber]
aFields = self.KeyField.split(",")
@@ -1175,7 +1176,7 @@
""" Create the 'set field=val' section of the Update statement.
"""
ret = ""
- tblPrefix =
self._getBackendObject().getUpdateTablePrefix(self.Table)
+ tblPrefix = self.BackendObject.getUpdateTablePrefix(self.Table)
for fld, val in diff.items():
# Skip the fields that are not to be updated.
@@ -1196,26 +1197,26 @@
def processFields(self, txt):
- return self._getBackendObject().processFields(txt)
+ return self.BackendObject.processFields(txt)
def escQuote(self, val):
""" Escape special characters in SQL strings. """
ret = val
if isinstance(val, basestring):
- ret = self._getBackendObject().escQuote(val)
+ ret = self.BackendObject.escQuote(val)
return ret
def getTables(self, includeSystemTables=False):
""" Return a tuple of tables in the current database.
"""
- return self._getBackendObject().getTables(includeSystemTables)
+ return self.BackendObject.getTables(includeSystemTables)
def getTableRecordCount(self, tableName):
""" Get the number of records in the backend table.
"""
- return self._getBackendObject().getTableRecordCount(tableName)
+ return self.BackendObject.getTableRecordCount(tableName)
def getFields(self, tableName=None):
""" Get field information about the backend table.
@@ -1228,47 +1229,46 @@
if tableName is None:
# Use the default
tableName = self.Table
- return self._getBackendObject().getFields(tableName)
+ return self.BackendObject.getFields(tableName)
def getLastInsertID(self):
""" Return the most recently generated PK """
ret = None
- if self._getBackendObject():
- # Should we pass 'self' or 'self._getAuxCursor()'?
- ret = self._getBackendObject().getLastInsertID(self)
+ if self.BackendObject:
+ ret = self.BackendObject.getLastInsertID(self)
return ret
def formatDateTime(self, val):
""" Format DateTime values for the backend """
ret = val
- if self._getBackendObject():
- ret = self._getBackendObject().formatDateTime(val)
+ if self.BackendObject:
+ ret = self.BackendObject.formatDateTime(val)
return ret
def beginTransaction(self):
""" Begin a SQL transaction."""
ret = None
- if self._getBackendObject():
- ret =
self._getBackendObject().beginTransaction(self._getAuxCursor())
+ if self.BackendObject:
+ ret =
self.BackendObject.beginTransaction(self.AuxCursor)
return ret
def commitTransaction(self):
""" Commit a SQL transaction."""
ret = None
- if self._getBackendObject():
- ret =
self._getBackendObject().commitTransaction(self._getAuxCursor())
+ if self.BackendObject:
+ ret =
self.BackendObject.commitTransaction(self.AuxCursor)
return ret
def rollbackTransaction(self):
""" Roll back (revert) a SQL transaction."""
ret = None
- if self._getBackendObject():
- ret =
self._getBackendObject().rollbackTransaction(self._getAuxCursor())
+ if self.BackendObject:
+ ret =
self.BackendObject.rollbackTransaction(self.AuxCursor)
return ret
@@ -1281,13 +1281,13 @@
def setFieldClause(self, clause):
""" Set the field clause of the sql statement.
"""
- self.sqlManager._fieldClause =
self.sqlManager._getBackendObject().setFieldClause(clause)
+ self.sqlManager._fieldClause =
self.sqlManager.BackendObject.setFieldClause(clause)
def addField(self, exp):
""" Add a field to the field clause.
"""
- if self.sqlManager._getBackendObject():
- self.sqlManager._fieldClause =
self.sqlManager._getBackendObject().addField(self.sqlManager._fieldClause, exp)
+ if self.sqlManager.BackendObject:
+ self.sqlManager._fieldClause =
self.sqlManager.BackendObject.addField(self.sqlManager._fieldClause, exp)
return self.sqlManager._fieldClause
def getFromClause(self):
@@ -1298,7 +1298,7 @@
def setFromClause(self, clause):
""" Set the from clause of the sql statement.
"""
- self.sqlManager._fromClause =
self.sqlManager._getBackendObject().setFromClause(clause)
+ self.sqlManager._fromClause =
self.sqlManager.BackendObject.setFromClause(clause)
def addFrom(self, exp):
""" Add a table to the sql statement.
@@ -1306,8 +1306,8 @@
For joins, use setFromClause() to set the entire from clause
explicitly.
"""
- if self.sqlManager._getBackendObject():
- self.sqlManager._fromClause =
self.sqlManager._getBackendObject().addFrom(self.sqlManager._fromClause, exp)
+ if self.sqlManager.BackendObject:
+ self.sqlManager._fromClause =
self.sqlManager.BackendObject.addFrom(self.sqlManager._fromClause, exp)
return self.sqlManager._fromClause
@@ -1319,18 +1319,18 @@
def setWhereClause(self, clause):
""" Set the where clause of the sql statement.
"""
- self.sqlManager._whereClause =
self.sqlManager._getBackendObject().setWhereClause(clause)
+ self.sqlManager._whereClause =
self.sqlManager.BackendObject.setWhereClause(clause)
def addWhere(self, exp, comp="and"):
""" Add an expression to the where clause.
"""
- if self.sqlManager._getBackendObject():
- self.sqlManager._whereClause =
self.sqlManager._getBackendObject().addWhere(self.sqlManager._whereClause, exp,
comp)
+ if self.sqlManager.BackendObject:
+ self.sqlManager._whereClause =
self.sqlManager.BackendObject.addWhere(self.sqlManager._whereClause, exp, comp)
return self.sqlManager._whereClause
def prepareWhere(self, clause):
""" Modifies WHERE clauses as needed for each backend. """
- return self.sqlManager._getBackendObject().prepareWhere(clause)
+ return self.sqlManager.BackendObject.prepareWhere(clause)
def getChildFilterClause(self):
""" Get the child filter part of the sql statement.
@@ -1340,7 +1340,7 @@
def setChildFilterClause(self, clause):
""" Set the child filter clause of the sql statement.
"""
- self.sqlManager._childFilterClause =
self.sqlManager._getBackendObject().setChildFilterClause(clause)
+ self.sqlManager._childFilterClause =
self.sqlManager.BackendObject.setChildFilterClause(clause)
def getGroupByClause(self):
""" Get the group-by clause of the sql statement.
@@ -1350,13 +1350,13 @@
def setGroupByClause(self, clause):
""" Set the group-by clause of the sql statement.
"""
- self.sqlManager._groupByClause =
self.sqlManager._getBackendObject().setGroupByClause(clause)
+ self.sqlManager._groupByClause =
self.sqlManager.BackendObject.setGroupByClause(clause)
def addGroupBy(self, exp):
""" Add an expression to the group-by clause.
"""
- if self.sqlManager._getBackendObject():
- self.sqlManager._groupByClause =
self.sqlManager._getBackendObject().addGroupBy(self.sqlManager._groupByClause,
exp)
+ if self.sqlManager.BackendObject:
+ self.sqlManager._groupByClause =
self.sqlManager.BackendObject.addGroupBy(self.sqlManager._groupByClause, exp)
return self.sqlManager._groupByClause
def getOrderByClause(self):
@@ -1367,13 +1367,13 @@
def setOrderByClause(self, clause):
""" Set the order-by clause of the sql statement.
"""
- self.sqlManager._orderByClause =
self.sqlManager._getBackendObject().setOrderByClause(clause)
+ self.sqlManager._orderByClause =
self.sqlManager.BackendObject.setOrderByClause(clause)
def addOrderBy(self, exp):
""" Add an expression to the order-by clause.
"""
- if self.sqlManager._getBackendObject():
- self.sqlManager._orderByClause =
self.sqlManager._getBackendObject().addOrderBy(self.sqlManager._orderByClause,
exp)
+ if self.sqlManager.BackendObject:
+ self.sqlManager._orderByClause =
self.sqlManager.BackendObject.addOrderBy(self.sqlManager._orderByClause, exp)
return self.sqlManager._orderByClause
def getLimitClause(self):
@@ -1390,8 +1390,8 @@
""" Return the word to use in the db-specific limit clause.
"""
ret = "limit"
- if self.sqlManager._getBackendObject():
- ret = self.sqlManager._getBackendObject().getLimitWord()
+ if self.sqlManager.BackendObject:
+ ret = self.sqlManager.BackendObject.getLimitWord()
return ret
def getLimitPosition(self):
@@ -1401,8 +1401,8 @@
are sufficient.
"""
ret = "bottom"
- if self.sqlManager._getBackendObject():
- ret =
self.sqlManager._getBackendObject().getLimitPosition()
+ if self.sqlManager.BackendObject:
+ ret = self.sqlManager.BackendObject.getLimitPosition()
return ret
def getSQL(self):
@@ -1440,7 +1440,7 @@
else:
limitClause = "%s %s" %
(self.sqlManager.getLimitWord(), self.sqlManager._defaultLimit)
- return self.sqlManager._getBackendObject().formSQL(fieldClause,
fromClause,
+ return self.sqlManager.BackendObject.formSQL(fieldClause,
fromClause,
whereClause, groupByClause, orderByClause,
limitClause)
@@ -1457,36 +1457,38 @@
def getWordMatchFormat(self):
- return self.sqlManager._getBackendObject().getWordMatchFormat()
+ return self.sqlManager.BackendObject.getWordMatchFormat()
+ ## Property getter/setter methods ##
+ def _getAutoSQL(self):
+ return self.getSQL()
+
+ def _getAutoPopulatePK(self):
+ try:
+ return self._autoPopulatePK
+ except AttributeError:
+ return True
+ def _setAutoPopulatePK(self, autopop):
+ self._autoPopulatePK = bool(autopop)
+
+
def _getAuxCursor(self):
if self.__auxCursor is None:
if self._cursorFactoryClass is not None:
if self._cursorFactoryFunc is not None:
self.__auxCursor =
self._cursorFactoryFunc(self._cursorFactoryClass)
if not self.__auxCursor:
- self.__auxCursor =
self._getBackendObject().getCursor(self.__class__)
+ self.__auxCursor =
self.BackendObject.getCursor(self.__class__)
return self.__auxCursor
- def setBackendObject(self, obj):
- self.__backend = obj
- self._getAuxCursor().__backend = obj
-
+
def _getBackendObject(self):
return self.__backend
-
- ## Property getter/setter methods ##
- def _getAutoSQL(self):
- return self.getSQL()
-
- def _getAutoPopulatePK(self):
- try:
- return self._autoPopulatePK
- except AttributeError:
- return True
- def _setAutoPopulatePK(self, autopop):
- self._autoPopulatePK = bool(autopop)
+ def _setBackendObject(self, obj):
+ self.__backend = obj
+ self.AuxCursor.__backend = obj
+
def _getCurrentSQL(self):
if self.UserSQL is not None:
@@ -1494,10 +1496,10 @@
return self.AutoSQL
def _getEncoding(self):
- return self._getBackendObject().Encoding
+ return self.BackendObject.Encoding
def _setEncoding(self, val):
- self._getBackendObject().Encoding = val
+ self.BackendObject.Encoding = val
def _getDescrip(self):
return self.__backend.getDescription(self)
@@ -1517,7 +1519,7 @@
def _setKeyField(self, kf):
self._keyField = str(kf)
- self._getAuxCursor()._keyField = str(kf)
+ self.AuxCursor._keyField = str(kf)
self._keyFieldSet = True
def _setRowNumber(self, num):
@@ -1543,7 +1545,7 @@
def _setTable(self, table):
self._table = str(table)
- self._getAuxCursor()._table = str(table)
+ self.AuxCursor._table = str(table)
if not self._keyFieldSet:
# Get the PK field, if any
try:
@@ -1574,6 +1576,13 @@
AutoPopulatePK = property(_getAutoPopulatePK, _setAutoPopulatePK, None,
_("When inserting a new record, does the backend
populate the PK field?"))
+ AuxCursor = property(_getAuxCursor, None, None,
+ _("""Auxiliary cursor object that handles queries that
would otherwise
+ affect the main cursor's data set. (dCursorMixin
subclass)"""))
+
+ BackendObject = property(_getBackendObject, _setBackendObject, None,
+ _("Returns a reference to the object defining
backend-specific behavior (dBackend)"))
+
CurrentSQL = property(_getCurrentSQL, None, None,
_("Returns the current SQL that will be run, which is
one of UserSQL or AutoSQL."))
_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://leafe.com/mailman/listinfo/dabo-dev