def zsa_savepoints(conn):
""" Place a savepoint at the start of the zope transaction
This means failed requests rollback to the db state when they began rather
than that at the start of the test.
"""
from transaction.interfaces import ISynchronizer
from zope.interface import implementer
@implementer(ISynchronizer)
class Savepoints(object):
def __init__(self, conn):
self.conn = conn
self.sp = None
self.state = None
def beforeCompletion(self, transaction):
pass
def afterCompletion(self, transaction):
# txn be aborted a second time in manager.begin()
if self.sp is None:
return
if self.state == 'commit':
self.state = 'completion'
self.sp.commit()
else:
self.state = 'abort'
self.sp.rollback()
self.sp = None
self.state = 'done'
def newTransaction(self, transaction):
self.state = 'new'
self.sp = self.conn.begin_nested()
self.state = 'begun'
transaction.addBeforeCommitHook(self._registerCommit)
def _registerCommit(self):
self.state = 'commit'
zsa_savepoints = Savepoints(conn)
import transaction
transaction.manager.registerSynch(zsa_savepoints)
yield zsa_savepoints
transaction.manager.unregisterSynch(zsa_savepoints)
评论列表
文章目录