commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnue] r7464 - in trunk/gnue-common/src/datasources: . drivers/Base


From: reinhard
Subject: [gnue] r7464 - in trunk/gnue-common/src/datasources: . drivers/Base
Date: Fri, 22 Apr 2005 13:31:11 -0500 (CDT)

Author: reinhard
Date: 2005-04-22 13:31:10 -0500 (Fri, 22 Apr 2005)
New Revision: 7464

Modified:
   trunk/gnue-common/src/datasources/GDataSource.py
   trunk/gnue-common/src/datasources/drivers/Base/DataObject.py
   trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
Log:
More cleanup for master/detail.


Modified: trunk/gnue-common/src/datasources/GDataSource.py
===================================================================
--- trunk/gnue-common/src/datasources/GDataSource.py    2005-04-22 16:54:38 UTC 
(rev 7463)
+++ trunk/gnue-common/src/datasources/GDataSource.py    2005-04-22 18:31:10 UTC 
(rev 7464)
@@ -67,6 +67,8 @@
     self._defaultData = {}
     self._rowidField = None
 
+    self._detailDataSources = []       # Datasources of which I am the master
+
     self._inits = [self.__primaryInit, self.__secondaryInit,
                    self.__tertiaryInit]
     self._currentResultSet = None
@@ -271,9 +273,7 @@
       if len (self._masterPkFields) != len (self._masterFkFields):
         raise Exceptions.MasterDetailFieldMismatch (self.name)
 
-      masterDataObject = self.__master._dataObject
-      detailDataObject = self._dataObject
-      masterDataObject.addDetailDataObject (detailDataObject, self)
+      self.__master._addDetailDataSource (self)
 
 
   # ---------------------------------------------------------------------------
@@ -409,6 +409,14 @@
 
 
   # ---------------------------------------------------------------------------
+  # Add a detail datasource where this datasource is a master
+  # ---------------------------------------------------------------------------
+
+  def _addDetailDataSource (self, dataSource):
+
+    self._detailDataSources.append (dataSource)
+
+  # ---------------------------------------------------------------------------
   # Reference a bound field
   # ---------------------------------------------------------------------------
 

Modified: trunk/gnue-common/src/datasources/drivers/Base/DataObject.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/DataObject.py        
2005-04-22 16:54:38 UTC (rev 7463)
+++ trunk/gnue-common/src/datasources/drivers/Base/DataObject.py        
2005-04-22 18:31:10 UTC (rev 7464)
@@ -42,7 +42,6 @@
 
     self._connection = connection
     self.__dataSource = dataSource
-    self._detailObjects = []
 
 
   def createResultSet (self, conditions ={}, readOnly=0, masterRecord=None):
@@ -84,23 +83,15 @@
   def __createResultSet (self, readOnly = False, masterRecord = None):
 
     return self._resultSetClass (
-        dataObject       = self,
-        defaultData      = self.__dataSource._defaultData,
-        connection       = self.__dataSource._connection,
-        tablename        = self.__dataSource.table,
-        rowidField       = self.__dataSource._rowidField,
-        primarykeyFields = self.__dataSource._primarykeyFields,
-        boundFields      = self.__dataSource._fieldReferences.keys (),
-        readonly         = readOnly,
-        masterRecord     = masterRecord,
-        masterPkFields   = self.__dataSource._masterPkFields,
-        masterFkFields   = self.__dataSource._masterFkFields,
-        dataSource       = self.__dataSource)
-
-
-  def addDetailDataObject(self, dataObject, handler=None):
-    self._detailObjects.append ([dataObject, handler])
-
-  def _masterRecordChanged(self, master):
-    return master.current.addDetailResultSet(self.__dataSource,
-          self.__dataSource._masterPkFields)
+        defaultData       = self.__dataSource._defaultData,
+        connection        = self.__dataSource._connection,
+        tablename         = self.__dataSource.table,
+        rowidField        = self.__dataSource._rowidField,
+        primarykeyFields  = self.__dataSource._primarykeyFields,
+        boundFields       = self.__dataSource._fieldReferences.keys (),
+        readonly          = readOnly,
+        masterRecord      = masterRecord,
+        masterPkFields    = self.__dataSource._masterPkFields,
+        masterFkFields    = self.__dataSource._masterFkFields,
+        detailDataSources = self.__dataSource._detailDataSources,
+        dataSource        = self.__dataSource)

Modified: trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2005-04-22 
16:54:38 UTC (rev 7463)
+++ trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2005-04-22 
18:31:10 UTC (rev 7464)
@@ -39,18 +39,19 @@
   # Constructor
   # ---------------------------------------------------------------------------
 
