Skip to content

Commit 29dc4f6

Browse files
committed
correções e otimizações no REST Dataware para Delphi e Lazarus
fix(core): correções e otimizações no REST Dataware para Delphi e Lazarus - Corrigido SetBuffer do RESTDWMemtable para Lazarus (TExtendedValue) - Corrigido buffer no Delphi - Corrigidas inconsistências em campos Lookup, Extended e String - Corrigido comportamento de Massive para Delphi e Lazarus - Ajustado destructor da classe TRESTDWIdClientREST - Otimizados os processos de envio e recebimento de eventos - Adicionado exemplo prático de uso do Massive Co-autores: - xybersportgames (Gilberto Rocha) - valberhcustodio (Valber Custódio)
1 parent b88379e commit 29dc4f6

12 files changed

Lines changed: 702 additions & 245 deletions

CORE/Source/Basic/uRESTDWBasic.pas

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7244,6 +7244,7 @@ procedure TRESTDWBasicReceptor.SetAuthenticator(
72447244
vErrorMessage,
72457245
vStrAcceptedRoutes : String;
72467246
vDWRoutes : TRESTDWRoutes;
7247+
vEvent : TRESTDWEvent;
72477248
Begin
72487249
Result := False;
72497250
vRejected := False;
@@ -7288,40 +7289,41 @@ procedure TRESTDWBasicReceptor.SetAuthenticator(
72887289
Break;
72897290
End;
72907291
End;
7291-
If (TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].Routes.RouteIsActive(RequestType)) Or
7292-
(TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].Routes.RouteIsActive(rtAll)) Then
7292+
vEvent := TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler];
7293+
If (vEvent.Routes.RouteIsActive(RequestType)) Or
7294+
(vEvent.Routes.RouteIsActive(rtAll)) Then
72937295
Begin
72947296
vResult := '';
72957297
TRESTDWServerEvents(ServerMethodsClass.Components[i]).CreateDWParams(Pooler, Params);
7296-
IF TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].Routes.RouteNeedAuthorization(RequestType) Or
7297-
TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].Routes.RouteNeedAuthorization(rtAll) Then
7298+
IF vEvent.Routes.RouteNeedAuthorization(RequestType) Or
7299+
vEvent.Routes.RouteNeedAuthorization(rtAll) Then
72987300
Begin
7299-
If Assigned(TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].OnAuthRequest) Then
7300-
TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].OnAuthRequest(Params, vRejected, vErrorMessage, ErrorCode, RequestHeader);
7301+
If Assigned(vEvent.OnAuthRequest) Then
7302+
vEvent.OnAuthRequest(Params, vRejected, vErrorMessage, ErrorCode, RequestHeader);
73017303
End
73027304
Else
73037305
Vrejected := False;
73047306
If Not vRejected Then
73057307
Begin
7306-
TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].CompareParams(Params);
7308+
vEvent.CompareParams(Params);
73077309
Try
73087310
If RequestType <> rtOption Then
73097311
Begin
73107312
vResultA := TStringList.Create;
73117313
Try
7312-
If Assigned(TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].OnBeforeExecute) Then
7313-
TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].OnBeforeExecute(TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler]);
7314-
If Assigned(TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].OnReplyEventByType) Then
7315-
TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].OnReplyEventByType(Params, vResultA, RequestType, ErrorCode, RequestHeader)
7316-
Else If Assigned(TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].OnReplyEvent) Then
7317-
TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].OnReplyEvent(Params, vResultA);
7314+
If Assigned(vEvent.OnBeforeExecute) Then
7315+
vEvent.OnBeforeExecute(vEvent);
7316+
If Assigned(vEvent.OnReplyEventByType) Then
7317+
vEvent.OnReplyEventByType(Params, vResultA, RequestType, ErrorCode, RequestHeader)
7318+
Else If Assigned(vEvent.OnReplyEvent) Then
7319+
vEvent.OnReplyEvent(Params, vResultA);
73187320
Finally
73197321
vResult := vResultA.Text;
73207322
vResultA.Free;
73217323
End;
73227324
End;
7323-
DataMode := TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].DataMode;
7324-
ContentType := TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].defaultcontenttype;
7325+
DataMode := vEvent.DataMode;
7326+
ContentType := vEvent.defaultcontenttype;
73257327
If Trim(ContentType) = '' Then
73267328
ContentType := cDefaultContentType;
73277329
Except
@@ -7357,7 +7359,7 @@ procedure TRESTDWBasicReceptor.SetAuthenticator(
73577359
Else
73587360
Begin
73597361
vStrAcceptedRoutes := '';
7360-
vDWRoutes := TRESTDWServerEvents(ServerMethodsClass.Components[i]).Events.EventByName[Pooler].Routes;
7362+
vDWRoutes := vEvent.Routes;
73617363
If vDWRoutes.RouteIsActive(rtGet) Then
73627364
Begin
73637365
If vStrAcceptedRoutes <> '' Then

CORE/Source/Basic/uRESTDWBasicDB.pas

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8565,9 +8565,9 @@ procedure TRESTDWClientSQL.CloseCursor;
85658565
vActive := False;
85668566
If Not vActive Then
85678567
SetActiveDB(True);
8568+
If vActive Then
8569+
Inherited Open;
85688570
End;
8569-
If vActive Then
8570-
Inherited Open;
85718571
Finally
85728572
vInBlockEvents := False;
85738573
End;

CORE/Source/Basic/uRESTDWDesignReg.pas

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -787,9 +787,13 @@ procedure TRESTDWContextRulesEditor.ExecuteVerb(Index: Integer);
787787
Begin
788788
{$IFDEF FPC}
789789
// RegFields(DefaultFieldClasses);
790-
RegField(TExtendedField);
790+
RegField(TRESTDWNumericField);
791+
RegField(TStringFieldRESTDW);
792+
// RegField(TRESTDWSQLTimeStampOffsetField);
791793
{$ELSE}
792-
// RegisterFields([TExtendedField]);
794+
RegisterFields([TRESTDWNumericField]);
795+
RegisterFields([TStringFieldRESTDW]);
796+
// RegisterFields(DefaultFieldClasses);
793797
{$ENDIF}
794798
{$IFDEF FPC}
795799
{$I RESTDataWareComponents_LAMW.lrs}

CORE/Source/Basic/uRESTDWParams.pas

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6683,14 +6683,14 @@ procedure TRESTDWJSONParam.SetParamContentType(const bValue: String);
66836683

66846684
Procedure TRESTDWParams.SetCriptOptions(Use : Boolean;
66856685
Key : String);
6686-
Var
6687-
I : Integer;
6686+
//Var
6687+
// I : Integer;
66886688
Begin
6689-
For I := 0 To Count -1 Do
6690-
Begin
6689+
// For I := 0 To Count -1 Do
6690+
// Begin
66916691
// Items[I].CriptOptions.Use := Use;
66926692
// Items[I].CriptOptions.Key := Key;
6693-
End;
6693+
// End;
66946694
End;
66956695

66966696
end.

CORE/Source/Basic/uRESTDWServerEvents.pas

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -557,8 +557,9 @@ function TRESTDWEventList.GetRec(Index: Integer): TRESTDWEvent;
557557

558558
function TRESTDWEventList.GetRecName(Index: String): TRESTDWEvent;
559559
Var
560-
I : Integer;
560+
X, Z : Integer;
561561
aIndex : String;
562+
vExit : Boolean;
562563
Begin
563564
Result := Nil;
564565
aIndex := Index;
@@ -568,13 +569,29 @@ function TRESTDWEventList.GetRecName(Index: String): TRESTDWEvent;
568569
(aIndex[Length(aIndex) - FinalStrPos] = '/') Then
569570
DeleteStr(aIndex, Length(aIndex) - FinalStrPos, 1);
570571
End;
571-
For I := 0 To Self.Count - 1 Do
572+
X := 0;
573+
Z := Self.Count;
574+
vExit := Z = 0;
575+
If Not vExit Then
572576
Begin
573-
If (Uppercase(aIndex) = Uppercase(TRESTDWEvent(Items[I]).EventName)) Or
574-
(Uppercase(aIndex) = Uppercase(TRESTDWEvent(Items[I]).BaseURL + TRESTDWEvent(Items[I]).EventName)) Then
577+
While (X <> Z) Do
575578
Begin
576-
Result := TRESTDWEvent(Self.Items[I]);
577-
Break;
579+
// For I := 0 To Self.Count - 1 Do
580+
If (Uppercase(aIndex) = Uppercase(TRESTDWEvent(Items[X]).EventName)) Or
581+
(Uppercase(aIndex) = Uppercase(TRESTDWEvent(Items[X]).BaseURL + TRESTDWEvent(Items[X]).EventName)) Then
582+
Begin
583+
Result := TRESTDWEvent(Self.Items[X]);
584+
Break;
585+
End;
586+
Dec(Z);
587+
If (Uppercase(aIndex) = Uppercase(TRESTDWEvent(Items[Z]).EventName)) Or
588+
(Uppercase(aIndex) = Uppercase(TRESTDWEvent(Items[Z]).BaseURL + TRESTDWEvent(Items[Z]).EventName)) Then
589+
Begin
590+
Result := TRESTDWEvent(Self.Items[Z]);
591+
Break;
592+
End;
593+
If Z <> X Then
594+
Inc(X);
578595
End;
579596
End;
580597
End;
@@ -651,51 +668,53 @@ procedure TRESTDWEventList.PutRecName(Index: String; Item: TRESTDWEvent);
651668
dwParam : TRESTDWJSONParam;
652669
I : Integer;
653670
vFound : Boolean;
671+
vEvent : TRESTDWEvent;
654672
Begin
655673
vParamNameS := '';
656-
If vEventList.EventByName[EventName] <> Nil Then
674+
vEvent := vEventList.EventByName[EventName];
675+
If vEvent <> Nil Then
657676
Begin
658677
If Not Assigned(DWParams) Then
659678
DWParams := TRESTDWParams.Create;
660-
DWParams.DataMode := vEventList.EventByName[EventName].DataMode;
661-
For I := 0 To vEventList.EventByName[EventName].vDWParams.Count -1 Do
679+
DWParams.DataMode := vEvent.DataMode;
680+
For I := 0 To vEvent.vDWParams.Count -1 Do
662681
Begin
663682
vParamNameS := '';
664-
vFound := (DWParams.ItemsString[vEventList.EventByName[EventName].vDWParams.Items[I].ParamName] <> Nil);
683+
vFound := (DWParams.ItemsString[vEvent.vDWParams.Items[I].ParamName] <> Nil);
665684
If vFound Then
666-
vParamNameS := vEventList.EventByName[EventName].vDWParams.Items[I].ParamName
685+
vParamNameS := vEvent.vDWParams.Items[I].ParamName
667686
Else
668687
Begin
669-
vFound := (DWParams.ItemsString[vEventList.EventByName[EventName].vDWParams.Items[I].Alias] <> Nil);
688+
vFound := (DWParams.ItemsString[vEvent.vDWParams.Items[I].Alias] <> Nil);
670689
If vFound Then
671-
vParamNameS := vEventList.EventByName[EventName].vDWParams.Items[I].Alias;
690+
vParamNameS := vEvent.vDWParams.Items[I].Alias;
672691
End;
673692
If Not(vFound) Then
674693
Begin
675694
dwParam := TRESTDWJSONParam.Create(DWParams.Encoding);
676-
dwParam.Alias := vEventList.EventByName[EventName].vDWParams.Items[I].Alias;
677-
dwParam.ParamName := vEventList.EventByName[EventName].vDWParams.Items[I].ParamName;
678-
dwParam.ObjectDirection := vEventList.EventByName[EventName].vDWParams.Items[I].ObjectDirection;
679-
dwParam.ObjectValue := vEventList.EventByName[EventName].vDWParams.Items[I].ObjectValue;
680-
dwParam.Encoded := vEventList.EventByName[EventName].vDWParams.Items[I].Encoded;
695+
dwParam.Alias := vEvent.vDWParams.Items[I].Alias;
696+
dwParam.ParamName := vEvent.vDWParams.Items[I].ParamName;
697+
dwParam.ObjectDirection := vEvent.vDWParams.Items[I].ObjectDirection;
698+
dwParam.ObjectValue := vEvent.vDWParams.Items[I].ObjectValue;
699+
dwParam.Encoded := vEvent.vDWParams.Items[I].Encoded;
681700
dwParam.DataMode := DWParams.DataMode;
682-
If (vEventList.EventByName[EventName].vDWParams.Items[I].DefaultValue <> '') And
701+
If (vEvent.vDWParams.Items[I].DefaultValue <> '') And
683702
(Trim(dwParam.AsString) = '') Then
684-
dwParam.Value := vEventList.EventByName[EventName].vDWParams.Items[I].DefaultValue;
703+
dwParam.Value := vEvent.vDWParams.Items[I].DefaultValue;
685704
DWParams.Add(dwParam);
686705
End
687706
Else
688707
Begin
689708
If (DWParams.ItemsString[vParamNameS].ParamName = '') Or
690709
((DWParams.ItemsString[vParamNameS].ParamName <> '') And
691710
(Lowercase(DWParams.ItemsString[vParamNameS].ParamName) <>
692-
Lowercase(vEventList.EventByName[EventName].vDWParams.Items[I].ParamName))) Then
711+
Lowercase(vEvent.vDWParams.Items[I].ParamName))) Then
693712
Begin
694-
DWParams.ItemsString[vParamNameS].Alias := vEventList.EventByName[EventName].vDWParams.Items[I].Alias;
695-
DWParams.ItemsString[vParamNameS].ParamName := vEventList.EventByName[EventName].vDWParams.Items[I].ParamName;
713+
DWParams.ItemsString[vParamNameS].Alias := vEvent.vDWParams.Items[I].Alias;
714+
DWParams.ItemsString[vParamNameS].ParamName := vEvent.vDWParams.Items[I].ParamName;
696715
End;
697716
If DWParams.ItemsString[vParamNameS].Alias = '' Then
698-
DWParams.ItemsString[vParamNameS].Alias := vEventList.EventByName[EventName].vDWParams.Items[I].Alias;
717+
DWParams.ItemsString[vParamNameS].Alias := vEvent.vDWParams.Items[I].Alias;
699718
End;
700719
End;
701720
End

