--- On Tue, 8/19/08, Dieter Maurer <[EMAIL PROTECTED]> wrote:

> From: Dieter Maurer <[EMAIL PROTECTED]>
> Subject: Re: [Zope] Need some help to get rid of an InvalidObjectReference 
> exception
> To: [EMAIL PROTECTED]
> Cc: zope@zope.org
> Date: Tuesday, August 19, 2008, 11:16 AM
> chaouche yacine wrote at 2008-8-18 09:50 -0700:
> >Need some help to get rid of an InvalidObjectReference
> exception
> >In my zope product, when I try to put some specific
> object in the session, I get this :
> >
> >2008-08-18T14:51:02 ERROR(200) SiteError
> http://www.afdas.com:8091/noyauafdas/tests/testAdresses
> >Traceback (most recent call last):
> >  File
> "/opt/Zope-2.7/lib/python/ZPublisher/Publish.py",
> line 107, in publish
> >    transactions_manager.commit()
> >  File
> "/opt/Zope-2.7/lib/python/Zope/App/startup.py",
> line 222, in commit
> >    get_transaction().commit()
> >  File
> "/opt/Zope-2.7/lib/python/ZODB/Transaction.py",
> line 241, in commit
> >    ncommitted += self._commit_objects(objects)
> >  File
> "/opt/Zope-2.7/lib/python/ZODB/Transaction.py",
> line 356, in _commit_objects
> >    jar.commit(o, self)
> >  File
> "/opt/Zope-2.7/lib/python/ZODB/Connection.py",
> line 452, in commit
> >    dump(state)
> >InvalidObjectReference: Attempt to store an object from
> a foreign database connection
> 
> A given persistent object can only be in one (ZODB-)
> database, not in several
> databases at the same time.
> 
> You must copy the persistent object, when you want it to be
> stored
> (also) in another (ZODB-) database.
> 
> You can use the "_getCopy(destination)" method to
> create such
> a copy. "_getCopy" is defined by
> "OFS.CopySupport.CopySource" inherited
> by most Zope objects.
> 
> 
> 
> -- 
> Dieter

I narrowed the code to what is necessary to fire this exception, and here is 
the tarball for those who want to test it live 
http://yacinechaouche.googlepages.com/InvalidObjectReferenceExample.tgz

This is the directory contents :

+ InvalidObjectReferenceExample 
\_ __init__.py
\_ NonZODBObject.py
\_+ zmi
  \_ ZODBLivingObjectAddForm.pt
\_ ZODBLivingObject.py

================
NonZODBObject.py
================
class NonZODBObject:
    """
    Hello, i do not live in the ZODB
    """

    def __init__(self,p_context):
        """
        """
        # This is the evil line. 
        self.context = p_context

===================
ZODBLivingObject.py
===================
from OFS.SimpleItem import SimpleItem
from NonZODBObject import NonZODBObject


class ZODBLivingObject(SimpleItem) :
    """
    Hello, I live in the ZODB.
    """
    meta_type = "ZODBish"
    def __init__(self):
        """
        """
        self.id = "ZODBish"
        self.title = "ZODBish"

    def breakEverything(self):
        """
        """
        nonZODBish = NonZODBObject(self)
        # This line breaks everything.
        self.REQUEST.SESSION.set('breakish',nonZODBish)
        # This can be seen in the console if runzope
        print "it's me",nonZODBish.context
        return nonZODBish.context



__init__.py contains the code necessary to create a ZODBish in the ZODB through 
the ZMI
zmi contains the form that adds a ZODBish through the ZMI

As you see, I do not intentionally copy objects from one ZODB to another... 
Except maybe if the session has a separate storage and that this breaks 
everything. But then, I could not even use the _getCopy method because 
nonZODBish do not have a _p_jar attribute.

Any help or comment would be appreciated .


      
_______________________________________________
Zope maillist  -  Zope@zope.org
http://mail.zope.org/mailman/listinfo/zope
**   No cross posts or HTML encoding!  **
(Related lists - 
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope-dev )

Reply via email to