Bläddra i källkod

Add more functionality to postgresql driver

 * remove node
 * set_node_tags
 * update tag lookup
oz123 10 år sedan
förälder
incheckning
bad570d372
2 ändrade filer med 29 tillägg och 4 borttagningar
  1. 23 4
      pwman/data/drivers/postgresql.py
  2. 6 0
      pwman/tests/test_postgresql.py

+ 23 - 4
pwman/data/drivers/postgresql.py

@@ -90,6 +90,19 @@ class PostgresqlDatabase(Database):
             rid = self._cur.fetchone()[0]
             return rid
 
+    def _setnodetags(self, nodeid, tags):
+        for tag in tags:
+            tid = self._get_or_create_tag(tag)
+            self._update_tag_lookup(nodeid, tid)
+
+    def _get_node_tags(self, node):
+        pass
+
+    def _update_tag_lookup(self, nodeid, tid):
+        sql_lookup = "INSERT INTO LOOKUP(nodeid, tagid) VALUES(%s, %s)"
+        self._cur.execute(sql_lookup, (nodeid, tid))
+        self._con.commit()
+
     def _clean_orphans(self):
         clean = ("delete from tag where not exists "
                  "(select 'x' from lookup l where l.tagid = tag.id)")
@@ -123,11 +136,12 @@ class PostgresqlDatabase(Database):
 
     def add_node(self, node):
         sql = ("INSERT INTO NODE(USERNAME, PASSWORD, URL, NOTES)"
-               "VALUES(%s, %s, %s, %s)")
+               "VALUES(%s, %s, %s, %s) RETURNING ID")
         node_tags = list(node)
         node, tags = node_tags[:4], node_tags[-1]
         self._cur.execute(sql, (node))
-        #self._setnodetags(self._cur.lastrowid, tags)
+        nid = self._cur.fetchone()[0]
+        self._setnodetags(nid, tags)
         self._con.commit()
 
     def getnodes(self, ids):
@@ -143,8 +157,13 @@ class PostgresqlDatabase(Database):
 
         return nodes_w_tags
 
-    def removenodes(self, nodes):
-        pass
+    def removenodes(self, nid):
+        # shall we do this also in the sqlite driver?
+        sql_clean = "DELETE FROM LOOKUP WHERE NODEID=%s"
+        self._cur.execute(sql_clean, nid)
+        sql_rm = "delete from node where id = %s"
+        self._cur.execute(sql_rm, nid)
+        self._con.commit()
 
     def listtags(self):
         self._clean_orphans()

+ 6 - 0
pwman/tests/test_postgresql.py

@@ -83,6 +83,12 @@ class TestPostGresql(unittest.TestCase):
         rv = self.db._get_tag("SECRET")
         self.assertIsNone(rv)
 
+    def test_8_remove_node(self):
+        self.db.removenodes([1])
+        n = self.db.listnodes()
+        self.assertEqual(len(n), 0)
+
+
 if __name__ == '__main__':
 
     ce = CryptoEngine.get()