summaryrefslogtreecommitdiffstats
path: root/acf2/persistence
diff options
context:
space:
mode:
Diffstat (limited to 'acf2/persistence')
-rw-r--r--acf2/persistence/backends/service.lua32
-rw-r--r--acf2/persistence/init.lua18
2 files changed, 43 insertions, 7 deletions
diff --git a/acf2/persistence/backends/service.lua b/acf2/persistence/backends/service.lua
new file mode 100644
index 0000000..2163184
--- /dev/null
+++ b/acf2/persistence/backends/service.lua
@@ -0,0 +1,32 @@
+--[[
+Copyright (c) 2012-2013 Kaarle Ritvanen
+See LICENSE file for license details
+--]]
+
+local rc = require('rc')
+local stringy = require('stringy')
+
+
+local backend = require('acf2.object').class()
+
+function backend:get(path, top)
+ if #path == 1 then return {'enabled', 'status'} end
+ assert(#path == 2)
+ local status = rc.service_status(path[1])
+ if path[2] == 'status' then return status end
+ if path[2] == 'enabled' then return stringy.startswith(status, 'start') end
+end
+
+function backend:set(mods)
+ for _, mod in ipairs(mods) do
+ local path, value = unpack(mod)
+ assert(#path == 2 and path[2] == 'enabled')
+
+ local name = path[1]
+ if value then rc.service_add(name)
+ else rc.service_delete(name) end
+ os.execute('rc-service '..name..' '..(value and 'start' or 'stop'))
+ end
+end
+
+return backend
diff --git a/acf2/persistence/init.lua b/acf2/persistence/init.lua
index 1cdea75..74ca447 100644
--- a/acf2/persistence/init.lua
+++ b/acf2/persistence/init.lua
@@ -27,11 +27,11 @@ function DataStore:init()
function(m) return m() end,
loadmods('persistence/backends')
)
- self.triggers = {}
+ self.triggers = {pre={}, post={}}
end
-function DataStore:trigger(path, func)
- local funcs = setdefault(self.triggers, path, {})
+function DataStore:trigger(phase, path, func)
+ local funcs = setdefault(self.triggers[phase], path, {})
if not contains(funcs, func) then table.insert(funcs, func) end
end
@@ -98,11 +98,15 @@ function DataStore:_set_multiple(mods)
table.insert(setdefault(bms, backend, {}), {comps, value})
end
- for backend, bm in pairs(bms) do backend:set(bm) end
-
- for path, _ in pairs(trigger) do
- for _, func in ipairs(self.triggers[path] or {}) do func() end
+ local function exec_triggers(phase)
+ for path, _ in pairs(trigger) do
+ for _, func in ipairs(self.triggers[phase][path] or {}) do func() end
+ end
end
+
+ exec_triggers('pre')
+ for backend, bm in pairs(bms) do backend:set(bm) end
+ exec_triggers('post')
end