# HG changeset patch # User sylvain.thenault@logilab.fr # Date 1242226876 -7200 # Node ID c77629112437ebc4bbefb92dcc68c1b394af4583 # Parent a3e2b079de00f512b4c5d8fa0c68b13f33d9d5f4 clear cache before synchronization diff -r a3e2b079de00 -r c77629112437 server/sources/pyrorql.py --- a/server/sources/pyrorql.py Wed May 13 17:00:42 2009 +0200 +++ b/server/sources/pyrorql.py Wed May 13 17:01:16 2009 +0200 @@ -27,19 +27,19 @@ class ReplaceByInOperator(Exception): def __init__(self, eids): self.eids = eids - + class PyroRQLSource(AbstractSource): """External repository source, using Pyro connection""" - + # boolean telling if modification hooks should be called when something is # modified in this source should_call_hooks = False # boolean telling if the repository should connect to this source during # migration connect_for_migration = False - + support_entities = None - + options = ( # XXX pyro-ns host/port ('pyro-ns-id', @@ -101,7 +101,7 @@ repository (default to 5 minutes).', 'group': 'pyro-source', 'inputlevel': 2, }), - + ) PUBLIC_KEYS = AbstractSource.PUBLIC_KEYS + ('base-url',) @@ -127,7 +127,7 @@ {'type' : 'int', 'sitewide': True, 'default': 0, 'help': _('timestamp of the latest source synchronization.'), - 'group': 'sources', + 'group': 'sources', }),) register_persistent_options(myoptions) self._query_cache = TimedCache(30) @@ -154,8 +154,8 @@ def init(self): """method called by the repository once ready to handle request""" interval = int(self.config.get('synchronization-interval', 5*60)) - self.repo.looping_task(interval, self.synchronize) - self.repo.looping_task(self._query_cache.ttl.seconds/10, self._query_cache.clear_expired) + self.repo.looping_task(interval, self.synchronize) + self.repo.looping_task(self._query_cache.ttl.seconds/10, self._query_cache.clear_expired) def synchronize(self, mtime=None): """synchronize content known by this repository with content in the @@ -169,6 +169,7 @@ mtime = self.last_update_time() updatetime, modified, deleted = extrepo.entities_modified_since(etypes, mtime) + self._query_cache.clear() repo = self.repo session = repo.internal_session() try: @@ -201,7 +202,7 @@ session.commit() finally: session.close() - + def _get_connection(self): """open and return a connection to the source""" nshost = self.config.get('pyro-ns-host') or self.repo.config['pyro-ns-host'] @@ -221,7 +222,7 @@ self.critical("can't get connection to source %s", self.uri, exc_info=1) return ConnectionWrapper() - + def check_connection(self, cnx): """check connection validity, return None if the connection is still valid else a new connection @@ -242,7 +243,7 @@ pass # try to reconnect return self.get_connection() - + def syntax_tree_search(self, session, union, args=None, cachekey=None, varmap=None): #assert not varmap, (varmap, union) @@ -253,10 +254,10 @@ results = self._syntax_tree_search(session, union, args) self._query_cache[rqlkey] = results return results - + def _syntax_tree_search(self, session, union, args): - """return result from this source for a rql query (actually from a rql - syntax tree and a solution dictionary mapping each used variable to a + """return result from this source for a rql query (actually from a rql + syntax tree and a solution dictionary mapping each used variable to a possible type). If cachekey is given, the query necessary to fetch the results (but not the results themselves) may be cached using this key. """ @@ -330,11 +331,11 @@ relations.append('X %s %%(%s)s' % (key, key)) kwargs[key] = val return relations, kwargs - + def add_entity(self, session, entity): """add a new entity to the source""" raise NotImplementedError() - + def update_entity(self, session, entity): """update an entity in the source""" relations, kwargs = self._entity_relations_and_kwargs(session, entity) @@ -354,7 +355,7 @@ cu.execute('SET X %s Y WHERE X eid %%(x)s, Y eid %%(y)s' % rtype, {'x': self.eid2extid(subject, session), 'y': self.eid2extid(object, session)}, ('x', 'y')) - + def delete_relation(self, session, subject, rtype, object): """delete a relation from the source""" cu = session.pool[self.uri] @@ -368,7 +369,7 @@ def __init__(self, source): self.source = source self.current_operator = None - + def _accept_children(self, node): res = [] for child in node.children: @@ -376,20 +377,20 @@ if rql is not None: res.append(rql) return res - + def generate(self, session, rqlst, args): - self._session = session + self._session = session self.kwargs = args self.cachekey = [] self.need_translation = False return self.visit_union(rqlst), self.cachekey - + def visit_union(self, node): s = self._accept_children(node) if len(s) > 1: return ' UNION '.join('(%s)' % q for q in s) return s[0] - + def visit_select(self, node): """return the tree as an encoded rql string""" self._varmaker = rqlvar_maker(defined=node.defined_vars.copy()) @@ -416,7 +417,7 @@ restrictions.append(nr) if restrictions: s.append('WHERE %s' % ','.join(restrictions)) - + if node.having: s.append('HAVING %s' % ', '.join(term.accept(self) for term in node.having)) @@ -427,13 +428,13 @@ if subqueries: s.append('WITH %s' % (','.join(subqueries))) return ' '.join(s) - + def visit_and(self, node): res = self._accept_children(node) if res: return ', '.join(res) return - + def visit_or(self, node): res = self._accept_children(node) if len(res) > 1: @@ -441,16 +442,16 @@ elif res: return res[0] return - + def visit_not(self, node): rql = node.children[0].accept(self) if rql: return 'NOT (%s)' % rql return - + def visit_exists(self, node): return 'EXISTS(%s)' % node.children[0].accept(self) - + def visit_relation(self, node): try: if isinstance(node.children[0], Constant): @@ -497,18 +498,18 @@ if restr is not None: return '%s %s %s, %s' % (lhs, node.r_type, rhs, restr) return '%s %s %s' % (lhs, node.r_type, rhs) - + def visit_comparison(self, node): if node.operator in ('=', 'IS'): return node.children[0].accept(self) return '%s %s' % (node.operator.encode(), node.children[0].accept(self)) - + def visit_mathexpression(self, node): return '(%s %s %s)' % (node.children[0].accept(self), node.operator.encode(), node.children[1].accept(self)) - + def visit_function(self, node): #if node.name == 'IN': res = [] @@ -521,7 +522,7 @@ if not res: raise ex return '%s(%s)' % (node.name, ', '.join(res)) - + def visit_constant(self, node): if self.need_translation or node.uidtype: if node.type == 'Int': @@ -558,7 +559,7 @@ def eid2extid(self, eid): try: - return self.source.eid2extid(eid, self._session) + return self.source.eid2extid(eid, self._session) except UnknownEid: operator = self.current_operator if operator is not None and operator != '=': @@ -583,4 +584,4 @@ if rows: raise ReplaceByInOperator((r[0] for r in rows)) raise - +