Browse Source

* Reset update desriptor if it failed in current batch.

michael 7 years ago
parent
commit
ad62d86c9b
1 changed files with 20 additions and 5 deletions
  1. 20 5
      packages/fcl-db/db.pas

+ 20 - 5
packages/fcl-db/db.pas

@@ -1055,7 +1055,6 @@ type
     FCalcFieldsSize: Longint;
     FCalcFieldsSize: Longint;
     FOnLoadFail: TDatasetLoadFailEvent;
     FOnLoadFail: TDatasetLoadFailEvent;
     FOnRecordResolved: TOnRecordResolveEvent;
     FOnRecordResolved: TOnRecordResolveEvent;
-    FOnRecordResolveEvent: TOnRecordResolveEvent;
     FOpenAfterRead : boolean;
     FOpenAfterRead : boolean;
     FActiveRecord: Longint;
     FActiveRecord: Longint;
     FAfterCancel: TDataSetNotifyEvent;
     FAfterCancel: TDataSetNotifyEvent;
@@ -1392,7 +1391,7 @@ type
     property OnEditError: TDataSetErrorEvent read FOnEditError write FOnEditError;
     property OnEditError: TDataSetErrorEvent read FOnEditError write FOnEditError;
     property OnFilterRecord: TFilterRecordEvent read FOnFilterRecord write SetOnFilterRecord;
     property OnFilterRecord: TFilterRecordEvent read FOnFilterRecord write SetOnFilterRecord;
     property OnNewRecord: TDataSetNotifyEvent read FOnNewRecord write FOnNewRecord;
     property OnNewRecord: TDataSetNotifyEvent read FOnNewRecord write FOnNewRecord;
-    Property OnRecordResolved : TOnRecordResolveEvent Read FOnRecordResolved Write FOnRecordResolveEvent;
+    Property OnRecordResolved : TOnRecordResolveEvent Read FOnRecordResolved Write FOnRecordResolved;
     property OnPostError: TDataSetErrorEvent read FOnPostError write FOnPostError;
     property OnPostError: TDataSetErrorEvent read FOnPostError write FOnPostError;
     property OnLoadFail : TDatasetLoadFailEvent Read FOnLoadFail Write FOnLoadFail;
     property OnLoadFail : TDatasetLoadFailEvent Read FOnLoadFail Write FOnLoadFail;
   end;
   end;
@@ -1597,6 +1596,7 @@ type
     FOriginalStatus : TUpdateStatus;
     FOriginalStatus : TUpdateStatus;
   Protected
   Protected
     Procedure SetStatus(aValue : TUpdateStatus); virtual;
     Procedure SetStatus(aValue : TUpdateStatus); virtual;
+    Procedure Reset;
   Public
   Public
     Constructor Create(aProxy : TDataProxy; aDataset : TDataset; aBookmark : TBookMark; AData : JSValue; AStatus : TUpdateStatus); reintroduce;
     Constructor Create(aProxy : TDataProxy; aDataset : TDataset; aBookmark : TBookMark; AData : JSValue; AStatus : TUpdateStatus); reintroduce;
     Procedure Resolve(aData : JSValue);
     Procedure Resolve(aData : JSValue);
@@ -1824,6 +1824,13 @@ begin
   FStatus:=AValue;
   FStatus:=AValue;
 end;
 end;
 
 
+procedure TRecordUpdateDescriptor.Reset;
+begin
+  FStatus:=FOriginalStatus;
+  FResolveError:='';
+  FServerData:=Null;
+end;
+
 constructor TRecordUpdateDescriptor.Create(aProxy: TDataProxy; aDataset: TDataset; aBookmark: TBookMark; AData: JSValue;
 constructor TRecordUpdateDescriptor.Create(aProxy: TDataProxy; aDataset: TDataset; aBookmark: TBookMark; AData: JSValue;
   AStatus: TUpdateStatus);
   AStatus: TUpdateStatus);
 begin
 begin
@@ -2862,6 +2869,9 @@ end;
 
 
 Function TDataSet.ResolveRecordUpdate(anUpdate: TRecordUpdateDescriptor) : Boolean;
 Function TDataSet.ResolveRecordUpdate(anUpdate: TRecordUpdateDescriptor) : Boolean;
 
 
+// This must return true if the record may be removed from the list of 'modified' records.
+// If it returns false, the record is kept in the list of modified records.
+
 begin
 begin
   try
   try
     Result:=DoResolveRecordUpdate(anUpdate);
     Result:=DoResolveRecordUpdate(anUpdate);
@@ -2869,7 +2879,10 @@ begin
       anUpdate.FStatus:=usResolveFailed;
       anUpdate.FStatus:=usResolveFailed;
   except
   except
     On E : Exception do
     On E : Exception do
+      begin
       anUpdate.ResolveFailed(E.Classname+': '+E.Message);
       anUpdate.ResolveFailed(E.Classname+': '+E.Message);
+      Result:=False;
+      end;
   end;
   end;
   DoOnRecordResolved(anUpdate);
   DoOnRecordResolved(anUpdate);
 end;
 end;
@@ -2920,13 +2933,15 @@ begin
       if (RUD.Status=usResolved) then
       if (RUD.Status=usResolved) then
         DoRemove:=ResolveRecordUpdate(RUD)
         DoRemove:=ResolveRecordUpdate(RUD)
       else
       else
-        DoRemove:=(RUD.Status in [usUnmodified,usResolveFailed]);
-      // What if not resolvable.. ?
+        // What if not resolvable.. ?
+        DoRemove:=(RUD.Status in [usUnmodified]);
       If DoRemove then
       If DoRemove then
         begin
         begin
         RUD.Free;
         RUD.Free;
         FChangeList.Delete(Idx);
         FChangeList.Delete(Idx);
-        end;
+        end
+      else
+        RUD.Reset; // So we try it again in next applyupdates.
       end;
       end;
     end;
     end;
   if (FBatchList.Count=0) then
   if (FBatchList.Count=0) then