Revision 5576e6dd snf-pithos-backend/pithos/backends/lib/sqlite/node.py

b/snf-pithos-backend/pithos/backends/lib/sqlite/node.py
32 32
# or implied, of GRNET S.A.
33 33

  
34 34
from time import time
35
from operator import itemgetter
36
from itertools import groupby
35 37

  
36 38
from dbworker import DBWorker
37 39

  
......
180 182
                            references versions(serial)
181 183
                            on update cascade
182 184
                            on delete cascade ) """)
185
        execute(""" create index if not exists idx_attributes_domain
186
                    on attributes(domain) """)
183 187

  
184 188
        wrapper = self.wrapper
185 189
        wrapper.execute()
......
284 288
        self.statistics_update(parent, -nr, -size, mtime, cluster)
285 289
        self.statistics_update_ancestors(parent, -nr, -size, mtime, cluster)
286 290

  
287
        q = ("select hash from versions "
291
        q = ("select hash, serial from versions "
288 292
             "where node in (select node "
289 293
             "from nodes "
290 294
             "where parent = ?) "
......
333 337
        mtime = time()
334 338
        self.statistics_update_ancestors(node, -nr, -size, mtime, cluster)
335 339

  
336
        q = ("select hash from versions "
340
        q = ("select hash, serial from versions "
337 341
             "where node = ? "
338 342
             "and cluster = ? "
339 343
             "and mtime <= ?")
......
343 347
        for r in self.fetchall():
344 348
            hashes += [r[0]]
345 349
            serials += [r[1]]
346
        
350

  
347 351
        q = ("delete from versions "
348 352
             "where node = ? "
349 353
             "and cluster = ? "
......
1001 1005
             "and n.node = v.node") % cluster_where
1002 1006
        self.execute(q, args)
1003 1007
        return self.fetchone()
1008

  
1009
    def domain_object_list(self, domain, cluster=None):
1010
        """Return a list of (path, property list, attribute dictionary)
1011
           for the objects in the specific domain and cluster.
1012
        """
1013

  
1014
        q = ("select n.path, v.serial, v.node, v.hash, "
1015
             "v.size, v.type, v.source, v.mtime, v.muser, "
1016
             "v.uuid, v.checksum, v.cluster, a.key, a.value "
1017
             "from nodes n, versions v, attributes a "
1018
             "where n.node = v.node and "
1019
             "n.latest_version = v.serial and "
1020
             "v.serial = a.serial and "
1021
             "a.domain = ? ")
1022
        args = [domain]
1023
        if cluster != None:
1024
            q += "and v.cluster = ?"
1025
            args += [cluster]
1026

  
1027
        self.execute(q, args)
1028
        rows = self.fetchall()
1029

  
1030
        group_by = itemgetter(slice(12))
1031
        rows.sort(key = group_by)
1032
        groups = groupby(rows, group_by)
1033
        return [(k[0], k[1:], dict([i[12:] for i in data])) \
1034
            for (k, data) in groups]

Also available in: Unified diff