* 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;
procedure SetParams(AValue: TParams);
Protected
function ConvertToDateTime(aField : TField; aValue : JSValue; ARaiseException : Boolean) : TDateTime; override;
function ConvertDateTimeToNative(aField : TField; aValue : TDateTime) : JSValue; override;
Procedure MetaDataToFieldDefs; override;
Public
constructor create(aOwner : TComponent); 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 ParamByName(Const aName : string) : TParam;
Function FindParam(Const aName : string) : TParam;

View File

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

View File

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

View File

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