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/transaction/init.lua | |
parent | fe648009635c8b744c51303020fd0b3b9cfe83c9 (diff) | |
download | acf2-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.lua | 33 |
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 |