Sektionen
Benutzerspezifische Werkzeuge
Sie sind hier: Startseite Support Dokumentation docs ZODB-Transaktionen im debug-Modus rückgängig machen

ZODB-Transaktionen im debug-Modus rückgängig machen

Wie kann ich meherere ZODB-Transaktionen im Zope-debug-Modus rückgängig machen?

Um mehere Transaktionen in der ZODB rückgängig zu machen, muss man im Prinzip mehrere einzelne Transaktionen in einer Schleife rückgängig machen.

Zum Ersten muss man herausfinden, wie viele Transaktionen man rückgängig machen möchte. Hierzu kann man das undoLog nutzen.

Hat man schließlich die Anzahl an Transaktionen, die rückgängig gemacht werden sollen, kann man sich die entsprechenden Transaktionsdaten wie folgt aus dem Undo-Log holen:

>>> from pprint import pprint as pp
>>> pp( app._p_jar._db.undoLog(0,100) )
[{'description': 'Installed package Products.ResourceRegistries',
'id': 'A4knk0Fvv2Y=',
'size': 1400L,
'time': 1285596675.3366828,
'user_name': ''},
{'description': 'Installed package Products.PlacelessTranslationService',
'id': 'A4knk0C3tnc=',
'size': 409390L,
'time': 1285596675.1681938,
'user_name': ''},
{'description': 'Installed package inqbus.plone.fastmemberproperties',
'id': 'A4knkzI8sxE=',
'size': 1380L,
'time': 1285596671.774322,
'user_name': ''},
 ...

Schließlich bleibt in Verbindung mit Python2.4 und dem Zope-Debug-Modus nur noch die Inline-Schleife, um über die so bezogene Liste zu iterieren - nicht unbeding schön, aber selten:

>>> [app._p_jar._db.undo(tr['id']) for tr in app._p_jar._db.undoLog(0,567)]
[None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
 None, None, None, None, None, None, None, None, None, None, None,
...

Entsprechend der Definition einer solchen Inline-Liste bekommt man nämlich eine Liste der  Rückgabewerte der undo(tr['id']) -Funktion - in diesem Fall None. Die Ausgabe kann man also ignorieren.

Schließlich wird der Vorgang noch mit einem commit beendet:

>>> import transaction as zt
>>> zt.commit()