diff options
author | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-06-28 07:00:01 +0300 |
---|---|---|
committer | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-06-28 13:40:05 +0300 |
commit | 00166624a85afdbe24722c7e2e3320316cfbae93 (patch) | |
tree | f9484b7eb7c2c889c048b318a402d19a7e8ac5ff /acf/transaction/init.lua | |
parent | 37396d77b3e911b1c5351ab56ff3ec5797e2f62d (diff) | |
download | acf2-00166624a85afdbe24722c7e2e3320316cfbae93.tar.bz2 acf2-00166624a85afdbe24722c7e2e3320316cfbae93.tar.xz |
prevent deletion of objects referred to by other objects
Diffstat (limited to 'acf/transaction/init.lua')
-rw-r--r-- | acf/transaction/init.lua | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/acf/transaction/init.lua b/acf/transaction/init.lua index a76e7bf..76a8d47 100644 --- a/acf/transaction/init.lua +++ b/acf/transaction/init.lua @@ -6,7 +6,7 @@ See LICENSE file for license details module(..., package.seeall) local ErrorDict = require('acf.error').ErrorDict -local RootModel = require('acf.model.root').RootModel +local root = require('acf.model.root') local object = require('acf.object') local pth = require('acf.path') local be_mod = require('acf.transaction.backend') @@ -46,7 +46,7 @@ function Transaction:init(backend, validate) self.validate = validate self.validable = {} - self.root = RootModel(self) + self.root = root.RootModel(self) end function Transaction:check() @@ -94,6 +94,20 @@ function Transaction:_set_multiple(mods) local delete = value == nil + if delete then + -- assume one-level refs for now + local top = root.topology(ppath) + if top then + local errors = ErrorDict() + for _, refs in ipairs(top.referrers) do + for _, ref in ipairs(self.root:search_refs(refs)) do + errors:collect(ref.deleted, ref, path) + end + end + errors:raise() + end + end + if type(old) == 'table' then if delete then for _, child in ipairs(old) do self:set(pth.join(path, child)) end |