From eba7ecbbc0eaddbd7c4840291854cb2837e46f80 Mon Sep 17 00:00:00 2001
From: Matthias Schiffer <mschiffer@universe-factory.net>
Date: Sat, 12 Dec 2015 20:49:17 +0100
Subject: [PATCH] gluon-announced: add support for caching announced data

---
 .../files/usr/lib/lua/gluon/announced.lua     | 33 +++++++++++++++----
 1 file changed, 27 insertions(+), 6 deletions(-)

diff --git a/package/gluon-announced/files/usr/lib/lua/gluon/announced.lua b/package/gluon-announced/files/usr/lib/lua/gluon/announced.lua
index f6863277..7c43a523 100644
--- a/package/gluon-announced/files/usr/lib/lua/gluon/announced.lua
+++ b/package/gluon-announced/files/usr/lib/lua/gluon/announced.lua
@@ -1,6 +1,7 @@
 local announce = require 'gluon.announce'
 local deflate = require 'deflate'
 local json = require 'luci.jsonc'
+local util = require 'luci.util'
 local nixio = require 'nixio'
 local fs = require 'nixio.fs'
 
@@ -10,16 +11,36 @@ nixio.chdir('/lib/gluon/announce/')
 
 for dir in fs.glob('*.d') do
   local name = dir:sub(1, -3)
-  memoize[name] = announce.collect_dir(dir)
+  memoize[name] = {
+    collect = announce.collect_dir(dir),
+    -- tonumber will return 0 for invalid inputs
+    cache_time = tonumber(util.trim(fs.readfile(name .. '.cache') or ''))
+  }
 end
 
-local function collect(type)
-  return memoize[type] and memoize[type]()
+local function collect(type, timestamp)
+  local c = memoize[type]
+  if not c then
+    return nil
+  end
+
+  if c.cache_timeout and timestamp < c.cache_timeout then
+    return c.cache
+  else
+    local ret = c.collect()
+
+    if c.cache_time then
+      c.cache = ret
+      c.cache_timeout = timestamp + c.cache_time
+    end
+
+    return ret
+  end
 end
 
 module('gluon.announced', package.seeall)
 
-function handle_request(query)
+function handle_request(query, timestamp)
   collectgarbage()
 
   local m = query:match('^GET ([a-z ]+)$')
@@ -28,7 +49,7 @@ function handle_request(query)
     local data = {}
 
     for q in m:gmatch('([a-z]+)') do
-      local ok, val = pcall(collect, q)
+      local ok, val = pcall(collect, q, timestamp)
       if ok then
         data[q] = val
       end
@@ -38,7 +59,7 @@ function handle_request(query)
       ret = deflate.compress(json.stringify(data))
     end
   elseif query:match('^[a-z]+$') then
-    local ok, data = pcall(collect, query)
+    local ok, data = pcall(collect, query, timestamp)
     if ok then
       ret = json.stringify(data)
     end
-- 
GitLab