commit-gnue
[Top][All Lists]
Advanced

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

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


From: reinhard
Subject: [gnue] r7543 - in trunk/gnue-common/src/datasources: . drivers/Base
Date: Tue, 17 May 2005 10:31:09 -0500 (CDT)

Author: reinhard
Date: 2005-05-17 10:31:08 -0500 (Tue, 17 May 2005)
New Revision: 7543

Modified:
   trunk/gnue-common/src/datasources/GDataSource.py
   trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py
   trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
Log:
Made RecordSet a little more autonomous wrt details.


Modified: trunk/gnue-common/src/datasources/GDataSource.py
===================================================================
--- trunk/gnue-common/src/datasources/GDataSource.py    2005-05-17 13:24:56 UTC 
(rev 7542)
+++ trunk/gnue-common/src/datasources/GDataSource.py    2005-05-17 15:31:08 UTC 
(rev 7543)
@@ -74,7 +74,9 @@
     self._defaultData = {}
     self._rowidField = None
 
-    self._detailDataSources = []       # Datasources of which I am the master
+    # Dictionary with the keys being GDataSource objects and the values being
+    # (pk_fields, fk_fields) tuples.
+    self.__details = {}
 
     self._inits = [self.__primaryInit, self.__secondaryInit,
                    self.__tertiaryInit]
@@ -309,7 +311,8 @@
       if len (self._masterPkFields) != len (self._masterFkFields):
         raise Exceptions.MasterDetailFieldMismatch (self.name)
 
-      self.__master._addDetailDataSource (self)
+      self.__master._addDetail (self, self._masterPkFields,
+          self._masterFkFields)
 
 
   # ---------------------------------------------------------------------------
@@ -367,10 +370,11 @@
   # Add a detail datasource where this datasource is a master
   # ---------------------------------------------------------------------------
 
-  def _addDetailDataSource (self, dataSource):
+  def _addDetail (self, dataSource, pkFields, fkFields):
 
-    self._detailDataSources.append (dataSource)
+    self.__details [dataSource] = (pkFields, fkFields)
 
+
   # ---------------------------------------------------------------------------
   # Reference a bound field
   # ---------------------------------------------------------------------------
@@ -554,20 +558,20 @@
   def __newResultSet (self, readOnly, masterRecord):
 
     return self.__resultSetClass (
-        defaultData       = self._defaultData,
-        connection        = self._connection,
-        tablename         = self.table,
-        rowidField        = self._rowidField,
-        primarykeyFields  = self._primarykeyFields,
-        primarykeySeq     = self.primarykeyseq,
-        boundFields       = self._fieldReferences.keys (),
-        requery           = self.requery,
-        readonly          = readOnly,
-        masterRecord      = masterRecord,
-        masterPkFields    = self._masterPkFields,
-        masterFkFields    = self._masterFkFields,
-        detailDataSources = self._detailDataSources,
-        dataSource        = self)
+        defaultData      = self._defaultData,
+        connection       = self._connection,
+        tablename        = self.table,
+        rowidField       = self._rowidField,
+        primarykeyFields = self._primarykeyFields,
+        primarykeySeq    = self.primarykeyseq,
+        boundFields      = self._fieldReferences.keys (),
+        requery          = self.requery,
+        readonly         = readOnly,
+        masterRecord     = masterRecord,
+        masterPkFields   = self._masterPkFields,
+        masterFkFields   = self._masterFkFields,
+        details          = self.__details,
+        dataSource       = self)
 
 
   # ---------------------------------------------------------------------------

Modified: trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py 2005-05-17 
13:24:56 UTC (rev 7542)
+++ trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py 2005-05-17 
15:31:08 UTC (rev 7543)
@@ -55,8 +55,8 @@
   master record's primary key was set in an OnInsert database trigger).
 
   If the RecordSet is the master in a master/detail relationship, it is aware
