[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnue] r7371 - trunk/gnue-common/src/datasources/drivers/Base
From: |
reinhard |
Subject: |
[gnue] r7371 - trunk/gnue-common/src/datasources/drivers/Base |
Date: |
Fri, 15 Apr 2005 05:23:02 -0500 (CDT) |
Author: reinhard
Date: 2005-04-15 05:23:01 -0500 (Fri, 15 Apr 2005)
New Revision: 7371
Modified:
trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py
trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
Log:
Hold a weak reference to the DataSource in the RecordSet.
Modified: trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py 2005-04-15
09:32:13 UTC (rev 7370)
+++ trunk/gnue-common/src/datasources/drivers/Base/RecordSet.py 2005-04-15
10:23:01 UTC (rev 7371)
@@ -22,6 +22,7 @@
# $Id$
import string
+import weakref
from gnue.common.apps import errors
from gnue.common.datasources import Exceptions
@@ -39,8 +40,8 @@
def __init__ (self, parent, initialData = {}, defaultData = {},
connection = None, tablename = '', boundFields = [], readonly = False,
- masterRecord = None, masterKeyFields = [], masterLinkFields = []
- rowidField = None, primarykeyFields = []):
+ masterRecord = None, masterKeyFields = [], masterLinkFields = [],
+ rowidField = None, primarykeyFields = [], dataSource = None):
"""
Create a new RecordSet instance.
@@ -67,6 +68,7 @@
generated by the backend, if available.
@param primaryKeyFields: List of field names that make up a unique key, if
available.
+ @param dataSource: GDataSource instance to notify of data events.
"""
self.__connection = connection
@@ -76,15 +78,21 @@
self.__masterRecord = masterRecord
self.__masterKeyFields = masterKeyFields
self.__masterLinkFields = masterLinkFields
- self.__rowidField = rowidField # Field name of the rowid
- self.__primarykeyFields = primarykeyFields # Field names of the primarykey
+ self.__rowidField = rowidField
+ self.__primarykeyFields = primarykeyFields
+ if dataSource is not None:
+ self.__dataSource = weakref.proxy (dataSource)
+ else:
+ self.__dataSource = None
+
# Record status
# New records: 'empty' -(setField)-> 'inserted' -(delete)-> 'void'
# Existing records: 'clean' -(setField)-> 'modified' -(delete)-> 'deleted'
self.__status = 'clean'
- # The ResultSet this RecordSet is a part of - FIXME: should be private
+ # The ResultSet this RecordSet is a part of - FIXME: this should go away,
+ # but is still used in GFInstance (!)
self._parent = parent
# The field values
@@ -200,9 +208,8 @@
self.__status = 'inserted'
elif self.__status == 'clean':
self.__status = 'modified'
- do = self._parent._dataObject
- if hasattr (do, '_dataSource'):
- do._dataSource._onModification (self)
+ if self.__dataSource is not None:
+ self.__dataSource._onModification (self)
# ---------------------------------------------------------------------------
@@ -381,33 +388,29 @@
status = self.__status
# Call the hooks for commit-level hooks
- if hasattr(self._parent._dataObject,'_dataSource'):
+ if self.__dataSource is not None:
+ # A trigger code could change the status from empty/inserted/modified to
+ # deleted. In that case, both triggers would be called.
if self.__status in ['empty', 'inserted']:
- self._parent._dataObject._dataSource._beforeCommitInsert(self)
- elif self.__status == 'modified':
- self._parent._dataObject._dataSource._beforeCommitUpdate(self)
- elif self.__status == 'deleted':
- self._parent._dataObject._dataSource._beforeCommitDelete(self)
+ self.__dataSource._beforeCommitInsert (self)
+ if self.__status == 'modified':
+ self.__dataSource._beforeCommitUpdate (self)
+ if self.__status == 'deleted':
+ self.__dataSource._beforeCommitDelete (self)
- #
- # If the record status changed while we were doing the triggers,
- # start from the beginning and run the triggers again.
- #
- if status != self.__status:
- self.post(recordNumber)
- return
+ # Check for empty primary key and set with the sequence value if so
+ # TODO: Move this to GDataSource
+ if self.__status in ['empty', 'inserted']:
+ if hasattr (self.__dataSource, 'primarykey') and \
+ hasattr (self.__dataSource, 'primarykeyseq'):
+ if self.__dataSource.primarykey and \
+ ',' not in self.__dataSource.primarykey and \
+ self.__dataSource.primarykeyseq and \
+ hasattr (self.__connection, 'getsequence') and \
+ self.getField (self.__dataSource.primarykey) is None:
+ pk = self.__connection.getsequence
(self.__dataSource.primarykeyseq)
+ self.setField (self.__dataSource.primarykey, pk)
- #
- # Check for empty primary key and set with the sequence value if so
- #
- if self.__status in ['empty', 'inserted']:
- do = self._parent._dataObject
- if hasattr(do,'primarykey') and hasattr(do,'primarykeyseq'):
- if do.primarykey and do.primarykeyseq and ',' not in do.primarykey and
\
- hasattr(self.__connection,'getsequence') and \
- self.getField(do.primarykey) is None:
-
self.setField(do.primarykey,self.__connection.getsequence(do.primarykeyseq))
-
# If we have a connection (i.e. we aren't static or unbound), do the post
if self.__connection is not None:
if self.__status == 'deleted':
@@ -457,8 +460,7 @@
"""
# First, requery ourselves
- ds = self._parent._dataObject._dataSource
- if ds and ds.requery:
+ if self.__dataSource is not None and self.__dataSource.requery:
if self.__rowidField or self.__primarykeyFields:
self.__requery (self.__boundFields)
Modified: trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2005-04-15
09:32:13 UTC (rev 7370)
+++ trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2005-04-15
10:23:01 UTC (rev 7371)
@@ -163,7 +163,8 @@
masterKeyFields = self._dataObject._masterfields,
masterLinkFields = self._dataObject._detailfields,
rowidField = self.__rowidField,
- primarykeyFields = self.__primarykeyFields)
+ primarykeyFields = self.__primarykeyFields,
+ dataSource = self._dataObject._dataSource)
if position is None:
self._cachedRecords.append (record)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r7371 - trunk/gnue-common/src/datasources/drivers/Base,
reinhard <=