1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
--[[
Copyright (c) 2012-2013 Kaarle Ritvanen
See LICENSE file for license details
--]]
module(..., package.seeall)
local loadmods = require('acf.loader').loadmods
local object = require('acf.object')
local pth = require('acf.path')
local util = require('acf.util')
DataStore = object.class(require('acf.transaction.backend').TransactionBackend)
function DataStore:init()
object.super(self, DataStore):init()
self.backends = util.map(
function(m) return m.backend() end,
loadmods('persistence/backends')
)
end
function DataStore:split_path(path)
local comps = pth.split(path)
local backend = self.backends[comps[1]]
assert(backend)
table.remove(comps, 1)
return backend, comps
end
function DataStore:get(path, t)
local backend, comps = self:split_path(path)
local res = backend:get(comps, t)
if t ~= nil and res ~= nil then
local atype = type(res)
if t == 'table' then assert(atype == 'table')
else
assert(atype ~= 'table')
if t == 'string' then res = tostring(res)
elseif t == 'number' then res = tonumber(res)
elseif t == 'boolean' then res = res and true or false
elseif t == 'reference' then assert(atype == 'string')
else assert(false) end
end
end
return util.copy(res), self.mod_time[path] or 0
end
function DataStore:_set_multiple(mods)
local bms = {}
for _, mod in ipairs(mods) do
local path, t, value = unpack(mod)
local backend, comps = self:split_path(path)
table.insert(util.setdefault(bms, backend, {}), {comps, t, value})
end
for backend, bm in pairs(bms) do backend:set(bm) end
end
|