[Top][All Lists]
[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 ()
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r7543 - in trunk/gnue-common/src/datasources: . drivers/Base,
reinhard <=