]> git.ipfire.org Git - people/jschlag/pbs.git/commitdiff
settings: Add lazy caching for settings.
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 2 Mar 2013 11:54:49 +0000 (12:54 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 2 Mar 2013 11:54:49 +0000 (12:54 +0100)
backend/settings.py

index 114bbeac60c2b5855eab2846ea1100264f7e9750..ae6aeb7f7ebfc17ac76740fc8e4b2bc6e06abfae 100644 (file)
@@ -1,5 +1,7 @@
 #!/usr/bin/python
 
+import time
+
 import base
 import cache
 
@@ -7,50 +9,53 @@ class Settings(base.Object):
        def __init__(self, pakfire):
                base.Object.__init__(self, pakfire)
 
-       def query(self, key):
-               return self.db.get("SELECT * FROM settings WHERE k = %s", key)
+               self.next_update = 0
 
-       def get(self, key, default=None):
-               result = self.query(key)
-               if not result:
-                       return default
+       @property
+       def data(self):
+               now = time.time()
+
+               # Update the cache if no data is available or the data
+               # has timed out.
+               if not hasattr(self, "_data") or now >= self.next_update:
+                       self._data = self.fetch_everything()
+                       self.next_update = now + 300
 
-               return result.v
+               return self._data
 
-       def get_id(self, key):
-               res = self.query(key)
+       def fetch_everything(self):
+               res = self.db.query("SELECT k, v FROM settings")
 
-               if res:
-                       return res.id
+               ret = {}
+               for row in res:
+                       ret[row.k] = row.v
+
+               return ret
+
+       def get(self, key, default=None):
+               try:
+                       return self.data[key]
+               except KeyError:
+                       return default
 
        def get_int(self, key, default=None):
                value = self.get(key, default)
 
-               if value is None:
+               try:
+                       return int(value)
+               except ValueError:
                        return None
 
-               return int(value)
-
        def get_float(self, key, default=None):
                value = self.get(key, default)
 
-               if value is None:
+               try:
+                       return float(value)
+               except ValueError:
                        return None
 
-               return float(value)
-
        def set(self, key, value):
-               id = self.get(key)
-
-               if not id:
-                       self.db.execute("INSERT INTO settings(k, v) VALUES(%s, %s)", key, value)
-               else:
-                       self.db.execute("UPDATE settings SET v = %s WHERE id = %s", value, id)
-
-       def get_all(self):
-               attrs = {}
-
-               for s in self.db.query("SELECT * FROM settings"):
-                       attrs[s.k] = s.v
+               self.db.execute("REPLACE INTO settings(k, v) VALUES(%s, %s)", key, value)
 
-               return attrs
+               if hasattr(self, "_data"):
+                       self._data[key] = value