From c38f231c1b0bc3c1a2da3fc55c7a15799fd7009f Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Thu, 12 Oct 2023 14:22:23 +0000 Subject: [PATCH] TvPlanIt: Fix leaving orphan events, tasks and contacts in an ini datastore when a resource is deleted. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8952 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/tvplanit/source/vpinids.pas | 68 ++++++++++++++++++++------ 1 file changed, 53 insertions(+), 15 deletions(-) diff --git a/components/tvplanit/source/vpinids.pas b/components/tvplanit/source/vpinids.pas index 11accd11f..ac297356e 100644 --- a/components/tvplanit/source/vpinids.pas +++ b/components/tvplanit/source/vpinids.pas @@ -33,6 +33,10 @@ type procedure StrToResource(AString: String; AResource: TVpResource); procedure StrToTask(AString: String; ATask: TVpTask); + procedure InternalPurgeContacts(Res: TVpResource); override; + procedure InternalPurgeEvents(Res: TVpResource); override; + procedure InternalPurgeTasks(Res: TVpResource); override; + procedure SetConnected(const AValue: Boolean); override; function UniqueID(AValue: Integer): Boolean; @@ -52,6 +56,7 @@ type procedure PostEvents; override; procedure PostResources; override; procedure PostTasks; override; + procedure PurgeResource(Res: TVpResource); override; procedure SetResourceByName(Value: String); override; published @@ -362,6 +367,21 @@ begin until UniqueID(Result) and (Result <> -1); end; +procedure TVpIniDataStore.InternalPurgeContacts(Res: TVpResource); +begin + Res.Contacts.ClearContacts; +end; + +procedure TVpIniDataStore.InternalPurgeEvents(Res: TVpResource); +begin + Res.Schedule.ClearEvents; +end; + +procedure TVpIniDataStore.InternalPurgeTasks(Res: TVpResource); +begin + Res.Tasks.ClearTasks; +end; + function TVpIniDatastore.UniqueID(AValue: Integer): Boolean; var i, j: Integer; @@ -568,6 +588,15 @@ begin RefreshTasks; end; +procedure TVpIniDataStore.PurgeResource(Res: TVpResource); +begin + PurgeEvents(Res); + PurgeContacts(Res); + PurgeTasks(Res); + Res.Deleted := true; + inherited PurgeResource(Res); +end; + procedure TVpIniDatastore.StrToContact(AString: String; AContact: TVpContact); var L: TVpIniStrings; @@ -1262,31 +1291,40 @@ begin for i:=0 to Resources.Count-1 do begin res := Resources.Items[i]; - key := Format('Contacts of resource %d', [res.ResourceID]); - for j:=0 to res.Contacts.Count-1 do begin - contact := res.Contacts.GetContact(j); - if not contact.Deleted then - ini.WriteString(key, IntToStr(contact.RecordID), ContactToStr(contact)); + if not res.Deleted then + begin + key := Format('Contacts of resource %d', [res.ResourceID]); + for j:=0 to res.Contacts.Count-1 do begin + contact := res.Contacts.GetContact(j); + if not contact.Deleted then + ini.WriteString(key, IntToStr(contact.RecordID), ContactToStr(contact)); + end; end; end; for i:=0 to Resources.Count-1 do begin res := Resources.Items[i]; - key := Format('Tasks of resource %d', [res.ResourceID]); - for j:=0 to res.Tasks.Count-1 do begin - task := res.Tasks.GetTask(j); - if not task.Deleted then - ini.WriteString(key, IntToStr(task.RecordID), TaskToStr(task)); + if not res.Deleted then + begin + key := Format('Tasks of resource %d', [res.ResourceID]); + for j:=0 to res.Tasks.Count-1 do begin + task := res.Tasks.GetTask(j); + if not task.Deleted then + ini.WriteString(key, IntToStr(task.RecordID), TaskToStr(task)); + end; end; end; for i:=0 to Resources.Count-1 do begin res := Resources.Items[i]; - key := Format('Events of resource %d', [res.ResourceID]); - for j:=0 to res.Schedule.EventCount-1 do begin - event := res.Schedule.GetEvent(j); - if not event.Deleted then - ini.WriteString(key, IntToStr(event.RecordID), EventToStr(event)); + if not res.Deleted then + begin + key := Format('Events of resource %d', [res.ResourceID]); + for j:=0 to res.Schedule.EventCount-1 do begin + event := res.Schedule.GetEvent(j); + if not event.Deleted then + ini.WriteString(key, IntToStr(event.RecordID), EventToStr(event)); + end; end; end;