commit-gnue
[Top][All Lists]
Advanced

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

r5812 - in trunk/gnue-appserver: . src


From: johannes
Subject: r5812 - in trunk/gnue-appserver: . src
Date: Thu, 13 May 2004 11:39:28 -0500 (CDT)

Author: johannes
Date: 2004-05-13 11:39:26 -0500 (Thu, 13 May 2004)
New Revision: 5812

Modified:
   trunk/gnue-appserver/BUGS
   trunk/gnue-appserver/src/data.py
Log:
Perform inserts and deletes in the same order as called


Modified: trunk/gnue-appserver/BUGS
===================================================================
--- trunk/gnue-appserver/BUGS   2004-05-13 11:51:19 UTC (rev 5811)
+++ trunk/gnue-appserver/BUGS   2004-05-13 16:39:26 UTC (rev 5812)
@@ -7,7 +7,3 @@
 
 * Operations on the Session Manager interface are not atomar
 
-* Inserts that are committed at the same time are sent to the database in
-  random order. This means that, in case newly inserted instances reference
-  each other, the database might throw a foreign key violation.
-

Modified: trunk/gnue-appserver/src/data.py
===================================================================
--- trunk/gnue-appserver/src/data.py    2004-05-13 11:51:19 UTC (rev 5811)
+++ trunk/gnue-appserver/src/data.py    2004-05-13 16:39:26 UTC (rev 5812)
@@ -332,8 +332,10 @@
     checktype (database, StringType)
 
     self.__connections = connections
-    self.__database = database
-    self.__cache = _cache ()
+    self.__database    = database
+    self.__cache       = _cache ()
+    self.__inserted    = []
+    self.__deleted     = []
 
   # ---------------------------------------------------------------------------
   # Create a recordset from a query
@@ -420,6 +422,8 @@
     r = record (self.__cache, self.__connections, self.__database, table, id)
     self.__cache.write (table, id, u'gnue_id', None, 0)  # old id is None
     self.__cache.write (table, id, u'gnue_id', id, 1)    # new id
+
+    self.__inserted.append ((table, id))
     return r
 
   # ---------------------------------------------------------------------------
@@ -440,6 +444,7 @@
     if not self.__cache.has (table, row, u'gnue_id'):    # not yet in cache
       self.__cache.write (table, row, u'gnue_id', row, 0)
     self.__cache.write (table, row, u'gnue_id', None, 1)
+    self.__deleted.append ((table, row))
 
   # ---------------------------------------------------------------------------
   # Find a record
@@ -491,20 +496,28 @@
     """
 
     tables = self.__cache.dirtyTables ()
+
+    # first perform all inserts
+    for (table, row) in self.__inserted:
+      fields = tables [table] [row]
+      resultSet = _createEmptyResultSet (self.__connections,
+                                         self.__database,
+                                         table, fields.keys ())
+      resultSet.insertRecord ()
+
+      for (field, value) in fields.items ():
+         resultSet.current.setField (field, value)
+
+      resultSet.post ()
+
+    self.__inserted = []
+
+    # second perform all updates
     for (table, rows) in tables.items ():
       for (row, fields) in rows.items ():
         status = self.__cache.status (table, row)
 
-        if status == 'inserted':
-          resultSet = _createEmptyResultSet (self.__connections,
-                                             self.__database,
-                                             table, fields.keys ())
-          resultSet.insertRecord ()
-
-          for (field, value) in fields.items ():
-            resultSet.current.setField (field, value)
-
-        elif status == 'changed':
+        if status == 'changed':
           # TODO: gnue-common should provide a method for updating a record
           # without reading it first. Until that is done, we have to create a
           # temporary resultSet for every record we update
@@ -514,17 +527,21 @@
           for (field, value) in fields.items ():
             resultSet.current.setField (field, value)
 
-        elif status == 'deleted':
-          # TODO: gnue-common should provide a method for deleting a record
-          # without reading it first. Until that is done, we have to create a
-          # temporary resultSet for every record we delete
-          resultSet = _find (self.__connections, self.__database, table, row,
-                             [u'gnue_id'])
-          resultSet.current.delete ()
-
-        if status != '':
           resultSet.post ()
 
+    # perform all deletes
+    for (table, row) in self.__deleted:
+      # TODO: gnue-common should provide a method for deleting a record
+      # without reading it first. Until that is done, we have to create a
+      # temporary resultSet for every record we delete
+      resultSet = _find (self.__connections, self.__database, table, row,
+                         [u'gnue_id'])
+      resultSet.current.delete ()
+      resultSet.post ()
+
+    self.__deleted = []
+
+
     # Commit the whole transaction
     self.__connections.commitAll ()
 
@@ -541,6 +558,9 @@
     Undo all uncommitted changes.
     """
 
+    self.__inserted = []
+    self.__deleted  = []
+
     # Send the rollback to the database. Although we have (most probably) not
     # written anything yet, we have to tell the database that a new transaction
     # starts now, so that commits from other sessions become valid now for us





reply via email to

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