[ZODB-Dev] problem with broken
Laurence Rowe
l at lrowe.co.uk
Wed Nov 5 05:31:21 EST 2008
Broken objects occur when the class for a pickled object cannot be
imported. To change the location of a class, you need to provide an
alias at the old location so that the object can be unpickled, i.e.
MyOldClassName = MyNewClassName. You can only remove MyOldClassName
after you have updated all of the pickles (with your code below).
Laurence
Adam GROSZER wrote:
> Hello,
>
> I'm having a problem with broken objects here.
> It's coming when I'm trying to evolve generations and the generation
> just touches all objects in the ZODB to store them again with the
> non-deprecated classes.
>
> The code is like this:
> storage = context.connection._storage
>
> next_oid = None
> n = 0
> while True:
> oid, tid, data, next_oid = storage.record_iternext(next_oid)
>
> obj = context.connection.get(oid)
> # Make sure that we tell all objects that they have been changed. Who
> # cares whether it is true! :-)
> obj._p_activate()
> obj._p_changed = True
>
> if next_oid is None:
> break
>
>
> 2008-11-04T19:40:16 ERROR SiteError http://localhost:8080/++etc++process/@@generations.html
> Traceback (most recent call last):
> File "F:\W\Zope3\src\zope\publisher\publish.py", line 133, in publish
> result = publication.callObject(request, obj)
> ...
> File "F:\W\Zope3\src\zope\tal\talinterpreter.py", line 343, in interpret
> handlers[opcode](self, args)
> File "F:\W\Zope3\src\zope\tal\talinterpreter.py", line 583, in do_setLocal_tal
> self.engine.setLocal(name, self.engine.evaluateValue(expr))
> File "F:\W\Zope3\src\zope\tales\tales.py", line 696, in evaluate
> return expression(self)
> File "F:\W\Zope3\src\zope\tales\expressions.py", line 217, in __call__
> return self._eval(econtext)
> File "F:\W\Zope3\src\zope\tales\expressions.py", line 211, in _eval
> return ob()
> File "F:\W\Zope3\src\zope\app\generations\browser\managers.py", line 182, in evolve
> transaction.commit()
> File "F:\W\Zope3\src\transaction\_manager.py", line 93, in commit
> return self.get().commit()
> File "F:\W\Zope3\src\transaction\_transaction.py", line 322, in commit
> self._commitResources()
> File "F:\W\Zope3\src\transaction\_transaction.py", line 416, in _commitResources
> rm.commit(self)
> File "F:\W\Zope3\src\ZODB\Connection.py", line 541, in commit
> self._commit(transaction)
> File "F:\W\Zope3\src\ZODB\Connection.py", line 586, in _commit
> self._store_objects(ObjectWriter(obj), transaction)
> File "F:\W\Zope3\src\ZODB\Connection.py", line 620, in _store_objects
> p = writer.serialize(obj) # This calls __getstate__ of obj
> File "F:\W\Zope3\src\ZODB\serialize.py", line 405, in serialize
> meta = klass, newargs()
> File "F:\W\Zope3\src\ZODB\broken.py", line 325, in __getnewargs__
> return self.__Broken_newargs__
> AttributeError: 'VocabularyManager' object has no attribute '__Broken_newargs__'
>
>
More information about the ZODB-Dev
mailing list