@@ -991,11 +991,11 @@ TDoubleLinkedBufIndex = class(TRESTDWIndex)
991991 Protected
992992 Function GetAsString : String; Override;
993993 Procedure SetAsString (Const AValue : String); Override;
994- // Function GetAsVariant : Variant ; Override;
994+ Function GetAsFloat : Double ; Override;
995995 Public
996996 Constructor Create(AOwner: TComponent); override;
997- Property Size : Integer Read vSize Write vSize;
998997 Published
998+ Property Size : Integer Read vSize Write vSize;
999999 Property Precision : Integer Read vPrecision Write vPrecision;
10001000 End ;
10011001 { $ENDIF}
@@ -1022,9 +1022,8 @@ TDoubleLinkedBufIndex = class(TRESTDWIndex)
10221022 Type
10231023 TStringFieldRESTDW = Class (TStringField)
10241024 Protected
1025- Function CopyToNull (const aValue : String;
1026- aBegin, aQtde : Integer) : String;
1027- Function GetAsString : String; Override;
1025+ Function CopyToNull (aValue : String) : String;
1026+ Function GetAsString : String; Override;
10281027 { $IFNDEF FPC}
10291028 { $IFNDEF NEXTGEN}
10301029 Function GetValue (var aValue: AnsiString): Boolean;
@@ -1123,7 +1122,11 @@ TDoubleLinkedBufIndex = class(TRESTDWIndex)
11231122 { $IFDEF DELPHIXE2UP} ,
11241123 TSQLTimeStampOffsetField, { ftTimeStampOffset }
11251124 nil , { ftObject }
1126- TSingleField { ftSingle }{ $ENDIF} );
1125+ TSingleField { ftSingle }
1126+ { $ENDIF}
1127+ { $IFDEF DELPHI2025UP} ,
1128+ TLargeIntField
1129+ { $ENDIF} );
11271130
11281131
11291132Implementation
@@ -1579,8 +1582,8 @@ TMemBookmarkInfo = record
15791582 { $IFNDEF FPC}
15801583 SetLength(Data, Size);
15811584 { $ENDIF}
1582- If GetData({ $IFDEF FPC} Pointer(@{ $ENDIF} Data{ $IFDEF FPC} ){ $ENDIF} , True) then
1583- Result := CopyToNull( BytesToString(TRESTDWBytes(Data)), InitStrPos, Size );
1585+ If GetData({ $IFDEF FPC} Pointer(@{ $ENDIF} Data{ $IFDEF FPC} ){ $ENDIF} , True) then
1586+ Result := BytesToString(TRESTDWBytes(Data));
15841587 { $IFNDEF FPC}
15851588 SetLength(Data, 0 );
15861589 { $ENDIF}
@@ -1604,28 +1607,22 @@ TMemBookmarkInfo = record
16041607Begin
16051608 Result := False;
16061609 Try
1607- aValue := CopyToNull( GetAsString, InitStrPos, Size) ;
1610+ aValue := GetAsString;
16081611 Result := True;
16091612 Except
16101613
16111614 End ;
16121615End ;
16131616
1614- Function TStringfieldRESTDW.CopyToNull (Const aValue : String;
1615- aBegin, aQtde : Integer) : String;
1617+ Function TStringfieldRESTDW.CopyToNull (aValue : String) : String;
16161618Var
1617- I, A : Integer;
1619+ I : Integer;
16181620Begin
16191621 Result := ' ' ;
1620- A := Length(aValue) - FinalStrPos;
1621- I := InitStrPos;
1622- While I <= A Do
1622+ For I := InitStrPos To Length(aValue) - FinalStrPos Do
16231623 Begin
16241624 If aValue[I] <> #0 Then
1625- Result := Result + aValue[I]
1626- Else
1627- Break;
1628- Inc(I);
1625+ Result := Result + aValue[I];
16291626 End ;
16301627End ;
16311628
@@ -1638,10 +1635,10 @@ TMemBookmarkInfo = record
16381635 { $IFNDEF FPC}
16391636 SetLength(Data, Size);
16401637 If GetData(Data, True) then
1641- Result := CopyToNull(BytesToString(TRESTDWBytes(Data)), InitStrPos, Size );
1638+ Result := CopyToNull(BytesToString(TRESTDWBytes(Data)));
16421639 SetLength(Data, 0 );
16431640 { $ELSE}
1644- Result := Copy( GetAsAnsiString, InitStrPos, Size) ;
1641+ Result := GetAsAnsiString;
16451642 { $ENDIF}
16461643End ;
16471644
@@ -1709,12 +1706,15 @@ TMemBookmarkInfo = record
17091706End ;
17101707{ $ENDIF}
17111708
1712- Function TRESTDWNumericField.GetAsString : string;
1713- Var
1714- x : DWLongDouble;
1715- { $IFDEF COMPILER17_UP}
1716- Data: TValueBuffer;
1709+ { $IFDEF FPC}
1710+ Function TRESTDWNumericField.GetAsFloat : Double;
1711+ Begin
1712+ If not GetData(@Result, True) then
1713+ Result := NaN;
1714+ End ;
17171715{ $ENDIF}
1716+
1717+ Function TRESTDWNumericField.GetAsString : string;
17181718 Function BuildMask (Value : Double;
17191719 aPrecision : Integer) : String;
17201720 Var
@@ -1728,21 +1728,16 @@ TMemBookmarkInfo = record
17281728 vString := vString + ' 0' ;
17291729 Result := FormatFloat(vString, Value );
17301730 End ;
1731+ Var
1732+ x : DWLongDouble;
17311733Begin
1732- { $IFNDEF COMPILER17_UP }
1733- If Inherited GetData(@x, True) then
1734- Begin
1735- { $ELSE }
1736- SetLength(Data, SizeOf(Extended));
1737- If GetData(Data, True) then
1734+ { $IFDEF FPC }
1735+ x := GetAsFloat;
1736+ { $ELSE }
1737+ x := GetAsExtended;
1738+ { $ENDIF }
1739+ If Not isNull then
17381740 Begin
1739- { $IF CompilerVersion > 28}
1740- x := TBitConverter.InTo<Extended>(Data);
1741- { $ELSE}
1742- x := TBitConverter.ToExtended(Data);
1743- { $IFEND}
1744- // x := TBitConverter.InTo<Extended>(Data);
1745- { $ENDIF}
17461741 If (Length(FloatToStr(x)) > vSize) Then
17471742 Result := FloatToStrF(x, ffGeneral, vSize, vPrecision)
17481743 Else If (Length(FloatToStr(Frac(x))) > vPrecision) Then
@@ -2726,6 +2721,19 @@ function TRESTDWMemTable.GetRecordSize: Word;
27262721 vDateTimeInt : DWInteger;
27272722 vDateTimeRec : TDateTimeRec;
27282723 vDWFieldType : Byte;
2724+ Function CountToNull (Const aBytes : TRESTDWBytes) : Integer;
2725+ Var
2726+ I : Integer;
2727+ Begin
2728+ Result := 0 ;
2729+ For I := 0 To Length(aBytes) -1 Do
2730+ Begin
2731+ If aBytes[I] <> 0 Then
2732+ Inc(Result)
2733+ Else
2734+ Break;
2735+ End ;
2736+ End ;
27292737Begin
27302738 Result := False;
27312739 If Not GetActiveRecBuf(RecBuf) Then
@@ -2771,7 +2779,7 @@ function TRESTDWMemTable.GetRecordSize: Word;
27712779 Begin
27722780 If Length(TRESTDWBytes(Buffer)) > 0 Then
27732781 Begin
2774- If (not (Char(TRESTDWBytes(Buffer)[0 ]) = #0 )) Then
2782+ If (Not (Char(TRESTDWBytes(Buffer)[0 ]) = #0 )) Then
27752783 Begin
27762784 Move(TRESTDWBytes(Buffer)[0 ], aDataBytes[0 ], cLen);
27772785 Result := (not (Char(TRESTDWBytes(Buffer)[0 ]) = #0 ));
@@ -2790,10 +2798,11 @@ function TRESTDWMemTable.GetRecordSize: Word;
27902798 Result := Not (Result);
27912799 If Not (Result) then
27922800 Begin
2801+ cLen := SizeOf(Boolean);
27932802 aNullData := False;
27942803 SetLength(aDataBytes, cLen);
27952804 Move(Data^, aDataBytes[0 ], cLen);
2796- Move(aDataBytes[0 ], Pointer(@aNullData)^, SizeOf(Boolean));
2805+ // Move(aDataBytes[0], Pointer(@aNullData)^, SizeOf(Boolean));
27972806 Result := Not (aNullData);
27982807 End ;
27992808 End
@@ -2937,7 +2946,8 @@ function TRESTDWMemTable.GetRecordSize: Word;
29372946 { $IFNDEF FPC}
29382947 { $IF CompilerVersion <= 22}
29392948 If Result Then
2940- Result := ((Not (aNullData)) and Not (VarIsNull(Data^)));
2949+ If Not (Field.datatype in [ftBoolean]) then
2950+ Result := ((Not (aNullData)) and Not (VarIsNull(Data^)));
29412951 If (Field.datatype In [ftLargeint, ftInteger, ftSmallint, ftFloat,
29422952 ftFMTBCD, ftBCD, ftCurrency, ftDate, ftTime]) Then
29432953 Result := PRESTDWBytes(@Data)^[1 ] > 0 ;
@@ -2975,6 +2985,13 @@ function TRESTDWMemTable.GetRecordSize: Word;
29752985 End ;
29762986 End ;
29772987 End
2988+ Else If Field.datatype = ftExtended Then
2989+ Begin
2990+ If Length(TRESTDWBytes(Buffer)) = 0 Then
2991+ SetLength(TRESTDWBytes(Pointer(@Buffer)^), SizeOf(DwLongDouble));
2992+ Move(aDataBytes[1 ], vLongDouble, SizeOf(vLongDouble));
2993+ Move(vLongDouble, Pointer(Buffer)^, cLen-1 );
2994+ End
29782995 Else
29792996 Begin
29802997 If Length(TRESTDWBytes(Buffer)) = 0 Then
@@ -2985,7 +3002,12 @@ function TRESTDWMemTable.GetRecordSize: Word;
29853002 Move(PRESTDWBytes(@Data)^[0 ], Pointer(Buffer)^, cLen);
29863003 End ;
29873004 { $ELSE}
2988- Result := ((Not (aNullData)) and Not (VarIsNull(Data^)));
3005+ If Not (Field.datatype in [ftBoolean{ $IFNDEF FPC}
3006+ { $IF CompilerVersion > 21}
3007+ , ftByte, ftShortint
3008+ { $IFEND}
3009+ { $ENDIF} ]) then
3010+ Result := ((Not (aNullData)) and Not (VarIsNull(Data^)));
29893011 If (Field.datatype In [ftAutoInc, ftLargeint, ftInteger, ftSmallint, ftFloat, ftSingle,
29903012 ftFMTBCD, ftBCD, ftCurrency]) Then
29913013 Begin
@@ -3026,14 +3048,28 @@ function TRESTDWMemTable.GetRecordSize: Word;
30263048 Else If Field.datatype = ftExtended Then
30273049 Begin
30283050 If Length(TRESTDWBytes(Buffer)) = 0 Then
3029- SetLength(TRESTDWBytes(Pointer(@Buffer)^), SizeOf(DwLongDouble ));
3051+ SetLength(TRESTDWBytes(Pointer(@Buffer)^), SizeOf(vLongDouble ));
30303052 Move(aDataBytes[1 ], vLongDouble, SizeOf(vLongDouble));
3031- Move(vLongDouble, Pointer(Buffer)^, cLen- 1 );
3053+ Move(Pointer(@ vLongDouble)^ , Pointer(Buffer)^, SizeOf(vLongDouble) );
30323054 End
30333055 Else
30343056 Begin
3057+ // If Field.datatype in [ftString, ftFixedChar
3058+ // {$IF DEFINED(FPC) OR DEFINED(DELPHI10_0UP)}
3059+ // , ftFixedWideChar , ftWideString{$IFEND}] Then
3060+ // Begin
3061+ // cLen := CountToNull(aDataBytes);
3062+ // If Length(TRESTDWBytes(Buffer)) > cLen Then
3063+ // Begin
3064+ // SetLength(TRESTDWBytes(Buffer), 0);
3065+ // SetLength(TRESTDWBytes(Buffer), cLen);
3066+ // End;
3067+ // End
3068+ // Else
3069+ // Begin
30353070 If Length(TRESTDWBytes(Buffer)) = 0 Then
30363071 SetLength(TRESTDWBytes(Buffer), cLen);
3072+ // End;
30373073 If Field.datatype = ftGuid Then
30383074 Move(PRESTDWBytes(@Data)^[0 ], Pointer(Buffer)^, cLen -1 )
30393075 Else
@@ -3043,6 +3079,8 @@ function TRESTDWMemTable.GetRecordSize: Word;
30433079 { $ELSE}
30443080 If Length(TRESTDWBytes(Buffer)) = 0 Then
30453081 SetLength(TRESTDWBytes(Buffer), cLen);
3082+ If Not (Field.datatype in [ftBoolean]) then
3083+ Result := ((Not (aNullData)) and Not (VarIsNull(Data^)));
30463084 Result := ((Not (aNullData)) and Not (VarIsNull(Data^)));
30473085 If (Field.datatype In [ftAutoInc, ftLargeint, ftInteger, ftSmallint, ftFloat,
30483086 ftFMTBCD, ftBCD, ftCurrency]) Then
@@ -3087,6 +3125,15 @@ function TRESTDWMemTable.GetRecordSize: Word;
30873125 End ;
30883126 End ;
30893127 End
3128+ {
3129+ Else If Field.datatype = ftExtended Then
3130+ Begin
3131+ If Length(TRESTDWBytes(Buffer)) = 0 Then
3132+ SetLength(TRESTDWBytes(Pointer(@Buffer)^), SizeOf(DwLongDouble));
3133+ Move(aDataBytes[1], vLongDouble, SizeOf(vLongDouble));
3134+ Move(vLongDouble, Pointer(Buffer)^, cLen-1);
3135+ End
3136+ }
30903137 Else
30913138 Begin
30923139 If Length(TRESTDWBytes(Buffer)) = 0 Then
@@ -5966,7 +6013,10 @@ procedure TRESTDWMemTable.InternalOpen;
59666013 If FieldDefs[I].DataType = { $IFNDEF FPC} ftExtended{ $ELSE} ftFMTBcd{ $ENDIF} Then
59676014 Field := TRESTDWNumericField.Create(Self)
59686015 Else If FieldDefs[I].DataType = { $IFNDEF FPC} ftString{ $ELSE} ftFixedChar{ $ENDIF} Then
5969- Field := TStringFieldRESTDW.Create(Self)
6016+ Begin
6017+ Field := TStringFieldRESTDW.Create(Self);
6018+ Field.Size := FieldDefs[I].Size;
6019+ End
59706020 Else
59716021 Begin
59726022 { $IFNDEF FPC}
0 commit comments