Skip to content
Snippets Groups Projects
storage.py 944 B
Newer Older
import os
import hashlib

from private_storage.storage import PrivateStorage


class HashStorage(PrivateStorage):
    def save(self, name, content, *args, **kwargs):
        if name is None:
            name = content.name

        name = self._save(name, content, *args, **kwargs)
        return name

    def _save(self, name, content, *args, **kwargs):

        h = hashlib.sha512()

        for chunk in iter(lambda: content.read(128 * h.block_size), b''):
            h.update(chunk)
        file_hash = h.hexdigest()

        name = os.path.join(file_hash[:3], file_hash)

        if self.exists(name):
            # File with same hash already exists
            return name

        return super()._save(name, content)
    def delete(self, name):
        super().delete(name)
        hashdir = os.path.join(self.location, os.path.split(name)[0])
        if not os.listdir(hashdir):
            # clean up
            os.rmdir(hashdir)