-  def __init__ (self, dataObject,
-      defaultData      = {},
-      connection       = None,
-      tablename        = None,
-      rowidField       = None,
-      primarykeyFields = [],
-      boundFields      = [],
-      readonly         = False,
-      masterRecord     = None,
-      masterPkFields   = [],
-      masterFkFields   = [],
-      dataSource       = None):
+  def __init__ (self,
+      defaultData       = {},
+      connection        = None,
+      tablename         = None,
+      rowidField        = None,
+      primarykeyFields  = [],
+      boundFields       = [],
+      readonly          = False,
+      masterRecord      = None,
+      masterPkFields    = [],
+      masterFkFields    = [],
+      detailDataSources = [],
+      dataSource        = None):
     """
     Create a new ResultSet instance.
 
@@ -78,18 +79,18 @@
     @param dataSource: GDataSource instance to notify of data events.
     """
 
-    self._dataObject        = dataObject
-    self.__defaultData      = defaultData
-    self.__connection       = connection
-    self.__tablename        = tablename
-    self.__rowidField       = rowidField
-    self.__primarykeyFields = primarykeyFields
-    self.__boundFields      = boundFields
-    self.__readonly         = readonly
-    self.__masterRecord     = masterRecord
-    self.__masterPkFields   = masterPkFields
-    self.__masterFkFields   = masterFkFields
-    self.__dataSource       = dataSource
+    self.__defaultData       = defaultData
+    self.__connection        = connection
+    self.__tablename         = tablename
+    self.__rowidField        = rowidField
+    self.__primarykeyFields  = primarykeyFields
+    self.__boundFields       = boundFields
+    self.__readonly          = readonly
+    self.__masterRecord      = masterRecord
+    self.__masterPkFields    = masterPkFields
+    self.__masterFkFields    = masterFkFields
+    self.__detailDataSources = detailDataSources
+    self.__dataSource        = dataSource
 
     self._cachedRecords = []
     self._currentRecord = -1
@@ -297,8 +298,6 @@
   # Notification of record navigation
   # ---------------------------------------------------------------------------
 
-  # TODO: Unify __notifyListeners and notifyDetailObjects
-
   # Other objects can register here. Their currentRecordMoved method will then
   # get called whenever the current record of this ResultSet changes.
   def registerListener (self, listener):
@@ -311,52 +310,33 @@
 
   # ---------------------------------------------------------------------------
 
-  # This gets called whenever the ResultSet gets a new current recordset,
-  # that happens in case of record navigation, in case of inserting a new
-  # record, and in case of posting data (the current record could have been
-  # deleted, or the backend could have changed some data).
-  def __notifyListeners (self):
-    for listener in self.__listeners:
-      listener.currentRecordMoved ()
-
-  # ---------------------------------------------------------------------------
-
-  def notifyDetailObjects(self):
-
-    # Do nothing if the resultset is empty.
-    if not self.current:
-      return
-
-    gDebug (8,'Master record changed; Notifying Detail Objects')
-    for detail in self._dataObject._detailObjects:
-      if detail[1]:
-        detail[1].masterResultSetChanged(self,
-                                         detail[0]._masterRecordChanged(self))
-
-  # ---------------------------------------------------------------------------
-
   # Sync self.current with self._currentRecord and adjust detail resultsets and
   # the user interface
   def __sync (self):
+
     oldCurrent = self.current
     if self._currentRecord == -1:
       self.current = None
     else:
       self.current = self._cachedRecords [self._currentRecord]
-    # If called on requery, the current record doesn't change if the old
-    # current record wasn't deleted. In that case, we don't want to notify the
-    # detail objects (and reset the current record pointer of the details to
-    # the start).
-    if self.current != oldCurrent:
-      self.notifyDetailObjects ()
-    self.__notifyListeners ()
 
+    # If the current record has *really* changed (this method can be called for
+    # non-changing records after requery or merge) to a new current record,
+    # bring all detail records in sync.
+    if self.current and self.current != oldCurrent:
+      for detail in self.__detailDataSources:
+        resultset = self.current.addDetailResultSet (detail,
+            detail._masterPkFields)
+        detail.masterResultSetChanged (self, resultset)
 
+    for listener in self.__listeners:
+      listener.currentRecordMoved ()
+
+
   # ---------------------------------------------------------------------------
   # Record navigation
   # ---------------------------------------------------------------------------
 
-
   # Move to a record number already in cache
   # -1 sets the current record to None
   def __move (self, record):





reply via email to

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