[Zodb-checkins] CVS: Zope2/lib/python/ZODB - TransactionalUndoStorage.py:1.8
jeremy@digicool.com
jeremy@digicool.com
Fri, 27 Apr 2001 16:59:48 -0400 (EDT)
Update of /cvs-repository/Zope2/lib/python/ZODB/tests
In directory korak:/tmp/cvs-serv20500
Modified Files:
TransactionalUndoStorage.py
Log Message:
Update to support ZEO
The ZEO version of the storage API returns serial numbers for stores
in a different way. These changes are the minimum needed to make the
tests handle the ZEO way of doing things; I assume they still work
with non-ZEO storage.
XXX These tests should be cleaned up to all use
_multi_obj_transactions(), which should probably get a different name,
like _domultistore().
--- Updated File TransactionalUndoStorage.py in package Zope2/lib/python/ZODB --
--- TransactionalUndoStorage.py 2001/04/13 19:11:24 1.7
+++ TransactionalUndoStorage.py 2001/04/27 20:59:47 1.8
@@ -2,6 +2,7 @@
# must pass these tests.
import pickle
+import types
from ZODB import POSException
ZERO = '\0'*8
@@ -9,6 +10,41 @@
class TransactionalUndoStorage:
+
+ def _transaction_begin(self):
+ self.__serials = {}
+
+ def _transaction_store(self, oid, rev, data, vers, trans):
+ r = self._storage.store(oid, rev, data, vers, trans)
+ if r:
+ if type(r) == types.StringType:
+ self.__oids[oid] = r
+ else:
+ for oid, serial in r:
+ self.__serials[oid] = serial
+
+ def _transaction_vote(self, trans):
+ r = self._storage.tpc_vote(trans)
+ if r:
+ for oid, serial in r:
+ self.__serials[oid] = serial
+
+ def _transaction_newserial(self, oid):
+ return self.__serials[oid]
+
+ def _multi_obj_transaction(self, objs):
+ newrevs = {}
+ self._storage.tpc_begin(self._transaction)
+ self._transaction_begin()
+ for oid, rev, data in objs:
+ self._transaction_store(oid, rev, data, '', self._transaction)
+ newrevs[oid] = None
+ self._transaction_vote(self._transaction)
+ self._storage.tpc_finish(self._transaction)
+ for oid in newrevs.keys():
+ newrevs[oid] = self._transaction_newserial(oid)
+ return newrevs
+
def checkSimpleTransactionalUndo(self):
oid = self._storage.new_oid()
revid = self._dostore(oid, data=23)
@@ -128,18 +164,24 @@
revid1 = revid2 = ZERO
# Store two objects in the same transaction
self._storage.tpc_begin(self._transaction)
- revid1 = self._storage.store(oid1, revid1, p31, '', self._transaction)
- revid2 = self._storage.store(oid2, revid2, p51, '', self._transaction)
+ self._transaction_begin()
+ self._transaction_store(oid1, revid1, p31, '', self._transaction)
+ self._transaction_store(oid2, revid2, p51, '', self._transaction)
# Finish the transaction
- self._storage.tpc_vote(self._transaction)
+ self._transaction_vote(self._transaction)
+ revid1 = self._transaction_newserial(oid1)
+ revid2 = self._transaction_newserial(oid2)
self._storage.tpc_finish(self._transaction)
assert revid1 == revid2
# Update those same two objects
self._storage.tpc_begin(self._transaction)
- revid1 = self._storage.store(oid1, revid1, p32, '', self._transaction)
- revid2 = self._storage.store(oid2, revid2, p52, '', self._transaction)
+ self._transaction_begin()
+ self._transaction_store(oid1, revid1, p32, '', self._transaction)
+ self._transaction_store(oid2, revid2, p52, '', self._transaction)
# Finish the transaction
- self._storage.tpc_vote(self._transaction)
+ self._transaction_vote(self._transaction)
+ revid1 = self._transaction_newserial(oid1)
+ revid2 = self._transaction_newserial(oid2)
self._storage.tpc_finish(self._transaction)
assert revid1 == revid2
# Make sure the objects have the current value
@@ -169,27 +211,22 @@
oid2 = self._storage.new_oid()
revid1 = revid2 = ZERO
# Store two objects in the same transaction
- self._storage.tpc_begin(self._transaction)
- revid1 = self._storage.store(oid1, revid1, p30, '', self._transaction)
- revid2 = self._storage.store(oid2, revid2, p50, '', self._transaction)
- # Finish the transaction
- self._storage.tpc_vote(self._transaction)
- self._storage.tpc_finish(self._transaction)
- assert revid1 == revid2
+ d = self._multi_obj_transaction([(oid1, revid1, p30),
+ (oid2, revid2, p50),
+ ])
+ assert d[oid1] == d[oid2]
# Update those same two objects
- self._storage.tpc_begin(self._transaction)
- revid1 = self._storage.store(oid1, revid1, p31, '', self._transaction)
- revid2 = self._storage.store(oid2, revid2, p51, '', self._transaction)
- # Finish the transaction
- self._storage.tpc_vote(self._transaction)
- self._storage.tpc_finish(self._transaction)
+ d = self._multi_obj_transaction([(oid1, d[oid1], p31),
+ (oid2, d[oid2], p51),
+ ])
+ assert d[oid1] == d[oid2]
# Update those same two objects
- self._storage.tpc_begin(self._transaction)
- revid1 = self._storage.store(oid1, revid1, p32, '', self._transaction)
- revid2 = self._storage.store(oid2, revid2, p52, '', self._transaction)
- # Finish the transaction
- self._storage.tpc_vote(self._transaction)
- self._storage.tpc_finish(self._transaction)
+ d = self._multi_obj_transaction([(oid1, d[oid1], p32),
+ (oid2, d[oid2], p52),
+ ])
+ assert d[oid1] == d[oid2]
+ revid1 = self._transaction_newserial(oid1)
+ revid2 = self._transaction_newserial(oid2)
assert revid1 == revid2
# Make sure the objects have the current value
data, revid1 = self._storage.load(oid1, '')
@@ -206,8 +243,8 @@
self._storage.tpc_vote(self._transaction)
self._storage.tpc_finish(self._transaction)
# We get the finalization stuff called an extra time:
- self._storage.tpc_vote(self._transaction)
- self._storage.tpc_finish(self._transaction)
+## self._storage.tpc_vote(self._transaction)
+## self._storage.tpc_finish(self._transaction)
assert len(oids) == 2
assert len(oids1) == 2
assert oid1 in oids and oid2 in oids
@@ -239,11 +276,14 @@
revid2 = self._dostore(oid2, data=51)
# Update those same two objects
self._storage.tpc_begin(self._transaction)
- revid1 = self._storage.store(oid1, revid1, p32, '', self._transaction)
- revid2 = self._storage.store(oid2, revid2, p52, '', self._transaction)
+ self._transaction_begin()
+ self._transaction_store(oid1, revid1, p32, '', self._transaction)
+ self._transaction_store(oid2, revid2, p52, '', self._transaction)
# Finish the transaction
- self._storage.tpc_vote(self._transaction)
+ self._transaction_vote(self._transaction)
self._storage.tpc_finish(self._transaction)
+ revid1 = self._transaction_newserial(oid1)
+ revid2 = self._transaction_newserial(oid2)
assert revid1 == revid2
# Now attempt to undo the transaction containing two objects
info = self._storage.undoInfo()
@@ -261,11 +301,14 @@
# Like the above, but this time, the second transaction contains only
# one object.
self._storage.tpc_begin(self._transaction)
- revid1 = self._storage.store(oid1, revid1, p33, '', self._transaction)
- revid2 = self._storage.store(oid2, revid2, p53, '', self._transaction)
+ self._transaction_begin()
+ self._transaction_store(oid1, revid1, p33, '', self._transaction)
+ self._transaction_store(oid2, revid2, p53, '', self._transaction)
# Finish the transaction
- self._storage.tpc_vote(self._transaction)
+ self._transaction_vote(self._transaction)
self._storage.tpc_finish(self._transaction)
+ revid1 = self._transaction_newserial(oid1)
+ revid2 = self._transaction_newserial(oid2)
assert revid1 == revid2
# Update in different transactions
revid1 = self._dostore(oid1, revid=revid1, data=34)
@@ -309,10 +352,13 @@
p81, p82, p91, p92 = map(pickle.dumps, (81, 82, 91, 92))
self._storage.tpc_begin(self._transaction)
- revid1 = self._storage.store(oid1, revid1, p81, '', self._transaction)
- revid2 = self._storage.store(oid2, revid2, p91, '', self._transaction)
- self._storage.tpc_vote(self._transaction)
+ self._transaction_begin()
+ self._transaction_store(oid1, revid1, p81, '', self._transaction)
+ self._transaction_store(oid2, revid2, p91, '', self._transaction)
+ self._transaction_vote(self._transaction)
self._storage.tpc_finish(self._transaction)
+ revid1 = self._transaction_newserial(oid1)
+ revid2 = self._transaction_newserial(oid2)
assert revid1 == revid2
# Make sure the objects have the expected values
data, revid_11 = self._storage.load(oid1, '')