X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Futil%2Fcache.py;fp=sfa%2Futil%2Fcache.py;h=45961feb9c2877249656ec12b9712056285a4e93;hb=f3d825457ff4881b8c9658967f8ed159a01dfcaa;hp=0000000000000000000000000000000000000000;hpb=7928eda8ae331272276237740075e23c6fcfb63f;p=sfa.git diff --git a/sfa/util/cache.py b/sfa/util/cache.py new file mode 100644 index 00000000..45961feb --- /dev/null +++ b/sfa/util/cache.py @@ -0,0 +1,62 @@ +# +# This module implements general purpose caching system +# +from __future__ import with_statement +import time +import threading +from datetime import datetime + +# maximum lifetime of cached data (in seconds) +MAX_CACHE_TTL = 60 * 60 + +class CacheData: + + data = None + created = None + expires = None + lock = None + + def __init__(self, data, ttl = MAX_CACHE_TTL): + self.lock = threading.RLock() + self.data = data + self.renew(ttl) + + def is_expired(self): + return time.time() > self.expires + + def get_created_date(self): + return str(datetime.fromtimestamp(self.created)) + + def get_expires_date(self): + return str(datetime.fromtimestamp(self.expires)) + + def renew(self, ttl = MAX_CACHE_TTL): + self.created = time.time() + self.expires = self.created + ttl + + def set_data(self, data, renew=True, ttl = MAX_CACHE_TTL): + with self.lock: + self.data = data + if renew: + self.renew(ttl) + + def get_data(self): + return self.data + +class Cache: + + cache = {} + lock = threading.RLock() + + def add(self, key, value, ttl = MAX_CACHE_TTL): + with self.lock: + if self.cache.has_key(key): + self.cache[key].set_data(value, ttl=ttl) + else: + self.cache[key] = CacheData(value, ttl) + + def get(self, key): + data = self.cache.get(key) + if not data or data.is_expired(): + return None + return data.get_data()