diff options
author | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-03-15 10:58:36 +0200 |
---|---|---|
committer | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-03-15 10:58:36 +0200 |
commit | c72a57b99c93a14cdf924771455a74aa358227c6 (patch) | |
tree | 25407e84c18cdddc05ec7b3d9ce0b0c3541ce6a9 /acf/model | |
parent | fe648009635c8b744c51303020fd0b3b9cfe83c9 (diff) | |
download | aconf-c72a57b99c93a14cdf924771455a74aa358227c6.tar.bz2 aconf-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/model')
-rw-r--r-- | acf/model/model.lua | 17 | ||||
-rw-r--r-- | acf/model/node.lua | 19 |
2 files changed, 18 insertions, 18 deletions
diff --git a/acf/model/model.lua b/acf/model/model.lua index 6a9a843..aa27312 100644 --- a/acf/model/model.lua +++ b/acf/model/model.lua @@ -79,6 +79,13 @@ function Model:init(txn, path, addr) return util.map(function(f) return f.name end, mt.meta.fields) end + function mt.validate() + for _, name in ipairs(mt.members()) do + local field = mt.field(name) + if not field.compute then field:validate_saved() end + end + end + function mt.__index(t, k) local f = mt.field(k) if f then @@ -93,14 +100,4 @@ function Model:init(txn, path, addr) if not f then raise(mt.path, 'Field named '..k..' does not exist') end f:save(v) end - - txn.validate[mt.path] = function() self:validate() end -end - -function Model:validate() - local mt = getmetatable(self) - for _, name in ipairs(mt.members()) do - local field = mt.field(name) - if not field.compute then field:validate_saved() end - end end diff --git a/acf/model/node.lua b/acf/model/node.lua index 3459fce..f893d6a 100644 --- a/acf/model/node.lua +++ b/acf/model/node.lua @@ -48,6 +48,8 @@ function TreeNode:init(txn, path, addr) mt.txn = txn mt.path = path mt.addr = addr + + txn.validable[path] = true end function TreeNode:search(path) @@ -67,14 +69,6 @@ Collection = class(TreeNode) function Collection:init(txn, path, addr, field, required) super(self, Collection):init(txn, path, addr) - if required then - txn.validate[path] = function() - if #txn:get(addr) == 0 then - raise(path, 'Collection cannot be empty') - end - end - end - self.init = nil self.search = nil @@ -84,6 +78,14 @@ function Collection:init(txn, path, addr, field, required) mt.meta = {type='collection', members=mt.field:meta('$')} function mt.mmeta(name) return mt.meta.members end function mt.members() return txn:get(addr) or {} end + + function mt.validate() + if required then + if #txn:get(addr) == 0 then + raise(path, 'Collection cannot be empty') + end + end + end function mt.__index(t, k) return mt.field:load(k) end function mt.__newindex(t, k, v) mt.field:save(k, v) end @@ -132,3 +134,4 @@ members = meta_func('members') meta = meta_func('meta') mmeta = meta_func('mmeta') path = meta_func('path') +validate = meta_func('validate') |