| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- import os
-
-
- class BaseCache(object):
- def __init__(self, path, config):
- self._path = path
- self._config = config
-
- def check(self, path):
- return False
-
- def write(self, data):
- pass
-
- def read(self):
- pass
-
-
- class NullCache(BaseCache):
- """
- A dummy cache that doesn't do anything, handy for developing new Mods
- """
- def check(self, path):
- return False
-
- def write(self, data):
- self.data = data
-
- def read(self):
- return self.data
-
-
- class DiskCache(BaseCache):
- """
- A simple disk-based cache.
- """
- def _create_folders(self):
- """
- Create the disk cache path so that the cached image can be stored in
- the same hierarchy as the original images.
- """
- paths = self._path.split(os.path.sep)
- paths.pop() # Remove file from path
- path = os.path.join(self._config['cache_root'], *paths)
-
- if not os.path.isdir(path):
- os.makedirs(path)
-
- def _cache_path(self):
- return os.path.join(self._config['cache_root'], self._path)
-
- def check(self, path):
- """
- Checks the disk cache for an already processed image. If it exists then
- we'll check it's timestamp against the original image to make sure it's
- newer (and therefore valid). Also creates the folder hierarchy in the
- cache for the cached image if it doesn't find it there itself.
- """
- self._create_folders()
-
- cache = self._cache_path()
-
- original_time = os.path.getmtime(path)
-
- if os.path.exists(cache):
- cache_time = os.path.getmtime(cache)
- else:
- # Cached image does not exist
- return False
-
- if original_time > cache_time:
- # Cached image is out of date
- return False
- else:
- return True
-
- def write(self, data):
- path = self._cache_path()
- f = open(path, 'w')
- f.write(data)
- f.close()
-
- def file_info(self):
- """
- If we're using X-Sendfile or X-Accel-Redirect we want to return info
- about the file, rather than the actual file content
- """
- size = os.path.getsize(self._cache_path())
- return (self._path, size)
-
- def read(self):
- f = open(self._cache_path(), "r")
- data = f.read()
- f.close()
-
- return data
|