# HG changeset patch # User Goffi # Date 1502554296 -7200 # Node ID 57a3051ee43593268249a39683fdcb60a9ca1975 # Parent a468c187bbb5b705a0f0108f35107aaa1e8188b7 storage (pgsql): added getLastItems method, to get last items from a series of nodes and entities (needed for PEP compliance). diff -r a468c187bbb5 -r 57a3051ee435 sat_pubsub/pgsql_storage.py --- a/sat_pubsub/pgsql_storage.py Sat Aug 12 18:10:14 2017 +0200 +++ b/sat_pubsub/pgsql_storage.py Sat Aug 12 18:11:36 2017 +0200 @@ -338,6 +338,38 @@ return self.defaultConfig[nodeType] + def formatLastItems(self, result): + last_items = [] + for pep_jid_s, node, data, item_access_model in result: + pep_jid = jid.JID(pep_jid_s) + item = generic.stripNamespace(parseXml(data)) + last_items.append((pep_jid, node, item, item_access_model)) + return last_items + + + def getLastItems(self, entities, nodes, node_accesses, item_accesses, pep): + """get last item for several nodes and entities in a single request""" + if not entities or not nodes or not node_accesses or not item_accesses: + raise ValueError("entities, nodes and accesses must not be empty") + if node_accesses != ('open',) or item_accesses != ('open',): + raise NotImplementedError('only "open" access model is handled for now') + if not pep: + raise NotImplementedError(u"getLastItems is only implemented for PEP at the moment") + d = self.dbpool.runQuery("""SELECT DISTINCT ON (node_id) pep, node, data, items.access_model + FROM items + NATURAL JOIN nodes + WHERE nodes.pep IN %s + AND node IN %s + AND nodes.access_model in %s + AND items.access_model in %s + ORDER BY node_id DESC, item_id DESC""", + (tuple([e.userhost() for e in entities]), + nodes, + node_accesses, + item_accesses)) + d.addCallback(self.formatLastItems) + return d + class Node: