AW: [Zope3-dev] Re: [ZODB-Dev] Problems with ZODB3-3.9.0_dev_r77011
Hi Tobias Auftrag von Gary Poster Gesendet: Donnerstag, 19. Juli 2007 15:53 An: Tobias Rodäbel [...] zope.app.keyreference-3.5.0_dev_r77018-py2.4.egg requires ZODB3=3.9.0-dev-r77011 But there might be a caching problem within ZODB3-3.9.0 dev r77011, my debug session tells: /development/Zope3/MyProject/eggs/ZODB3-3.9.0_dev_r77011-py2.4- macosx-10.4-ppc.egg/ZODB/Connection.py(644)_store_objects() - raise (Pdb) obj zope.app.file.image.Image object at 0x3faadb0 (Pdb) oid '\x00\x00\x00\x00\x00\x00\x00\xc6' (Pdb) self._cache[oid] *** KeyError: '\x00\x00\x00\x00\x00\x00\x00\xc6' (Pdb) self._cache[oid] = obj *** TypeError: Cache values must be persistent objects. But zope.app.file.image.Image should be persistent. [...] Looking forward to some hints or help, Hi Tobias. The ZODB 3.9 dev version is only different from 3.8 in some conflict resolution code, for which I am responsible. Some thoughts. I'm pretty shure you ve got a LocationProxy arround your object because the zope.app.file doesn't implement ILocation. I've had this issue too and removed the location before I stored the object.With e.g. @apply def photo(): See interfaces.IPersonalData def get(self): photo = self._photo if zope.proxy.isProxy(photo): photo = zope.proxy.getProxiedObject(photo) if photo is not None: proxy = LocationProxy(photo) proxy.__name__ = 'photo' proxy.__parent__ = self return proxy def set(self, photo): if photo is not None: # remove location proxy because the ZODB doesn't like it anymore photo = zope.proxy.getProxiedObject(photo) self._photo = photo return property(get, set) Note: This sample only works in our project because the name is allways ``photo``. Gary - This happens because of the call in ZODB.Connection.py $Id: Connection.py 75693 2007-05-11 22:18:37Z jim $ cool that we have the revision info in the file header ;-) line: 627 except: # Dang, I bet it's wrapped: # TODO: Deprecate, then remove, this. if hasattr(obj, 'aq_base'): self._cache[oid] = obj.aq_base else: raise My question is, can we improve the method: if hasattr(obj, 'aq_base') and remove the proxy with a method that works? Tobias -- Can you agree this? And probably tell us if the obj is a proxy? You can check this by get the type of the object. e.g. type(obj) Regards Roger Ineichen Gary___ Zope3-dev mailing list Zope3-dev@zope.org Unsub: http://mail.zope.org/mailman/options/zope3-dev/dev%40projekt01.ch ___ Zope3-dev mailing list Zope3-dev@zope.org Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com
Re: AW: [Zope3-dev] Re: [ZODB-Dev] Problems with ZODB3-3.9.0_dev_r77011
On Jul 19, 2007, at 10:36 AM, Roger Ineichen wrote: Hi Tobias Auftrag von Gary Poster Gesendet: Donnerstag, 19. Juli 2007 15:53 An: Tobias Rodäbel [...] zope.app.keyreference-3.5.0_dev_r77018-py2.4.egg requires ZODB3=3.9.0-dev-r77011 But there might be a caching problem within ZODB3-3.9.0 dev r77011, my debug session tells: /development/Zope3/MyProject/eggs/ZODB3-3.9.0_dev_r77011-py2.4- macosx-10.4-ppc.egg/ZODB/Connection.py(644)_store_objects() - raise (Pdb) obj zope.app.file.image.Image object at 0x3faadb0 (Pdb) oid '\x00\x00\x00\x00\x00\x00\x00\xc6' (Pdb) self._cache[oid] *** KeyError: '\x00\x00\x00\x00\x00\x00\x00\xc6' (Pdb) self._cache[oid] = obj *** TypeError: Cache values must be persistent objects. But zope.app.file.image.Image should be persistent. [...] Looking forward to some hints or help, Hi Tobias. The ZODB 3.9 dev version is only different from 3.8 in some conflict resolution code, for which I am responsible. Some thoughts. I'm pretty shure you ve got a LocationProxy arround your object because the zope.app.file doesn't implement ILocation. Hey Roger. I bet you are right. ... Gary - This happens because of the call in ZODB.Connection.py $Id: Connection.py 75693 2007-05-11 22:18:37Z jim $ cool that we have the revision info in the file header ;-) line: 627 except: # Dang, I bet it's wrapped: # TODO: Deprecate, then remove, this. if hasattr(obj, 'aq_base'): self._cache[oid] = obj.aq_base else: raise My question is, can we improve the method: if hasattr(obj, 'aq_base') and remove the proxy with a method that works? I mentioned this to Jim. If the masking of the original exception doesn't appear to lose any useful information, he'd prefer something like if type(obj) is not obj.__class__: raise ValueError('object appears to be proxied', obj) else: raise IOW, don't guess, but give a more helpful error message Gary___ Zope3-dev mailing list Zope3-dev@zope.org Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com