NDOJ/judge/utils/file_cache.py
2023-05-20 08:54:17 +09:00

45 lines
1.2 KiB
Python
Executable file

import errno
import os
from gzip import open as gzip_open
from urllib.parse import urljoin
class HashFileCache(object):
def __init__(self, root, url, gzip=False):
self.root = root
self.url = url
self.gzip = gzip
def create(self, hash):
try:
os.makedirs(os.path.join(self.root, hash))
except OSError as e:
if e.errno != errno.EEXIST:
raise
def has_file(self, hash, file):
return os.path.isfile(self.get_path(hash, file))
def get_path(self, hash, file):
return os.path.join(self.root, hash, file)
def get_url(self, hash, file):
return urljoin(self.url, "%s/%s" % (hash, file))
def read_file(self, hash, file):
return open(self.get_path(hash, file), "rb")
def read_data(self, hash, file):
with self.read_file(hash, file) as f:
return f.read()
def cache_data(self, hash, file, data, url=True, gzip=True):
if gzip and self.gzip:
with gzip_open(self.get_path(hash, file + ".gz"), "wb") as f:
f.write(data)
with open(self.get_path(hash, file), "wb") as f:
f.write(data)
if url:
return self.get_url(hash, file)