[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- r5812 - in trunk/gnue-appserver: . src,
johannes <=