diff options
author | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2014-01-03 01:00:01 +0200 |
---|---|---|
committer | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2014-01-03 03:45:39 +0200 |
commit | 849ed1cb3792af468999a312449faf3e599e67c1 (patch) | |
tree | 04456d38b803e29e44302b7f44e0525e1395cd77 /acf2/persistence/defer.lua | |
parent | 15ea19da7079cb4c2019b53dae62d5cf6562ce63 (diff) | |
download | aconf-849ed1cb3792af468999a312449faf3e599e67c1.tar.bz2 aconf-849ed1cb3792af468999a312449faf3e599e67c1.tar.xz |
deferred final commit for configurable backend addresses
Diffstat (limited to 'acf2/persistence/defer.lua')
-rw-r--r-- | acf2/persistence/defer.lua | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/acf2/persistence/defer.lua b/acf2/persistence/defer.lua new file mode 100644 index 0000000..e93f49e --- /dev/null +++ b/acf2/persistence/defer.lua @@ -0,0 +1,47 @@ +--[[ +Copyright (c) 2012-2014 Kaarle Ritvanen +See LICENSE file for license details +--]] + +local object = require('acf2.object') +local super = object.super + +local pth = require('acf2.path') + + +local DeferringCommitter = object.class( + require('acf2.transaction.base').Transaction +) + +function DeferringCommitter:init(backend) + super(self, DeferringCommitter):init(backend) + self.defer_paths = {} + self.committed = true +end + +function DeferringCommitter:defer(path) self.defer_paths[path] = true end + +function DeferringCommitter:_set_multiple(mods) + super(self, DeferringCommitter):_set_multiple(mods) + + if not self.committed then return end + self.committed = false + + for _, mod in ipairs(mods) do + local path, value = unpack(mod) + while path > '/' do + if self.defer_paths[path] then return end + path = pth.parent(path) + end + end + + self:commit() +end + +function DeferringCommitter:commit() + super(self, DeferringCommitter):commit() + self.committed = true +end + + +return DeferringCommitter(require('acf2.persistence')) |