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 MAX_CACHE_TTL = 60 * 60
20 def __init__(self, data, ttl = MAX_CACHE_TTL):
21 self.lock = threading.RLock()
26 return time.time() > self.expires
28 def get_created_date(self):
29 return str(datetime.fromtimestamp(self.created))
31 def get_expires_date(self):
32 return str(datetime.fromtimestamp(self.expires))
34 def renew(self, ttl = MAX_CACHE_TTL):
35 self.created = time.time()
36 self.expires = self.created + ttl
38 def set_data(self, data, renew=True, ttl = MAX_CACHE_TTL):
47 def __getstate__(self):
48 d = dict(self.__dict__)
52 def __setstate__(self, d):
53 self.__dict__.update(d)
54 self.lock = threading.RLock()
60 lock = threading.RLock()
62 def add(self, key, value, ttl = MAX_CACHE_TTL):
64 if self.cache.has_key(key):
65 self.cache[key].set_data(value, ttl=ttl)
67 self.cache[key] = CacheData(value, ttl)
70 data = self.cache.get(key)
71 if not data or data.is_expired():
73 return data.get_data()
75 def save_to_file(self, filename):
76 f = open(filename, 'w')
77 pickle.dump(self.cache, f)
79 def load_from_file(self, filename):
80 f = open(filename, 'r')
81 self.cache = pickle.load(f)