def build_inner_query(request, tags): """Build an "inner query" -- a query which yields a list of stream ids (indexes in the stream table). These match the identifiers used in the reading db, or can be used as part of a join. The query performs auth checks and will check for the tags specified. """ # the inner query builds a list of streams matching all the # clauses which we can then select from clauses = [] uuid_clause = "true" for (k, v) in tags: if k == 'uuid': if v != None: uuid_clause = "s.uuid = %s" % escape_string(v) continue if v != None: clauses.append("hstore(%s, %s)" % (escape_string(k), escape_string(v))) else: break if len(clauses) == 0: clauses = ["hstore(array[]::varchar[])"] inner_query = """ (SELECT s.id FROM stream s, subscription sub WHERE s.subscription_id = sub.id AND (%s) AND (%s) AND s.metadata @> (%s)) """ % (build_authcheck(request), uuid_clause, ' || '.join(clauses)) return inner_query, clauses
def render_GET(self, request): if len(request.prepath) == 2 or \ (len(request.prepath) == 3 and request.prepath[-1] == ''): d = self.db.runQuery(""" SELECT id, url, resource FROM subscription sub WHERE """ + build_authcheck(request)) d.addCallback(lambda x: self._done_subs(request, x)) d.addErrback(makeErrback(request)) else: when = int(time.time()) * 1000 d = self.db.runQuery(""" SELECT m.tagval, s.uuid FROM subscription sub, stream s, metadata2 m WHERE """ + build_authcheck(request) + """ AND tagname = 'Path' AND m.stream_id = s.id AND s.subscription_id = sub.id AND sub.id = %s """, (int(request.prepath[-1]), )) d.addCallback(lambda x: self._done_streams(request, x)) d.addErrback(makeErrback(request)) return server.NOT_DONE_YET