Skip to content

Instantly share code, notes, and snippets.

@metametaclass
Created February 2, 2013 12:08
Show Gist options
  • Select an option

  • Save metametaclass/4697035 to your computer and use it in GitHub Desktop.

Select an option

Save metametaclass/4697035 to your computer and use it in GitHub Desktop.
procedure TTransactionProcess.OnAddChangeLog(Item:TChangeLog);
var td,tmp:TTableData;
chd:TChangeLogData;
begin
Log([' ',Item.Dump],LVL_DEBUG);
CheckIsInheritedFinished(Item.OPER);
chd:=nil;
td:=nil;
case Item.OPER of
cOper_Insert,
cOper_AppendLogOnly,
cOper_InsertV,
cOper_Delete,
cOper_DeleteV,
cOper_DummyUpdate,
cOper_DummyUpdateV:begin
if mOld<>nil then
raise Exception.CreateFmt('%s: mOld<>nil in single log data %s',['TTransactionProcess.OnAddChangeLog',Item.Dump]);
td:=CreateTableData(item.TABLE_ID);
td.LoadChangeLog(item,mDbIdx);
end;
cOper_DeleteObject:begin
if mOld<>nil then
raise Exception.CreateFmt('%s: mOld<>nil in single log data %s',['TTransactionProcess.OnAddChangeLog',Item.Dump]);
mOld:=CreateTableData(item.TABLE_ID);
mOld.LoadChangeLog(item,mDbIdx);
mInheritedMode:=ipmDeleteObject;
end;
cOper_UpdateOld,
cOper_UpdateOldV,
cOper_NewVersion:begin
if mOld<>nil then
raise Exception.CreateFmt('%s: mOld<>nil in first data of pair %s',['TTransactionProcess.OnAddChangeLog',Item.Dump]);
mLogID:=Item.ID;
mOld:=CreateTableData(item.TABLE_ID);
mOld.LoadChangeLog(item,mDbIdx);
end;
cOper_NewVersionInherited:begin
if mOld=nil then
raise Exception.CreateFmt('%s: mOld=nil in data of inherited %s',['TTransactionProcess.OnAddChangeLog',Item.Dump]);
tmp:=CreateTableData(item.TABLE_ID);
tmp.LoadChangeLog(item,mDbIdx);
mInherited.Add(tmp);
end;
cOper_NewObject:begin
mLogID:=Item.ID;
mOld:=CreateTableData(item.TABLE_ID);
mOld.LoadChangeLog(item,mDbIdx);
mOld.ResetNextVersionFields;
mInheritedMode:=ipmNewObject;
end;
cOper_NewObjectInherited,
cOper_DeleteObjectInherited:begin
if(mOld=nil) then
raise Exception.CreateFmt('%s: mOld=nil in data of inherited %s',['TTransactionProcess.OnAddChangeLog',Item.Dump]);
tmp:=CreateTableData(item.TABLE_ID);
tmp.LoadChangeLog(item,mDbIdx);
mInherited.Add(tmp);
end;
cOper_MarkOldVersionInherited:begin
if(mOld=nil) then
raise Exception.CreateFmt('%s: mOld=nil in data of inherited %s',['TTransactionProcess.OnAddChangeLog',Item.Dump]);
tmp:=CreateTableData(item.TABLE_ID);
tmp.LoadChangeLog(item,mDbIdx);
mInherited.Add(tmp);
end;
cOper_MarkOldVersion:begin
if mOld=nil then
raise Exception.CreateFmt('%s: mOld=nil in second data of pair %s',['TTransactionProcess.OnAddChangeLog',Item.Dump]);
mNew:=mOld;
mInheritedNew.SwapWith(mInherited);
mOld:=CreateTableData(item.TABLE_ID);
mOld.LoadChangeLog(item,mDbIdx);
mInheritedMode:=ipmMarkOld;
end;
cOper_UpdateNew,
cOper_UpdateNewV:begin
if mOld=nil then
raise Exception.CreateFmt('%s: mOld=nil in second data of pair %s',['TTransactionProcess.OnAddChangeLog',Item.Dump]);
td:=CreateTableData(item.TABLE_ID);
td.LoadChangeLog(item,mDbIdx);
end;
else
raise Exception.CreateFmt('%s: Unknown oper code %d in %s',['TTransactionProcess.OnAddChangeLog',Item.OPER,Item.Dump]);
end;
if (mOld=nil)and(td=nil) then
raise Exception.CreateFmt('%s: invalid state in %s',['TTransactionProcess.OnAddChangeLog',Item.Dump]);
if (mOld=nil)and(td<>nil) then begin
chd:=TChangeLogSingle.Create(Item.OPER,Item.ID,td);
end;
if (mOld<>nil)and(td=nil) then begin
//do nothing, second stage
end;
if (mOld<>nil)and(td<>nil) then begin
{if Item.Oper=cOper_MarkOldVersion then begin//åñëè ó íàñ íîâàÿ âåðñèÿ+ïîìåòêà ñòàðîé, òî ïîðÿäîê îáðàòíûé
tmp:=td;
td:=mOld;
mOld:=tmp;
td.ResetNextVersionFields;//set null äëÿ íîâîé âåðñèè - èíà÷å òðèããåð Forbid ïàðèòñÿ
//move ownership of objects in inherited to chd object;
//should clear mInherited and do not destroy object in it!
chd:=TChangeLogMultiPair.Create(Item.OPER,mLogID,mOld,td, mInherited);
mOld:=nil;
mLogID:=0;
end else begin}
chd:=TChangeLogPair.Create(Item.OPER,mLogID,mOld,td);
mOld:=nil;
mLogID:=0;
//end;
end;
if chd<>nil then RegisterChangeLogData(chd);
Item.Free;
end;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment