diff options
-rw-r--r-- | acf/persistence/init.lua | 8 | ||||
-rw-r--r-- | acf/transaction/backend.lua | 10 | ||||
-rw-r--r-- | acf/transaction/init.lua | 6 |
3 files changed, 14 insertions, 10 deletions
diff --git a/acf/persistence/init.lua b/acf/persistence/init.lua index 479620b..de23a68 100644 --- a/acf/persistence/init.lua +++ b/acf/persistence/init.lua @@ -7,7 +7,6 @@ module(..., package.seeall) local loadmods = require('acf.loader').loadmods local object = require('acf.object') -local super = object.super local pth = require('acf.path') local util = require('acf.util') @@ -15,7 +14,7 @@ local util = require('acf.util') DataStore = object.class(require('acf.transaction.backend').TransactionBackend) function DataStore:init() - super(self, DataStore):init() + object.super(self, DataStore):init() self.backends = util.map( function(m) return m.backend() end, loadmods('persistence/backends') @@ -35,10 +34,9 @@ function DataStore:get(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) - +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) diff --git a/acf/transaction/backend.lua b/acf/transaction/backend.lua index e907c6f..a8ecfe0 100644 --- a/acf/transaction/backend.lua +++ b/acf/transaction/backend.lua @@ -36,9 +36,17 @@ end function TransactionBackend:set_multiple(mods) -- TODO delegate to PM backends? local timestamp = gen_number() + local effective = {} + for _, mod in ipairs(mods) do - self.mod_time[mod[1]] = timestamp + local path, t, value = unpack(mod) + if t == 'table' or value ~= self:get(path) then + table.insert(effective, mod) + self.mod_time[path] = timestamp + end end + + self:_set_multiple(effective) end -- TODO should be atomic, mutex with set_multiple diff --git a/acf/transaction/init.lua b/acf/transaction/init.lua index 51137e3..0afad48 100644 --- a/acf/transaction/init.lua +++ b/acf/transaction/init.lua @@ -8,7 +8,6 @@ module(..., package.seeall) local ErrorDict = require('acf.error').ErrorDict local RootModel = require('acf.model.root').RootModel local object = require('acf.object') -local super = object.super local pth = require('acf.path') local be_mod = require('acf.transaction.backend') @@ -33,7 +32,7 @@ end local Transaction = object.class(be_mod.TransactionBackend) function Transaction:init(backend, validate) - super(self, Transaction):init() + object.super(self, Transaction):init() self.backend = backend @@ -69,8 +68,7 @@ function Transaction:get(path) return value, timestamp end -function Transaction:set_multiple(mods) - super(self, Transaction):set_multiple(mods) +function Transaction:_set_multiple(mods) local function set(path, t, value, new) local delete = value == nil |