summaryrefslogtreecommitdiffstats
path: root/acf/model
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/model
parentfe648009635c8b744c51303020fd0b3b9cfe83c9 (diff)
downloadaconf-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.lua17
-rw-r--r--acf/model/node.lua19
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')