Revision 371d907a pithos/backends/modular.py

b/pithos/backends/modular.py
296 296
            start, limit = self._list_limits(allowed, marker, limit)
297 297
            return allowed[start:start + limit]
298 298
        node = self.node.node_lookup(account)
299
        return [x[0] for x in self._list_objects(node, account, '', '/', marker, limit, False, None, [], until)]
299
        return [x[0] for x in self._list_object_properties(node, account, '', '/', marker, limit, False, None, [], until)]
300
    
301
    @backend_method
302
    def list_container_meta(self, user, account, container, domain, until=None):
303
        """Return a list with all the container's object meta keys for the domain."""
304
        
305
        logger.debug("list_container_meta: %s %s %s %s", account, container, domain, until)
306
        allowed = []
307
        if user != account:
308
            if until:
309
                raise NotAllowedError
310
            allowed = self.permissions.access_list_paths(user, '/'.join((account, container)))
311
            if not allowed:
312
                raise NotAllowedError
313
        path, node = self._lookup_container(account, container)
314
        before = until if until is not None else inf
315
        allowed = self._get_formatted_paths(allowed)
316
        return self.node.latest_attribute_keys(node, domain, before, CLUSTER_DELETED, allowed)
300 317
    
301 318
    @backend_method
302 319
    def get_container_meta(self, user, account, container, domain, until=None):
......
405 422
        self.node.node_remove(node)
406 423
        self._report_size_change(user, account, -size, {'action': 'container delete'})
407 424
    
408
    @backend_method
409
    def list_objects(self, user, account, container, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, domain=None, keys=[], shared=False, until=None, size_range=None):
410
        """Return a list of objects existing under a container."""
411
        
412
        logger.debug("list_objects: %s %s %s %s %s %s %s %s %s %s %s", account, container, prefix, delimiter, marker, limit, virtual, domain, keys, shared, until)
425
    def _list_objects(self, user, account, container, prefix, delimiter, marker, limit, virtual, domain, keys, shared, until, size_range, all_props):
413 426
        allowed = []
414 427
        if user != account:
415 428
            if until:
......
424 437
                    return []
425 438
        path, node = self._lookup_container(account, container)
426 439
        allowed = self._get_formatted_paths(allowed)
427
        return self._list_objects(node, path, prefix, delimiter, marker, limit, virtual, domain, keys, until, size_range, allowed)
440
        return self._list_object_properties(node, path, prefix, delimiter, marker, limit, virtual, domain, keys, until, size_range, allowed, all_props)
428 441
    
429 442
    @backend_method
430
    def list_object_meta(self, user, account, container, domain, until=None):
431
        """Return a list with all the container's object meta keys for the domain."""
443
    def list_objects(self, user, account, container, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, domain=None, keys=[], shared=False, until=None, size_range=None):
444
        """Return a list of object (name, version_id) tuples existing under a container."""
432 445
        
433
        logger.debug("list_object_meta: %s %s %s %s", account, container, domain, until)
434
        allowed = []
435
        if user != account:
436
            if until:
437
                raise NotAllowedError
438
            allowed = self.permissions.access_list_paths(user, '/'.join((account, container)))
439
            if not allowed:
440
                raise NotAllowedError
441
        path, node = self._lookup_container(account, container)
442
        before = until if until is not None else inf
443
        allowed = self._get_formatted_paths(allowed)
444
        return self.node.latest_attribute_keys(node, domain, before, CLUSTER_DELETED, allowed)
446
        logger.debug("list_objects: %s %s %s %s %s %s %s %s %s %s %s %s", account, container, prefix, delimiter, marker, limit, virtual, domain, keys, shared, until, size_range)
447
        return self._list_objects(user, account, container, prefix, delimiter, marker, limit, virtual, domain, keys, shared, until, size_range, False)
448
    
449
    @backend_method
450
    def list_object_meta(self, user, account, container, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, domain=None, keys=[], shared=False, until=None, size_range=None):
451
        """Return a list of object metadata dicts existing under a container."""
452
        
453
        logger.debug("list_object_meta: %s %s %s %s %s %s %s %s %s %s %s %s", account, container, prefix, delimiter, marker, limit, virtual, domain, keys, shared, until, size_range)
454
        props = self._list_objects(user, account, container, prefix, delimiter, marker, limit, virtual, domain, keys, shared, until, size_range, True)
455
        objects = []
456
        for p in props:
457
            if len(p) == 2:
458
                objects.append({'subdir': p[0]})
459
            else:
460
                objects.append({'name': p[0],
461
                                'bytes': p[self.SIZE + 1],
462
                                'type': p[self.TYPE + 1],
463
                                'hash': p[self.HASH + 1],
464
                                'version': p[self.SERIAL + 1],
465
                                'version_timestamp': p[self.MTIME + 1],
466
                                'modified': p[self.MTIME + 1] if until is None else None,
467
                                'modified_by': p[self.MUSER + 1],
468
                                'uuid': p[self.UUID + 1],
469
                                'checksum': p[self.CHECKSUM + 1]})
470
        return objects
445 471
    
446 472
    @backend_method
447 473
    def get_object_meta(self, user, account, container, name, domain, version=None):
......
466 492
        meta.update({'name': name,
467 493
                     'bytes': props[self.SIZE],
468 494
                     'type': props[self.TYPE],
469
                     'hash':props[self.HASH],
495
                     'hash': props[self.HASH],
470 496
                     'version': props[self.SERIAL],
471 497
                     'version_timestamp': props[self.MTIME],
472 498
                     'modified': modified,
......
894 920
            limit = 10000
895 921
        return start, limit
896 922
    
897
    def _list_objects(self, parent, path, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, domain=None, keys=[], until=None, size_range=None, allowed=[]):
923
    def _list_object_properties(self, parent, path, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, domain=None, keys=[], until=None, size_range=None, allowed=[], all_props=False):
898 924
        cont_prefix = path + '/'
899 925
        prefix = cont_prefix + prefix
900 926
        start = cont_prefix + marker if marker else None
......
902 928
        filterq = keys if domain else []
903 929
        sizeq = size_range
904 930
        
905
        objects, prefixes = self.node.latest_version_list(parent, prefix, delimiter, start, limit, before, CLUSTER_DELETED, allowed, domain, filterq, sizeq)
931
        objects, prefixes = self.node.latest_version_list(parent, prefix, delimiter, start, limit, before, CLUSTER_DELETED, allowed, domain, filterq, sizeq, all_props)
906 932
        objects.extend([(p, None) for p in prefixes] if virtual else [])
907 933
        objects.sort(key=lambda x: x[0])
908
        objects = [(x[0][len(cont_prefix):], x[1]) for x in objects]
934
        objects = [(x[0][len(cont_prefix):],) + x[1:] for x in objects]
909 935
        
910 936
        start, limit = self._list_limits([x[0] for x in objects], marker, limit)
911 937
        return objects[start:start + limit]

Also available in: Unified diff