[ZODB-Dev] undo / non-undoable

harm kirchhoff harm.kirchhoff at mail.digital.co.jp
Sat Feb 14 23:26:34 EST 2004


When I lost some data and tried to wheel my ZODB back to the state 
before, I encountered that any transaction seemed to be undoable.
'UndoError: Undo error None: non-undoable transaction', no matter in 
which order I tried to undo the last 5 transactions.

 From my research in the internet and mailing lists, I can not explain 
this error. My understanding is, that if you try to wheel back, 
transaction by transaction starting from the most recent, there should 
generally not be a problem, because there can be no more recent 
transactions which depend on the changes made, since each transaction I 
undo is the most recent.

I isolated the problem in the attached code. Running this code produces 
this output:

 >>> reload(undo) ; test_undo1()
<module 'undo' from 'C:/Program Files/Zope262/Extensions\undo.py'>
[{'description': 'level 1.2.a created', 'user_name': '/ me', 'id': 
'A1MSHccYcIg=', 'time': 1076818426.6630001}, {'description': 'level 1 
created', 'user_name': '/ me', 'id': 'A1MSHccCmBE=', 'time': 
1076818426.6429996}, {'description': 'initial database creation', 
'user_name': '', 'id': 'A1MSHcbBDt0=', 'time': 1076818426.5829997}]
{'level1_b': {}, 'level1_a': {'sub_level1.2.a': '1.2.a'}}
True
 >>> test_undo2()
{'level1_b': {}, 'level1_a': {'sub_level1.2.a': '1.2.a'}}
[{'description': 'level 1.2.a created', 'user_name': '/ me', 'id': 
'A1MSHccYcIg=', 'time': 1076818426.6630001}, {'description': 'level 1 
created', 'user_name': '/ me', 'id': 'A1MSHccCmBE=', 'time': 
1076818426.6429996}, {'description': 'initial database creation', 
'user_name': '', 'id': 'A1MSHcbBDt0=', 'time': 1076818426.5829997}]
willl try to undo: A1MSHccYcIg=
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in ?
    test_undo2()
  File "C:/Program Files/Zope262/Extensions/undo.py", line 39, in test_undo2
    storage.undo( log[0] ['id'] )
  File "C:\PROGRA~1\Python23\Lib\site-packages\ZODB\BaseStorage.py", 
line 221, in undo
    raise POSException.UndoError, 'non-undoable transaction'
UndoError: Undo error None: non-undoable transaction

Code  :  =============================================================

 
import ZODB
from   ZODB import FileStorage, DB

import pprint

def test_undo1():
    root,connection,db,storage = open_zodb('C:/temp/test_zodb.fs')
    try:   
        root['level1_a'] = {}
        root['level1_b'] = {}

        root._p_changed = 1
        get_transaction().note('level 1 created')     # a message for 
the log
        get_transaction().setUser('me')               # the user, who 
made the changes
        get_transaction().commit()

        root['level1_a'] = {'sub_level1.2.a' : '1.2.a'}

        root._p_changed = 1
        get_transaction().note('level 1.2.a created')     # a message 
for the log
        get_transaction().setUser('me')               # the user, who 
made the changes
        get_transaction().commit()

        print storage.undoLog(0, 20)
        print root
    finally:
        close_zodb( (root,connection,db,storage) )

    return True

def test_undo2():
    root,connection,db,storage = open_zodb('C:/temp/test_zodb.fs')
    try:
        print root
        log = storage.undoLog(0, 20)
        print log
        print 'willl try to undo:',log[0] ['id']
        storage.undo( log[0] ['id'] )
    finally:
        close_zodb( (root,connection,db,storage) )
    return True

def open_zodb(Path):
    "Open ZODB."

    storage     = FileStorage.FileStorage(Path)
    db          = DB(storage)
    connection  = db.open()
    root      = connection.root()
    return (root,connection,db,storage)
    
def close_zodb(DataBase):
    "Closes the ZODB."

    DataBase[1].close()
    DataBase[2].close()
    DataBase[3].close()
    return True






More information about the ZODB-Dev mailing list