* Rework dataset resolve mechanism to use separate status

This commit is contained in:
michael 2019-11-02 17:32:55 +00:00
parent a16ec5bdc1
commit 551b7e9911
4 changed files with 25 additions and 21 deletions

View File

@ -64,12 +64,12 @@ Type
function DataTypeToFieldType(s: String): TFieldType; function DataTypeToFieldType(s: String): TFieldType;
procedure SetParams(AValue: TParams); procedure SetParams(AValue: TParams);
Protected Protected
function ConvertToDateTime(aField : TField; aValue : JSValue; ARaiseException : Boolean) : TDateTime; override;
function ConvertDateTimeToNative(aField : TField; aValue : TDateTime) : JSValue; override;
Procedure MetaDataToFieldDefs; override; Procedure MetaDataToFieldDefs; override;
Public Public
constructor create(aOwner : TComponent); override; constructor create(aOwner : TComponent); override;
Destructor Destroy; override; Destructor Destroy; override;
function ConvertToDateTime(aField : TField; aValue : JSValue; ARaiseException : Boolean) : TDateTime; override;
function ConvertDateTimeToNative(aField : TField; aValue : TDateTime) : JSValue; override;
function DoGetDataProxy: TDataProxy; override; function DoGetDataProxy: TDataProxy; override;
Function ParamByName(Const aName : string) : TParam; Function ParamByName(Const aName : string) : TParam;
Function FindParam(Const aName : string) : TParam; Function FindParam(Const aName : string) : TParam;

View File

@ -46,9 +46,12 @@ type
deCheckBrowseMode, dePropertyChange, deFieldListChange, deFocusControl, deCheckBrowseMode, dePropertyChange, deFieldListChange, deFocusControl,
deParentScroll,deConnectChange,deReconcileError,deDisabledStateChange); deParentScroll,deConnectChange,deReconcileError,deDisabledStateChange);
TUpdateStatus = (usUnmodified, usModified, usInserted, usDeleted, usResolved, usResolveFailed, usResolving); TUpdateStatus = (usModified, usInserted, usDeleted);
TUpdateStatusSet = Set of TUpdateStatus; TUpdateStatusSet = Set of TUpdateStatus;
TResolveStatus = (rsUnresolved, rsResolving, rsResolved, rsResolveFailed);
TResolveStatusSet = Set of TResolveStatus;
TUpdateMode = (upWhereAll, upWhereChanged, upWhereKeyOnly); TUpdateMode = (upWhereAll, upWhereChanged, upWhereKeyOnly);
TResolverResponse = (rrSkip, rrAbort, rrMerge, rrApply, rrIgnore); TResolverResponse = (rrSkip, rrAbort, rrMerge, rrApply, rrIgnore);
@ -1356,7 +1359,6 @@ type
procedure UpdateCursorPos; procedure UpdateCursorPos;
procedure UpdateRecord; procedure UpdateRecord;
Function GetPendingUpdates : TResolveInfoArray; Function GetPendingUpdates : TResolveInfoArray;
function UpdateStatus: TUpdateStatus; virtual;
Property Loading : Boolean Read GetIsLoading; Property Loading : Boolean Read GetIsLoading;
property BlockReadSize: Integer read FBlockReadSize write SetBlockReadSize; property BlockReadSize: Integer read FBlockReadSize write SetBlockReadSize;
property BOF: Boolean read FBOF; property BOF: Boolean read FBOF;
@ -1607,12 +1609,12 @@ type
FData: JSValue; FData: JSValue;
FDataset: TDataset; FDataset: TDataset;
FProxy: TDataProxy; FProxy: TDataProxy;
FResolveStatus: TResolveStatus;
FResolveError: String; FResolveError: String;
FServerData: JSValue; FServerData: JSValue;
FStatus: TUpdateStatus; FStatus: TUpdateStatus;
FOriginalStatus : TUpdateStatus;
Protected Protected
Procedure SetStatus(aValue : TUpdateStatus); virtual; Procedure SetResolveStatus(aValue : TResolveStatus); virtual;
Procedure Reset; 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;
@ -1620,8 +1622,9 @@ type
Procedure ResolveFailed(aError : String); Procedure ResolveFailed(aError : String);
Property Proxy : TDataProxy read FProxy; Property Proxy : TDataProxy read FProxy;
Property Dataset : TDataset Read FDataset; Property Dataset : TDataset Read FDataset;
Property OriginalStatus : TUpdateStatus Read FOriginalStatus; Property OriginalStatus : TUpdateStatus Read FStatus; deprecated;
Property Status : TUpdateStatus Read FStatus; Property Status : TUpdateStatus Read FStatus;
Property ResolveStatus : TResolveStatus Read FResolveStatus;
Property ServerData : JSValue Read FServerData; Property ServerData : JSValue Read FServerData;
Property Data : JSValue Read FData; Property Data : JSValue Read FData;
Property Bookmark : TBookmark Read FBookmark; Property Bookmark : TBookmark Read FBookmark;
@ -1836,14 +1839,14 @@ end;
{ TRecordUpdateDescriptor } { TRecordUpdateDescriptor }
procedure TRecordUpdateDescriptor.SetStatus(aValue: TUpdateStatus); procedure TRecordUpdateDescriptor.SetResolveStatus(aValue: TResolveStatus);
begin begin
FStatus:=AValue; FResolveStatus:=AValue;
end; end;
procedure TRecordUpdateDescriptor.Reset; procedure TRecordUpdateDescriptor.Reset;
begin begin
FStatus:=FOriginalStatus; FResolveStatus:=rsUnresolved;
FResolveError:=''; FResolveError:='';
FServerData:=Null; FServerData:=Null;
end; end;
@ -1855,20 +1858,19 @@ begin
FBookmark:=aBookmark; FBookmark:=aBookmark;
FData:=AData; FData:=AData;
FStatus:=AStatus; FStatus:=AStatus;
FOriginalStatus:=AStatus;
FProxy:=aProxy; FProxy:=aProxy;
end; end;
procedure TRecordUpdateDescriptor.Resolve(aData: JSValue); procedure TRecordUpdateDescriptor.Resolve(aData: JSValue);
begin begin
FStatus:=usResolved; SetResolveStatus(rsResolved);
FServerData:=AData; FServerData:=AData;
end; end;
procedure TRecordUpdateDescriptor.ResolveFailed(aError: String); procedure TRecordUpdateDescriptor.ResolveFailed(aError: String);
begin begin
SetStatus(usResolveFailed); SetResolveStatus(rsResolveFailed);
FResolveError:=AError; FResolveError:=AError;
end; end;
@ -2882,7 +2884,7 @@ Var
begin begin
MinIndex:=0; // Check batch list for minimal index ? MinIndex:=0; // Check batch list for minimal index ?
For I:=MinIndex to FChangeList.Count-1 do For I:=MinIndex to FChangeList.Count-1 do
if Not (TRecordUpdateDescriptor(FChangeList[i]).Status in [usResolving,usResolved]) then if TRecordUpdateDescriptor(FChangeList[i]).ResolveStatus=rsUnResolved then
Alist.Add(FChangeList[i]); Alist.Add(FChangeList[i]);
Result:=FChangeList.Count; Result:=FChangeList.Count;
end; end;
@ -2896,7 +2898,7 @@ begin
try try
Result:=DoResolveRecordUpdate(anUpdate); Result:=DoResolveRecordUpdate(anUpdate);
If not Result then If not Result then
anUpdate.FStatus:=usResolveFailed; anUpdate.SetResolveStatus(rsResolveFailed);
except except
On E : Exception do On E : Exception do
begin begin
@ -2953,11 +2955,11 @@ begin
if (Idx<>-1) then if (Idx<>-1) then
begin begin
doRemove:=False; doRemove:=False;
if (RUD.Status=usResolved) then if (RUD.ResolveStatus=rsResolved) then
DoRemove:=ResolveRecordUpdate(RUD) DoRemove:=ResolveRecordUpdate(RUD)
else else
// What if not resolvable.. ? // What if not resolvable.. ?
DoRemove:=(RUD.Status in [usUnmodified]); DoRemove:=(RUD.ResolveStatus=rsResolved);
If DoRemove then If DoRemove then
begin begin
RUD.Free; RUD.Free;
@ -2997,7 +2999,7 @@ begin
end; end;
Inc(FUpdateBatchID); Inc(FUpdateBatchID);
For I:=0 to L.Count-1 do For I:=0 to L.Count-1 do
TRecordUpdateDescriptor(L[i]).SetStatus(usResolving); TRecordUpdateDescriptor(L[i]).SetResolveStatus(rsResolving);
B:=DataProxy.GetRecordUpdateBatch(FUpdateBatchID,L,True); B:=DataProxy.GetRecordUpdateBatch(FUpdateBatchID,L,True);
B.FDataset:=Self; B.FDataset:=Self;
B.FLastChangeIndex:=I; B.FLastChangeIndex:=I;
@ -4868,11 +4870,13 @@ begin
end; end;
end; end;
(*
function TDataSet.UpdateStatus: TUpdateStatus; function TDataSet.UpdateStatus: TUpdateStatus;
begin begin
Result:=usUnmodified; Result:=;
end; end;
*)
procedure TDataSet.SetConstraints(Value: TCheckConstraints); procedure TDataSet.SetConstraints(Value: TCheckConstraints);
begin begin

View File

@ -288,7 +288,6 @@ type
procedure SetRowType(AValue: TJSONRowType); procedure SetRowType(AValue: TJSONRowType);
protected protected
procedure ActivateIndex(Build : Boolean); procedure ActivateIndex(Build : Boolean);
function ConvertDateTimeToNative(aField : TField; aValue : TDateTime) : JSValue; override;
// Determine filter value type based on field type // Determine filter value type based on field type
function FieldTypeToExpressionType(aDataType: TFieldType): TResultType; virtual; function FieldTypeToExpressionType(aDataType: TFieldType): TResultType; virtual;
// Callback for IsNull filter function. // Callback for IsNull filter function.
@ -376,6 +375,7 @@ type
public public
constructor Create (AOwner: TComponent); override; constructor Create (AOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
function ConvertDateTimeToNative(aField : TField; aValue : TDateTime) : JSValue; override;
function Locate(const KeyFields: string; const KeyValues: JSValue; Options: TLocateOptions): boolean; override; function Locate(const KeyFields: string; const KeyValues: JSValue; Options: TLocateOptions): boolean; override;
function Lookup(const KeyFields: string; const KeyValues: JSValue; const ResultFields: string): JSValue; override; function Lookup(const KeyFields: string; const KeyValues: JSValue; const ResultFields: string): JSValue; override;
function GetFieldData(Field: TField; Buffer: TDatarecord): JSValue; override; function GetFieldData(Field: TField; Buffer: TDatarecord): JSValue; override;

View File

@ -235,7 +235,7 @@ begin
I:=aBatch.List.Count-1; I:=aBatch.List.Count-1;
While BatchOK and (I>=0) do While BatchOK and (I>=0) do
begin begin
BatchOK:=aBatch.List[I].Status in [usResolved,usResolveFailed]; BatchOK:=aBatch.List[I].ResolveStatus in [rsResolved,rsResolveFailed];
Dec(I); Dec(I);
end; end;
If BatchOK and Assigned(aBatch.OnResolve) then If BatchOK and Assigned(aBatch.OnResolve) then