[TransWarp] problem with commit and activated query-link

Ulrich Eck ueck at net-labs.de
Tue Feb 18 07:06:39 EST 2003

again it's me:

when i access the "folders" property of a folder before i add new
ones, i get an error on commit:
(i.o.w: when i access the Querylink and then change values the error happens)

>>> from peak.api import *
>>> from acmgr.api import *
>>> class TestServer(connection.IMAPServer):
...     connection = binding.bindTo('imap://jack-e:Strike@mail.net-labs.de')
>>> s = TestServer()
>>> storage.begin(s)
>>> f = s.folderDM[('INBOX',)]
>>> f.folders
[<acmgr.connection.imapmodel.IMAPFolder object at 0x835e2ac>, <acmgr.connection.imapmodel.IMAPFolder object at 
0x835e43c>, <acmgr.connection.imapmodel.IMAPFolder object at 0x835e504>, <acmgr.connection.imapmodel.IMAPFolder object 
at 0x835e5cc>, <acmgr.connection.imapmodel.IMAPFolder object at 0x835e694>, <acmgr.connection.imapmodel.IMAPFolder 
object at 0x835e824>, <acmgr.connection.imapmodel.IMAPFolder object at 0x835e8ec>]
>>> f1 = s.folderDM.newItem()
>>> f1.name = 'testing'
>>> f.addFolders(f1)
>>> f2 = s.folderDM.newItem()
>>> f2.name = 'sub01'
>>> f1.addFolders(f2)
>>> f3 = s.folderDM.newItem()
>>> f3.name = 'subsub01'
>>> f2.addFolders(f3)
>>> storage.commit(s)
_new INBOX.testing
_save: INBOX.testing
_new INBOX.testing.sub01
_save: INBOX.testing.sub01
_save: INBOX
_new INBOX.testing.sub01.subsub01
_save: INBOX.testing.sub01.subsub01
_save: INBOX.testing
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/usr/lib/python2.2/site-packages/peak/storage/transactions.py", line 20, in commitTransaction
  File "/usr/lib/python2.2/site-packages/peak/storage/transactions.py", line 223, in commit
  File "/usr/lib/python2.2/site-packages/peak/storage/transactions.py", line 183, in _prepare
    unready = [p for p in state.participants if not p.readyToVote(self)]
  File "/usr/lib/python2.2/site-packages/peak/storage/data_managers.py", line 498, in readyToVote
  File "/usr/lib/python2.2/site-packages/peak/storage/data_managers.py", line 444, in flush
    del dirty[key]
KeyError: 137744044

this probably happens because flush is called when oidFor and readyToVote is called.
the flush in oidFor already clears the dirty-flag, and the flush in readyToVote seems
not to get this right (dirty.values() seem to do something wrong in this case).

would a simple condition in flush():

if key in dirty:
  del dirty[key]

solve the problem (objects might have been saved twice in this case)
or is it a problem with my implementation?

Ulrich Eck
net-labs Systemhaus GmbH
Ebersberger Str. 46
85570 Markt Schwaben
fon:   +49-8121-4747-11
fax:   +49-8121-4747-77
email: ueck at net-labs.de

More information about the PEAK mailing list