summaryrefslogtreecommitdiffstats
path: root/acf/transaction/init.lua
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-03-15 10:58:36 +0200
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-03-15 10:58:36 +0200
commitc72a57b99c93a14cdf924771455a74aa358227c6 (patch)
tree25407e84c18cdddc05ec7b3d9ce0b0c3541ce6a9 /acf/transaction/init.lua
parentfe648009635c8b744c51303020fd0b3b9cfe83c9 (diff)
downloadacf2-c72a57b99c93a14cdf924771455a74aa358227c6.tar.bz2
acf2-c72a57b99c93a14cdf924771455a74aa358227c6.tar.xz
improved handling of nested transactions
add nested transaction support to protocol allow deferring validation to parent transaction process each update request within a nested transaction
Diffstat (limited to 'acf/transaction/init.lua')
-rw-r--r--acf/transaction/init.lua33
1 files changed, 25 insertions, 8 deletions
diff --git a/acf/transaction/init.lua b/acf/transaction/init.lua
index eb92c34..e9b8bbc 100644
--- a/acf/transaction/init.lua
+++ b/acf/transaction/init.lua
@@ -11,7 +11,9 @@ local object = require('acf.object')
local super = object.super
local pth = require('acf.path')
local be_mod = require('acf.transaction.backend')
-local copy = require('acf.util').copy
+
+local util = require('acf.util')
+local copy = util.copy
local function remove_list_value(list, value)
@@ -30,7 +32,7 @@ end
local Transaction = object.class(be_mod.TransactionBackend)
-function Transaction:init(backend)
+function Transaction:init(backend, validate)
super(self, Transaction):init()
self.backend = backend
@@ -42,7 +44,8 @@ function Transaction:init(backend)
self.modified = {}
self.deleted = {}
- self.validate = {}
+ self.validate = validate
+ self.validable = {}
self.root = RootModel(self)
end
@@ -122,11 +125,15 @@ function Transaction:search(path) return self.root:search(pth.split(path)) end
function Transaction:commit()
self:check()
- local errors = ErrorDict()
- for path, func in pairs(self.validate) do
- if not self.deleted[path] then errors:collect(func) end
+ if self.validate then
+ local errors = ErrorDict()
+ for path, _ in pairs(copy(self.validable)) do
+ if not self.deleted[path] then
+ errors:collect(getmetatable(self:search(path)).validate)
+ end
+ end
+ errors:raise()
end
- errors:raise()
local mods = {}
local handled = {}
@@ -174,8 +181,18 @@ function Transaction:commit()
for path, _ in pairs(self.added) do insert_add(path) end
self.backend:comp_and_setm(self.access_time, mods)
+
+
+ if not self.validate then
+ util.update(self.backend.validable, self.validable)
+ end
+
self.backend = nil
end
+
local store = require('acf.persistence').DataStore()
-function start(txn) return Transaction(txn or store) end
+
+function start(txn, defer_validation)
+ return Transaction(txn or store, not (txn and defer_validation))
+end