summaryrefslogtreecommitdiffstats
path: root/acf/persistence/init.lua
blob: f674e9cb2455031d2bc621f5eb79acedbb5d3ba0 (plain)
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
--[[
Copyright (c) 2012 Kaarle Ritvanen
See LICENSE file for license details
--]]

module(..., package.seeall)

local object = require('acf.object')
local super = object.super
local pth = require('acf.path')
local util = require('acf.util')


DataStore = object.class(require('acf.transaction.backend').TransactionBackend)

function DataStore:init()
   super(self, DataStore):init()
   self.backends = util.map(function(m) return m.backend() end,
			    util.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)
   local backend, comps = self:split_path(path)
   return util.copy(backend:get(comps)), self.mod_time[path] or 0
end

function DataStore:set_multiple(mods)
   super(self, 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)
      if not bms[backend] then bms[backend] = {} end
      table.insert(bms[backend], {comps, t, value})
   end

   for backend, bm in pairs(bms) do backend:set(bm) end
end