# HG changeset patch # User Sylvain Thénault # Date 1268986080 -3600 # Node ID 96f67c5be0e6020ed95ab7a3a0c6b661179ef12c # Parent c8c0e10dbd976e343c6eca8d09ab132a4a076ab6 [security] experimental rqlst cache for read security: to activate using a 'security-rqlst-cache' flag in transaction data when you'll issue a lot of identic queries with only kwargs varying diff -r c8c0e10dbd97 -r 96f67c5be0e6 server/querier.py --- a/server/querier.py Fri Mar 19 08:18:31 2010 +0100 +++ b/server/querier.py Fri Mar 19 09:08:00 2010 +0100 @@ -188,15 +188,35 @@ return rqlst to actually execute """ - noinvariant = set() + cached = None if security and self.session.read_security: # ensure security is turned of when security is inserted, # else we may loop for ever... - with security_enabled(self.session, read=False): - self._insert_security(union, noinvariant) - self.rqlhelper.simplify(union) - self.sqlannotate(union) - set_qdata(self.schema.rschema, union, noinvariant) + if self.session.transaction_data.get('security-rqlst-cache'): + key = self.cache_key + else: + key = None + if key is not None and key in self.session.transaction_data: + cachedunion, args = self.session.transaction_data[key] + union.children[:] = [] + for select in cachedunion.children: + union.append(select) + union.has_text_query = cachedunion.has_text_query + args.update(self.args) + self.args = args + cached = True + else: + noinvariant = set() + with security_enabled(self.session, read=False): + self._insert_security(union, noinvariant) + if key is not None: + self.session.transaction_data[key] = (union, self.args) + else: + noinvariant = () + if cached is None: + self.rqlhelper.simplify(union) + self.sqlannotate(union) + set_qdata(self.schema.rschema, union, noinvariant) if union.has_text_query: self.cache_key = None