diff options
Diffstat (limited to 'acf/transaction/backend.lua')
-rw-r--r-- | acf/transaction/backend.lua | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/acf/transaction/backend.lua b/acf/transaction/backend.lua index 5b8c53f..e907c6f 100644 --- a/acf/transaction/backend.lua +++ b/acf/transaction/backend.lua @@ -1,10 +1,12 @@ --[[ -Copyright (c) 2012 Kaarle Ritvanen +Copyright (c) 2012-2013 Kaarle Ritvanen See LICENSE file for license details --]] module(..., package.seeall) +local err = require('acf.error') + -- TODO each transaction backend (i.e. persistence manager or -- transaction proper) should be implemented as a thread or have its -- internal state stored in shared storage (with appropriate locking) @@ -23,7 +25,7 @@ function TransactionBackend:init() self.mod_time = {} end function TransactionBackend:get_if_older(path, timestamp) local value, ts = self:get(path) - if ts > timestamp then error('Concurrent modification: '..path) end + if ts > timestamp then err.raise('conflict', path) end return value, ts end @@ -41,8 +43,11 @@ end -- TODO should be atomic, mutex with set_multiple function TransactionBackend:comp_and_setm(accessed, mods) + local errors = err.ErrorDict() for path, timestamp in pairs(accessed) do - self:get_if_older(path, timestamp) + errors:collect(self.get_if_older, self, path, timestamp) end + errors:raise() + self:set_multiple(mods) end |