Jan-Ole Esleben wrote:
security.declareProtected("Use TestPChanged", "test_internal") def test_internal(self, args=None, args2=None): "Called by test via XML-RPC" if args2: self.a.append(1) self._p_changed = 1 if not args: import xmlrpclib s = xmlrpclib.ServerProxy("http://USER:PASSWORD@localhost:8080/", allow_none=True) s.TestPChanged.test_internal(1) return self.a
security.declareProtected("Use TestPChanged", "test") def test(self, args2=None): "Called directly via ZOPE" if args2: self.a.append(1) self._p_changed = 1 import xmlrpclib s = xmlrpclib.ServerProxy("http://USER:PASSWORD@localhost:8080/", allow_none=True) return s.TPCDest.test_internal()
1. In the example, just setting _p_changed=1 does _not_ lead to a conflict error. With the ineffectual code above it (that never gets executed) it _does_. So there _is_ some implicit magical stuff going on and ZOPE tries to take care that only subobjects change (but incompletely)!
I strongly doubt it. Zope does not "inspect code". There must be a problem in your testing. Note that if self.a is a standard list, the self.a.append(1) doesn't have any impact on the persistence mechanism or transactions either.
2. You shouldn't use lists and dicts - it should say this "on the front page". It is never really mentioned in any way that intuitively leads to such problems as we are now talking about. It isn't very obvious that things work like this when you look at the documentation, and
You should understand the persistence mechanism of a framework before using it. Zope's is simple to understand in the case where you work with a single transaction. Here you have a remote server that does a callback to the local and thus starts a new transaction parallel to the current one. In addition it touches the same object. Frankly that's a bizarre use case, nothing is "simple" about it.
3. It is especially confusing that ZOPE behaves differently when using XML-RPC calls. From what you say, it should be the same within the ZOPE system as when using XML-RPC. It gets more complicated with XML-RPC though!
The successive XML-RPC call you describe provoke new transactions, surely you're aware of that? Whereas just calling a function of course doesn't. Florent -- Florent Guillaume, Nuxeo (Paris, France) Director of R&D +33 1 40 33 71 59 http://nuxeo.com fg@nuxeo.com