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)