Escape catch-all characters in LIKE queries.
[pithos] / pithos / backends / lib / sqlite / node.py
index 1fe66c8..e0485b5 100644 (file)
@@ -228,7 +228,7 @@ class Node(DBWorker):
     def node_purge_children(self, parent, before=inf, cluster=0):
         """Delete all versions with the specified
            parent and cluster, and return
-           the serials of versions deleted.
+           the hashes of versions deleted.
            Clears out nodes with no remaining versions.
         """
         
@@ -248,14 +248,14 @@ class Node(DBWorker):
         self.statistics_update(parent, -nr, -size, mtime, cluster)
         self.statistics_update_ancestors(parent, -nr, -size, mtime, cluster)
         
-        q = ("select serial from versions "
+        q = ("select hash from versions "
              "where node in (select node "
                             "from nodes "
                             "where parent = ?) "
              "and cluster = ? "
              "and mtime <= ?")
         execute(q, args)
-        serials = [r[SERIAL] for r in self.fetchall()]
+        hashes = [r[0] for r in self.fetchall()]
         q = ("delete from versions "
              "where node in (select node "
                             "from nodes "
@@ -270,12 +270,12 @@ class Node(DBWorker):
                                    "where node = n.node) = 0 "
                             "and parent = ?)")
         execute(q, (parent,))
-        return serials
+        return hashes
     
     def node_purge(self, node, before=inf, cluster=0):
         """Delete all versions with the specified
            node and cluster, and return
-           the serials of versions deleted.
+           the hashes of versions deleted.
            Clears out the node if it has no remaining versions.
         """
         
@@ -292,12 +292,12 @@ class Node(DBWorker):
         mtime = time()
         self.statistics_update_ancestors(node, -nr, -size, mtime, cluster)
         
-        q = ("select serial from versions "
+        q = ("select hash from versions "
              "where node = ? "
              "and cluster = ? "
              "and mtime <= ?")
         execute(q, args)
-        serials = [r[SERIAL] for r in self.fetchall()]
+        hashes = [r[0] for r in self.fetchall()]
         q = ("delete from versions "
              "where node = ? "
              "and cluster = ? "
@@ -310,7 +310,7 @@ class Node(DBWorker):
                                    "where node = n.node) = 0 "
                             "and node = ?)")
         execute(q, (node,))
-        return serials
+        return hashes
     
     def node_remove(self, node):
         """Remove the node specified.
@@ -447,8 +447,8 @@ class Node(DBWorker):
              "and cluster != ? "
              "and node in (select node "
                           "from nodes "
-                          "where path like ?)")
-        execute(q, (before, except_cluster, path + '%'))
+                          "where path like ? escape '\\')")
+        execute(q, (before, except_cluster, self.escape_like(path) + '%'))
         r = fetchone()
         if r is None:
             return None
@@ -529,10 +529,11 @@ class Node(DBWorker):
     def version_remove(self, serial):
         """Remove the serial specified."""
         
-        props = self.node_get_properties(serial)
+        props = self.version_get_properties(serial)
         if not props:
             return
         node = props[NODE]
+        hash = props[HASH]
         size = props[SIZE]
         cluster = props[CLUSTER]
         
@@ -541,7 +542,7 @@ class Node(DBWorker):
         
         q = "delete from versions where serial = ?"
         self.execute(q, (serial,))
-        return True
+        return hash
     
     def attribute_get(self, serial, keys=()):
         """Return a list of (key, value) pairs of the version specified by serial.
@@ -604,9 +605,9 @@ class Node(DBWorker):
             return None, None
         
         subq = " and ("
-        subq += ' or '.join(('n.path like ?' for x in pathq))
+        subq += ' or '.join(("n.path like ? escape '\\'" for x in pathq))
         subq += ")"
-        args = tuple([x + '%' for x in pathq])
+        args = tuple([self.escape_like(x) + '%' for x in pathq])
         
         return subq, args