mirror of
https://gitlab.com/freepascal.org/fpc/pas2js.git
synced 2025-08-22 16:29:10 +02:00
* Rework dataset resolve mechanism to use separate status
This commit is contained in:
parent
a16ec5bdc1
commit
551b7e9911
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user