[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnue/gnue-common/src GDataObjects.py dbdrivers/...
From: |
Jason Cater |
Subject: |
gnue/gnue-common/src GDataObjects.py dbdrivers/... |
Date: |
Wed, 07 Nov 2001 23:39:04 -0500 |
CVSROOT: /home/cvs
Module name: gnue
Changes by: Jason Cater <address@hidden> 01/11/07 23:39:04
Modified files:
gnue-common/src: GDataObjects.py
gnue-common/src/dbdrivers/_dbsig: DBdriver.py
Log message:
fixes to master/detail binding bug
CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/GDataObjects.py.diff?cvsroot=OldCVS&tr1=1.27&tr2=1.28&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py.diff?cvsroot=OldCVS&tr1=1.20&tr2=1.21&r1=text&r2=text
Patches:
Index: gnue/gnue-common/src/GDataObjects.py
diff -u gnue/gnue-common/src/GDataObjects.py:1.27
gnue/gnue-common/src/GDataObjects.py:1.28
--- gnue/gnue-common/src/GDataObjects.py:1.27 Sun Nov 4 17:04:48 2001
+++ gnue/gnue-common/src/GDataObjects.py Wed Nov 7 23:39:03 2001
@@ -140,9 +140,9 @@
GDebug.printMesg (1,"Adding a master/detail relationship to DataObject")
dataObject._masterObject = self
dataObject._masterfields = string.split(hasattr(dataObject,'masterlink')
and \
- dataObject.masterlink or "", ',')
+ string.lower(dataObject.masterlink) or "",
',')
dataObject._detailfields = string.split(hasattr(dataObject,'detaillink')
and \
- dataObject.detaillink or "", ',')
+ string.lower(dataObject.detaillink) or "",
',')
if len(dataObject._masterfields) != len(dataObject._detailfields):
raise MasterDetailFieldMismatch, "master=%s; detail=%s" % \
@@ -150,8 +150,11 @@
# Make sure "master" fields will be in our future query
for field in dataObject._masterfields:
- self._fieldReferences[string.strip(string.lower(field))] = 1
+ self._fieldReferences[string.strip(field)] = 1
+ for field in dataObject._detailfields:
+ dataObject._fieldReferences[string.strip(field)] = 1
+
self._detailObjects.append ([dataObject, handler])
@@ -417,9 +420,15 @@
return self.current.isPending()
# Post changes to the database
- def post(self):
+ def post(self, foreign_keys={}):
# post our changes
for record in (self._cachedRecords):
+ for field in foreign_keys.keys():
+ record._fields[field] = foreign_keys[field]
+ # Some DBs will throw an exception if you update a Primary Key
+ # (even if you are updating to the same value)
+ if record._insertFlag:
+ record._modifiedFlags[field] = 1
record.post()
def notifyDetailObjects(self):
@@ -581,9 +590,15 @@
GDebug.printMesg(5,'Posting datasource %s' %
self._parent._dataObject.name)
self._postChanges()
- # Post all details in
+ # Post all detail records
for child in (self._cachedDetailResultSets.keys()):
- self._cachedDetailResultSets[child].post()
+ c = self._cachedDetailResultSets[child]._dataObject
+ # Set the primary key for any new child records
+ fk = {}
+ for i in range(len(c._masterfields)):
+ fk[c._detailfields[i]] = self.getField(c._masterfields[i])
+
+ self._cachedDetailResultSets[child].post(foreign_keys=fk)
# Sets the ResultSet associated with this master record
Index: gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py
diff -u gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py:1.20
gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py:1.21
--- gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py:1.20 Fri Nov 2
14:51:54 2001
+++ gnue/gnue-common/src/dbdrivers/_dbsig/DBdriver.py Wed Nov 7 23:39:04 2001
@@ -7,12 +7,12 @@
# version 2, or (at your option) any later version.
#
# GNU Enterprise is distributed in the hope that it will be
-# useful, but WITHOUT ANY WARRANTY; without even the implied
+# useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
# PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public
-# License along with program; see the file COPYING. If not,
+# License along with program; see the file COPYING. If not,
# write to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.
#
@@ -39,11 +39,11 @@
class DBSIG_RecordSet(GDataObjects.RecordSet):
def _postChanges(self):
if not self.isPending(): return
- if self._deleteFlag:
+ if self._deleteFlag:
statement = self._buildDeleteStatement()
- elif self._insertFlag:
+ elif self._insertFlag:
statement = self._buildInsertStatement()
- elif self._updateFlag:
+ elif self._updateFlag:
statement = self._buildUpdateStatement()
GDebug.printMesg(5, "_postChanges: statement=%s" % statement)
@@ -78,7 +78,7 @@
self._initialData[self._parent._primaryIdField] ]
else:
where = []
- for field in self._initialData.keys():
+ for field in self._initialData.keys():
if self._initialData[field] == None:
where.append ("%s IS NULL" % field)
else:
@@ -95,12 +95,12 @@
# TODO: This should actually only insert modified fields.
# TODO: Unfortunately, self._modifiedFlags is not being
# TODO: set for new records (address@hidden)
- #for field in self._modifiedFlags.keys():
-
- for field in self._fields.keys():
+ #for field in self._modifiedFlags.keys():
+
+ for field in self._fields.keys():
if self._parent.isFieldBound(field):
fields.append (field)
- if self._fields[field] == None or self._fields[field] == '':
+ if self._fields[field] == None or self._fields[field] == '':
vals.append ("NULL") # % (self._fields[field]))
else:
vals.append ("'%s'" % (self._fields[field]))
@@ -108,11 +108,11 @@
return "INSERT INTO %s (%s) VALUES (%s)" % \
(self._parent._dataObject.table, string.join(fields,','), \
string.join(vals,',') )
-
+
- def _buildUpdateStatement(self):
+ def _buildUpdateStatement(self):
updates = []
- for field in self._modifiedFlags.keys():
+ for field in self._modifiedFlags.keys():
updates.append ("%s='%s'" % (field, self._fields[field]))
if self._initialData.has_key(self._parent._primaryIdField):
@@ -133,7 +133,7 @@
class DBSIG_ResultSet(GDataObjects.ResultSet):
def __init__(self, dataObject, cursor=None, \
- defaultValues={}, masterRecordSet=None):
+ defaultValues={}, masterRecordSet=None):
GDataObjects.ResultSet.__init__(
self,dataObject,cursor,defaultValues,masterRecordSet)
self._recordSetClass = DBSIG_RecordSet
@@ -141,36 +141,44 @@
self._recordCount = cursor.rowcount > 0 and cursor.rowcount or 0
- # If a DB driver supports a unique identifier for rows,
+ # If a DB driver supports a unique identifier for rows,
# list it here. _primaryIdField is the field name (lower case)
- # that would appear in the recordset (note that this can be
- # a system generated format). If a primary id is supported,
+ # that would appear in the recordset (note that this can be
+ # a system generated format). If a primary id is supported,
# _primaryIdFormat is the WHERE clause to be used. It will have
# the string % (fieldvalue) format applied to it.
self._primaryIdField = None
- self._primaryIdFormat = "__gnue__ = '%s'"
+ self._primaryIdFormat = "__gnue__ = '%s'"
GDebug.printMesg(5, 'ResultSet created')
# Post changes to the database
- def post(self):
+ def post(self, foreign_keys={}):
# post our changes
self._update_cursor = self._dataObject._dataConnection.cursor()
+
+ i = 0
+ while i < len(self._cachedRecords):
- i = 0
- while i < len(self._cachedRecords):
record = self._cachedRecords[i]
+ for field in foreign_keys.keys():
+ record._fields[field] = foreign_keys[field]
+ # Some DBs will throw an exception if you update a Primary Key
+ # (even if you are updating to the same value)
+ if record._insertFlag:
+ record._modifiedFlags[field] = 1
+
delete = record._deleteFlag and not record._insertFlag
record.post()
- if delete:
- self._cachedRecords.pop(i)
- else:
+ if delete:
+ self._cachedRecords.pop(i)
+ else:
i = i + 1
-
+
- def _loadNextRecord(self):
- if self._cursor:
+ def _loadNextRecord(self):
+ if self._cursor:
rs = None
try:
@@ -184,7 +192,7 @@
if rs:
if not self._fieldNames:
self._fieldNames = []
- for t in (self._cursor.description):
+ for t in (self._cursor.description):
self._fieldNames.append (string.lower(t[0]))
i = 0
dict = {}
@@ -250,7 +258,7 @@
def commit(self):
GDebug.printMesg (5,"DB-SIG database driver: commit()")
-
+
try:
self._dataConnection.commit()
except self._DatabaseError, value:
@@ -280,7 +288,7 @@
return ""
elif type(condition) == types.DictType:
cond = GConditions.buildConditionFromDict(condition)
- else:
+ else:
cond = condition
if not len(cond._children):