summaryrefslogtreecommitdiffstats
path: root/acf/persistence/backends/files.lua
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2012-12-16 19:10:38 +0200
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2012-12-16 19:10:38 +0200
commite4361842fcdec369fbd4466f2528b2815f504ff9 (patch)
tree4694ca56f9e9a4869763d8fe1f31a81f6f62ac0b /acf/persistence/backends/files.lua
downloadaconf-e4361842fcdec369fbd4466f2528b2815f504ff9.tar.bz2
aconf-e4361842fcdec369fbd4466f2528b2815f504ff9.tar.xz
initial version
Diffstat (limited to 'acf/persistence/backends/files.lua')
-rw-r--r--acf/persistence/backends/files.lua68
1 files changed, 68 insertions, 0 deletions
diff --git a/acf/persistence/backends/files.lua b/acf/persistence/backends/files.lua
new file mode 100644
index 0000000..8e59ab9
--- /dev/null
+++ b/acf/persistence/backends/files.lua
@@ -0,0 +1,68 @@
+--[[
+Copyright (c) 2012 Kaarle Ritvanen
+See LICENSE file for license details
+--]]
+
+module(..., package.seeall)
+
+local pth = require('acf.path')
+local util = require('acf.persistence.util')
+
+require 'lfs'
+
+
+backend = require('acf.object').class()
+
+-- TODO cache expiration
+function backend:init() self.cache = {} end
+
+function backend:get(path)
+ local name = pth.join('/', unpack(path))
+
+ if not self.cache[name] then
+ local attrs = lfs.attributes(name)
+ if not attrs then return end
+
+ if attrs.mode == 'file' then
+ self.cache[name] = util.read_file(name)
+
+ elseif attrs.mode == 'directory' then
+ local res = {}
+ for fname in lfs.dir(name) do
+ if not ({['.']=true, ['..']=true})[fname] then
+ table.insert(res, fname)
+ end
+ end
+ return res
+
+ else error('Unsupported file type: '..name) end
+
+ -- TODO present symlinks as references
+ end
+
+ return self.cache[name]
+end
+
+function backend:set(mods)
+ for _, mod in pairs(mods) do
+ local path, t, value = unpack(mod)
+ local name = pth.join('/', unpack(path))
+
+ -- TODO save references (t == 'reference') as symlinks
+
+ if not t then
+ -- TODO del files & dirs
+ print('DEL', name)
+
+ elseif t == 'table' then
+ lfs.mkdir(name)
+
+ else
+ local file = util.open_file(name, 'w')
+ file:write(value)
+ file:close()
+
+ self.cache[name] = value
+ end
+ end
+end