fix relation registry bug concerning persistent storage of relation objects
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3265 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
		
							parent
							
								
									fc6fc2b77c
								
							
						
					
					
						commit
						f45a870c27
					
				
					 1 changed files with 34 additions and 3 deletions
				
			
		| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#  Copyright (c) 2005 Helmut Merz helmutm@cy55.de
 | 
					#  Copyright (c) 2009 Helmut Merz helmutm@cy55.de
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#  This program is free software; you can redistribute it and/or modify
 | 
					#  This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
#  it under the terms of the GNU General Public License as published by
 | 
					#  it under the terms of the GNU General Public License as published by
 | 
				
			||||||
| 
						 | 
					@ -22,6 +22,8 @@ Implementation of the utilities needed for the relations package.
 | 
				
			||||||
$Id$
 | 
					$Id$
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from logging import getLogger
 | 
				
			||||||
 | 
					from BTrees.IOBTree import IOBTree
 | 
				
			||||||
from persistent import Persistent
 | 
					from persistent import Persistent
 | 
				
			||||||
from persistent.interfaces import IPersistent
 | 
					from persistent.interfaces import IPersistent
 | 
				
			||||||
from zope import component
 | 
					from zope import component
 | 
				
			||||||
| 
						 | 
					@ -115,6 +117,12 @@ class RelationRegistry(Catalog):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    implements(IRelationRegistry)
 | 
					    implements(IRelationRegistry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    relations = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, *args, **kw):
 | 
				
			||||||
 | 
					        super(RelationRegistry, self).__init__(*args, **kw)
 | 
				
			||||||
 | 
					        self.relations = IOBTree()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setupIndexes(self):
 | 
					    def setupIndexes(self):
 | 
				
			||||||
        for idx in ('relationship', 'first', 'second', 'third'):
 | 
					        for idx in ('relationship', 'first', 'second', 'third'):
 | 
				
			||||||
            if idx not in self:
 | 
					            if idx not in self:
 | 
				
			||||||
| 
						 | 
					@ -124,12 +132,35 @@ class RelationRegistry(Catalog):
 | 
				
			||||||
        if getattr(relation, '__parent__', None) is None:
 | 
					        if getattr(relation, '__parent__', None) is None:
 | 
				
			||||||
            # Allow the IntIds utility to get a DB connection:
 | 
					            # Allow the IntIds utility to get a DB connection:
 | 
				
			||||||
            relation.__parent__ = self
 | 
					            relation.__parent__ = self
 | 
				
			||||||
        self.index_doc(component.getUtility(IIntIds).register(relation), relation)
 | 
					        uid = component.getUtility(IIntIds).register(relation)
 | 
				
			||||||
 | 
					        self.index_doc(uid, relation)
 | 
				
			||||||
 | 
					        if self.relations is not None:
 | 
				
			||||||
 | 
					            self.relations[uid] = relation
 | 
				
			||||||
 | 
					            logger = getLogger('cybertools.relation.registry')
 | 
				
			||||||
 | 
					            logger.info('added relation with uid %i.' % uid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def unregister(self, relation):
 | 
					    def unregister(self, relation):
 | 
				
			||||||
        self.unindex_doc(component.getUtility(IIntIds).getId(relation))
 | 
					        uid = component.getUtility(IIntIds).getId(relation)
 | 
				
			||||||
 | 
					        self.unindex_doc(uid)
 | 
				
			||||||
 | 
					        if self.relations is not None and uid in self.relations:
 | 
				
			||||||
 | 
					            del self.relations[uid]
 | 
				
			||||||
 | 
					            logger = getLogger('cybertools.relation.registry')
 | 
				
			||||||
 | 
					            logger.info('removed relation with uid %i.' % uid)
 | 
				
			||||||
        notify(RelationInvalidatedEvent(relation))
 | 
					        notify(RelationInvalidatedEvent(relation))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def cleanupRelations(self):
 | 
				
			||||||
 | 
					        logger = getLogger('cybertools.relation.registry.cleanup')
 | 
				
			||||||
 | 
					        intids = component.getUtility(IIntIds)
 | 
				
			||||||
 | 
					        if self.relations is not None:
 | 
				
			||||||
 | 
					            logger.info('%i relations currently stored.' % len(self.relations))
 | 
				
			||||||
 | 
					        self.relations = IOBTree()
 | 
				
			||||||
 | 
					        result = self.apply(dict(relationship='*'))
 | 
				
			||||||
 | 
					        logger.info('%i relations found.' % len(result))
 | 
				
			||||||
 | 
					        for idx, uid in enumerate(result):
 | 
				
			||||||
 | 
					            relation = intids.getObject(uid)
 | 
				
			||||||
 | 
					            self.relations[uid] = relation
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getUniqueIdForObject(self, obj):
 | 
					    def getUniqueIdForObject(self, obj):
 | 
				
			||||||
        if obj == '*': # wild card
 | 
					        if obj == '*': # wild card
 | 
				
			||||||
            return '*'
 | 
					            return '*'
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue