commit-gnue
[Top][All Lists]
Advanced

[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): 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]