Revert "full fastindex integration, drop old cache stuff"
[project/luci.git] / libs / web / luasrc / dispatcher.lua
index d22ae84..c867579 100644 (file)
@@ -27,7 +27,6 @@ module("luci.dispatcher", package.seeall)
 require("luci.http")
 require("luci.sys")
 require("luci.fs")
-require("luci.fastindex")
 
 -- Dirty OpenWRT fix
 if (os.time() < luci.fs.mtime(luci.sys.libpath() .. "/dispatcher.lua")) then
@@ -50,8 +49,6 @@ dispatched = nil
 built_index = false
 built_tree  = false
 
--- Fastindex cache
-local fi = nil
 
 -- Builds a URL
 function build_url(...)
@@ -158,20 +155,75 @@ end
 function createindex()
        index = {}
        local path = luci.sys.libpath() .. "/controller/"
-       local suffix = ".lua"
+       local suff = ".lua"
+       
+       --[[if pcall(require, "fastindex") then
+               createindex_fastindex(path, suff)
+       else
+               createindex_plain(path, suff)
+       end]]--
+       
+       createindex_plain(path, suff)
+       
+       built_index = true
+end
 
-       if fi == nil then
-               fi = luci.fastindex.new("index")
-               fi.add(path .. "*" .. suffix)
-               fi.add(path .. "*/*" .. suffix)
-       end
+-- Uses fastindex to create the dispatching tree
+function createindex_fastindex(path, suffix)   
+       local fi = fastindex.new("index")
+       fi.add(path .. "*" .. suffix)
+       fi.add(path .. "*/*" .. suffix)
        fi.scan()
-
+       
        for k, v in pairs(fi.indexes) do
                index[v[2]] = v[1]
        end
+end
 
-       built_index = true
+-- Calls the index function of all available controllers
+function createindex_plain(path, suffix)
+       local cache = nil 
+       
+       local controllers = luci.util.combine(
+               luci.fs.glob(path .. "*" .. suffix) or {},
+               luci.fs.glob(path .. "*/*" .. suffix) or {}
+       )
+       
+       if indexcache then
+               cache = luci.fs.mtime(indexcache)
+               
+               if not cache then
+                       luci.fs.mkdir(indexcache)
+                       luci.fs.chmod(indexcache, "a=,u=rwx")
+                       cache = luci.fs.mtime(indexcache)
+               end
+       end
+
+       for i,c in ipairs(controllers) do
+               local module = "luci.controller." .. c:sub(#path+1, #c-#suffix):gsub("/", ".")
+               local cachefile = indexcache .. "/" .. module
+               local stime
+               local ctime
+               
+               if cache then
+                       stime = luci.fs.mtime(c) or 0
+                       ctime = luci.fs.mtime(cachefile) or 0
+               end
+               
+               if not cache or stime > ctime then 
+                       stat, mod = pcall(require, module)
+       
+                       if stat and mod and type(mod.index) == "function" then
+                               index[module] = mod.index
+                               
+                               if cache then
+                                       luci.fs.writefile(cachefile, luci.util.dump(mod.index))
+                               end
+                       end
+               else
+                       index[module] = loadfile(cachefile)
+               end
+       end
 end
 
 -- Creates the dispatching tree from the index