Mercurial > libervia-pubsub
diff sat_pubsub/pgsql_storage.py @ 301:05c875a13a62
categories are now stored in a dedicated table if item contain an atom entry:
- database creation/update files include the new table
- item data are now stored in a ItemData namedtuple
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 25 Nov 2015 18:33:38 +0100 |
parents | 4115999d85e9 |
children | 087b705493a6 |
line wrap: on
line diff
--- a/sat_pubsub/pgsql_storage.py Wed Nov 25 16:00:08 2015 +0100 +++ b/sat_pubsub/pgsql_storage.py Wed Nov 25 18:33:38 2015 +0100 @@ -608,18 +608,21 @@ def _storeItem(self, cursor, item_data, publisher): - item, access_model, item_config = item_data + item, access_model, item_config = item_data.item, item_data.access_model, item_data.config data = item.toXml() cursor.execute("""UPDATE items SET date=now(), publisher=%s, data=%s FROM nodes WHERE nodes.node_id = items.node_id AND - nodes.node_id = %s and items.item=%s""", + nodes.node_id = %s and items.item=%s + RETURNING item_id""", (publisher.full(), data, self.nodeDbId, item["id"])) if cursor.rowcount == 1: + item_id = cursor.fetchone()[0]; + self._storeCategories(cursor, item_id, item_data.categories, update=True) return cursor.execute("""INSERT INTO items (node_id, item, publisher, data, access_model) @@ -633,8 +636,10 @@ access_model, self.nodeDbId)) + item_id = cursor.fetchone()[0]; + self._storeCategories(cursor, item_id, item_data.categories) + if access_model == const.VAL_AMODEL_ROSTER: - item_id = cursor.fetchone()[0]; if const.OPT_ROSTER_GROUPS_ALLOWED in item_config: item_config.fields[const.OPT_ROSTER_GROUPS_ALLOWED].fieldType='list-multi' #XXX: needed to force list if there is only one value allowed_groups = item_config[const.OPT_ROSTER_GROUPS_ALLOWED] @@ -645,6 +650,15 @@ cursor.execute("""INSERT INTO item_groups_authorized (item_id, groupname) VALUES (%s,%s)""" , (item_id, group)) + def _storeCategories(self, cursor, item_id, categories, update=False): + # TODO: handle canonical form + if update: + cursor.execute("""DELETE FROM item_categories + WHERE item_id=%s""", (item_id,)) + + for category in categories: + cursor.execute("""INSERT INTO item_categories (item_id, category) + VALUES (%s, %s)""", (item_id, category)) def removeItems(self, itemIdentifiers): return self.dbpool.runInteraction(self._removeItems, itemIdentifiers)