diff options
Diffstat (limited to 'acf/persistence/backends/files.lua')
-rw-r--r-- | acf/persistence/backends/files.lua | 107 |
1 files changed, 0 insertions, 107 deletions
diff --git a/acf/persistence/backends/files.lua b/acf/persistence/backends/files.lua deleted file mode 100644 index 7d03e12..0000000 --- a/acf/persistence/backends/files.lua +++ /dev/null @@ -1,107 +0,0 @@ ---[[ -Copyright (c) 2012-2013 Kaarle Ritvanen -See LICENSE file for license details ---]] - -local topology = require('acf.model.root').topology -local pth = require('acf.path') -local util = require('acf.persistence.util') -local copy = require('acf.util').copy - -local posix = require('posix') -local stringy = require('stringy') - - -local function get_scope(top) - if not top or top.type ~= 'reference' or not pth.is_unique(top.scope) then - return - end - - return stringy.startswith( - top.scope, '/files/' - ) and top.scope:sub(7, -1) or nil -end - - -local backend = require('acf.object').class() - --- TODO cache expiration -function backend:init() self.cache = {} end - -function backend:get(path, top) - local name = pth.join('/', unpack(path)) - - if not self.cache[name] then - local t = posix.stat(name, 'type') - if not t then return end - - if t == 'regular' then - self.cache[name] = util.read_file(name) - - elseif t == 'link' then - -- TODO handle relative symlinks - local target = posix.readlink(name) - assert(target) - - local scope = get_scope(top) - assert(scope) - scope = scope..'/' - - local slen = scope:len() - assert(target:sub(1, slen) == scope) - return target:sub(slen + 1, -1) - - elseif t == 'directory' then - local res = {} - for _, fname in ipairs(posix.dir(name)) do - if not ({['.']=true, ['..']=true})[fname] then - table.insert(res, pth.name(fname)) - end - end - return res - - else error('Unsupported file type: '..name) end - end - - return self.cache[name] -end - -function backend:set(mods) - for _, mod in pairs(mods) do - local path, value = unpack(mod) - local name = pth.join('/', unpack(path)) - - if value == nil then - print('DEL', name) - - local t = posix.stat(name, 'type') - if t == 'directory' then - assert(posix.rmdir(name)) - elseif t then assert(os.remove(name)) end - - self.cache[name] = nil - - elseif type(value) == 'table' then - assert(posix.mkdir(name)) - - else - local scope = get_scope(topology('/files'..name)) - - if scope then - -- TODO use relative symlink - os.remove(name) - assert(posix.link(pth.to_absolute(value, scope), name, true)) - - else - local file = util.open_file(name, 'w') - file:write(tostring(value)) - file:close() - - self.cache[name] = value - end - end - end -end - - -return backend |