-  of all its details. It will notify all its detail L{DataSource} objects
-  whenever it has become the current record, and it posts/requeries all detail
+  of all its details. It notifies all its detail L{DataSource} objects whenever
+  it becomes the current record, and it posts/requeries all detail
   L{ResultSet} objects after posting/requerying its own data.
   """
 
@@ -78,6 +78,7 @@
       masterRecord     = None,
       masterPkFields   = [],
       masterFkFields   = [],
+      details          = {},
       dataSource       = None):
     """
     Create a new RecordSet instance.
@@ -112,6 +113,10 @@
       masterFkFields in this record.
     @param masterFkFields: Fields in this record matching the masterPkFields
       of the master record.
+    @param details: Dictionary defining all details of this ResultSet, where
+      the key is the @L{GDataSource} object and the values are tuples
+      containing a list of primary key fields and a list of the corresponding
+      foreign key fields.
     @param dataSource: GDataSource instance to notify of data events.
     """
 
@@ -126,6 +131,7 @@
     self.__masterRecord     = masterRecord
     self.__masterPkFields   = masterPkFields
     self.__masterFkFields   = masterFkFields
+    self.__details          = details
     self.__dataSource       = dataSource
 
     # Record status
@@ -145,6 +151,9 @@
     # All field names that are used to link detail records (i.e. all fieldnames
     # that appear as masterfield in any of my detail result sets)
     self.__detailLinkFlags = {}
+    for (dataSource, (pkFields, fkFields)) in self.__details.items ():
+      for fieldname in pkFields:
+        self.__detailLinkFlags [fieldname] = True
 
     # Dictionary with field:value pairs of initial data
     self.__initialData = initialData.copy ()     # don't touch the parameter!
@@ -380,6 +389,36 @@
 
 
   # ---------------------------------------------------------------------------
+  # Make this RecordSet the current one (notify all details)
+  # ---------------------------------------------------------------------------
+
+  def _activate (self):
+    """
+    Make this the current record, notifying all detail datasources.
+    """
+    for dataSource in self.__details.keys ():
+
+      # If we already have it in our cache, activate it
+      if self.__cachedDetailResultSets.has_key (dataSource):
+        resultset = self.__cachedDetailResultSets [dataSource]
+        if resultset.isPending () or int (gConfig ('CacheDetailRecords')):
+          dataSource._activateResultSet (resultset)
+          # FIXME: This is only for compatibility and should be removed
+          dataSource.masterResultSetChanged (self, resultset)
+          return
+
+      # If this record is empty anyway, it can't have any detail records, so
+      # create empty detail result sets.  Query the matching details otherwise.
+      if self.__status == 'empty':
+        resultset = dataSource.createEmptyResultSet (masterRecord = self)
+      else:
+        resultset = dataSource.createResultSet (masterRecord = self)
+
+      # Remember it
+      self.__cachedDetailResultSets [dataSource] = resultset
+
+
+  # ---------------------------------------------------------------------------
   # Fields to be used in WHERE clauses for UPDATE and DELETE.
   # ---------------------------------------------------------------------------
 
@@ -543,43 +582,6 @@
 
 
   # ---------------------------------------------------------------------------
-  # Find an existing or create a new detail result set for this record
-  # ---------------------------------------------------------------------------
-
-  def addDetailResultSet (self, dataSource, fieldnames):
-    """
-    Add a result set to the list of detail result sets for this record.
-
-    @param dataSource: The L{GDataSource} to use to create the ResultSet.
-    @param fieldnames: List of the names of the master fields in this
-      master/detail connection.
-    """
-
-    # If we already have it in our cache, return it
-    if self.__cachedDetailResultSets.has_key (dataSource):
-      resultset = self.__cachedDetailResultSets [dataSource]
-      if resultset.isPending () or int (gConfig ('CacheDetailRecords')):
-        dataSource._activateResultSet (resultset)
-        return resultset
-
-    # If this record is empty anyway, it can't have any detail records, so
-    # create empty detail result sets.  Query the matching details otherwise.
-    if self.__status == 'empty':
-      resultset = dataSource.createEmptyResultSet (masterRecord = self)
-    else:
-      resultset = dataSource.createResultSet (masterRecord = self)
-
-    # Remember it
-    self.__cachedDetailResultSets [dataSource] = resultset
-
-    # Remember the fields that serve as primary key for this master/detail link
-    for fieldname in fieldnames:
-      self.__detailLinkFlags [fieldname] = True
-
-    return resultset
-
-
-  # ---------------------------------------------------------------------------
   # Set clean data from a dictionary
   # ---------------------------------------------------------------------------
 

Modified: trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2005-05-17 
13:24:56 UTC (rev 7542)
+++ trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2005-05-17 
15:31:08 UTC (rev 7543)
@@ -40,20 +40,20 @@
   # ---------------------------------------------------------------------------
 
   def __init__ (self,
-      defaultData       = {},
-      connection        = None,
-      tablename         = None,
-      rowidField        = None,
-      primarykeyFields  = [],
-      primarykeySeq     = None,
-      boundFields       = [],
-      requery           = True,
-      readonly          = False,
-      masterRecord      = None,
-      masterPkFields    = [],
-      masterFkFields    = [],
-      detailDataSources = [],
-      dataSource        = None):
+      defaultData      = {},
+      connection       = None,
+      tablename        = None,
+      rowidField       = None,
+      primarykeyFields = [],
+      primarykeySeq    = None,
+      boundFields      = [],
+      requery          = True,
+      readonly         = False,
+      masterRecord     = None,
+      masterPkFields   = [],
+      masterFkFields   = [],
+      details          = {},
+      dataSource       = None):
     """
     Create a new ResultSet instance.
 
