/
aMove.xxm
82 lines (69 loc) · 2.48 KB
/
aMove.xxm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
[[@txDefs,DataLank,txSession,]][[!var
x:string;
ItemType:TtxItemType;
ItemID,newPid,aid,RlmID,i,c:integer;
url:string;
]][[
//TODO: Session.UpdateID to move node
CheckFormProtect(Context);
x:=Context['x'].Value;
txItem(x,ItemType,ItemID);
newPid:=Context['parent'].AsInteger;
//check not creating invalid path
aid:=newPid;
while (aid<>0) and (aid<>ItemID) do
aid:=DBSingleValue(txItemSQL_PidById[ItemType],[aid],0);
if aid<>0 then raise Exception.Create('Can''t move item to a branch under itself.');
if ItemType=itObj then
begin
//check realm
RlmID:=DBSingleValue('SELECT rlm_id FROM Obj WHERE id=?',[ItemID],DefaultRlmID);
Session.HasRealmPermission(ItemID,RlmID,rpEdit);
if newPid=0 then RlmID:=0 else RlmID:=DBSingleValue('SELECT rlm_id FROM Obj WHERE id=?',[newPid],DefaultRlmID);
Session.HasRealmPermission(newPid,RlmID,rpEdit);
//TODO: else RealmPermission(rpEdit,0)?
Session.DbCon.BeginTrans;
try
//perform doesn't set c_ts, c_uid
Session.DbCon.Execute(txItemSQL_Move[ItemType],[newPid,ItemID]);
Session.AddFilterRecent(itObj,newPid);
if Use_ObjPath then
begin
Session.DbCon.Execute('DELETE FROM ObjPath WHERE oid=?',[ItemID]);
Session.DbCon.Execute('DELETE FROM ObjPath WHERE pid=?',[ItemID]);
//parents
i:=0;
while newPid<>0 do
begin
inc(i);
Session.DbCon.Insert('ObjPath',['pid',newPid,'oid',ItemID,'lvl',i]);
newPid:=DBSingleValue('SELECT pid FROM Obj WHERE id=?',[newPid],0);
end;
//children
//TODO: perform async in background
c:=Session.DbCon.Execute('INSERT INTO ObjPath (pid,oid,lvl) SELECT pid,id,1 FROM Obj WHERE pid=?',[ItemID]);
i:=0;
while c<>0 do
begin
inc(i);
c:=Session.DbCon.Execute('INSERT INTO ObjPath (pid,oid,lvl) SELECT ObjPath.pid,Obj.id,ObjPath.lvl+1 FROM ObjPath '+
'INNER JOIN Obj ON Obj.pid=ObjPath.oid WHERE ObjPath.pid=? AND ObjPath.lvl=?',[ItemID,i]);
end;
end;
if Use_Unread and not Session.Stealth then
Session.DbCon.Insert('Obx',['obj_id',ItemID]);
Session.DbCon.CommitTrans;
except
Session.DbCon.RollbackTrans;
raise;
end;
end
else
begin
Session.HasRealmPermission(0,DefaultRlmID,rpEdit);
Session.DbCon.Execute(txItemSQL_Move[ItemType],[newPid,ItemID]);
Session.AddFilterRecent(ItemType,newPid);
end;
url:='Item.xxm?x='+x;
Context.Redirect(url,true);
<<a href="[[=url]]">>=url<</a>