Skip to content

Commit ca5333e

Browse files
committed
correções de campos e melhorias gerais no REST Dataware
fix(core): correções de campos e melhorias gerais no REST Dataware - Corrigidos campos Lookup, Extended, String e Boolean - Corrigidos componentes TStringFieldRESTDW e TRESTDWNumericField - Corrigida instalação em Delphi 13 - Adicionado exemplo prático com uso de Massive - Melhorado desempenho geral (speedup) Autor: - xybersportgames (Gilberto Rocha)
1 parent c011e41 commit ca5333e

File tree

5 files changed

+128
-50
lines changed

5 files changed

+128
-50
lines changed

CORE/Source/Basic/uRESTDWDesignReg.pas

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -791,9 +791,8 @@ procedure TRESTDWContextRulesEditor.ExecuteVerb(Index: Integer);
791791
RegField(TStringFieldRESTDW);
792792
// RegField(TRESTDWSQLTimeStampOffsetField);
793793
{$ELSE}
794-
RegisterFields([TRESTDWNumericField]);
795794
RegisterFields([TStringFieldRESTDW]);
796-
// RegisterFields(DefaultFieldClasses);
795+
RegisterFields([TRESTDWNumericField]);
797796
{$ENDIF}
798797
{$IFDEF FPC}
799798
{$I RESTDataWareComponents_LAMW.lrs}

CORE/Source/Consts/uRESTDWConsts.pas

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@
6060

6161
// controle de versão
6262
RESTDWVersionINFO = 'v2.1.0-';
63-
RESTDWRelease = '3974';
64-
RESTDWCodeProject = 'Final Fantasy X - SourceForge';
63+
RESTDWRelease = '3992';
64+
RESTDWCodeProject = 'Final Fantasy X - GitHub';
6565
RESTDWVersao = RESTDWVersionINFO + RESTDWRelease + '(' + RESTDWCodeProject + ')';
6666
RESTDWDialogoTitulo = 'REST DataWare Components ' + RESTDWVersao;
6767
RESTDWSobreTitulo = 'REST DataWare '+ RESTDWVersao;

CORE/Source/Includes/uRESTDW.inc

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,32 @@
4040
{$ENDIF}
4141

4242
{$IFNDEF FPC}
43+
{$IFDEF VER370 or CompilerVersion >= 37}
44+
{$DEFINE DELPHI12UP}
45+
{$DEFINE DELPHI11UP}
46+
{$DEFINE DELPHI10_4UP}
47+
{$DEFINE DELPHI10_3UP}
48+
{$DEFINE DELPHI10_2UP}
49+
{$DEFINE DELPHI10_1UP}
50+
{$DEFINE DELPHI10_0UP}
51+
{$DEFINE DELPHIXE8UP}
52+
{$DEFINE DELPHIXE7UP}
53+
{$DEFINE DELPHIXE6UP}
54+
{$DEFINE DELPHIXE5UP}
55+
{$DEFINE DELPHIXE4UP}
56+
{$DEFINE DELPHIXE3UP}
57+
{$DEFINE DELPHIXE2UP}
58+
{$DEFINE DELPHIXEUP}
59+
{$DEFINE DELPHI2010UP}
60+
{$DEFINE DELPHI2009UP}
61+
{$DEFINE DELPHI2007UP}
62+
{$DEFINE DELPHI2006UP}
63+
{$DEFINE DELPHI2005UP}
64+
{$DEFINE DELPHI2025UP}
65+
{$DEFINE DELPHI8UP}
66+
{$DEFINE DELPHI7UP}
67+
{$DEFINE RTL280_UP}
68+
{$ENDIF ~VER370}
4369
{$IFDEF VER360 or CompilerVersion >= 36}
4470
{$DEFINE DELPHI12UP}
4571
{$DEFINE DELPHI11UP}

CORE/Source/Plugins/Memdataset/uRESTDWABMemDBFilterExpr.pas

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ implementation
123123
{$IFDEF DELPHI2010UP}
124124
,ord(DB.ftSingle) // ftSingle
125125
{$ENDIF}
126+
{$IFDEF DELPHI2025UP}
127+
,ord(DB.ftLargeint) // ftSingle
128+
{$ENDIF}
126129
{$ELSE}
127130
,ord(DB.ftUnknown) // ftObject
128131
{$ENDIF}

CORE/Source/Plugins/Memdataset/uRESTDWMemoryDataset.pas

Lines changed: 96 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

11291132
Implementation
@@ -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
16041607
Begin
16051608
Result := False;
16061609
Try
1607-
aValue := CopyToNull(GetAsString, InitStrPos, Size);
1610+
aValue := GetAsString;
16081611
Result := True;
16091612
Except
16101613

16111614
End;
16121615
End;
16131616

1614-
Function TStringfieldRESTDW.CopyToNull(Const aValue : String;
1615-
aBegin, aQtde : Integer) : String;
1617+
Function TStringfieldRESTDW.CopyToNull(aValue : String) : String;
16161618
Var
1617-
I, A : Integer;
1619+
I : Integer;
16181620
Begin
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;
16301627
End;
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}
16461643
End;
16471644

@@ -1709,12 +1706,15 @@ TMemBookmarkInfo = record
17091706
End;
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;
17311733
Begin
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;
27292737
Begin
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

Comments
 (0)