diff -r 7df3494ae657 -r 04034421b072 server/repository.py --- a/server/repository.py Fri Aug 14 09:20:33 2009 +0200 +++ b/server/repository.py Fri Aug 14 09:26:41 2009 +0200 @@ -41,7 +41,6 @@ from cubicweb.server.session import Session, InternalSession from cubicweb.server.querier import QuerierHelper from cubicweb.server.sources import get_source -from cubicweb.server.hooksmanager import HooksManager from cubicweb.server.hookhelper import rproperty @@ -173,8 +172,6 @@ self._type_source_cache = {} # cache (extid, source uri) -> eid self._extid_cache = {} - # create the hooks manager - self.hm = HooksManager(self.schema) # open some connections pools self._available_pools = Queue.Queue() self._available_pools.put_nowait(ConnectionsPool(self.sources)) @@ -185,7 +182,7 @@ # usually during repository creation self.warning("set fs instance'schema as bootstrap schema") config.bootstrap_cubes() - self.set_bootstrap_schema(self.config.load_schema()) + self.set_schema(self.config.load_schema(), resetvreg=False) # need to load the Any and CWUser entity types self.vreg.schema = self.schema etdirectory = join(CW_SOFTWARE_ROOT, 'entities') @@ -222,13 +219,13 @@ self.pools.append(ConnectionsPool(self.sources)) self._available_pools.put_nowait(self.pools[-1]) self._shutting_down = False + self.hm = vreg['hooks'] if not (config.creating or config.repairing): # call instance level initialisation hooks self.hm.call_hooks('server_startup', repo=self) # register a task to cleanup expired session self.looping_task(self.config['session-time']/3., self.clean_sessions) - CW_EVENT_MANAGER.bind('after-registry-load', self.reset_hooks) # internals ############################################################### @@ -248,22 +245,13 @@ # full reload of all appobjects self.vreg.reset() self.vreg.set_schema(schema) - self.reset_hooks() - - def reset_hooks(self): - self.hm.set_schema(self.schema) - self.hm.register_system_hooks(self.config) - # instance specific hooks - if self.config.instance_hooks: - self.info('loading instance hooks') - self.hm.register_hooks(self.config.load_hooks(self.vreg)) def fill_schema(self): """lod schema from the repository""" from cubicweb.server.schemaserial import deserialize_schema self.info('loading schema from the repository') appschema = CubicWebSchema(self.config.appid) - self.set_bootstrap_schema(self.config.load_bootstrap_schema()) + self.set_schema(self.config.load_bootstrap_schema(), resetvreg=False) self.debug('deserializing db schema into %s %#x', appschema.name, id(appschema)) session = self.internal_session() try: @@ -277,39 +265,10 @@ raise Exception('Is the database initialised ? (cause: %s)' % (ex.args and ex.args[0].strip() or 'unknown')), \ None, sys.exc_info()[-1] - self.info('set the actual schema') - # XXX have to do this since CWProperty isn't in the bootstrap schema - # it'll be redone in set_schema - self.set_bootstrap_schema(appschema) - # 2.49 migration - if exists(join(self.config.apphome, 'vc.conf')): - session.set_pool() - if not 'template' in file(join(self.config.apphome, 'vc.conf')).read(): - # remaning from cubicweb < 2.38... - session.execute('DELETE CWProperty X WHERE X pkey "system.version.template"') - session.commit() finally: session.close() + self.set_schema(appschema) self.config.init_cubes(self.get_cubes()) - self.set_schema(appschema) - - def set_bootstrap_schema(self, schema): - """disable hooks when setting a bootstrap schema, but restore - the configuration for the next time - """ - config = self.config - # XXX refactor - config.core_hooks = False - config.usergroup_hooks = False - config.schema_hooks = False - config.notification_hooks = False - config.instance_hooks = False - self.set_schema(schema, resetvreg=False) - config.core_hooks = True - config.usergroup_hooks = True - config.schema_hooks = True - config.notification_hooks = True - config.instance_hooks = True def start_looping_tasks(self): assert isinstance(self._looping_tasks, list), 'already started' @@ -578,7 +537,7 @@ user.clear_related_cache() self._sessions[session.id] = session self.info('opened %s', session) - self.hm.call_hooks('session_open', session=session) + self.hm.call_hooks('session_open', session) # commit session at this point in case write operation has been done # during `session_open` hooks session.commit() @@ -669,7 +628,7 @@ checkshuttingdown=checkshuttingdown) # operation uncommited before close are rollbacked before hook is called session.rollback() - self.hm.call_hooks('session_close', session=session) + self.hm.call_hooks('session_close', session) # commit session at this point in case write operation has been done # during `session_close` hooks session.commit() @@ -850,11 +809,11 @@ entity = source.before_entity_insertion(session, extid, etype, eid) entity._cw_recreating = True if source.should_call_hooks: - self.hm.call_hooks('before_add_entity', etype, session, entity) + self.hm.call_hooks('before_add_entity', session, entity=entity) # XXX add fti op ? source.after_entity_insertion(session, extid, entity) if source.should_call_hooks: - self.hm.call_hooks('after_add_entity', etype, session, entity) + self.hm.call_hooks('after_add_entity', session, entity=entity) if reset_pool: session.reset_pool() return eid @@ -875,12 +834,12 @@ self._type_source_cache[eid] = (etype, source.uri, extid) entity = source.before_entity_insertion(session, extid, etype, eid) if source.should_call_hooks: - self.hm.call_hooks('before_add_entity', etype, session, entity) + self.hm.call_hooks('before_add_entity', session, entity=entity) # XXX call add_info with complete=False ? self.add_info(session, entity, source, extid) source.after_entity_insertion(session, extid, entity) if source.should_call_hooks: - self.hm.call_hooks('after_add_entity', etype, session, entity) + self.hm.call_hooks('after_add_entity', session, entity=entity) else: # minimal meta-data session.execute('SET X is E WHERE X eid %(x)s, E name %(name)s', @@ -998,13 +957,13 @@ relations = [] # if inlined relations are specified, fill entity's related cache to # avoid unnecessary queries - for attr in entity.keys(): + entity.edited_attributes = set(entity) + for attr in entity.edited_attributes: rschema = eschema.subject_relation(attr) if not rschema.is_final(): # inlined relation relations.append((attr, entity[attr])) if source.should_call_hooks: - self.hm.call_hooks('before_add_entity', etype, session, entity) - entity.edited_attributes = entity.keys() + self.hm.call_hooks('before_add_entity', session, entity=entity) entity.set_defaults() entity.check(creation=True) source.add_entity(session, entity) @@ -1035,13 +994,13 @@ session.update_rel_cache_add(entity.eid, attr, value) # trigger after_add_entity after after_add_relation if source.should_call_hooks: - self.hm.call_hooks('after_add_entity', etype, session, entity) + self.hm.call_hooks('after_add_entity', session, entity=entity) # call hooks for inlined relations for attr, value in relations: - self.hm.call_hooks('before_add_relation', attr, session, - entity.eid, attr, value) - self.hm.call_hooks('after_add_relation', attr, session, - entity.eid, attr, value) + self.hm.call_hooks('before_add_relation', session, + eidfrom=entity.eid, rtype=attr, eidto=value) + self.hm.call_hooks('after_add_relation', session, + eidfrom=entity.eid, rtype=attr, eidto=value) return entity.eid def glob_update_entity(self, session, entity, edited_attributes): @@ -1074,19 +1033,18 @@ if previous_value == entity[attr]: previous_value = None else: - self.hm.call_hooks('before_delete_relation', attr, - session, entity.eid, attr, - previous_value) + self.hm.call_hooks('before_delete_relation', session, + eidfrom=entity.eid, rtype=attr, + eidto=previous_value) relations.append((attr, entity[attr], previous_value)) source = self.source_from_eid(entity.eid, session) if source.should_call_hooks: # call hooks for inlined relations for attr, value, _ in relations: - self.hm.call_hooks('before_add_relation', attr, session, - entity.eid, attr, value) + self.hm.call_hooks('before_add_relation', session, + eidfrom=entity.eid, rtype=attr, eidto=value) if not only_inline_rels: - self.hm.call_hooks('before_update_entity', etype, session, - entity) + self.hm.call_hooks('before_update_entity', session, entity=entity) source.update_entity(session, entity) if not only_inline_rels: if need_fti_update and self.do_fti: @@ -1094,15 +1052,14 @@ # one indexable attribute FTIndexEntityOp(session, entity=entity) if source.should_call_hooks: - self.hm.call_hooks('after_update_entity', etype, session, - entity) + self.hm.call_hooks('after_update_entity', session, entity=entity) if source.should_call_hooks: for attr, value, prevvalue in relations: # if the relation is already cached, update existant cache relcache = entity.relation_cached(attr, 'subject') if prevvalue: - self.hm.call_hooks('after_delete_relation', attr, session, - entity.eid, attr, prevvalue) + self.hm.call_hooks('after_delete_relation', session, + eidfrom=entity.eid, rtype=attr, eidto=prevvalue) if relcache is not None: session.update_rel_cache_del(entity.eid, attr, prevvalue) del_existing_rel_if_needed(session, entity.eid, attr, value) @@ -1111,8 +1068,8 @@ else: entity.set_related_cache(attr, 'subject', session.eid_rset(value)) - self.hm.call_hooks('after_add_relation', attr, session, - entity.eid, attr, value) + self.hm.call_hooks('after_add_relation', session, + eidfrom=entity.eid, rtype=attr, eidto=value) def glob_delete_entity(self, session, eid): """delete an entity and all related entities from the repository""" @@ -1125,11 +1082,12 @@ server.DEBUG |= (server.DBG_SQL | server.DBG_RQL | server.DBG_MORE) source = self.sources_by_uri[uri] if source.should_call_hooks: - self.hm.call_hooks('before_delete_entity', etype, session, eid) + entity = session.entity_from_eid(eid) + self.hm.call_hooks('before_delete_entity', session, entity=entity) self._delete_info(session, eid) source.delete_entity(session, etype, eid) if source.should_call_hooks: - self.hm.call_hooks('after_delete_entity', etype, session, eid) + self.hm.call_hooks('after_delete_entity', session, entity=entity) # don't clear cache here this is done in a hook on commit def glob_add_relation(self, session, subject, rtype, object): @@ -1139,14 +1097,14 @@ source = self.locate_relation_source(session, subject, rtype, object) if source.should_call_hooks: del_existing_rel_if_needed(session, subject, rtype, object) - self.hm.call_hooks('before_add_relation', rtype, session, - subject, rtype, object) + self.hm.call_hooks('before_add_relation', session, + eidfrom=subject, rtype=rtype, eidto=object) source.add_relation(session, subject, rtype, object) rschema = self.schema.rschema(rtype) session.update_rel_cache_add(subject, rtype, object, rschema.symetric) if source.should_call_hooks: - self.hm.call_hooks('after_add_relation', rtype, session, - subject, rtype, object) + self.hm.call_hooks('after_add_relation', session, + eidfrom=subject, rtype=rtype, eidto=object) def glob_delete_relation(self, session, subject, rtype, object): """delete a relation from the repository""" @@ -1154,8 +1112,8 @@ print 'DELETE relation', subject, rtype, object source = self.locate_relation_source(session, subject, rtype, object) if source.should_call_hooks: - self.hm.call_hooks('before_delete_relation', rtype, session, - subject, rtype, object) + self.hm.call_hooks('before_delete_relation', session, + eidfrom=subject, rtype=rtype, eidto=object) source.delete_relation(session, subject, rtype, object) rschema = self.schema.rschema(rtype) session.update_rel_cache_del(subject, rtype, object, rschema.symetric) @@ -1164,8 +1122,8 @@ # stored so try to delete both source.delete_relation(session, object, rtype, subject) if source.should_call_hooks: - self.hm.call_hooks('after_delete_relation', rtype, session, - subject, rtype, object) + self.hm.call_hooks('after_delete_relation', session, + eidfrom=subject, rtype=rtype, eidto=object) # pyro handling ###########################################################