2 # This module implements general purpose caching system
4 from __future__ import with_statement
8 from datetime import datetime
10 # maximum lifetime of cached data (in seconds)
11 DEFAULT_CACHE_TTL = 60 * 60
21 def __init__(self, data, ttl=DEFAULT_CACHE_TTL):
22 self.lock = threading.RLock()
27 return time.time() > self.expires
29 def get_created_date(self):
30 return str(datetime.fromtimestamp(self.created))
32 def get_expires_date(self):
33 return str(datetime.fromtimestamp(self.expires))
35 def renew(self, ttl=DEFAULT_CACHE_TTL):
36 self.created = time.time()
37 self.expires = self.created + ttl
39 def set_data(self, data, renew=True, ttl=DEFAULT_CACHE_TTL):
52 return str(self.dump())
57 def __getstate__(self):
58 d = dict(self.__dict__)
62 def __setstate__(self, d):
63 self.__dict__.update(d)
64 self.lock = threading.RLock()
70 lock = threading.RLock()
72 def __init__(self, filename=None):
74 self.load_from_file(filename)
76 def add(self, key, value, ttl=DEFAULT_CACHE_TTL):
79 self.cache[key].set_data(value, ttl=ttl)
81 self.cache[key] = CacheData(value, ttl)
84 data = self.cache.get(key)
87 elif data.is_expired():
91 data = data.get_data()
100 for key in self.cache:
101 result[key] = self.cache[key].__getstate__()
105 return str(self.dump())
110 def save_to_file(self, filename):
111 f = open(filename, 'wb')
112 pickle.dump(self.cache, f)
114 def load_from_file(self, filename):
115 f = open(filename, 'rb')
116 self.cache = pickle.load(f)