You've already forked lazarus-ccr
TvPlanIt: Fix leaving orphan events, tasks and contacts in an xml datastore when a resource is deleted.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8950 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -28,6 +28,10 @@ type
|
||||
function CreateStoreNode(ADoc: TDOMDocument): TDOMNode;
|
||||
function FindStoreNode(ADoc: TDOMDocument): TDOMNode;
|
||||
|
||||
procedure InternalPurgeContacts(Res: TVpResource); override;
|
||||
procedure InternalPurgeEvents(Res: TVpResource); override;
|
||||
procedure InternalPurgeTasks(Res: TVpResource); override;
|
||||
|
||||
procedure ReadContact(ANode: TDOMNode; AContacts: TVpContacts);
|
||||
procedure ReadContacts(ANode: TDOMNode; AContacts: TVpContacts);
|
||||
procedure ReadEvent(ANode: TDOMNode; ASchedule: TVpSchedule);
|
||||
@ -64,6 +68,8 @@ type
|
||||
procedure PostResources; override;
|
||||
procedure PostTasks; override;
|
||||
|
||||
procedure PurgeResource(Res: TVpResource); override;
|
||||
|
||||
published
|
||||
property AutoConnect default false;
|
||||
property FileName: String read FFileName write SetFileName;
|
||||
@ -396,6 +402,21 @@ begin
|
||||
until UniqueID(Result) and (Result <> -1);
|
||||
end;
|
||||
|
||||
procedure TVpXmlDataStore.InternalPurgeContacts(Res: TVpResource);
|
||||
begin
|
||||
Res.Contacts.ClearContacts;
|
||||
end;
|
||||
|
||||
procedure TVpXmlDataStore.InternalPurgeEvents(Res: TVpResource);
|
||||
begin
|
||||
Res.Schedule.ClearEvents;
|
||||
end;
|
||||
|
||||
procedure TVpXmlDataStore.InternalPurgeTasks(Res: TVpResource);
|
||||
begin
|
||||
Res.Tasks.ClearTasks;
|
||||
end;
|
||||
|
||||
procedure TVpXmlDatastore.Loaded;
|
||||
begin
|
||||
inherited;
|
||||
@ -537,6 +558,15 @@ begin
|
||||
RefreshTasks;
|
||||
end;
|
||||
|
||||
procedure TVpXmlDataStore.PurgeResource(Res: TVpResource);
|
||||
begin
|
||||
PurgeEvents(Res);
|
||||
PurgeContacts(Res);
|
||||
PurgeTasks(Res);
|
||||
Res.Deleted := true;
|
||||
inherited PurgeResource(Res);
|
||||
end;
|
||||
|
||||
procedure TVpXmlDatastore.ReadFromXml;
|
||||
var
|
||||
doc: TXMLDocument;
|
||||
@ -1457,23 +1487,27 @@ end;
|
||||
|
||||
procedure TVpXmlDatastore.WriteResources(ADoc: TDOMDocument; AParentNode: TDOMNode);
|
||||
var
|
||||
i: Integer;
|
||||
node, resnode, child, txt: TDOMNode;
|
||||
i, n: Integer;
|
||||
node, resroot, resnode, child, txt: TDOMNode;
|
||||
res: TVpResource;
|
||||
begin
|
||||
node := ADoc.CreateElement('Resources');
|
||||
TDOMElement(node).SetAttribute('Count', IntToStr(Resources.Count));
|
||||
AParentNode.AppendChild(node);
|
||||
resRoot := ADoc.CreateElement('Resources');
|
||||
AParentNode.AppendChild(resRoot);
|
||||
|
||||
n := 0; // Counter of "Resource" nodes
|
||||
for i:=0 to Resources.Count-1 do begin
|
||||
res := Resources.Items[i];
|
||||
if res.Deleted then
|
||||
Continue;
|
||||
|
||||
inc(n);
|
||||
|
||||
resNode := ADoc.CreateElement('Resource');
|
||||
with TDOMElement(resNode) do begin
|
||||
SetAttribute('ResourceID', IntToStr(res.ResourceID));
|
||||
SetAttribute('ResourceActive', BoolToStr(res.ResourceActive, strTRUE, strFALSE));
|
||||
end;
|
||||
node.AppendChild(resnode);
|
||||
resRoot.AppendChild(resnode);
|
||||
|
||||
if res.Description <> '' then begin
|
||||
child := ADoc.CreateElement('Description');
|
||||
@ -1563,6 +1597,8 @@ begin
|
||||
WriteEvents(ADoc, resnode, res);
|
||||
WriteTasks(ADoc, resNode, res);
|
||||
end;
|
||||
|
||||
TDOMElement(resRoot).SetAttribute('Count', IntToStr(n));
|
||||
end;
|
||||
|
||||
procedure TVpXmlDatastore.WriteTask(ADoc: TDOMDocument; ATaskNode: TDOMNode;
|
||||
|
Reference in New Issue
Block a user