From 6d00994335ff149e87def444dab22538785b29f5 Mon Sep 17 00:00:00 2001 From: "ronierys2@hotmail.com" Date: Mon, 1 Apr 2024 08:37:47 -0300 Subject: [PATCH] =?UTF-8?q?Atualiza=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Correção de serialização de PATCH parâmetro - Correção do Eventname e do ContextName em LAzarus. - Correção para uso de ISAPI/CGI no IIS - Correção Binario physics driver - Ajuste feito no DM de RESTDW pelo Brito reproduzido na ServerMethodClass. - Correção de bookmark do novo dwmemtable para lazarus. - Correção Binario Clientsql - Correções no RESTDWmemtable para uso no Lazarus. - Massive Edit, Delete e Insert Fix. - Reopen data Fix. - CloseData fix. - Correções de memleak no Lazarus no dwmem --- CORE/Source/Basic/uRESTDWBasic.pas | 28 ++++--- CORE/Source/Basic/uRESTDWBasicDB.pas | 24 ++---- CORE/Source/Basic/uRESTDWServerContext.pas | 6 +- CORE/Source/Basic/uRESTDWServerEvents.pas | 6 +- .../Source/Basic/uRESTDWServerMethodClass.pas | 8 +- CORE/Source/Basic/uRESTDWStorageBin.pas | 37 +++++++-- .../Database_Drivers/uRESTDWDriverBase.pas | 42 ++++++---- .../Memdataset/uRESTDWMemoryDataset.pas | 56 ++++++++----- .../ShellTools/uRESTDWShellServicesDelphi.pas | 3 +- .../uRESTDWShellServicesLazarus.pas | 3 +- CORE/Source/Sockets/Indy/uRESTDWIdBase.pas | 1 + CORE/Source/utils/uRESTDWJSONObject.pas | 29 ------- CORE/Source/utils/uRESTDWMassiveBuffer.pas | 81 ++++++++++++++++--- CORE/Source/utils/uRESTDWTools.pas | 14 +++- 14 files changed, 214 insertions(+), 124 deletions(-) diff --git a/CORE/Source/Basic/uRESTDWBasic.pas b/CORE/Source/Basic/uRESTDWBasic.pas index 35517c81..f730b7db 100644 --- a/CORE/Source/Basic/uRESTDWBasic.pas +++ b/CORE/Source/Basic/uRESTDWBasic.pas @@ -472,6 +472,7 @@ TRESTDWServerIpVersionConfig = class(TPersistent) BinaryCompatibleMode : Boolean; CompareContext : Boolean) : Boolean; Public + Procedure SetSocketKind (SocketKind : String); Procedure SetActive (Value : Boolean);Virtual; Procedure ClearDataRoute; Procedure AddDataRoute (DataRoute : String; @@ -3418,8 +3419,8 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); vRequestHeader := TStringList.Create; vCompareContext := False; { TODO 1 -oRoniery -ccorreção : função para fazer decode de url utf8 para ascii } - RawHTTPCommand := DecodeURL(RawHTTPCommand); - QueryParams := DecodeURL(QueryParams); + RawHTTPCommand := DecodeURL(RawHTTPCommand); + QueryParams := DecodeURL(QueryParams); Cmd := RemoveBackslashCommands(Trim(RawHTTPCommand)); vUrlToExec := ''; Try @@ -3827,7 +3828,7 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); End; {$ENDIF} If vAuthenticator <> Nil Then - Begin + Begin If vToken = '' Then vToken := Token; vAcceptAuth := False; @@ -3835,12 +3836,11 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); vErrorMessage := cInvalidAuth; //Roniery ajuste para encontrar o evento na lista de eventos, //para assim determinar se passa ou não no validador de permissão - if not (vUrlToExec='') then - Begin - if vUrlToExec[Length(vUrlToExec)] = '/' then - delete(vUrlToExec, Length(vUrlToExec), 1); - end; - + If Not (vUrlToExec='') Then + Begin + If vUrlToExec[Length(vUrlToExec)] = '/' Then + Delete(vUrlToExec, Length(vUrlToExec), 1); + End; // verifica se precisa autenticação vNeedAuthorization := False; {$IFNDEF RESTDWLAZARUS} @@ -3975,7 +3975,7 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); PCustomHeaders := @ResponseHeaders; BuildCORS(TRESTDWAuthToken(vAuthenticator).GetTokenRoutes, TStrings(PCustomHeaders^)); End; - End + End Else Begin {$IFNDEF RESTDWLAZARUS} @@ -4524,6 +4524,8 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); End; End; Finally + If Not (Assigned(ResultStream)) Then + ResultStream := TStringStream.Create(vDefaultPage.Text); DestroyComponents; End; End; @@ -4632,6 +4634,12 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); End; End; +Procedure TRESTDWBasicReceptor.SetSocketKind(SocketKind : String); +Begin + FSocketKind := SocketKind; +End; + + Procedure TRESTDWBasicReceptor.SetActive(Value : Boolean); Begin vActive := Value; diff --git a/CORE/Source/Basic/uRESTDWBasicDB.pas b/CORE/Source/Basic/uRESTDWBasicDB.pas index 79e2abb3..e0ab9201 100644 --- a/CORE/Source/Basic/uRESTDWBasicDB.pas +++ b/CORE/Source/Basic/uRESTDWBasicDB.pas @@ -6968,15 +6968,10 @@ procedure TRESTDWClientSQL.ProcBeforeOpen(DataSet: TDataSet); Begin If TMassiveDatasetBuffer(vMassiveDataset).TempBuffer <> Nil Then Begin - If TMassiveDatasetBuffer(vMassiveDataset).TempBuffer.UpdateFieldChanges <> Nil Then - Begin - If TMassiveDatasetBuffer(vMassiveDataset).TempBuffer.UpdateFieldChanges.Count = 0 Then - TMassiveDatasetBuffer(vMassiveDataset).ClearLine - Else - TMassiveDatasetBuffer(vMassiveDataset).SaveBuffer(Self, TMassiveDatasetBuffer(vMassiveDataset).MassiveMode = mmExec); - End + If TMassiveDatasetBuffer(vMassiveDataset).TempBuffer.UpdateFieldChangesCount = 0 Then + TMassiveDatasetBuffer(vMassiveDataset).ClearLine Else - TMassiveDatasetBuffer(vMassiveDataset).ClearLine; + TMassiveDatasetBuffer(vMassiveDataset).SaveBuffer(Self, TMassiveDatasetBuffer(vMassiveDataset).MassiveMode = mmExec); End Else TMassiveDatasetBuffer(vMassiveDataset).ClearLine; @@ -7052,15 +7047,10 @@ procedure TRESTDWClientSQL.ProcBeforePost(DataSet: TDataSet); Begin If TMassiveDatasetBuffer(vMassiveDataset).TempBuffer <> Nil Then Begin - If TMassiveDatasetBuffer(vMassiveDataset).TempBuffer.UpdateFieldChanges <> Nil Then - Begin - If TMassiveDatasetBuffer(vMassiveDataset).TempBuffer.UpdateFieldChanges.Count = 0 Then - TMassiveDatasetBuffer(vMassiveDataset).ClearLine - Else - TMassiveDatasetBuffer(vMassiveDataset).SaveBuffer(Self, TMassiveDatasetBuffer(vMassiveDataset).MassiveMode = mmExec); - End + If TMassiveDatasetBuffer(vMassiveDataset).TempBuffer.UpdateFieldChangesCount = 0 Then + TMassiveDatasetBuffer(vMassiveDataset).ClearLine Else - TMassiveDatasetBuffer(vMassiveDataset).ClearLine; + TMassiveDatasetBuffer(vMassiveDataset).SaveBuffer(Self, TMassiveDatasetBuffer(vMassiveDataset).MassiveMode = mmExec); End Else TMassiveDatasetBuffer(vMassiveDataset).ClearLine; @@ -11318,7 +11308,7 @@ procedure TRESTDWClientSQL.SetActiveDB(Value: Boolean); Begin vInDesignEvents := False; SetInBlockEvents(True); - TRESTDWMemTable(Self).EmptyTable; + Inherited Active := False; If Not InLoadFromStream Then Begin vActive := False; diff --git a/CORE/Source/Basic/uRESTDWServerContext.pas b/CORE/Source/Basic/uRESTDWServerContext.pas index 6e33e115..31631cdf 100644 --- a/CORE/Source/Basic/uRESTDWServerContext.pas +++ b/CORE/Source/Basic/uRESTDWServerContext.pas @@ -209,9 +209,9 @@ interface Procedure SetBeforeRenderer (Value : TRESTDWBeforeRenderer); Procedure SetBaseURL(Value : String); Public - Function GetDisplayName : String; {$IFNDEF FPC}Override;{$ENDIF} - Procedure SetDisplayName(Const Value : String); {$IFNDEF FPC}Override;{$ENDIF} - Function GetNamePath : String; {$IFNDEF FPC}Override;{$ENDIF} + Function GetDisplayName : String; Override; + Procedure SetDisplayName(Const Value : String); Override; + Function GetNamePath : String; Override; Procedure Assign (Source : TPersistent); Override; Procedure CompareParams (Var Dest : TRESTDWParams); Constructor Create (aCollection : TCollection); Override; diff --git a/CORE/Source/Basic/uRESTDWServerEvents.pas b/CORE/Source/Basic/uRESTDWServerEvents.pas index 72014c87..47756379 100644 --- a/CORE/Source/Basic/uRESTDWServerEvents.pas +++ b/CORE/Source/Basic/uRESTDWServerEvents.pas @@ -93,12 +93,12 @@ interface Procedure SetContentType(Value : String); Procedure SetDataMode (Value : TDataMode); Public - Function GetDisplayName : String; {$IFNDEF FPC}Override;{$ENDIF} - Procedure SetDisplayName(Const Value : String); {$IFNDEF FPC}Override;{$ENDIF} + Function GetDisplayName : String; Override; + Procedure SetDisplayName(Const Value : String); Override; Procedure CompareParams (Var Dest : TRESTDWParams); Procedure Assign (Source : TPersistent); Override; Constructor Create (aCollection : TCollection); Override; - Function GetNamePath : String; {$IFNDEF FPC}Override;{$ENDIF} + Function GetNamePath : String; Override; Destructor Destroy; Override; Published Property Routes : TRESTDWRoutes Read vDWRoutes Write vDWRoutes; diff --git a/CORE/Source/Basic/uRESTDWServerMethodClass.pas b/CORE/Source/Basic/uRESTDWServerMethodClass.pas index 66c4840d..33b8fca1 100644 --- a/CORE/Source/Basic/uRESTDWServerMethodClass.pas +++ b/CORE/Source/Basic/uRESTDWServerMethodClass.pas @@ -167,18 +167,16 @@ implementation Try ctempURI := ParamsURI; pAux1 := Pos('?', ctempURI); + vIsQuery := pAux1 > 0; // params com / If vIsQuery Then Begin + sAux2 := Copy(ctempURI, pAux1 + 1, Length(ctempURI)); + Delete(ctempURI, pAux1, Length(ctempURI)); If Pos('/', ctempURI) > 0 Then Begin sAux2 := Copy(ctempURI, pAux1 + 1, Pos('/', ctempURI) -2); Delete(ctempURI, pAux1, Pos('/', ctempURI)); - End - Else - Begin - sAux2 := Copy(ctempURI, pAux1 + 1, Length(ctempURI)); - Delete(ctempURI, pAux1, Length(ctempURI)); End; End Else diff --git a/CORE/Source/Basic/uRESTDWStorageBin.pas b/CORE/Source/Basic/uRESTDWStorageBin.pas index 4d4b0983..2ae57c90 100644 --- a/CORE/Source/Basic/uRESTDWStorageBin.pas +++ b/CORE/Source/Basic/uRESTDWStorageBin.pas @@ -1,4 +1,4 @@ -unit uRESTDWStorageBin; +unit uRESTDWStorageBin; {$I ..\Includes\uRESTDW.inc} @@ -502,7 +502,7 @@ interface vString := ''; If vInt64 > 0 Then Begin - SetLength(vString, sizeOf(vInt64)); + SetLength(vString, vInt64); {$IFDEF FPC} stream.Read(Pointer(vString)^, vInt64); If EncodeStrs Then @@ -515,9 +515,9 @@ interface stream.Read(vString[InitStrPos], vInt64); If EncodeStrs Then vString := DecodeStrings(vString); - vInt64 := (Length(vString) + 1) * SizeOf(WideChar); + //vInt64 := (Length(vString) + 1) * SizeOf(WideChar); If aField <> Nil Then - Move(DWWideString(vString)[InitStrPos], pData^, vInt64); + Move(vString[InitStrPos], pData^, vInt64); {$ENDIF} End; End; @@ -913,6 +913,8 @@ interface {$ENDIF} //{$ELSE} // FreeMem(PRESTDWMTMemBuffer(@PActualRecord)); + {$ELSE} + FreeMem(PRESTDWMTMemBuffer(@PActualRecord)); {$ENDIF} End; End; @@ -1359,8 +1361,31 @@ interface Case vDWFieldType Of dwftFixedChar, dwftWideString, - dwftString, dwftFixedWideChar : Begin + {$IFDEF RESTDWANDROID} + vString := MarshaledAString(PData); + {$ELSE} + SetLength(vRESTDWBytes, vDataSet.Fields[B].Size); + Try + Move(PRESTDWBytes(@Pdata)^[0], vRESTDWBytes[0], vDataSet.Fields[B].Size); + vString := StringReplace(BytesToString(vRESTDWBytes, false), #0, '', [rfReplaceAll]); + Finally + SetLength(vRESTDWBytes, 0); + End; + {$ENDIF} + If EncodeStrs Then + vString := EncodeStrings(vString{$IFDEF RESTDWLAZARUS}, csUndefined{$ENDIF}); + vInt64 := Length(vString)* SizeOf(vString[1]); + Stream.Write(vInt64, Sizeof(vInt64)); + {$IFNDEF FPC} + If vInt64 <> 0 Then + Stream.Write(vString[InitStrPos], vInt64); + {$ELSE} + If vInt64 <> 0 Then + Stream.Write(vString[1], vInt64); + {$ENDIF} + End; + dwftString : Begin {$IFDEF RESTDWANDROID} vString := MarshaledAString(PData); {$ELSE} @@ -1575,7 +1600,7 @@ interface If DatabaseCharSet <> csUndefined Then vWideString := GetStringDecode(vString, DatabaseCharSet); {$ENDIF} - vInt64 := Length(vWideString); + vInt64 := Length(vWideString)* sizeof(vWideString[1]); AStream.Write(vInt64, SizeOf(vInt64)); If vInt64 <> 0 Then AStream.Write(vWideString[InitStrPos], vInt64); diff --git a/CORE/Source/Database_Drivers/uRESTDWDriverBase.pas b/CORE/Source/Database_Drivers/uRESTDWDriverBase.pas index 7c963c49..8f7e3c41 100644 --- a/CORE/Source/Database_Drivers/uRESTDWDriverBase.pas +++ b/CORE/Source/Database_Drivers/uRESTDWDriverBase.pas @@ -1,4 +1,4 @@ -unit uRESTDWDriverBase; +unit uRESTDWDriverBase; {$I ..\Includes\uRESTDW.inc} @@ -1310,16 +1310,20 @@ procedure TRESTDWDriverBase.SetUpdateBuffer(var Query: TRESTDWDrvQuery; vParam.AsInteger := StrToInt(MassiveReplyValue.NewValue); end; end; - - if (MassiveReplyValue = nil) and - (not (MassiveDataset.AtualRec.PrimaryValues[X].IsNull)) then begin - if vParam.RESTDWDataTypeParam in [dwftLongWord,dwftLargeint] then - vParam.AsLargeInt := StrToInt64(MassiveDataset.AtualRec.PrimaryValues[X].Value) - else if vParam.DataType = ftSmallInt then - vParam.AsSmallInt := StrToInt(MassiveDataset.AtualRec.PrimaryValues[X].Value) - else - vParam.AsInteger := StrToInt(MassiveDataset.AtualRec.PrimaryValues[X].Value); - end; + If vParam.IsNull Then + Begin + If (MassiveReplyValue = Nil) And + (MassiveDataset.AtualRec.PrimaryValues[X] <> Nil) And + (Not (MassiveDataset.AtualRec.PrimaryValues[X].IsNull)) Then + Begin + If vParam.RESTDWDataTypeParam in [dwftLongWord,dwftLargeint] Then + vParam.AsLargeInt := StrToInt64(MassiveDataset.AtualRec.PrimaryValues[X].Value) + Else If vParam.DataType = ftSmallInt Then + vParam.AsSmallInt := StrToInt(MassiveDataset.AtualRec.PrimaryValues[X].Value) + Else + vParam.AsInteger := StrToInt(MassiveDataset.AtualRec.PrimaryValues[X].Value); + End; + End; end else if vParam.RESTDWDataTypeParam in [dwftFloat, dwftCurrency, dwftBCD, dwftFMTBcd, dwftSingle] then begin if (not (MassiveDataset.AtualRec.PrimaryValues[X].IsNull)) then @@ -4030,7 +4034,7 @@ procedure TRESTDWDriverBase.PrepareDataQuery(var Query: TRESTDWDrvQuery; else vLineSQL := Format('UPDATE %s ',[MassiveDataset.TableName + ' SET %s %s']); if not MassiveDataset.ReflectChanges then begin - for I := 0 to MassiveDataset.AtualRec.UpdateFieldChanges.Count - 1 do begin + for I := 0 to MassiveDataset.AtualRec.UpdateFieldChangesCount - 1 do begin if Lowercase(MassiveDataset.AtualRec.UpdateFieldChanges[I]) <> Lowercase(RESTDWFieldBookmark) then begin if vFields = '' then vFields := MassiveDataset.AtualRec.UpdateFieldChanges[I] + ' = :' + MassiveDataset.AtualRec.UpdateFieldChanges[I] @@ -4439,13 +4443,15 @@ procedure TRESTDWDriverBase.BuildDatasetLine(var Query : TRESTDWDrvDataset; Mass vStringStream := Nil; If Massivedataset.MassiveMode = mmUpdate Then Begin - For I := 0 To Massivedataset.AtualRec.UpdateFieldChanges.Count -1 Do + For I := 0 To Massivedataset.AtualRec.UpdateFieldChangesCount -1 Do Begin MassiveField := MassiveDataset.Fields.FieldByName(Massivedataset.AtualRec.UpdateFieldChanges[I]); - If (Lowercase(MassiveField.FieldName) = Lowercase(RESTDWFieldBookmark)) then - Continue; - If (MassiveField <> Nil) Then + If MassiveField = Nil Then + Continue + Else Begin + If (Lowercase(MassiveField.FieldName) = Lowercase(RESTDWFieldBookmark)) then + Continue; If MassiveField.IsNull Then vTempValue := '' Else @@ -4469,8 +4475,10 @@ procedure TRESTDWDriverBase.BuildDatasetLine(var Query : TRESTDWDrvDataset; Mass End; If Not MassiveField.IsNull Then vTempValue := MassiveReplyValue.NewValue + Else If MassiveReplyValue.OldValue <> Null Then + vTempValue := MassiveReplyValue.OldValue Else - vTempValue := MassiveReplyValue.OldValue; + vTempValue := ''; End Else Begin diff --git a/CORE/Source/Plugins/Memdataset/uRESTDWMemoryDataset.pas b/CORE/Source/Plugins/Memdataset/uRESTDWMemoryDataset.pas index 7acbdd0e..3c38c34f 100644 --- a/CORE/Source/Plugins/Memdataset/uRESTDWMemoryDataset.pas +++ b/CORE/Source/Plugins/Memdataset/uRESTDWMemoryDataset.pas @@ -1115,7 +1115,11 @@ TMemBookmarkInfo = record Finalize(FBlobs[0], FMemoryData.BlobFieldCount); FMemoryData.FRecords.Remove(Self); SetLength(FBlobs, 0); - FreeMem(FData, SizeOf(FData)); + {$IFDEF FPC} + ReallocMem(FData, 0); + {$ELSE} + FreeMem(FData, SizeOf(FData)); + {$ENDIF} FMemoryData := Nil; End; If Value <> nil then @@ -1531,11 +1535,15 @@ destructor TRESTDWMemTable.Destroy; Function TRESTDWMemTable.AllocRecordBuffer: TRecordBuffer; Begin - {$IFDEF DELPHI10_0UP} + {$IFDEF FPC} GetMem(Result, FRecBufSize); {$ELSE} - Result := StrAlloc(FRecBufSize); - {$ENDIF DELPHI10_0UP} + {$IFDEF DELPHI10_0UP} + GetMem(Result, FRecBufSize); + {$ELSE} + Result := StrAlloc(FRecBufSize); + {$ENDIF DELPHI10_0UP} + {$ENDIF} SetLength(FBlobs, 0); If BlobFieldCount > 0 Then SetLength(FBlobs, BlobFieldCount); @@ -1545,11 +1553,15 @@ destructor TRESTDWMemTable.Destroy; Begin If BlobFieldCount > 0 Then SetLength(FBlobs, 0); - {$IFDEF DELPHI10_0UP} - FreeMem(Buffer, 0); + {$IFDEF FPC} + FreeMem(Buffer); {$ELSE} - StrDispose(Buffer); - {$ENDIF DELPHI10_0UP} + {$IFDEF DELPHI10_0UP} + FreeMem(Buffer, 0); + {$ELSE} + StrDispose(Buffer); + {$ENDIF DELPHI10_0UP} + {$ENDIF} Buffer := nil; End; @@ -2179,20 +2191,20 @@ destructor TRESTDWMemTable.Destroy; {$ENDIF RTL240_UP} {$ENDIF ~NEXTGEN} -Procedure TRESTDWMemTable.InternalSetFieldData(Field : TField; - Buffer : Pointer; - Const ValidateBuffer : TRESTDWMTValueBuffer); +Procedure TRESTDWMemTable.InternalSetFieldData(Field : TField; + Buffer : Pointer; + Const ValidateBuffer : TRESTDWMTValueBuffer); Var - PActualRecord : PRESTDWMTMemBuffer; - Data : {$IFDEF FPC}PAnsiChar{$ELSE}PByte{$ENDIF}; - aBytes : TRESTDWBytes; - pBytes : PRESTDWBytes; - VarData : Variant; + PActualRecord : PRESTDWMTMemBuffer; + Data : {$IFDEF FPC}PAnsiChar{$ELSE}PByte{$ENDIF}; + aBytes : TRESTDWBytes; + pBytes : PRESTDWBytes; + VarData : Variant; aResult, vBoolean, - IsData : Boolean; + IsData : Boolean; aIndex, - cLen : Integer; + cLen : Integer; aDataType : TFieldType; Procedure GetDataValue; Begin @@ -4416,6 +4428,7 @@ procedure TRESTDWMemTable.InternalCreateIndex(F : TRESTDWDataSetIndex); Begin Move(Buffer^, Rec.Data^, FRecordSize); For I := 0 to BlobFieldCount - 1 do + If Assigned(FBlobs[I]) Then Rec.FBlobs[I] := FBlobs[I]; End; @@ -6368,8 +6381,10 @@ constructor TRESTDWStorageBase.Create(AOwner: TComponent); End; Procedure TRecordList.Delete(Index: Integer); +Var + vItem : PRESTDWMTMemoryRecord; Begin - If (Index > -1) Then + If (Index > -1) Then Begin Try If Assigned(TList(Self).Items[Index]) Then @@ -6377,7 +6392,8 @@ constructor TRESTDWStorageBase.Create(AOwner: TComponent); If Assigned(TRESTDWMTMemoryRecord(TList(Self).Items[Index]^)) Then Begin {$IFDEF FPC} - FreeAndNil(TList(Self).Items[Index]^); + vItem := TList(Self).Items[Index]; + vItem^.Free; {$ELSE} {$IF CompilerVersion > 33} FreeAndNil(TRESTDWMTMemoryRecord(TList(Self).Items[Index]^)); diff --git a/CORE/Source/ShellTools/uRESTDWShellServicesDelphi.pas b/CORE/Source/ShellTools/uRESTDWShellServicesDelphi.pas index 9460c185..aaab7f72 100644 --- a/CORE/Source/ShellTools/uRESTDWShellServicesDelphi.pas +++ b/CORE/Source/ShellTools/uRESTDWShellServicesDelphi.pas @@ -156,7 +156,7 @@ interface End; End; Begin - ResultStream := TStringStream.Create(''); +// ResultStream := TStringStream.Create(''); vCORSHeader := TStringList.Create; vResponseHeader := TStringList.Create; vResponseString := ''; @@ -310,6 +310,7 @@ interface Constructor TRESTDWShellService.Create(AOwner: TComponent); Begin Inherited Create(AOwner); + SetSocketKind('CGI/ISAPI - Delphi'); End; Destructor TRESTDWShellService.Destroy; diff --git a/CORE/Source/ShellTools/uRESTDWShellServicesLazarus.pas b/CORE/Source/ShellTools/uRESTDWShellServicesLazarus.pas index a5709d59..04d052d9 100644 --- a/CORE/Source/ShellTools/uRESTDWShellServicesLazarus.pas +++ b/CORE/Source/ShellTools/uRESTDWShellServicesLazarus.pas @@ -124,7 +124,7 @@ interface End; End; Begin - ResultStream := TStringStream.Create(''); +// ResultStream := TStringStream.Create(''); vResponseHeader := TStringList.Create; vCORSHeader := TStringList.Create; vResponseString := ''; @@ -260,6 +260,7 @@ interface Constructor TRESTDWShellService.Create(AOwner: TComponent); Begin Inherited Create(AOwner); + SetSocketKind('CGI/ISAPI - FPC/Lazarus'); End; Destructor TRESTDWShellService.Destroy; diff --git a/CORE/Source/Sockets/Indy/uRESTDWIdBase.pas b/CORE/Source/Sockets/Indy/uRESTDWIdBase.pas index e7e881e0..e9edf2ac 100644 --- a/CORE/Source/Sockets/Indy/uRESTDWIdBase.pas +++ b/CORE/Source/Sockets/Indy/uRESTDWIdBase.pas @@ -3311,6 +3311,7 @@ TIdHTTPAccess = class(TIdHTTP) Constructor TRESTDWIdServicePooler.Create(AOwner: TComponent); Begin Inherited; + SetSocketKind('Standalone - Indy'); HTTPServer := TIdHTTPServer.Create(Nil); lHandler := TIdServerIOHandlerSSLOpenSSL.Create(Nil); {$IFDEF RESTDWLAZARUS} diff --git a/CORE/Source/utils/uRESTDWJSONObject.pas b/CORE/Source/utils/uRESTDWJSONObject.pas index 043d1d86..444f9bb2 100644 --- a/CORE/Source/utils/uRESTDWJSONObject.pas +++ b/CORE/Source/utils/uRESTDWJSONObject.pas @@ -4291,34 +4291,6 @@ procedure TRESTDWJSONValue.WriteToDataset2(JSONValue: String; DestDS: TDataset); ovFixedWideChar]); Exit; End; - {$IFDEF RESTDWLAZARUS} - If vEncodingLazarus = Nil Then - SetEncoding(vEncoding); - If vEncoded Then - Begin - If vEncoding = esUtf8 Then - aValue := TRESTDWBytes(vEncodingLazarus.GetBytes(Format(TJsonStringValue, [bValue]))) - Else - aValue := StringToBytes(Format(TJsonStringValue, [bValue])) - End - Else - Begin - If ((DataMode = dmDataware) And (vEncoded)) Or Not(vObjectValue = ovObject) Then - Begin - If vEncoding = esUtf8 Then - aValue := TRESTDWBytes(vEncodingLazarus.GetBytes(Format(TJsonStringValue, [bValue]))) - Else - aValue := StringToBytes(Format(TJsonStringValue, [bValue])); - End - Else - Begin - If vEncoding = esUtf8 Then - aValue := TRESTDWBytes(vEncodingLazarus.GetBytes(bValue)) - Else - aValue := StringToBytes(String(bValue)); - End; - End; - {$ELSE} If vEncoded Then aValue := StringToBytes(Format(TJsonStringValue, [bValue])) Else @@ -4329,7 +4301,6 @@ procedure TRESTDWJSONValue.WriteToDataset2(JSONValue: String; DestDS: TDataset); Else aValue := StringToBytes(String(bValue)); End; - {$ENDIF} End Else If vObjectValue in [ovDate, ovTime, ovDateTime, ovTimeStamp, ovOraTimeStamp, ovTimeStampOffset] Then Begin diff --git a/CORE/Source/utils/uRESTDWMassiveBuffer.pas b/CORE/Source/utils/uRESTDWMassiveBuffer.pas index 15e67707..433c5b21 100644 --- a/CORE/Source/utils/uRESTDWMassiveBuffer.pas +++ b/CORE/Source/utils/uRESTDWMassiveBuffer.pas @@ -169,17 +169,21 @@ interface Procedure PutRec (Index : Integer; Item : TMassiveValue); Function GetRecPK(Index : Integer) : TMassiveValue; Procedure PutRecPK(Index : Integer; Item : TMassiveValue); + Function GetChanges(Index : Integer) : String; + Procedure SetChanges(Index : Integer; + Item : String); Protected Public Constructor Create; Destructor Destroy;Override; Procedure ClearAll; + Function UpdateFieldChangesCount : Integer; Procedure LoadFromStream (Source : TStream); Procedure SaveToStream (Var Dest : TStream; MassiveBuffer : TObject = Nil); Property Changes : TStringList Read vChanges; Property MassiveMode : TMassiveMode Read vMassiveMode Write vMassiveMode; - Property UpdateFieldChanges : TStringList Read vChanges Write vChanges; + Property UpdateFieldChanges[Index : Integer] : String Read GetChanges Write SetChanges; Property MassiveType : TMassiveType Read vMassiveType Write vMassiveType; Property Params : TRESTDWParams Read vDWParams Write vDWParams; Property DataExec : TStringList Read vDataExec Write vDataExec; @@ -727,13 +731,37 @@ implementation Function TMassiveFields.FieldByName(FieldName : String): TMassiveField; Var - I : Integer; + I : Integer; + vFieldName, + vFieldNameB : String; + vResult : Boolean; + Function StrCompField(A, B : String) : Boolean; + Var + I, X : Integer; + Begin + Result := Length(A) > 0; + X := 0; + For I := 1 To Length(A) Do + Begin + Result := I <= Length(B); + If Result Then + Begin + Result := A[I] = B[X]; + If Not Result Then + Break; + End + Else + Break; + End; + End; Begin - Result := Nil; + Result := Nil; + vFieldNameB := UpperCase(Trim(FieldName)); For I := 0 To Self.Count -1 Do Begin - If LowerCase(TMassiveField(TList(Self).Items[I]^).vFieldName) = - LowerCase(FieldName) Then + vFieldName := UpperCase(Trim(Items[I].vFieldName)); + vResult := vFieldName = vFieldNameB; + If vResult Then Begin Result := TMassiveField(TList(Self).Items[I]^); Break; @@ -1012,6 +1040,21 @@ implementation Result := TMassiveValue(TList(vMassiveValues).Items[Index]^); End; +Function TMassiveLine.GetChanges(Index : Integer) : String; +Begin + Result := ''; + If vChanges <> Nil Then + If (Index < vChanges.Count) And (Index > -1) Then + Result := vChanges[Index]; +End; + +Procedure TMassiveLine.SetChanges(Index : Integer; + Item : String); +Begin + If (Index < vChanges.Count) And (Index > -1) Then + vChanges[Index] := Item; +End; + Function TMassiveLine.GetRecPK(Index : Integer) : TMassiveValue; Begin Result := Nil; @@ -1020,6 +1063,13 @@ implementation Result := TMassiveValue(TList(vPrimaryValues).Items[Index]^); End; +Function TMassiveLine.UpdateFieldChangesCount : Integer; +Begin + Result := 0; + If vChanges <> Nil Then + Result := vChanges.Count; +End; + Procedure TMassiveLine.ClearAll; Begin vMassiveValues.ClearAll; @@ -1128,7 +1178,7 @@ implementation Begin BufferStream.InputBytes(VarToBytes(Changes.Count > 0, varBoolean)); If Changes.Count > 0 Then - BufferStream.InputBytes(VarToBytes(EncodeStrings(Changes.Text{$IFDEF RESTDWLAZARUS}, TDatabaseCharSet.csUTF8{$ENDIF}), varString)); + BufferStream.InputBytes(VarToBytes(EncodeStrings(Changes.Text{$IFDEF RESTDWLAZARUS}, TDatabaseCharSet.csUndefined{$ENDIF}), varString)); If vPrimaryValues = Nil Then BufferStream.InputBytes(VarToBytes(False, varBoolean)) Else @@ -1305,7 +1355,7 @@ implementation Begin MassiveValue := TMassiveValue.Create; MassiveValue.Encoding := vEncoding; - If (vMassiveFields.Count > I) And (I > 0) Then + If (I > 0) Then Begin MassiveValue.ValueName := vMassiveFields.Items[I -1].FieldName; MassiveValue.ObjectValue := vMassiveFields.Items[I -1].vFieldType; @@ -1316,7 +1366,10 @@ implementation {$ENDIF} If I = 0 Then MassiveValue.Value := MassiveModeToString(MassiveModeData); - MassiveLineBuff.vMassiveValues.Add(MassiveValue); + If ((MassiveValue.ValueName <> '') Or (I = 0)) Then + MassiveLineBuff.vMassiveValues.Add(MassiveValue) + Else + FreeAndNil(MassiveValue); End; End; End; @@ -1377,7 +1430,15 @@ implementation Begin If (Field.ProviderFlags = []) Then Continue; - MassiveLineBuff.vMassiveValues.Items[I + 1].vJSONValue.ObjectValue := FieldTypeToObjectValue(Field.DataType); + If MassiveLineBuff.vMassiveValues.Count > (I + 1) Then + Begin + If MassiveLineBuff.vMassiveValues.Items[I + 1] <> Nil Then + MassiveLineBuff.vMassiveValues.Items[I + 1].vJSONValue.ObjectValue := FieldTypeToObjectValue(Field.DataType) + Else + Continue; + End + Else + Continue; If MassiveModeBuff = mmDelete Then If Not(pfInKey in Field.ProviderFlags) Then Continue; @@ -2338,7 +2399,7 @@ implementation End; aBool := BytesToVar(BufferStream.ReadBytes, varBoolean); If aBool Then - MassiveLine.vChanges.Text := DecodeStrings(BytesToVar(BufferStream.ReadBytes, varString){$IFDEF RESTDWLAZARUS}, TDatabaseCharSet.csUTF8{$ENDIF}); + MassiveLine.vChanges.Text := DecodeStrings(BytesToVar(BufferStream.ReadBytes, varString){$IFDEF RESTDWLAZARUS}, TDatabaseCharSet.csUndefined{$ENDIF}); aBool := BytesToVar(BufferStream.ReadBytes, varBoolean); If aBool Then Begin diff --git a/CORE/Source/utils/uRESTDWTools.pas b/CORE/Source/utils/uRESTDWTools.pas index 0749b844..986d15fe 100644 --- a/CORE/Source/utils/uRESTDWTools.pas +++ b/CORE/Source/utils/uRESTDWTools.pas @@ -2945,6 +2945,9 @@ procedure WriteStringToStream(AStream : TStream; Function BookmarkToHex(Value : TRESTDWBytes) : String; {$IFDEF RESTDWFMX} +Var + bytes: TBytes; +{$ELSE IF FPC} Var bytes: TBytes; {$ENDIF} @@ -2958,7 +2961,13 @@ procedure WriteStringToStream(AStream : TStream; HexToBin(PwideChar(value), 0, bytes, 0, Length(bytes)); Result := TEncoding.UTF8.GetString(bytes); {$ELSE} - BinToHex(PAnsiChar(Value), PChar(Result), restdwLength(Value)); + {$IFDEF FPC} + SetLength(bytes, restdwLength(value) div 2); + HexToBin(PChar(value), PChar(bytes), Length(bytes)); + Result := BytesToString(bytes); + {$ELSE} + BinToHex(PAnsiChar(Value), PChar(Result), restdwLength(Value)); + {$ENDIF} {$ENDIF} End; End; @@ -3299,7 +3308,8 @@ procedure WriteStringToStream(AStream : TStream; Else LBytes := Copy(AValue, AStartIndex, LLength); {$IF Defined(RESTDWLAZARUS) OR not Defined(DELPHIXEUP)} - SetString(Result, PAnsiChar(LBytes), restdwLength(LBytes)); + SetString(Result, PWideChar(LBytes), restdwLength(LBytes)); + Result := TEncoding.ANSI.GetString(TBytes(LBytes)); {$ELSEIF Defined(DELPHIXEUP)} SetString(Result, PWideChar(LBytes), restdwLength(LBytes)); {$IFDEF MSWINDOWS}