From e4361842fcdec369fbd4466f2528b2815f504ff9 Mon Sep 17 00:00:00 2001 From: Kaarle Ritvanen Date: Sun, 16 Dec 2012 19:10:38 +0200 Subject: initial version --- acf/persistence/backends/files.lua | 68 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 acf/persistence/backends/files.lua (limited to 'acf/persistence/backends/files.lua') 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 -- cgit v1.2.3