[Zope] Catch Object Changes
    Holger Schmidt 
    hs at keppler-it.de
       
    Sun Nov 30 11:16:43 EST 2003
    
    
  
Hello,
am Freitag, 28. November 2003 um 22:44 schrieben Sie:
DM> Holger Schmidt wrote at 2003-11-28 01:47 +0100:
 >> I have a list of objects.
 >> The list can contain objects like Folders, PropertyObjects or just every
 >> product that you have installed (but has to be accessible via the ZMI).
 >> 
 >> My problem is that I want to do some XML-RPC to another Zope instance
 >> whenever some object of my list has changed (the XML-RPC depends on
 >> the object which has changed, that means that I also need to get the
 >> (commited?) changed object at this time).
 >> 
 >> My idea to solve this problem:
 >> 1.) get to know when ANY object in Zope is changed
 >> 2.) check if this object is in my list
 >> 3.) if the list contains the object: start a thread managing the XML-RPC
 >> 
 >> Problem is step 1 ... how can Zope tell me that ANY object is changed ...?
DM> Looks like you want a specialized transaction or ZODB connection.
DM>   Whenever an object is changed, it registers with the transaction.
DM>   When the transaction is about to commit, it informs
DM>   the object's ZODB connection that the object was modified.
DM>   Zope uses a two level commit protocol, thus one affected
DM>   connection may vote against the commit.
DM>   This means, the hook you are looking for is somewhere in
DM>   transaction or two level commit handling.
do you mean a monkey-patch like this?
or is this bad for any reasons ...?
--------------------------------------------------------------------
--------------------------------------------------------------------
from ZODB import Connection
old_commit = Connection.Connection.commit
def new_commit(self, object, transaction):
  print "catched ZODB-Modification (commit) ..."
  old_commit(self, object, transaction)
Connection.Connection.commit = new_commit
old_commit_sub = Connection.Connection.commit_sub
def new_commit_sub(self, t):
  print "catched ZODB-Modification (commit_sub) ..."
  old_commit_sub(self, t)
Connection.Connection.commit_sub = new_commit_sub
--------------------------------------------------------------------
--------------------------------------------------------------------
I patched the commit and the commit_sub because I think these methods
are called after 2PC has succeded, has it?
-- 
Thanks,
Holger
    
    
More information about the Zope
mailing list