Changeset View
Changeset View
Standalone View
Standalone View
swh/vault/cache.py
# Copyright (C) 2016-2017 The Software Heritage developers | # Copyright (C) 2016-2022 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
from swh.model import hashutil | from swh.model import hashutil | ||||
from swh.model.swhids import CoreSWHID | from swh.model.swhids import CoreSWHID | ||||
from swh.objstorage.factory import get_objstorage | from swh.objstorage.factory import get_objstorage | ||||
from swh.objstorage.objstorage import compute_hash | from swh.objstorage.interface import ObjId | ||||
class VaultCache: | class VaultCache: | ||||
"""The Vault cache is an object storage that stores Vault bundles. | """The Vault cache is an object storage that stores Vault bundles. | ||||
This implementation computes sha1('<bundle_type>:<swhid>') as the | This implementation computes sha1('<bundle_type>:<swhid>') as the | ||||
internal identifiers used in the underlying objstorage. | internal identifiers used in the underlying objstorage. | ||||
""" | """ | ||||
def __init__(self, **objstorage): | def __init__(self, **objstorage): | ||||
self.objstorage = get_objstorage(**objstorage) | self.objstorage = get_objstorage(**objstorage) | ||||
def add(self, bundle_type, swhid: CoreSWHID, content) -> None: | def add(self, bundle_type, swhid: CoreSWHID, content) -> None: | ||||
sid = self._get_internal_id(bundle_type, swhid) | sid = self._get_internal_id(bundle_type, swhid) | ||||
self.objstorage.add(content, sid) | self.objstorage.add(content, sid) | ||||
def get(self, bundle_type, swhid: CoreSWHID) -> bytes: | def get(self, bundle_type, swhid: CoreSWHID) -> bytes: | ||||
sid = self._get_internal_id(bundle_type, swhid) | sid = self._get_internal_id(bundle_type, swhid) | ||||
return self.objstorage.get(hashutil.hash_to_bytes(sid)) | return self.objstorage.get(sid) | ||||
def delete(self, bundle_type, swhid: CoreSWHID): | def delete(self, bundle_type, swhid: CoreSWHID): | ||||
sid = self._get_internal_id(bundle_type, swhid) | sid = self._get_internal_id(bundle_type, swhid) | ||||
return self.objstorage.delete(hashutil.hash_to_bytes(sid)) | return self.objstorage.delete(sid) | ||||
def is_cached(self, bundle_type, swhid: CoreSWHID) -> bool: | def is_cached(self, bundle_type, swhid: CoreSWHID) -> bool: | ||||
sid = self._get_internal_id(bundle_type, swhid) | sid = self._get_internal_id(bundle_type, swhid) | ||||
return hashutil.hash_to_bytes(sid) in self.objstorage | return sid in self.objstorage | ||||
def _get_internal_id(self, bundle_type, swhid: CoreSWHID): | def _get_internal_id(self, bundle_type, swhid: CoreSWHID) -> ObjId: | ||||
return compute_hash("{}:{}".format(bundle_type, swhid).encode()) | key = "{}:{}".format(bundle_type, swhid).encode() | ||||
return hashutil.MultiHash.from_data(key).digest() |