summaryrefslogtreecommitdiffstats
path: root/acf/transaction/init.lua
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-06-28 07:00:01 +0300
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-06-28 13:40:05 +0300
commit00166624a85afdbe24722c7e2e3320316cfbae93 (patch)
treef9484b7eb7c2c889c048b318a402d19a7e8ac5ff /acf/transaction/init.lua
parent37396d77b3e911b1c5351ab56ff3ec5797e2f62d (diff)
downloadacf2-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.lua18
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