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