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:
wp_xxyyzz
2023-10-12 13:53:23 +00:00
parent 45a8be0a99
commit 85f217b38e
3 changed files with 90 additions and 77 deletions

View File

@ -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;