2 # This module implements general purpose caching system
4 from __future__ import with_statement
8 from datetime import datetime
9 from pprint import pprint
11 # maximum lifetime of cached data (in seconds)
12 MAX_CACHE_TTL = 60 * 60
21 def __init__(self, data, ttl = MAX_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 = MAX_CACHE_TTL):
36 self.created = time.time()
37 self.expires = self.created + ttl
39 def set_data(self, data, renew=True, ttl = MAX_CACHE_TTL):
53 return str(self.dump())
58 def __getstate__(self):
59 d = dict(self.__dict__)
63 def __setstate__(self, d):
64 self.__dict__.update(d)
65 self.lock = threading.RLock()
71 lock = threading.RLock()
73 def add(self, key, value, ttl = MAX_CACHE_TTL):
75 if self.cache.has_key(key):
76 self.cache[key].set_data(value, ttl=ttl)
78 self.cache[key] = CacheData(value, ttl)
81 data = self.cache.get(key)
82 if not data or data.is_expired():
84 return data.get_data()
88 for key in self.cache:
89 result[key] = self.cache[key].__getstate__()
93 return str(self.dump())
98 def save_to_file(self, filename):
99 f = open(filename, 'w')
100 pickle.dump(self.cache, f)
102 def load_from_file(self, filename):
103 f = open(filename, 'r')
104 self.cache = pickle.load(f)