commit-gnue
[Top][All Lists]
Advanced

[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)





reply via email to

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