From: Michael Tremer Date: Sun, 18 Nov 2012 17:59:10 +0000 (+0100) Subject: Add permanent cache for Settings. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=771320fe2ff62b7f4603e9462a61a5ac36b4a194;p=pbs.git Add permanent cache for Settings. --- diff --git a/backend/base.py b/backend/base.py index 4d8d9254..4bffdf8c 100644 --- a/backend/base.py +++ b/backend/base.py @@ -18,11 +18,17 @@ class Object(object): if hasattr(self.pakfire, "settings"): self.settings = self.pakfire.settings + # Private cache. + self._cache = None + @property def cache(self): """ Shortcut to the cache. """ + if self._cache: + return self._cache + return self.pakfire.cache @property diff --git a/backend/cache.py b/backend/cache.py index 0aac46f4..08e46e9f 100644 --- a/backend/cache.py +++ b/backend/cache.py @@ -27,6 +27,8 @@ class Cache(base.Object): self._memcache = Client(self.servers, debug=1) def get(self, key): + logging.debug("Querying memcache for: %s" % key) + key = "".join((self.key_prefix, key)) return self._memcache.get(key) @@ -41,3 +43,20 @@ class Cache(base.Object): key = "".join((self.key_prefix, key)) return self._memcache.delete(key, time=time) + + +class PermanentCache(base.Object): + __items = {} + + def has_key(self, key): + return self.__items.has_key(key) + + def get(self, key, default=None): + return self.__items.get(key, default) + + def set(self, key, val): + self.__items[key] = val + + def delete(self, key): + if self.__items.has_key(key): + del self.__items[key] diff --git a/backend/settings.py b/backend/settings.py index 5a0ad405..b617e0d6 100644 --- a/backend/settings.py +++ b/backend/settings.py @@ -1,35 +1,47 @@ #!/usr/bin/python import base +import cache class Settings(base.Object): - """ - The cache is not available here. - """ + def __init__(self, pakfire): + base.Object.__init__(self, pakfire) + + # Private cache. + self._cache = cache.PermanentCache(self.pakfire) def query(self, key): return self.db.get("SELECT * FROM settings WHERE k = %s", key) - def get(self, key, default=None): + def get(self, key, default=None, cacheable=True): + if cacheable and self.cache.has_key(key): + return self.cache.get(key) + result = self.query(key) if not result: return default - return "%s" % result.v + result = result.v + + # Put the item into the cache to access it later. + if cacheable: + self.cache.set(key, result) + + return result def get_id(self, key): return self.query(key)["id"] - def get_int(self, key, default=None): - value = self.get(key, default) + def get_int(self, key, default=None, cacheable=True): + value = self.get(key, default, cacheable=cacheable) if value is None: return None return int(value) - def get_float(self, key, default=None): - value = self.get(key, default) + def get_float(self, key, default=None, cacheable=True): + value = self.get(key, default, cacheable=cacheable) if value is None: return None