@@ -85,23 +85,27 @@
       masterFkFields in the records of this result set.
     @param masterFkFields: Fields in the records of this result set matching
       the masterPkFields of the master record.
+    @param details: Dictionary defining all details of this ResultSet, where
+      the key is the L{GDataSource} object and the values are tuples
+      containing a list of primary key fields and a list of the corresponding
+      foreign key fields.
     @param dataSource: GDataSource instance to notify of data events.
     """
 
-    self.__defaultData       = defaultData
-    self.__connection        = connection
-    self.__tablename         = tablename
-    self.__rowidField        = rowidField
-    self.__primarykeyFields  = primarykeyFields
-    self.__primarykeySeq     = primarykeySeq
-    self.__boundFields       = boundFields
-    self.__requery           = requery
-    self.__readonly          = readonly
-    self.__masterRecord      = masterRecord
-    self.__masterPkFields    = masterPkFields
-    self.__masterFkFields    = masterFkFields
-    self.__detailDataSources = detailDataSources
-    self.__dataSource        = dataSource
+    self.__defaultData      = defaultData
+    self.__connection       = connection
+    self.__tablename        = tablename
+    self.__rowidField       = rowidField
+    self.__primarykeyFields = primarykeyFields
+    self.__primarykeySeq    = primarykeySeq
+    self.__boundFields      = boundFields
+    self.__requery          = requery
+    self.__readonly         = readonly
+    self.__masterRecord     = masterRecord
+    self.__masterPkFields   = masterPkFields
+    self.__masterFkFields   = masterFkFields
+    self.__details          = details
+    self.__dataSource       = dataSource
 
     self.__staticData = []              # Data for static datasources
 
@@ -217,6 +221,7 @@
         masterRecord     = self.__masterRecord,
         masterPkFields   = self.__masterPkFields,
         masterFkFields   = self.__masterFkFields,
+        details          = self.__details,
         dataSource       = self.__dataSource)
 
     if position is None:
@@ -339,10 +344,7 @@
     # 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)
+      self.current._activate ()
 
     for listener in self.__listeners:
       listener.currentRecordMoved ()





reply via email to

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