71 lines
1.3 KiB
Lua
71 lines
1.3 KiB
Lua
local lfs = require("lfs")
|
|
local pp = require("pp")
|
|
|
|
local function isFile(path)
|
|
return lfs.attributes(path, "mode") == "file"
|
|
end
|
|
|
|
local function isDir(path)
|
|
return lfs.attributes(path, "mode") == "directory"
|
|
end
|
|
|
|
local function load_page(path)
|
|
return dofile(path)
|
|
end
|
|
|
|
local function store_page(path, page)
|
|
if type(page) == "table" then
|
|
local f = io.open(path, "wb")
|
|
if f then
|
|
f:write("return ")
|
|
f:write(pp.format(page))
|
|
f:close()
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
local pool = {}
|
|
|
|
local db_funcs = {
|
|
save = function(db, p)
|
|
if p then
|
|
if type(p) == "string" and type(db[p]) == "table" then
|
|
return store_page(pool[db].."/"..p, db[p])
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
for p, page in pairs(db) do
|
|
store_page(pool[db].."/"..p, page)
|
|
end
|
|
return true
|
|
end
|
|
}
|
|
|
|
local mt = {
|
|
__index = function(db, k)
|
|
if db_funcs[k] then return db_funcs[k] end
|
|
if isFile(pool[db].."/"..k) then
|
|
db[k] = load_page(pool[db].."/"..k)
|
|
end
|
|
return rawget(db, k)
|
|
end
|
|
}
|
|
|
|
pool.hack = db_funcs
|
|
|
|
return setmetatable(pool, {
|
|
__mode = "kv",
|
|
__call = function(pool, path)
|
|
if pool[path] then return pool[path] end
|
|
if not isDir(path) then return end
|
|
local db = {}
|
|
setmetatable(db, mt)
|
|
pool[path] = db
|
|
pool[db] = path
|
|
return db
|
|
end
|
|
})
|