CORE/Source/Basic/uRESTDWStorageBin.pas

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ interface
4444
FFieldSize,
4545
FFieldPrecision : Array of Integer;
4646
FFieldTypes,
47-
FFieldAttrs : Array of Byte;
47+
FFieldAttrs : TFieldAttrs;
4848
FFieldExists : Array of Boolean;
4949
Procedure SaveRecordToStream (ADataset : TDataset;
5050
Var AStream : TStream);
@@ -382,6 +382,7 @@ interface
382382
FFieldExists[I] := (ADataSet.FindField(FFieldNames[I]) <> nil); // or (vNoFields);
383383
// create fieldsDefs like fields persistent
384384
// If ((vNoFields) Or (Not FFieldExists[I])) Then
385+
ADataSet.FieldAttrs := FFieldAttrs;
385386
CreateFieldDefs(ADataSet, I);
386387
End;
387388
ADataSet.Open;
@@ -481,9 +482,9 @@ interface
481482
Begin
482483
vLength := Dataset.GetCalcFieldLen(aField.DataType, aField.Size);
483484
{$IFDEF FPC}
484-
FillChar(PData^, vLength -1, #0);
485+
FillChar(PData^, vLength, #0);
485486
{$ELSE}
486-
FillChar(pData^, vLength -1, 0);
487+
FillChar(pData^, vLength, 0);
487488
{$ENDIF}
488489
End
489490
Else If (vDWFieldType In [dwftLongWord,
@@ -610,11 +611,13 @@ interface
610611
dwftVarBytes,
611612
dwftFixedChar,
612613
dwftString : Begin
614+
SetLength(vString, 0);
613615
stream.Read(vInt64, SizeOf(vInt64));
614616
vString := '';
615617
If vInt64 > 0 Then
616618
Begin
617619
SetLength(vString, vInt64);
620+
// FillChar(Pointer(@vString)^, vInt64, 0);
618621
{$IFDEF FPC}
619622
stream.Read(Pointer(vString)^, vInt64);
620623
If EncodeStrs Then
@@ -627,7 +630,10 @@ interface
627630
If EncodeStrs Then
628631
vString := DecodeStrings(vString);
629632
If aField <> Nil Then
630-
Move(vString[InitStrPos], pData^, Length(vString));
633+
Begin
634+
// FillChar(pData^, vInt64, 0);
635+
Move(Pointer(vString)^, pData^, vInt64);
636+
End;
631637
{$ENDIF}
632638
End;
633639
End;
@@ -717,14 +723,16 @@ interface
717723
, dwftExtended
718724

719725
:Begin
726+
vDouble := 0;
720727
stream.Read(vDouble, SizeOf(vDouble));
721728
If aField <> Nil Then
722729
Begin
723-
SetLength(vVarBytes, Sizeof(Boolean) + Sizeof(vDouble));
730+
SetLength(vVarBytes, Sizeof(Boolean) + Sizeof(vExtended));
724731
//Move Null para Bytes
725732
Move(vBoolean, vVarBytes[0], Sizeof(Boolean));
726733
//Move Bytes do Dado para Bytes
727-
Move(vDouble, vVarBytes[1], Sizeof(vDouble));
734+
vExtended := vDouble;
735+
Move(vExtended, vVarBytes[1], Sizeof(vExtended));
728736
//Move Bytes para Buffer
729737
Move(vVarBytes[0], PData^, Length(vVarBytes));
730738
End;
@@ -958,7 +966,8 @@ interface
958966
Try
959967
Dataset.SetMemoryRecordData(pActualRecord, i);
960968
Finally
961-
Dispose(pActualRecord);//FreeMem(PRESTDWMTMemBuffer(@PActualRecord));
969+
Reallocmem(pActualRecord, 0);
970+
// Dispose(pActualRecord);//FreeMem(PRESTDWMTMemBuffer(@PActualRecord));
962971
End;
963972
End;
964973
End;
@@ -1541,8 +1550,8 @@ interface
15411550
Stream.Write(vCurrency, Sizeof(vCurrency));
15421551
End;
15431552
dwftExtended : Begin
1544-
Move(PData^, vExtended, Sizeof(vExtended));
1545-
Stream.Write(vExtended, Sizeof(vExtended));
1553+
Move(PData^, vDouble, Sizeof(vDouble));
1554+
Stream.Write(vDouble, Sizeof(vDouble));
15461555
End;
15471556
// 8 - Bytes - Currency
15481557
dwftBCD : Begin
@@ -1741,8 +1750,8 @@ interface
17411750
End;
17421751
{$IFNDEF FPC}
17431752
dwftExtended : Begin
1744-
vExtended := ADataset.Fields[i]{$IFNDEF FPC}.AsExtended{$ELSE}.AsFloat{$ENDIF};
1745-
AStream.Write(vExtended, Sizeof(vExtended));
1753+
vDouble := ADataset.Fields[i]{$IFNDEF FPC}.AsExtended{$ELSE}.AsFloat{$ENDIF};
1754+
AStream.Write(vDouble, Sizeof(vDouble));
17461755
End;
17471756
{$ENDIF}
17481757
// 8 - Bytes - Date, Time, DateTime, TimeStamp

CORE/Source/Consts/uRESTDWConsts.pas

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
// controle de versão
6262
RESTDWVersionINFO = 'v2.1.0-';
6363
RESTDWRelease = '3974';
64-
RESTDWCodeProject = 'Final Fantasy X - GitHub';
64+
RESTDWCodeProject = 'Final Fantasy X - SourceForge';
6565
RESTDWVersao = RESTDWVersionINFO + RESTDWRelease + '(' + RESTDWCodeProject + ')';
6666
RESTDWDialogoTitulo = 'REST DataWare Components ' + RESTDWVersao;
6767
RESTDWSobreTitulo = 'REST DataWare '+ RESTDWVersao;

CORE/Source/Includes/uRESTDW.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,7 @@
514514
{$IFNDEF RESTDWLAMW}
515515
{$IFNDEF FPC}
516516
{$IFDEF DELPHIXE5UP}
517+
{$DEFINE SUPPORTS_CLASS_HELPERS}
517518
{$IF Declared(FireMonkeyVersion) or Defined(FRAMEWORK_FMX)
518519
Declared(FMX.Types.TFmxObject) or Defined(LINUX64)}
519520
{$DEFINE HAS_FMX}

0 commit comments

Comments
 (0)