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