From 0a0fd7dfe0f4424a0ba6eaa550c58fa2dd21ec35 Mon Sep 17 00:00:00 2001 From: michael Date: Sat, 18 May 2019 14:20:45 +0000 Subject: [PATCH] * Locate by default starts from 0th record. Add option to allow search from current. Fix date handling --- packages/fcl-db/db.pas | 38 +++++++++++++++++---------------- packages/fcl-db/jsondataset.pas | 25 ++++++++++++++++------ 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/packages/fcl-db/db.pas b/packages/fcl-db/db.pas index 8ea546c..385a7d9 100644 --- a/packages/fcl-db/db.pas +++ b/packages/fcl-db/db.pas @@ -1002,7 +1002,7 @@ type TUpdateAction = (uaFail, uaAbort, uaSkip, uaRetry, uaApplied); TUpdateKind = (ukModify, ukInsert, ukDelete); - TLocateOption = (loCaseInsensitive, loPartialKey); + TLocateOption = (loCaseInsensitive, loPartialKey, loFromCurrent); TLocateOptions = set of TLocateOption; TDataOperation = procedure of object; @@ -1293,10 +1293,10 @@ type procedure Append; procedure AppendRecord(const Values: array of jsValue); function BookmarkValid(ABookmark{%H-}: TBookmark): Boolean; virtual; - function ConvertToDateTime(aValue : JSValue; ARaiseException : Boolean) : TDateTime; virtual; - function ConvertDateTimeToNative(aValue : TDateTime) : JSValue; virtual; - Class function DefaultConvertToDateTime(aValue : JSValue; ARaiseException{%H-} : Boolean) : TDateTime; virtual; - Class function DefaultConvertDateTimeToNative(aValue : TDateTime) : JSValue; virtual; + function ConvertToDateTime(aField : TField; aValue : JSValue; ARaiseException : Boolean) : TDateTime; virtual; + function ConvertDateTimeToNative(aField : TField; aValue : TDateTime) : JSValue; virtual; + Class function DefaultConvertToDateTime(aField : TField; aValue : JSValue; ARaiseException{%H-} : Boolean) : TDateTime; virtual; + Class function DefaultConvertDateTimeToNative(aField : TField; aValue : TDateTime) : JSValue; virtual; Function BlobDataToBytes(aValue : JSValue) : TBytes; virtual; Class Function DefaultBlobDataToBytes(aValue : JSValue) : TBytes; virtual; Function BytesToBlobData(aValue : TBytes) : JSValue ; virtual; @@ -3867,12 +3867,12 @@ end; -function TDataSet.ConvertToDateTime(aValue: JSValue; ARaiseException: Boolean): TDateTime; +function TDataSet.ConvertToDateTime(aField: TField; aValue: JSValue; ARaiseException: Boolean): TDateTime; begin - Result:=DefaultConvertToDateTime(aValue,ARaiseException); + Result:=DefaultConvertToDateTime(aField,aValue,ARaiseException); end; -class function TDataSet.DefaultConvertToDateTime(aValue: JSValue; ARaiseException: Boolean): TDateTime; +class function TDataSet.DefaultConvertToDateTime(aField: TField; aValue: JSValue; ARaiseException: Boolean): TDateTime; begin Result:=0; if IsString(aValue) then @@ -3884,13 +3884,13 @@ begin Result:=TDateTime(AValue) end; -function TDataSet.ConvertDateTimeToNative(aValue : TDateTime) : JSValue; +function TDataSet.ConvertDateTimeToNative(aField: TField; aValue : TDateTime) : JSValue; begin - Result:=DefaultConvertDateTimeToNative(aValue); + Result:=DefaultConvertDateTimeToNative(aField, aValue); end; -Class function TDataSet.DefaultConvertDateTimeToNative(aValue : TDateTime) : JSValue; +Class function TDataSet.DefaultConvertDateTimeToNative(aField : TField;aValue : TDateTime) : JSValue; begin Result:=DateTimeToRFC3339(aValue); @@ -6735,18 +6735,20 @@ end; function TDateTimeField.ConvertToDateTime(aValue: JSValue; aRaiseError: Boolean): TDateTime; begin - if Assigned(Dataset) then - Result:=Dataset.ConvertToDateTime(aValue,aRaiseError) + if JS.isNull(aValue) then + Result:=0 + else if Assigned(Dataset) then + Result:=Dataset.ConvertToDateTime(Self,aValue,aRaiseError) else - Result:=TDataset.DefaultConvertToDateTime(aValue,aRaiseError); + Result:=TDataset.DefaultConvertToDateTime(Self,aValue,aRaiseError); end; function TDateTimeField.DateTimeToNativeDateTime(aValue: TDateTime): JSValue; begin if Assigned(Dataset) then - Result:=Dataset.ConvertDateTimeToNative(aValue) + Result:=Dataset.ConvertDateTimeToNative(Self,aValue) else - Result:=TDataset.DefaultConvertDateTimeToNative(aValue); + Result:=TDataset.DefaultConvertDateTimeToNative(Self,aValue); end; function TDateTimeField.GetAsDateTime: TDateTime; @@ -7107,9 +7109,9 @@ Var begin V:=GetData; if Assigned(Dataset) then - Result:=Dataset.ConvertToDateTime(V,True) + Result:=Dataset.ConvertToDateTime(Self,V,True) else - Result:=TDataset.DefaultConvertToDateTime(V,True) + Result:=TDataset.DefaultConvertToDateTime(Self,V,True) end; function TVariantField.GetAsFloat: Double; diff --git a/packages/fcl-db/jsondataset.pas b/packages/fcl-db/jsondataset.pas index be77887..1501040 100644 --- a/packages/fcl-db/jsondataset.pas +++ b/packages/fcl-db/jsondataset.pas @@ -282,6 +282,7 @@ type procedure SetRows(AValue: TJSArray); procedure SetRowType(AValue: TJSONRowType); protected + 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. @@ -643,7 +644,7 @@ var begin D1:=Dataset.ConvertDateTimeField(String(GetFieldValue(Rowindex)),Self.Field); - D2:=TDateTime(aValue); + D2:=Dataset.ConvertDateTimeField(String(aValue),Self.Field); Result:=Round(D1-D2); end; @@ -1085,6 +1086,15 @@ begin FRowType:=AValue; end; +function TBaseJSONDataSet.ConvertDateTimeToNative(aField : TField; aValue: TDateTime): JSValue; +begin + if jsISNan(aValue) then + Result:=Null + else + Result:=FormatDateTimeField(aValue,aField) + +end; + function TBaseJSONDataSet.AllocRecordBuffer: TDataRecord; begin @@ -1174,7 +1184,7 @@ begin Result:=TFPExpressionParser; end; -function TBaseJSONDataSet.GetFilterIsNull(Const Args : TExprParameterArray) : TFPExpressionResult; +function TBaseJSONDataSet.GetFilterIsNull(const Args: TExprParameterArray): TFPExpressionResult; begin Result.ResultType:=rtBoolean; @@ -1201,7 +1211,7 @@ begin end; end; -function TBaseJSONDataSet.GetFilterField(Const AName : String) : TFPExpressionResult; +function TBaseJSONDataSet.GetFilterField(const AName: String): TFPExpressionResult; Var F : TField; @@ -1265,7 +1275,7 @@ begin end; end; -function TBaseJSONDataSet.GetRecord(Var Buffer: TDataRecord; GetMode: TGetMode; DoCheck: Boolean): TGetResult; +function TBaseJSONDataSet.GetRecord(var Buffer: TDataRecord; GetMode: TGetMode; DoCheck: Boolean): TGetResult; Var BkmIdx : Integer; @@ -1689,7 +1699,7 @@ begin inherited; end; -Function TBaseJSONDataSet.CreateIndexDefs : TJSONIndexDefs; +function TBaseJSONDataSet.CreateIndexDefs: TJSONIndexDefs; begin Result:=TJSONIndexDefs.Create(Self,Self,TJSONIndexDef); @@ -1722,7 +1732,10 @@ begin Result:=-1; Comp:=RecordComparerClass.Create(Self,KeyFields,KeyValues,Options); try - I:=FCurrent; + if loFromCurrent in Options then + I:=FCurrent + else + I:=0; RI:=FCurrentIndex.GetRecordIndex(I); While (Result=-1) and (RI<>-1) do begin