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