From 3f325c56c1eb41c3d7e384dea62413898bd3d6f7 Mon Sep 17 00:00:00 2001 From: Rodrigo bernardi Date: Tue, 2 Oct 2018 11:21:05 -0300 Subject: [PATCH 01/45] added boss.json --- .gitignore | 3 ++- boss.json | 13 +++++++++++++ modules/DataSetConverter4Delphi | 1 - 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 boss.json delete mode 160000 modules/DataSetConverter4Delphi diff --git a/.gitignore b/.gitignore index 85f96d0..5d2aa5d 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,5 @@ src/*.~* *.so *.~* *.a -*.stat \ No newline at end of file +*.stat +/modules/ \ No newline at end of file diff --git a/boss.json b/boss.json new file mode 100644 index 0000000..e1fcdb4 --- /dev/null +++ b/boss.json @@ -0,0 +1,13 @@ +{ + "name": "ragna", + "description": "", + "version": "1.0.0", + "private": false, + "homepage": "", + "mainsrc": "src/", + "supported": "xe+", + "dprojFile": "", + "dependencies": { + "github.com/hunsche/DataSetConverter4Delphi": "^1" + } +} \ No newline at end of file diff --git a/modules/DataSetConverter4Delphi b/modules/DataSetConverter4Delphi deleted file mode 160000 index 196f36c..0000000 --- a/modules/DataSetConverter4Delphi +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 196f36cb9501784a4277453c318df90a67407d20 From 8b744fc26dfd67e446c4c713b2791d7020028e0b Mon Sep 17 00:00:00 2001 From: Rodrigo Bernardi Date: Tue, 2 Oct 2018 16:44:15 -0300 Subject: [PATCH 02/45] Create README.md --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..981d037 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# ragna From 578f36bd27e806b60a12ea8d5485ab4c392089d8 Mon Sep 17 00:00:00 2001 From: Rodrigo Bernardi Date: Tue, 2 Oct 2018 16:47:17 -0300 Subject: [PATCH 03/45] Create LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9d5c40d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 HashLoad + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 3ee34064d51a542e9f3a8cd44f6b684148e286d2 Mon Sep 17 00:00:00 2001 From: Matheus Hunsche Date: Thu, 4 Oct 2018 10:36:47 -0300 Subject: [PATCH 04/45] Update boss.json --- boss.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/boss.json b/boss.json index e1fcdb4..1c3b0ba 100644 --- a/boss.json +++ b/boss.json @@ -8,6 +8,6 @@ "supported": "xe+", "dprojFile": "", "dependencies": { - "github.com/hunsche/DataSetConverter4Delphi": "^1" + "github.com/hunsche/DataSetConverter4Delphi": "^1.0.0" } -} \ No newline at end of file +} From d880820ffebc4d346229974a628e5354aba7911c Mon Sep 17 00:00:00 2001 From: Matheus Hunsche Date: Mon, 8 Oct 2018 18:48:13 -0300 Subject: [PATCH 05/45] hotfix singleton sqls --- boss.json | 2 +- ragna.dpk | 45 ++++ .../criteria/criteria.dproj => ragna.dproj | 206 ++++++++---------- samples/criteria/Samples.Criteria.dfm | 16 -- samples/criteria/Samples.Criteria.pas | 30 --- samples/criteria/criteria.dpr | 23 -- src/Ragna.Impl.pas | 4 +- src/Ragna.State.pas | 46 ++-- 8 files changed, 162 insertions(+), 210 deletions(-) create mode 100644 ragna.dpk rename samples/criteria/criteria.dproj => ragna.dproj (73%) delete mode 100644 samples/criteria/Samples.Criteria.dfm delete mode 100644 samples/criteria/Samples.Criteria.pas delete mode 100644 samples/criteria/criteria.dpr diff --git a/boss.json b/boss.json index 1c3b0ba..7eed826 100644 --- a/boss.json +++ b/boss.json @@ -10,4 +10,4 @@ "dependencies": { "github.com/hunsche/DataSetConverter4Delphi": "^1.0.0" } -} +} \ No newline at end of file diff --git a/ragna.dpk b/ragna.dpk new file mode 100644 index 0000000..53134d0 --- /dev/null +++ b/ragna.dpk @@ -0,0 +1,45 @@ +package ragna; + +{$R *.res} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + rtl, + dbrtl, + FireDAC, + FireDACCommonDriver, + FireDACCommon; + +contains + Ragna.Criteria in 'src\Ragna.Criteria.pas', + Ragna.Impl in 'src\Ragna.Impl.pas', + Ragna.Intf in 'src\Ragna.Intf.pas', + Ragna in 'src\Ragna.pas', + Ragna.State in 'src\Ragna.State.pas'; + +end. diff --git a/samples/criteria/criteria.dproj b/ragna.dproj similarity index 73% rename from samples/criteria/criteria.dproj rename to ragna.dproj index 7d7a37e..dac5d1d 100644 --- a/samples/criteria/criteria.dproj +++ b/ragna.dproj @@ -1,25 +1,40 @@  - {36E01FA2-146E-4719-B53E-F5CBEFDF21C5} + {D9E8CA95-FBB1-42EA-A7B4-909AC5ACFADD} + ragna.dpk 18.4 - VCL - criteria.dpr + None True Debug Win32 1 - Application + Package true - - true + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true Base true - - true + + true Base true @@ -39,12 +54,6 @@ Base true - - true - Cfg_2 - true - true - .\$(Platform)\$(Config) .\$(Platform)\$(Config) @@ -53,24 +62,33 @@ false false false - RESTComponents;emsclientfiredac;DataSnapFireDAC;FireDACIBDriver;emsclient;FireDACCommon;RESTBackendComponents;soapserver;CloudService;FireDACCommonDriver;inet;FireDAC;FireDACSqliteDriver;soaprtl;soapmidas;$(DCC_UsePackage) - System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - criteria + true + true + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + All + true + ragna + ;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\src\;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\unittest\;$(DCC_UnitSearchPath) + + + None + android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services-ads-7.0.0.dex.jar;google-play-services-analytics-7.0.0.dex.jar;google-play-services-base-7.0.0.dex.jar;google-play-services-identity-7.0.0.dex.jar;google-play-services-maps-7.0.0.dex.jar;google-play-services-panorama-7.0.0.dex.jar;google-play-services-plus-7.0.0.dex.jar;google-play-services-wallet-7.0.0.dex.jar + + + None + + + None + + + None - DBXSqliteDriver;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;tethering;svnui;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;emsedge;fmx;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;DataSnapCommon;DataSnapConnectors;VCLRESTComponents;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;DataSnapClient;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;emshosting;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;DbxCommonDriver;DataSnapServer;xmlrtl;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug true CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 - $(BDS)\bin\default_app.manifest - - - DBXSqliteDriver;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;tethering;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;emsedge;fmx;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;DataSnapCommon;DataSnapConnectors;VCLRESTComponents;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;DataSnapClient;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;emshosting;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;DbxCommonDriver;DataSnapServer;xmlrtl;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) DEBUG;$(DCC_Define) @@ -82,8 +100,8 @@ false - true - true + true + 1033 false @@ -91,27 +109,20 @@ 0 0 - - true - true - MainSource - -
SampleCriteria
- dfm -
- - - - - - - - - + + + + + + + + + + Cfg_2 Base @@ -126,26 +137,46 @@
Delphi.Personality.12 - Application + Package + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + - criteria.dpr + ragna.dpk - - - criteria.exe + + true - + - 1 + true + + + + + true + + + + true + + + + + ragna.bpl + true + + + - Contents\MacOS 1 @@ -260,7 +291,6 @@ 1 - Contents\MacOS 1 @@ -269,7 +299,6 @@ - Contents\MacOS 1 .framework @@ -278,20 +307,7 @@ - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - Contents\MacOS 1 .dylib @@ -314,7 +330,6 @@ .dylib - Contents\MacOS 1 .dylib @@ -337,7 +352,6 @@ 0 - Contents\Resources\StartUp\ 0 @@ -436,35 +450,9 @@ 1 - - - 1 - - - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - + + + 1 @@ -476,18 +464,8 @@ 1 - - - ..\ - 1 - - - - - Contents - 1 - - + + Contents\Resources @@ -512,7 +490,6 @@ 1 - Contents\MacOS 1 @@ -552,11 +529,16 @@ - + + False + False + False + False + False True False diff --git a/samples/criteria/Samples.Criteria.dfm b/samples/criteria/Samples.Criteria.dfm deleted file mode 100644 index ff2db7d..0000000 --- a/samples/criteria/Samples.Criteria.dfm +++ /dev/null @@ -1,16 +0,0 @@ -object SampleCriteria: TSampleCriteria - Left = 0 - Top = 0 - Caption = 'SampleCriteria' - ClientHeight = 231 - ClientWidth = 505 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'Tahoma' - Font.Style = [] - OldCreateOrder = False - PixelsPerInch = 96 - TextHeight = 13 -end diff --git a/samples/criteria/Samples.Criteria.pas b/samples/criteria/Samples.Criteria.pas deleted file mode 100644 index 16adfe3..0000000 --- a/samples/criteria/Samples.Criteria.pas +++ /dev/null @@ -1,30 +0,0 @@ -unit Samples.Criteria; - -interface - -uses - Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, - System.Classes, Vcl.Graphics, - Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option, - FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, - FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, Data.DB, - FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.UI.Intf, FireDAC.Stan.Def, - FireDAC.Stan.Pool, FireDAC.Phys, FireDAC.VCLUI.Wait, FireDAC.Phys.PG, - FireDAC.Phys.PGDef; - -type - TSampleCriteria = class(TForm) - private - { Private declarations } - public - { Public declarations } - end; - -var - SampleCriteria: TSampleCriteria; - -implementation - -{$R *.dfm} - -end. diff --git a/samples/criteria/criteria.dpr b/samples/criteria/criteria.dpr deleted file mode 100644 index 625a4ae..0000000 --- a/samples/criteria/criteria.dpr +++ /dev/null @@ -1,23 +0,0 @@ -program criteria; - -uses - Vcl.Forms, - Samples.Criteria in 'Samples.Criteria.pas' {SampleCriteria}, - Ragna.Criteria in '..\..\src\Ragna.Criteria.pas', - Ragna in '..\..\src\Ragna.pas', - Ragna.Impl in '..\..\src\Ragna.Impl.pas', - Ragna.State in '..\..\src\Ragna.State.pas', - DataSetConverter4D.Helper in '..\..\modules\DataSetConverter4Delphi\src\DataSetConverter4D.Helper.pas', - DataSetConverter4D.Impl in '..\..\modules\DataSetConverter4Delphi\src\DataSetConverter4D.Impl.pas', - DataSetConverter4D in '..\..\modules\DataSetConverter4Delphi\src\DataSetConverter4D.pas', - DataSetConverter4D.Util in '..\..\modules\DataSetConverter4Delphi\src\DataSetConverter4D.Util.pas', - Ragna.Intf in '..\..\src\Ragna.Intf.pas'; - -{$R *.res} - -begin - Application.Initialize; - Application.MainFormOnTaskbar := True; - Application.CreateForm(TSampleCriteria, SampleCriteria); - Application.Run; -end. diff --git a/src/Ragna.Impl.pas b/src/Ragna.Impl.pas index c37dd69..b24848b 100644 --- a/src/Ragna.Impl.pas +++ b/src/Ragna.Impl.pas @@ -168,10 +168,10 @@ procedure TRagna.RaiseNotFound; procedure TRagna.StartCriteria; var - LKey: Pointer; + LKey: TFDQuery; LRagnaState: TRagnaState; begin - LKey := @FQuery; + LKey := FQuery; LRagnaState := TRagnaState.GetInstance; if LRagnaState.GetState(LKey).IsEmpty then diff --git a/src/Ragna.State.pas b/src/Ragna.State.pas index 31acbda..a2dd747 100644 --- a/src/Ragna.State.pas +++ b/src/Ragna.State.pas @@ -3,21 +3,22 @@ interface uses - System.Generics.Collections; + System.Generics.Collections, FireDac.Comp.Client; type + TPairOfQueryAndSql = TPair; + TRagnaState = class private FSecret: string; - FStates: TThreadList>; + FStates: TThreadList; class var FInstance: TRagnaState; public - property States: TThreadList < TPair < Pointer, string >> read FStates - write FStates; - procedure SetState(APointer: Pointer; ASQL: string); - function GetState(APointer: Pointer): string; - function RemoveState(APointer: Pointer): string; + property States: TThreadList read FStates write FStates; + procedure SetState(AQuery: TFDQuery; ASQL: string); + function GetState(AQuery: TFDQuery): string; + function RemoveState(AQuery: TFDQuery): string; class function GetInstance: TRagnaState; class procedure Release; constructor Create; @@ -30,7 +31,7 @@ implementation constructor TRagnaState.Create; begin - FStates := TThreadList < TPair < Pointer, string >>.Create; + FStates := TThreadList.Create; end; destructor TRagnaState.Destroy; @@ -45,16 +46,16 @@ class function TRagnaState.GetInstance: TRagnaState; Result := FInstance; end; -function TRagnaState.GetState(APointer: Pointer): string; +function TRagnaState.GetState(AQuery: TFDQuery): string; var - LState: TPair; - LStates: TList>; + LState: TPairOfQueryAndSql; + LStates: TList; begin LStates := FStates.LockList; try for LState in LStates do begin - if LState.Key = APointer then + if LState.Key = AQuery then begin Result := LState.Value; Break; @@ -70,16 +71,16 @@ class procedure TRagnaState.Release; FInstance.Free; end; -function TRagnaState.RemoveState(APointer: Pointer): string; +function TRagnaState.RemoveState(AQuery: TFDQuery): string; var - LState: TPair; - LStates: TList>; + LState: TPairOfQueryAndSql; + LStates: TList; begin LStates := FStates.LockList; try for LState in LStates do begin - if LState.Key = APointer then + if LState.Key = AQuery then begin Result := LState.Value; Break; @@ -92,18 +93,11 @@ function TRagnaState.RemoveState(APointer: Pointer): string; LStates.Remove(LState); end; -procedure TRagnaState.SetState(APointer: Pointer; ASQL: string); +procedure TRagnaState.SetState(AQuery: TFDQuery; ASQL: string); var - LState: TPair; + LState: TPairOfQueryAndSql; begin -// TMonitor.Enter(FList); - try -// FList.Add(); - finally -// TMonitor.Exit(FList); - end; - - LState := TPair.Create(APointer, ASQL); + LState := TPairOfQueryAndSql.Create(AQuery, ASQL); FStates.Add(LState); end; From a51a711caea8947a7435bb4eac15c6c9366a0388 Mon Sep 17 00:00:00 2001 From: Matheus Hunsche Date: Tue, 9 Oct 2018 10:54:37 -0300 Subject: [PATCH 06/45] hot fix pointer fdquery --- src/Ragna.Impl.pas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Ragna.Impl.pas b/src/Ragna.Impl.pas index b24848b..92f9442 100644 --- a/src/Ragna.Impl.pas +++ b/src/Ragna.Impl.pas @@ -71,10 +71,10 @@ destructor TRagna.Destroy; procedure TRagna.EndCriteria; var - LKey: Pointer; + LKey: TFDQuery; LRagnaState: TRagnaState; begin - LKey := @FQuery; + LKey := FQuery; LRagnaState := TRagnaState.GetInstance; FQuery.SQL.Text := LRagnaState.RemoveState(LKey); end; From f9428ec56f1b33346bafb7ab2e630e6d5201c480 Mon Sep 17 00:00:00 2001 From: Matheus Hunsche Date: Tue, 9 Oct 2018 14:22:47 -0300 Subject: [PATCH 07/45] adjusted states --- src/Ragna.Impl.pas | 28 ++++++++++++++++++++-------- src/Ragna.Intf.pas | 5 +++-- src/Ragna.State.pas | 4 ++-- src/Ragna.pas | 19 +++++++++++++++++-- 4 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/Ragna.Impl.pas b/src/Ragna.Impl.pas index 92f9442..0f0f96d 100644 --- a/src/Ragna.Impl.pas +++ b/src/Ragna.Impl.pas @@ -12,6 +12,7 @@ TRagna = class(TInterfacedObject, IRagna) FQuery: TFDQuery; FManagerCriteria: TManagerCriteria; FCriteria: ICriteria; + procedure SaveState; private function GetTableName: string; function HasField(AFields: array of TField): Boolean; @@ -25,8 +26,9 @@ TRagna = class(TInterfacedObject, IRagna) procedure UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject); procedure New(ABody: TJSONObject); procedure OpenUp; - procedure StartCriteria; - procedure EndCriteria; + procedure StartCriteria; deprecated; + procedure EndCriteria; deprecated; + procedure Reset; procedure ToJson(out AJSON: TJSONArray); overload; procedure ToJson(out AJSON: TJSONObject); overload; procedure EditFromJson(const AJSON: TJSONObject); @@ -45,6 +47,7 @@ implementation constructor TRagna.Create(AQuery: TFDQuery); begin FQuery := AQuery; + SaveState; FManagerCriteria := TManagerCriteria.Create(FQuery); FCriteria := FManagerCriteria.Criteria; end; @@ -69,14 +72,20 @@ destructor TRagna.Destroy; FManagerCriteria.Free; end; -procedure TRagna.EndCriteria; +procedure TRagna.SaveState; var LKey: TFDQuery; LRagnaState: TRagnaState; begin LKey := FQuery; LRagnaState := TRagnaState.GetInstance; - FQuery.SQL.Text := LRagnaState.RemoveState(LKey); + if LRagnaState.GetState(LKey).IsEmpty then + LRagnaState.SetState(LKey, FQuery.SQL.Text); +end; + +procedure TRagna.EndCriteria; +begin + Reset; end; procedure TRagna.FindById(AField: TField; AValue: Int64); @@ -166,16 +175,19 @@ procedure TRagna.RaiseNotFound; raise Exception.Create('Resource not found!'); end; -procedure TRagna.StartCriteria; +procedure TRagna.Reset; var - LKey: TFDQuery; + LKey: Pointer; LRagnaState: TRagnaState; begin LKey := FQuery; LRagnaState := TRagnaState.GetInstance; + FQuery.SQL.Text := LRagnaState.GetState(LKey); +end; - if LRagnaState.GetState(LKey).IsEmpty then - LRagnaState.SetState(LKey, FQuery.SQL.Text) +procedure TRagna.StartCriteria; +begin +// SaveState; end; procedure TRagna.ToJson(out AJSON: TJSONObject); diff --git a/src/Ragna.Intf.pas b/src/Ragna.Intf.pas index 878f875..040085c 100644 --- a/src/Ragna.Intf.pas +++ b/src/Ragna.Intf.pas @@ -16,8 +16,9 @@ interface procedure UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject); procedure New(ABody: TJSONObject); procedure OpenUp; - procedure StartCriteria; - procedure EndCriteria; + procedure StartCriteria; deprecated; + procedure EndCriteria; deprecated; + procedure Reset; procedure ToJson(out AJSON: TJSONArray); overload; procedure ToJson(out AJSON: TJSONObject); overload; procedure EditFromJson(const AJSON: TJSONObject); diff --git a/src/Ragna.State.pas b/src/Ragna.State.pas index a2dd747..0dab360 100644 --- a/src/Ragna.State.pas +++ b/src/Ragna.State.pas @@ -7,7 +7,7 @@ interface type - TPairOfQueryAndSql = TPair; + TPairOfQueryAndSql = TPair; TRagnaState = class private @@ -18,7 +18,7 @@ TRagnaState = class property States: TThreadList read FStates write FStates; procedure SetState(AQuery: TFDQuery; ASQL: string); function GetState(AQuery: TFDQuery): string; - function RemoveState(AQuery: TFDQuery): string; + function RemoveState(AQuery: TFDQuery): string; deprecated; class function GetInstance: TRagnaState; class procedure Release; constructor Create; diff --git a/src/Ragna.pas b/src/Ragna.pas index a0ecd75..8b8b265 100644 --- a/src/Ragna.pas +++ b/src/Ragna.pas @@ -18,8 +18,9 @@ TRagnaHelper = class helper for TFDQuery : TFDQuery; function New(ABody: TJSONObject): TFDQuery; function OpenUp: TFDQuery; - function StartCriteria: TFDQuery; - function EndCriteria: TFDQuery; + function StartCriteria: TFDQuery; deprecated; + function EndCriteria: TFDQuery; deprecated; + function Reset: TFDQuery; function ToJson(out AJSON: TJSONArray): TFDQuery; overload; function ToJson(out AJSON: TJSONObject): TFDQuery; overload; function EditFromJson(const AJSON: TJSONObject): TFDQuery; @@ -265,6 +266,20 @@ function TRagnaHelper.RadicalResearch(AValue: string; AFields: array of TField) Result := Self; end; +function TRagnaHelper.Reset: TFDQuery; +var + LRagna: TRagna; +begin + LRagna := TRagna.Create(Self); + try + LRagna.Reset; + finally + LRagna.Free; + end; + + Result := Self; +end; + function TRagnaHelper.StartCriteria: TFDQuery; var LRagna: TRagna; From 958fc1985f30fad4504fe59b461abcef8a68a8a2 Mon Sep 17 00:00:00 2001 From: Matheus Hunsche Date: Tue, 9 Oct 2018 19:10:29 -0300 Subject: [PATCH 08/45] Update Ragna.Impl.pas --- src/Ragna.Impl.pas | 231 ++++++++++++--------------------------------- 1 file changed, 59 insertions(+), 172 deletions(-) diff --git a/src/Ragna.Impl.pas b/src/Ragna.Impl.pas index 0f0f96d..34134f4 100644 --- a/src/Ragna.Impl.pas +++ b/src/Ragna.Impl.pas @@ -1,217 +1,104 @@ -unit Ragna.Impl; +unit Ragna.State; interface -uses Ragna.Intf, FireDAC.Comp.Client, System.JSON, Data.DB, Ragna.Criteria, - DataSetConverter4D.Helper; +uses + System.Generics.Collections, FireDac.Comp.Client, System.Rtti; type - TRagna = class(TInterfacedObject, IRagna) - private - FQuery: TFDQuery; - FManagerCriteria: TManagerCriteria; - FCriteria: ICriteria; - procedure SaveState; + TListQueryAndSql = TDictionary; + + TRagnaState = class private - function GetTableName: string; - function HasField(AFields: array of TField): Boolean; - procedure OpenEmpty; - procedure RaiseNotFound; + FSecret: string; + FStates: TListQueryAndSql; + FVmi : TVirtualMethodInterceptor; + class var FInstance: TRagnaState; + procedure OnBeforVMI(Instance: TObject; + Method: TRttiMethod; const Args: TArray; out DoInvoke: Boolean; + out Result: TValue); public - procedure Paginate(AOffSet, ALimit: integer); - procedure RadicalResearch(AValue: string; AFields: array of TField); - procedure Delete(AField: TField; AValue: Int64); - procedure FindById(AField: TField; AValue: Int64); - procedure UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject); - procedure New(ABody: TJSONObject); - procedure OpenUp; - procedure StartCriteria; deprecated; - procedure EndCriteria; deprecated; - procedure Reset; - procedure ToJson(out AJSON: TJSONArray); overload; - procedure ToJson(out AJSON: TJSONObject); overload; - procedure EditFromJson(const AJSON: TJSONObject); - constructor Create(AQuery: TFDQuery); + property States: TListQueryAndSql read FStates write FStates; + procedure SetState(AQuery: TFDQuery; ASQL: string); + function GetState(AQuery: TFDQuery; out ASQL: string): Boolean; + class function GetInstance: TRagnaState; + class procedure Release; + constructor Create; destructor Destroy; - property Query: TFDQuery read FQuery write FQuery; - property Criteria: ICriteria read FCriteria write FCriteria; end; implementation -{ TRagna } - -uses Ragna.State, System.SysUtils, Ragna; - -constructor TRagna.Create(AQuery: TFDQuery); -begin - FQuery := AQuery; - SaveState; - FManagerCriteria := TManagerCriteria.Create(FQuery); - FCriteria := FManagerCriteria.Criteria; -end; -procedure TRagna.Delete(AField: TField; AValue: Int64); -const - DELETE_SQL = 'DELETE FROM %s WHERE %s = :ID'; - DELETED: array [0 .. 1] of Boolean = (False, True); -var - LDeleted: integer; - LSql: string; -begin - OpenEmpty; - LSql := Format(DELETE_SQL, [GetTableName, AField.FieldName]); - LDeleted := FQuery.Connection.ExecSQL(LSql, [AValue]); - if not DELETED[LDeleted] then - RaiseNotFound; -end; +{ TRagnaState } -destructor TRagna.Destroy; +constructor TRagnaState.Create; begin - FManagerCriteria.Free; + FVmi := TVirtualMethodInterceptor.Create(TFDQuery); + FVmi.OnBefore := OnBeforVMI; + FStates := TListQueryAndSql.Create; end; -procedure TRagna.SaveState; -var - LKey: TFDQuery; - LRagnaState: TRagnaState; +destructor TRagnaState.Destroy; begin - LKey := FQuery; - LRagnaState := TRagnaState.GetInstance; - if LRagnaState.GetState(LKey).IsEmpty then - LRagnaState.SetState(LKey, FQuery.SQL.Text); + FStates.Free; + FVmi.Free; end; -procedure TRagna.EndCriteria; +class function TRagnaState.GetInstance: TRagnaState; begin - Reset; + if not assigned(FInstance) then + FInstance := TRagnaState.Create; + Result := FInstance; end; -procedure TRagna.FindById(AField: TField; AValue: Int64); -var - LField: string; +function TRagnaState.GetState(AQuery: TFDQuery; out ASQL: string): Boolean; begin - FQuery.StartCriteria; + TMonitor.Enter(FStates); try - OpenEmpty; - LField := GetTableName + '.' + AField.Origin; + Result := FStates.TryGetValue(AQuery, ASQL); finally - FQuery.EndCriteria; + TMonitor.Exit(FStates); end; - - FQuery - .Where(LField) - .Equals(AValue); -end; - -procedure TRagna.EditFromJson(const AJSON: TJSONObject); -begin - FQuery.RecordFromJSONObject(AJSON); end; -function TRagna.GetTableName: string; +procedure TRagnaState.OnBeforVMI(Instance: TObject; Method: TRttiMethod; + const Args: TArray; out DoInvoke: Boolean; out Result: TValue); begin - Result := FQuery.Table.Table.SourceName; -end; - -function TRagna.HasField(AFields: array of TField): Boolean; -begin - Result := Length(AFields) > 0; -end; - -procedure TRagna.OpenUp; -begin - FQuery.Open; -end; - -procedure TRagna.OpenEmpty; -begin - FQuery.Where(True).Equals(False).OpenUp; -end; - -procedure TRagna.Paginate(AOffSet, ALimit: integer); -begin - if AOffSet > 0 then - FQuery.FetchOptions.RecsSkip := AOffSet; - - if ALimit > 0 then - FQuery.FetchOptions.RecsMax := ALimit; -end; - -procedure TRagna.New(ABody: TJSONObject); -begin - OpenEmpty; - FQuery.EditFromJson(ABody); -end; - -procedure TRagna.RadicalResearch(AValue: string; AFields: array of TField); -var - LSearch: string; - LCount: integer; -begin - if HasField(AFields) and not AValue.IsEmpty then - begin - LSearch := '%' + AValue + '%'; - - FQuery - .Where(AFields[0]) - .Like(LSearch); - - if ((Length(AFields) - 1) >= 2) then - begin - for LCount := 1 to Length(AFields) - 1 do - begin - FQuery - .&Or(AFields[LCount]) - .Like(LSearch); - end; - end; + if Method.Name <> 'BeforeDestruction' then + Exit; + TMonitor.Enter(FStates); + try + FStates.Remove(Instance as TFDQuery); + finally + TMonitor.Exit(FStates); end; end; -procedure TRagna.RaiseNotFound; -begin - raise Exception.Create('Resource not found!'); -end; - -procedure TRagna.Reset; -var - LKey: Pointer; - LRagnaState: TRagnaState; +class procedure TRagnaState.Release; begin - LKey := FQuery; - LRagnaState := TRagnaState.GetInstance; - FQuery.SQL.Text := LRagnaState.GetState(LKey); + FInstance.Free; end; -procedure TRagna.StartCriteria; +procedure TRagnaState.SetState(AQuery: TFDQuery; ASQL: string); begin -// SaveState; + TMonitor.Enter(FStates); + try + if FVmi.ProxyClass <> AQuery.ClassType then + FVmi.Proxify(AQuery); + FStates.AddOrSetValue(AQuery, ASQL); + finally + TMonitor.Exit(FStates); + end; end; -procedure TRagna.ToJson(out AJSON: TJSONObject); -begin - if FQuery.IsEmpty then - RaiseNotFound; +initialization - AJSON := FQuery.AsJSONObject; -end; +TRagnaState.GetInstance; -procedure TRagna.ToJson(out AJSON: TJSONArray); -begin - if FQuery.IsEmpty then - AJSON := TJSONArray.Create - else - AJSON := FQuery.AsJSONArray; -end; +finalization -procedure TRagna.UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject); -begin - FQuery - .FindById(AField, AValue) - .OpenUp - .EditFromJson(ABody); -end; +TRagnaState.Release; end. From 73d9a32de6d87758d52b994aca8c707293721b5b Mon Sep 17 00:00:00 2001 From: Matheus Hunsche Date: Tue, 9 Oct 2018 19:10:58 -0300 Subject: [PATCH 09/45] Update Ragna.Impl.pas --- src/Ragna.Impl.pas | 236 +++++++++++++++++++++++++++++++++------------ 1 file changed, 174 insertions(+), 62 deletions(-) diff --git a/src/Ragna.Impl.pas b/src/Ragna.Impl.pas index 34134f4..fe39e34 100644 --- a/src/Ragna.Impl.pas +++ b/src/Ragna.Impl.pas @@ -1,104 +1,216 @@ -unit Ragna.State; +unit Ragna.Impl; interface -uses - System.Generics.Collections, FireDac.Comp.Client, System.Rtti; +uses Ragna.Intf, FireDAC.Comp.Client, System.JSON, Data.DB, Ragna.Criteria, + DataSetConverter4D.Helper; type - TListQueryAndSql = TDictionary; - - TRagnaState = class + TRagna = class(TInterfacedObject, IRagna) + private + FQuery: TFDQuery; + FManagerCriteria: TManagerCriteria; + FCriteria: ICriteria; + procedure SaveState; private - FSecret: string; - FStates: TListQueryAndSql; - FVmi : TVirtualMethodInterceptor; - class var FInstance: TRagnaState; - procedure OnBeforVMI(Instance: TObject; - Method: TRttiMethod; const Args: TArray; out DoInvoke: Boolean; - out Result: TValue); + function GetTableName: string; + function HasField(AFields: array of TField): Boolean; + procedure OpenEmpty; + procedure RaiseNotFound; public - property States: TListQueryAndSql read FStates write FStates; - procedure SetState(AQuery: TFDQuery; ASQL: string); - function GetState(AQuery: TFDQuery; out ASQL: string): Boolean; - class function GetInstance: TRagnaState; - class procedure Release; - constructor Create; + procedure Paginate(AOffSet, ALimit: integer); + procedure RadicalResearch(AValue: string; AFields: array of TField); + procedure Delete(AField: TField; AValue: Int64); + procedure FindById(AField: TField; AValue: Int64); + procedure UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject); + procedure New(ABody: TJSONObject); + procedure OpenUp; + procedure StartCriteria; deprecated; + procedure EndCriteria; deprecated; + procedure Reset; + procedure ToJson(out AJSON: TJSONArray); overload; + procedure ToJson(out AJSON: TJSONObject); overload; + procedure EditFromJson(const AJSON: TJSONObject); + constructor Create(AQuery: TFDQuery); destructor Destroy; + property Query: TFDQuery read FQuery write FQuery; + property Criteria: ICriteria read FCriteria write FCriteria; end; implementation +{ TRagna } -{ TRagnaState } +uses Ragna.State, System.SysUtils, Ragna; -constructor TRagnaState.Create; +constructor TRagna.Create(AQuery: TFDQuery); begin - FVmi := TVirtualMethodInterceptor.Create(TFDQuery); - FVmi.OnBefore := OnBeforVMI; - FStates := TListQueryAndSql.Create; + FQuery := AQuery; + SaveState; + FManagerCriteria := TManagerCriteria.Create(FQuery); + FCriteria := FManagerCriteria.Criteria; end; -destructor TRagnaState.Destroy; +procedure TRagna.Delete(AField: TField; AValue: Int64); +const + DELETE_SQL = 'DELETE FROM %s WHERE %s = :ID'; + DELETED: array [0 .. 1] of Boolean = (False, True); +var + LDeleted: integer; + LSql: string; begin - FStates.Free; - FVmi.Free; + OpenEmpty; + LSql := Format(DELETE_SQL, [GetTableName, AField.FieldName]); + LDeleted := FQuery.Connection.ExecSQL(LSql, [AValue]); + if not DELETED[LDeleted] then + RaiseNotFound; end; -class function TRagnaState.GetInstance: TRagnaState; +destructor TRagna.Destroy; begin - if not assigned(FInstance) then - FInstance := TRagnaState.Create; - Result := FInstance; + FManagerCriteria.Free; end; -function TRagnaState.GetState(AQuery: TFDQuery; out ASQL: string): Boolean; +procedure TRagna.SaveState; +var + LKey: TFDQuery; + LSQL: string; + LRagnaState: TRagnaState; begin - TMonitor.Enter(FStates); - try - Result := FStates.TryGetValue(AQuery, ASQL); - finally - TMonitor.Exit(FStates); - end; + LKey := FQuery; + LRagnaState := TRagnaState.GetInstance; + if not LRagnaState.GetState(LKey, LSQL) then + LRagnaState.SetState(LKey, FQuery.SQL.Text); end; -procedure TRagnaState.OnBeforVMI(Instance: TObject; Method: TRttiMethod; - const Args: TArray; out DoInvoke: Boolean; out Result: TValue); +procedure TRagna.EndCriteria; begin - if Method.Name <> 'BeforeDestruction' then - Exit; - TMonitor.Enter(FStates); - try - FStates.Remove(Instance as TFDQuery); - finally - TMonitor.Exit(FStates); - end; + Reset; +end; + +procedure TRagna.FindById(AField: TField; AValue: Int64); +var + LField: string; +begin + OpenEmpty; + LField := GetTableName + '.' + AField.Origin; + + FQuery + .Reset + .Where(LField) + .Equals(AValue); +end; + +procedure TRagna.EditFromJson(const AJSON: TJSONObject); +begin + FQuery.RecordFromJSONObject(AJSON); +end; + +function TRagna.GetTableName: string; +begin + Result := FQuery.Table.Table.SourceName; +end; + +function TRagna.HasField(AFields: array of TField): Boolean; +begin + Result := Length(AFields) > 0; +end; + +procedure TRagna.OpenUp; +begin + FQuery.Open; +end; + +procedure TRagna.OpenEmpty; +begin + FQuery.Where(True).Equals(False).OpenUp; +end; + +procedure TRagna.Paginate(AOffSet, ALimit: integer); +begin + if AOffSet > 0 then + FQuery.FetchOptions.RecsSkip := AOffSet; + + if ALimit > 0 then + FQuery.FetchOptions.RecsMax := ALimit; end; -class procedure TRagnaState.Release; +procedure TRagna.New(ABody: TJSONObject); begin - FInstance.Free; + OpenEmpty; + FQuery.EditFromJson(ABody); end; -procedure TRagnaState.SetState(AQuery: TFDQuery; ASQL: string); +procedure TRagna.RadicalResearch(AValue: string; AFields: array of TField); +var + LSearch: string; + LCount: integer; begin - TMonitor.Enter(FStates); - try - if FVmi.ProxyClass <> AQuery.ClassType then - FVmi.Proxify(AQuery); - FStates.AddOrSetValue(AQuery, ASQL); - finally - TMonitor.Exit(FStates); + if HasField(AFields) and not AValue.IsEmpty then + begin + LSearch := '%' + AValue + '%'; + + FQuery + .Where(AFields[0]) + .Like(LSearch); + + if ((Length(AFields) - 1) >= 2) then + begin + for LCount := 1 to Length(AFields) - 1 do + begin + FQuery + .&Or(AFields[LCount]) + .Like(LSearch); + end; + end; end; end; -initialization +procedure TRagna.RaiseNotFound; +begin + raise Exception.Create('Resource not found!'); +end; -TRagnaState.GetInstance; +procedure TRagna.Reset; +var + LKey: TFDQuery; + LSQL: string; + LRagnaState: TRagnaState; +begin + LKey := FQuery; + LRagnaState := TRagnaState.GetInstance; + LRagnaState.GetState(LKey, LSQL); + FQuery.SQL.Text := LSQL; +end; -finalization +procedure TRagna.StartCriteria; +begin +// SaveState; +end; + +procedure TRagna.ToJson(out AJSON: TJSONObject); +begin + if FQuery.IsEmpty then + RaiseNotFound; + + AJSON := FQuery.AsJSONObject; +end; -TRagnaState.Release; +procedure TRagna.ToJson(out AJSON: TJSONArray); +begin + if FQuery.IsEmpty then + AJSON := TJSONArray.Create + else + AJSON := FQuery.AsJSONArray; +end; + +procedure TRagna.UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject); +begin + FQuery + .FindById(AField, AValue) + .OpenUp + .EditFromJson(ABody); +end; end. From 0a5c77b5ec68a95b1a48e5a0456f8f96150d4b1b Mon Sep 17 00:00:00 2001 From: Matheus Hunsche Date: Tue, 9 Oct 2018 19:11:42 -0300 Subject: [PATCH 10/45] Update Ragna.State.pas --- src/Ragna.State.pas | 82 ++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 45 deletions(-) diff --git a/src/Ragna.State.pas b/src/Ragna.State.pas index 0dab360..34134f4 100644 --- a/src/Ragna.State.pas +++ b/src/Ragna.State.pas @@ -3,22 +3,25 @@ interface uses - System.Generics.Collections, FireDac.Comp.Client; + System.Generics.Collections, FireDac.Comp.Client, System.Rtti; type - TPairOfQueryAndSql = TPair; + TListQueryAndSql = TDictionary; TRagnaState = class private FSecret: string; - FStates: TThreadList; + FStates: TListQueryAndSql; + FVmi : TVirtualMethodInterceptor; class var FInstance: TRagnaState; + procedure OnBeforVMI(Instance: TObject; + Method: TRttiMethod; const Args: TArray; out DoInvoke: Boolean; + out Result: TValue); public - property States: TThreadList read FStates write FStates; + property States: TListQueryAndSql read FStates write FStates; procedure SetState(AQuery: TFDQuery; ASQL: string); - function GetState(AQuery: TFDQuery): string; - function RemoveState(AQuery: TFDQuery): string; deprecated; + function GetState(AQuery: TFDQuery; out ASQL: string): Boolean; class function GetInstance: TRagnaState; class procedure Release; constructor Create; @@ -27,16 +30,20 @@ TRagnaState = class implementation + { TRagnaState } constructor TRagnaState.Create; begin - FStates := TThreadList.Create; + FVmi := TVirtualMethodInterceptor.Create(TFDQuery); + FVmi.OnBefore := OnBeforVMI; + FStates := TListQueryAndSql.Create; end; destructor TRagnaState.Destroy; begin FStates.Free; + FVmi.Free; end; class function TRagnaState.GetInstance: TRagnaState; @@ -46,59 +53,44 @@ class function TRagnaState.GetInstance: TRagnaState; Result := FInstance; end; -function TRagnaState.GetState(AQuery: TFDQuery): string; -var - LState: TPairOfQueryAndSql; - LStates: TList; +function TRagnaState.GetState(AQuery: TFDQuery; out ASQL: string): Boolean; begin - LStates := FStates.LockList; + TMonitor.Enter(FStates); try - for LState in LStates do - begin - if LState.Key = AQuery then - begin - Result := LState.Value; - Break; - end; - end; + Result := FStates.TryGetValue(AQuery, ASQL); finally - FStates.UnlockList; + TMonitor.Exit(FStates); end; end; -class procedure TRagnaState.Release; +procedure TRagnaState.OnBeforVMI(Instance: TObject; Method: TRttiMethod; + const Args: TArray; out DoInvoke: Boolean; out Result: TValue); begin - FInstance.Free; -end; - -function TRagnaState.RemoveState(AQuery: TFDQuery): string; -var - LState: TPairOfQueryAndSql; - LStates: TList; -begin - LStates := FStates.LockList; + if Method.Name <> 'BeforeDestruction' then + Exit; + TMonitor.Enter(FStates); try - for LState in LStates do - begin - if LState.Key = AQuery then - begin - Result := LState.Value; - Break; - end; - end; + FStates.Remove(Instance as TFDQuery); finally - FStates.UnlockList; + TMonitor.Exit(FStates); end; +end; - LStates.Remove(LState); +class procedure TRagnaState.Release; +begin + FInstance.Free; end; procedure TRagnaState.SetState(AQuery: TFDQuery; ASQL: string); -var - LState: TPairOfQueryAndSql; begin - LState := TPairOfQueryAndSql.Create(AQuery, ASQL); - FStates.Add(LState); + TMonitor.Enter(FStates); + try + if FVmi.ProxyClass <> AQuery.ClassType then + FVmi.Proxify(AQuery); + FStates.AddOrSetValue(AQuery, ASQL); + finally + TMonitor.Exit(FStates); + end; end; initialization From 670d870689a45ccc9509b72bc5326f31dd3bed28 Mon Sep 17 00:00:00 2001 From: Matheus Hunsche Date: Tue, 9 Oct 2018 19:12:02 -0300 Subject: [PATCH 11/45] Update Ragna.Impl.pas From eb0a2ce55efd082daf7ed084164e47c05144e10d Mon Sep 17 00:00:00 2001 From: Rodrigo Bernardi Date: Wed, 3 Apr 2019 16:16:06 -0300 Subject: [PATCH 12/45] Added support to def connections --- src/Ragna.Criteria.pas | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Ragna.Criteria.pas b/src/Ragna.Criteria.pas index 9e9d3f9..e555672 100644 --- a/src/Ragna.Criteria.pas +++ b/src/Ragna.Criteria.pas @@ -34,6 +34,7 @@ TPGCriteria = class(TInterfacedObject, ICriteria) TManagerCriteria = class private FCriteria: ICriteria; + function GetDrive(AQuery: TFDQuery): string; function GetInstanceCriteria(AQuery: TFDQuery): ICriteria; public constructor Create(AQuery: TFDQuery); @@ -43,7 +44,8 @@ TManagerCriteria = class implementation -uses SysUtils; +uses + FireDAC.Stan.Intf, SysUtils; { TPGCriteria } @@ -150,13 +152,25 @@ destructor TManagerCriteria.Destroy; inherited; end; +function TManagerCriteria.GetDrive(AQuery: TFDQuery): string; +var + LDef: IFDStanConnectionDef; +begin + Result := AQuery.Connection.DriverName; + if Result.IsEmpty and not AQuery.Connection.ConnectionDefName.IsEmpty then + begin + LDef := FDManager.ConnectionDefs.FindConnectionDef(AQuery.Connection.ConnectionDefName); + Result := LDef.Params.DriverID; + end; +end; + function TManagerCriteria.GetInstanceCriteria(AQuery: TFDQuery): ICriteria; var LCriteria: ICriteria; begin LCriteria := nil; - case AnsiIndexStr(AQuery.Connection.DriverName, ['PG']) of + case AnsiIndexStr(GetDrive(AQuery), ['PG']) of 0: LCriteria := TPGCriteria.Create(AQuery); else From 15b14524385f98c8d398255b049c3226d509c8c5 Mon Sep 17 00:00:00 2001 From: Rodrigo Bernardi Date: Wed, 17 Apr 2019 14:31:18 -0300 Subject: [PATCH 13/45] Adjusted call of destroy method --- src/Ragna.State.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ragna.State.pas b/src/Ragna.State.pas index 34134f4..7ebe541 100644 --- a/src/Ragna.State.pas +++ b/src/Ragna.State.pas @@ -19,13 +19,13 @@ TRagnaState = class Method: TRttiMethod; const Args: TArray; out DoInvoke: Boolean; out Result: TValue); public + destructor Destroy; override; property States: TListQueryAndSql read FStates write FStates; procedure SetState(AQuery: TFDQuery; ASQL: string); function GetState(AQuery: TFDQuery; out ASQL: string): Boolean; class function GetInstance: TRagnaState; class procedure Release; constructor Create; - destructor Destroy; end; implementation From 773edb663a4abd598b0064530c7b0861cb7f5072 Mon Sep 17 00:00:00 2001 From: Rodrigo Bernardi Date: Thu, 18 Apr 2019 11:54:33 -0300 Subject: [PATCH 14/45] Adjusted destroy call --- src/Ragna.Impl.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ragna.Impl.pas b/src/Ragna.Impl.pas index fe39e34..bd4f28e 100644 --- a/src/Ragna.Impl.pas +++ b/src/Ragna.Impl.pas @@ -33,7 +33,7 @@ TRagna = class(TInterfacedObject, IRagna) procedure ToJson(out AJSON: TJSONObject); overload; procedure EditFromJson(const AJSON: TJSONObject); constructor Create(AQuery: TFDQuery); - destructor Destroy; + destructor Destroy; Override; property Query: TFDQuery read FQuery write FQuery; property Criteria: ICriteria read FCriteria write FCriteria; end; From 0389220aba4a22ef009f6bf0c522f71aa36a8385 Mon Sep 17 00:00:00 2001 From: Rodrigo Bernardi Date: Thu, 30 May 2019 12:47:14 -0300 Subject: [PATCH 15/45] added equals string --- boss.json | 4 +--- boss.lock | 18 ++++++++++++++ ragna.dproj | 54 +++++++++++++++++++++--------------------- src/Ragna.Criteria.pas | 8 +++++++ src/Ragna.Intf.pas | 1 + src/Ragna.pas | 15 ++++++++++++ 6 files changed, 70 insertions(+), 30 deletions(-) create mode 100644 boss.lock diff --git a/boss.json b/boss.json index 7eed826..bb54c54 100644 --- a/boss.json +++ b/boss.json @@ -2,11 +2,9 @@ "name": "ragna", "description": "", "version": "1.0.0", - "private": false, "homepage": "", "mainsrc": "src/", - "supported": "xe+", - "dprojFile": "", + "projects": [], "dependencies": { "github.com/hunsche/DataSetConverter4Delphi": "^1.0.0" } diff --git a/boss.lock b/boss.lock new file mode 100644 index 0000000..50f37c2 --- /dev/null +++ b/boss.lock @@ -0,0 +1,18 @@ +{ + "hash": "b14e6a77427d10f868e9622e3b2074b0", + "updated": "2019-05-30T11:49:11.4625948-03:00", + "installedModules": { + "github.com/hunsche/datasetconverter4delphi": { + "name": "DataSetConverter4Delphi", + "version": "1.0.0", + "hash": "d2cde03db15e9ec92e83dee63893caab5ed2fa5aa6f94f77a15cdf41ecaec27a", + "artifacts": { + "bin": [], + "dcp": [], + "dcu": [], + "bpl": [] + }, + "failed": false + } + } +} \ No newline at end of file diff --git a/ragna.dproj b/ragna.dproj index dac5d1d..6d84f76 100644 --- a/ragna.dproj +++ b/ragna.dproj @@ -68,7 +68,7 @@ All true ragna - ;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\src\;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\unittest\;$(DCC_UnitSearchPath) + C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\src\;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\unittest\;$(DCC_UnitSearchPath);modules\.dcp;modules\.dcu;modules;modules\DataSetConverter4Delphi\src;modules\DataSetConverter4Delphi\unittest
None @@ -113,16 +113,16 @@ MainSource - - - - - - - - - - + + + + + + + + + + Cfg_2 Base @@ -450,9 +450,9 @@ 1 - - - + + + 1 @@ -464,8 +464,8 @@ 1 - - + + Contents\Resources @@ -524,14 +524,14 @@ 1 - - - - - - - - + + + + + + + + False @@ -545,7 +545,7 @@ 12 - - - + + +
diff --git a/src/Ragna.Criteria.pas b/src/Ragna.Criteria.pas index e555672..3064d0a 100644 --- a/src/Ragna.Criteria.pas +++ b/src/Ragna.Criteria.pas @@ -27,6 +27,7 @@ TPGCriteria = class(TInterfacedObject, ICriteria) procedure Like(AValue: string); procedure &Equals(AValue: Int64); overload; procedure &Equals(AValue: Boolean); overload; + procedure &Equals(AValue: string); overload; procedure Order(AField: TField); constructor Create(AQuery: TFDQuery); end; @@ -75,6 +76,13 @@ constructor TPGCriteria.Create(AQuery: TFDQuery); FQuery := AQuery; end; +procedure TPGCriteria.Equals(AValue: string); +const + PHRASE = '%s %s'; +begin + FQuery.SQL.Add(format(PHRASE, [OPERATORS[otEquals], AValue])); +end; + procedure TPGCriteria.Equals(AValue: Int64); const PHRASE = '%s %d'; diff --git a/src/Ragna.Intf.pas b/src/Ragna.Intf.pas index 040085c..568b874 100644 --- a/src/Ragna.Intf.pas +++ b/src/Ragna.Intf.pas @@ -36,6 +36,7 @@ interface procedure Like(AValue: string); procedure &Equals(AValue: Int64); overload; procedure &Equals(AValue: Boolean); overload; + procedure &Equals(AValue: string); overload; procedure Order(AField: TField); end; diff --git a/src/Ragna.pas b/src/Ragna.pas index 8b8b265..e4923b5 100644 --- a/src/Ragna.pas +++ b/src/Ragna.pas @@ -34,6 +34,7 @@ TRagnaHelper = class helper for TFDQuery function Like(AValue: string): TFDQuery; function &Equals(AValue: Int64): TFDQuery; overload; function &Equals(AValue: Boolean): TFDQuery; overload; + function &Equals(AValue: String): TFDQuery; overload; function Order(AField: TField): TFDQuery; end; @@ -125,6 +126,20 @@ function TRagnaHelper.EndCriteria: TFDQuery; Result := Self; end; +function TRagnaHelper.Equals(AValue: String): TFDQuery; +var + LRagna: TRagna; +begin + LRagna := TRagna.Create(Self); + try + LRagna.Criteria.Equals(AValue); + finally + LRagna.Free; + end; + + Result := Self; +end; + function TRagnaHelper.Equals(AValue: Boolean): TFDQuery; var LRagna: TRagna; From a67c522fd5424cbdc188e8f3dd5e660e29bf0500 Mon Sep 17 00:00:00 2001 From: Rodrigo Bernardi Date: Sun, 2 Jun 2019 18:29:10 -0300 Subject: [PATCH 16/45] Delete .gitmodules --- .gitmodules | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index df057c6..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "modules/DataSetConverter4Delphi"] - path = modules/DataSetConverter4Delphi - url = https://github.com/hunsche/DataSetConverter4Delphi.git From 9993ebd7ab60aa41cccdd6cdfaa825d7bdeed57f Mon Sep 17 00:00:00 2001 From: Rodrigo Bernardi Date: Mon, 3 Jun 2019 10:38:01 -0300 Subject: [PATCH 17/45] adjusted default criteria --- ragna.dpk | 1 + ragna.dproj | 144 +++++++++++++++++++++++------------------ src/Ragna.Criteria.pas | 48 +++++++------- src/Ragna.Impl.pas | 19 +++++- src/Ragna.Intf.pas | 3 +- src/Ragna.pas | 34 +++++++++- 6 files changed, 155 insertions(+), 94 deletions(-) diff --git a/ragna.dpk b/ragna.dpk index 53134d0..74363c9 100644 --- a/ragna.dpk +++ b/ragna.dpk @@ -43,3 +43,4 @@ contains Ragna.State in 'src\Ragna.State.pas'; end. + diff --git a/ragna.dproj b/ragna.dproj index 6d84f76..e9719de 100644 --- a/ragna.dproj +++ b/ragna.dproj @@ -2,7 +2,7 @@ {D9E8CA95-FBB1-42EA-A7B4-909AC5ACFADD} ragna.dpk - 18.4 + 18.6 None True Debug @@ -18,21 +18,6 @@ Base true - - true - Base - true - - - true - Base - true - - - true - Base - true - true Base @@ -68,21 +53,12 @@ All true ragna - C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\src\;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\unittest\;$(DCC_UnitSearchPath);modules\.dcp;modules\.dcu;modules;modules\DataSetConverter4Delphi\src;modules\DataSetConverter4Delphi\unittest + C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\src\;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\unittest\;modules\.dcp;modules\.dcu;modules;modules\DataSetConverter4Delphi\src;modules\DataSetConverter4Delphi\unittest;$(DCC_UnitSearchPath) None android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services-ads-7.0.0.dex.jar;google-play-services-analytics-7.0.0.dex.jar;google-play-services-base-7.0.0.dex.jar;google-play-services-identity-7.0.0.dex.jar;google-play-services-maps-7.0.0.dex.jar;google-play-services-panorama-7.0.0.dex.jar;google-play-services-plus-7.0.0.dex.jar;google-play-services-wallet-7.0.0.dex.jar - - None - - - None - - - None - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug @@ -113,16 +89,16 @@ MainSource - - - - - - - - - - + + + + + + + + + + Cfg_2 Base @@ -154,8 +130,14 @@ true - - + + + ragna.bpl + true + + + + true @@ -164,14 +146,18 @@ true - - + + true - - - ragna.bpl + + + true + + + + true @@ -180,7 +166,6 @@ 1 - Contents\MacOS 0 @@ -190,6 +175,12 @@ 1 + + + res\xml + 1 + + library\lib\armeabi-v7a @@ -226,6 +217,12 @@ 1 + + + res\values-v21 + 1 + + res\drawable @@ -302,6 +299,10 @@ 1 .framework + + 1 + .framework + 0 @@ -311,6 +312,10 @@ 1 .dylib + + 1 + .dylib + 0 .dll;.bpl @@ -333,6 +338,10 @@ 1 .dylib + + 1 + .dylib + 0 .bpl @@ -354,6 +363,9 @@ 0 + + 0 + 0 @@ -450,9 +462,9 @@ 1 - - - + + + 1 @@ -464,13 +476,18 @@ 1 - - + + + Contents\Resources 1 + + Contents\Resources + 1 + @@ -492,6 +509,9 @@ 1 + + 1 + 0 @@ -524,20 +544,18 @@ 1 - - - - - - - - + + + + + + + + + False - False - False - False False True False @@ -545,7 +563,7 @@ 12 - - - + + + diff --git a/src/Ragna.Criteria.pas b/src/Ragna.Criteria.pas index 3064d0a..2f01d11 100644 --- a/src/Ragna.Criteria.pas +++ b/src/Ragna.Criteria.pas @@ -10,10 +10,10 @@ interface TOperatorType = (otWhere, otOr, otLike, otEquals, otOrder, otAnd); - TPGCriteria = class(TInterfacedObject, ICriteria) + TDefaultCriteria = class(TInterfacedObject, ICriteria) const - OPERATORS: array [low(TOperatorType) .. High(TOperatorType) - ] of string = ('WHERE', 'OR', 'LIKE', '=', 'ORDER BY', 'AND'); + OPERATORS: array [low(TOperatorType) .. High(TOperatorType)] of string = ('WHERE', 'OR', 'LIKE', '=', + 'ORDER BY', 'AND'); private FQuery: TFDQuery; public @@ -48,64 +48,63 @@ implementation uses FireDAC.Stan.Intf, SysUtils; -{ TPGCriteria } +{ TDefaultCriteria } -procedure TPGCriteria.&And(AField: string); +procedure TDefaultCriteria.&And(AField: string); const PHRASE = ' %s %s'; begin FQuery.SQL.Add(format(PHRASE, [OPERATORS[otAnd], AField])); end; -procedure TPGCriteria.&And(AField: TField); +procedure TDefaultCriteria.&And(AField: TField); const PHRASE = ' %s %s'; begin FQuery.SQL.Add(format(PHRASE, [OPERATORS[otAnd], AField.Origin])); end; -procedure TPGCriteria.&Or(AField: string); +procedure TDefaultCriteria.&Or(AField: string); const PHRASE = ' %s %s'; begin FQuery.SQL.Add(format(PHRASE, [OPERATORS[otOr], AField])); end; -constructor TPGCriteria.Create(AQuery: TFDQuery); +constructor TDefaultCriteria.Create(AQuery: TFDQuery); begin FQuery := AQuery; end; -procedure TPGCriteria.Equals(AValue: string); +procedure TDefaultCriteria.Equals(AValue: string); const - PHRASE = '%s %s'; + PHRASE = '%s ''%s'''; begin FQuery.SQL.Add(format(PHRASE, [OPERATORS[otEquals], AValue])); end; -procedure TPGCriteria.Equals(AValue: Int64); +procedure TDefaultCriteria.Equals(AValue: Int64); const PHRASE = '%s %d'; begin FQuery.SQL.Add(format(PHRASE, [OPERATORS[otEquals], AValue])); end; -procedure TPGCriteria.Where(AField: TField); +procedure TDefaultCriteria.Where(AField: TField); const PHRASE = '%s %s'; begin FQuery.SQL.Add(format(PHRASE, [OPERATORS[otWhere], AField.Origin])); end; -procedure TPGCriteria.Equals(AValue: Boolean); +procedure TDefaultCriteria.Equals(AValue: Boolean); const PHRASE = '%s %s'; begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otEquals], BoolToStr(AValue, - True)])); + FQuery.SQL.Add(format(PHRASE, [OPERATORS[otEquals], BoolToStr(AValue, True)])); end; -procedure TPGCriteria.Like(AValue: string); +procedure TDefaultCriteria.Like(AValue: string); const PHRASE = '::text %s %s'; var @@ -113,35 +112,34 @@ procedure TPGCriteria.Like(AValue: string); LParam: TFDParam; begin LKeyParam := THashMD5.Create.HashAsString; - FQuery.SQL.Text := FQuery.SQL.Text + - format(PHRASE, [OPERATORS[otLike], ':' + LKeyParam]); + FQuery.SQL.Text := FQuery.SQL.Text + format(PHRASE, [OPERATORS[otLike], ':' + LKeyParam]); LParam := FQuery.ParamByName(LKeyParam); LParam.DataType := ftString; LParam.Value := AValue; end; -procedure TPGCriteria.Order(AField: TField); +procedure TDefaultCriteria.Order(AField: TField); const PHRASE = '%s %s'; begin FQuery.SQL.Add(format(PHRASE, [OPERATORS[otOrder], AField.Origin])); end; -procedure TPGCriteria.Where(AField: string); +procedure TDefaultCriteria.Where(AField: string); const PHRASE = '%s %s'; begin FQuery.SQL.Add(format(PHRASE, [OPERATORS[otWhere], AField])); end; -procedure TPGCriteria.Where(AValue: Boolean); +procedure TDefaultCriteria.Where(AValue: Boolean); const PHRASE = '%s %s'; begin FQuery.SQL.Add(format(PHRASE, [OPERATORS[otWhere], BoolToStr(AValue, True)])); end; -procedure TPGCriteria.&Or(AField: TField); +procedure TDefaultCriteria.&Or(AField: TField); const PHRASE = ' %s %s'; begin @@ -180,9 +178,9 @@ function TManagerCriteria.GetInstanceCriteria(AQuery: TFDQuery): ICriteria; case AnsiIndexStr(GetDrive(AQuery), ['PG']) of 0: - LCriteria := TPGCriteria.Create(AQuery); - else - raise Exception.Create('Driver not suported'); + LCriteria := TDefaultCriteria.Create(AQuery); + else + LCriteria := TDefaultCriteria.Create(AQuery); end; Result := LCriteria; diff --git a/src/Ragna.Impl.pas b/src/Ragna.Impl.pas index bd4f28e..19b04f7 100644 --- a/src/Ragna.Impl.pas +++ b/src/Ragna.Impl.pas @@ -24,14 +24,16 @@ TRagna = class(TInterfacedObject, IRagna) procedure Delete(AField: TField; AValue: Int64); procedure FindById(AField: TField; AValue: Int64); procedure UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject); - procedure New(ABody: TJSONObject); + procedure New(ABody: TJSONObject); overload; + procedure New(ABody: TJSONArray); overload; procedure OpenUp; procedure StartCriteria; deprecated; procedure EndCriteria; deprecated; procedure Reset; procedure ToJson(out AJSON: TJSONArray); overload; procedure ToJson(out AJSON: TJSONObject); overload; - procedure EditFromJson(const AJSON: TJSONObject); + procedure EditFromJson(const AJSON: TJSONObject); overload; + procedure EditFromJson(const AJSON: TJSONArray); overload; constructor Create(AQuery: TFDQuery); destructor Destroy; Override; property Query: TFDQuery read FQuery write FQuery; @@ -84,6 +86,11 @@ procedure TRagna.SaveState; LRagnaState.SetState(LKey, FQuery.SQL.Text); end; +procedure TRagna.EditFromJson(const AJSON: TJSONArray); +begin + FQuery.FromJSONArray(AJSON); +end; + procedure TRagna.EndCriteria; begin Reset; @@ -104,7 +111,7 @@ procedure TRagna.FindById(AField: TField; AValue: Int64); procedure TRagna.EditFromJson(const AJSON: TJSONObject); begin - FQuery.RecordFromJSONObject(AJSON); + FQuery.RecordFromJSONObject(AJSON); end; function TRagna.GetTableName: string; @@ -117,6 +124,12 @@ function TRagna.HasField(AFields: array of TField): Boolean; Result := Length(AFields) > 0; end; +procedure TRagna.New(ABody: TJSONArray); +begin + OpenEmpty; + FQuery.EditFromJson(ABody); +end; + procedure TRagna.OpenUp; begin FQuery.Open; diff --git a/src/Ragna.Intf.pas b/src/Ragna.Intf.pas index 568b874..9b22fcb 100644 --- a/src/Ragna.Intf.pas +++ b/src/Ragna.Intf.pas @@ -14,7 +14,8 @@ interface procedure Delete(AField: TField; AValue: Int64); procedure FindById(AField: TField; AValue: Int64); procedure UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject); - procedure New(ABody: TJSONObject); + procedure New(ABody: TJSONObject); overload; + procedure New(ABody: TJSONArray); overload; procedure OpenUp; procedure StartCriteria; deprecated; procedure EndCriteria; deprecated; diff --git a/src/Ragna.pas b/src/Ragna.pas index e4923b5..25e7006 100644 --- a/src/Ragna.pas +++ b/src/Ragna.pas @@ -16,14 +16,16 @@ TRagnaHelper = class helper for TFDQuery function FindById(AField: TField; AValue: Int64): TFDQuery; function UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject) : TFDQuery; - function New(ABody: TJSONObject): TFDQuery; + function New(ABody: TJSONObject): TFDQuery; overload; + function New(ABody: TJSONArray): TFDQuery; overload; function OpenUp: TFDQuery; function StartCriteria: TFDQuery; deprecated; function EndCriteria: TFDQuery; deprecated; function Reset: TFDQuery; function ToJson(out AJSON: TJSONArray): TFDQuery; overload; function ToJson(out AJSON: TJSONObject): TFDQuery; overload; - function EditFromJson(const AJSON: TJSONObject): TFDQuery; + function EditFromJson(const AJSON: TJSONObject): TFDQuery; overload; + function EditFromJson(const AJSON: TJSONArray): TFDQuery; overload; function Where(AField: string): TFDQuery; overload; function Where(AField: TField): TFDQuery; overload; function Where(AValue: Boolean): TFDQuery; overload; @@ -112,6 +114,20 @@ function TRagnaHelper.Delete(AField: TField; AValue: Int64): TFDQuery; Result := Self; end; +function TRagnaHelper.EditFromJson(const AJSON: TJSONArray): TFDQuery; +var + LRagna: TRagna; +begin + LRagna := TRagna.Create(Self); + try + LRagna.EditFromJson(AJSON); + finally + LRagna.Free; + end; + + Result := Self; +end; + function TRagnaHelper.EndCriteria: TFDQuery; var LRagna: TRagna; @@ -210,6 +226,20 @@ function TRagnaHelper.Like(AValue: string): TFDQuery; Result := Self; end; +function TRagnaHelper.New(ABody: TJSONArray): TFDQuery; +var + LRagna: TRagna; +begin + LRagna := TRagna.Create(Self); + try + LRagna.New(ABody); + finally + LRagna.Free; + end; + + Result := Self; +end; + function TRagnaHelper.OpenUp: TFDQuery; var LRagna: TRagna; From 420c31a36258cc2d5becf10ec15c933d883b4c50 Mon Sep 17 00:00:00 2001 From: Rodrigo Bernardi Date: Thu, 6 Jun 2019 15:09:48 -0300 Subject: [PATCH 18/45] changed open empty validation to work in all dbs --- src/Ragna.Impl.pas | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Ragna.Impl.pas b/src/Ragna.Impl.pas index 19b04f7..965ac59 100644 --- a/src/Ragna.Impl.pas +++ b/src/Ragna.Impl.pas @@ -137,7 +137,10 @@ procedure TRagna.OpenUp; procedure TRagna.OpenEmpty; begin - FQuery.Where(True).Equals(False).OpenUp; + FQuery + .Where('1') + .Equals('2') + .OpenUp; end; procedure TRagna.Paginate(AOffSet, ALimit: integer); From 4040c0a32b9edd70caf6c57e3f5c05304cadffaf Mon Sep 17 00:00:00 2001 From: Matheus Hunsche Date: Tue, 18 Jun 2019 01:32:40 -0300 Subject: [PATCH 19/45] Rename Delete to Remove --- boss-lock.json | 18 ++++++++++++++++ boss.json | 4 +--- ragna.dproj | 54 +++++++++++++++++++++++----------------------- src/Ragna.Impl.pas | 4 ++-- src/Ragna.Intf.pas | 2 +- src/Ragna.pas | 6 +++--- 6 files changed, 52 insertions(+), 36 deletions(-) create mode 100644 boss-lock.json diff --git a/boss-lock.json b/boss-lock.json new file mode 100644 index 0000000..d68186a --- /dev/null +++ b/boss-lock.json @@ -0,0 +1,18 @@ +{ + "hash": "b14e6a77427d10f868e9622e3b2074b0", + "updated": "2019-06-18T01:31:24.020281-03:00", + "installedModules": { + "github.com/hunsche/datasetconverter4delphi": { + "name": "DataSetConverter4Delphi", + "version": "1.0.0", + "hash": "50a600ddef6362a35c7b4e4a872f2312", + "artifacts": { + "bin": [], + "dcp": [], + "dcu": [], + "bpl": [] + }, + "failed": false + } + } +} \ No newline at end of file diff --git a/boss.json b/boss.json index 7eed826..bb54c54 100644 --- a/boss.json +++ b/boss.json @@ -2,11 +2,9 @@ "name": "ragna", "description": "", "version": "1.0.0", - "private": false, "homepage": "", "mainsrc": "src/", - "supported": "xe+", - "dprojFile": "", + "projects": [], "dependencies": { "github.com/hunsche/DataSetConverter4Delphi": "^1.0.0" } diff --git a/ragna.dproj b/ragna.dproj index dac5d1d..6d84f76 100644 --- a/ragna.dproj +++ b/ragna.dproj @@ -68,7 +68,7 @@ All true ragna - ;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\src\;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\unittest\;$(DCC_UnitSearchPath) + C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\src\;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\unittest\;$(DCC_UnitSearchPath);modules\.dcp;modules\.dcu;modules;modules\DataSetConverter4Delphi\src;modules\DataSetConverter4Delphi\unittest None @@ -113,16 +113,16 @@ MainSource - - - - - - - - - - + + + + + + + + + + Cfg_2 Base @@ -450,9 +450,9 @@ 1 - - - + + + 1 @@ -464,8 +464,8 @@ 1 - - + + Contents\Resources @@ -524,14 +524,14 @@ 1 - - - - - - - - + + + + + + + + False @@ -545,7 +545,7 @@ 12 - - - + + + diff --git a/src/Ragna.Impl.pas b/src/Ragna.Impl.pas index bd4f28e..7582348 100644 --- a/src/Ragna.Impl.pas +++ b/src/Ragna.Impl.pas @@ -21,7 +21,7 @@ TRagna = class(TInterfacedObject, IRagna) public procedure Paginate(AOffSet, ALimit: integer); procedure RadicalResearch(AValue: string; AFields: array of TField); - procedure Delete(AField: TField; AValue: Int64); + procedure Remove(AField: TField; AValue: Int64); procedure FindById(AField: TField; AValue: Int64); procedure UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject); procedure New(ABody: TJSONObject); @@ -52,7 +52,7 @@ constructor TRagna.Create(AQuery: TFDQuery); FCriteria := FManagerCriteria.Criteria; end; -procedure TRagna.Delete(AField: TField; AValue: Int64); +procedure TRagna.Remove(AField: TField; AValue: Int64); const DELETE_SQL = 'DELETE FROM %s WHERE %s = :ID'; DELETED: array [0 .. 1] of Boolean = (False, True); diff --git a/src/Ragna.Intf.pas b/src/Ragna.Intf.pas index 040085c..7d8b592 100644 --- a/src/Ragna.Intf.pas +++ b/src/Ragna.Intf.pas @@ -11,7 +11,7 @@ interface ['{0F1AD1E9-A82C-44BE-9208-685B9C3C77F9}'] procedure Paginate(AOffSet, ALimit: integer); procedure RadicalResearch(AValue: string; AFields: array of TField); - procedure Delete(AField: TField; AValue: Int64); + procedure Remove(AField: TField; AValue: Int64); procedure FindById(AField: TField; AValue: Int64); procedure UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject); procedure New(ABody: TJSONObject); diff --git a/src/Ragna.pas b/src/Ragna.pas index 8b8b265..59aae4a 100644 --- a/src/Ragna.pas +++ b/src/Ragna.pas @@ -12,7 +12,7 @@ TRagnaHelper = class helper for TFDQuery function Paginate(AOffSet, ALimit: integer): TFDQuery; function RadicalResearch(AValue: string; AFields: array of TField) : TFDQuery; - function Delete(AField: TField; AValue: Int64): TFDQuery; + function Remove(AField: TField; AValue: Int64): TFDQuery; function FindById(AField: TField; AValue: Int64): TFDQuery; function UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject) : TFDQuery; @@ -97,13 +97,13 @@ function TRagnaHelper.&Or(AField: string): TFDQuery; Result := Self; end; -function TRagnaHelper.Delete(AField: TField; AValue: Int64): TFDQuery; +function TRagnaHelper.Remove(AField: TField; AValue: Int64): TFDQuery; var LRagna: TRagna; begin LRagna := TRagna.Create(Self); try - LRagna.Delete(AField, AValue); + LRagna.Remove(AField, AValue); finally LRagna.Free; end; From 443ac724a84a6e198522bbdbb37fba93225eede1 Mon Sep 17 00:00:00 2001 From: Matheus Hunsche Date: Tue, 18 Jun 2019 01:43:25 -0300 Subject: [PATCH 20/45] Adjusted dproj --- ragna.dproj | 56 +++++++++++++++++------------------------------------ 1 file changed, 18 insertions(+), 38 deletions(-) diff --git a/ragna.dproj b/ragna.dproj index 332653f..137613b 100644 --- a/ragna.dproj +++ b/ragna.dproj @@ -1,4 +1,4 @@ - + {D9E8CA95-FBB1-42EA-A7B4-909AC5ACFADD} ragna.dpk @@ -53,11 +53,7 @@ All true ragna -<<<<<<< HEAD - C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\src\;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\unittest\;$(DCC_UnitSearchPath);modules\.dcp;modules\.dcu;modules;modules\DataSetConverter4Delphi\src;modules\DataSetConverter4Delphi\unittest -======= C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\src\;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\unittest\;modules\.dcp;modules\.dcu;modules;modules\DataSetConverter4Delphi\src;modules\DataSetConverter4Delphi\unittest;$(DCC_UnitSearchPath) ->>>>>>> 420c31a36258cc2d5becf10ec15c933d883b4c50 None @@ -93,16 +89,16 @@ MainSource - - - - - - - - - - + + + + + + + + + + Cfg_2 Base @@ -466,9 +462,9 @@ 1 - - - + + + 1 @@ -480,14 +476,9 @@ 1 -<<<<<<< HEAD - - -======= ->>>>>>> 420c31a36258cc2d5becf10ec15c933d883b4c50 Contents\Resources @@ -553,16 +544,6 @@ 1 -<<<<<<< HEAD - - - - - - - - -======= @@ -572,7 +553,6 @@ ->>>>>>> 420c31a36258cc2d5becf10ec15c933d883b4c50 False @@ -583,7 +563,7 @@ 12 - - - - + + + + \ No newline at end of file From 5ab3523d738951ea163d1ebd811723472c3cc177 Mon Sep 17 00:00:00 2001 From: Rodrigo Bernardi Date: Fri, 26 Jul 2019 10:28:23 -0300 Subject: [PATCH 21/45] updated modules --- boss-lock.json | 16 +-- boss.json | 2 +- boss.lock | 18 --- ragna.dproj | 281 ++++++++++++++++++++++++++++++++++++++++++++- src/Ragna.Impl.pas | 5 +- 5 files changed, 286 insertions(+), 36 deletions(-) delete mode 100644 boss.lock diff --git a/boss-lock.json b/boss-lock.json index d68186a..81a4822 100644 --- a/boss-lock.json +++ b/boss-lock.json @@ -1,18 +1,14 @@ { "hash": "b14e6a77427d10f868e9622e3b2074b0", - "updated": "2019-06-18T01:31:24.020281-03:00", + "updated": "2019-07-26T10:10:24.8937824-03:00", "installedModules": { "github.com/hunsche/datasetconverter4delphi": { "name": "DataSetConverter4Delphi", - "version": "1.0.0", - "hash": "50a600ddef6362a35c7b4e4a872f2312", - "artifacts": { - "bin": [], - "dcp": [], - "dcu": [], - "bpl": [] - }, - "failed": false + "version": "2.0.0", + "hash": "86494a27f5010c6819d370b1d4008621", + "artifacts": {}, + "failed": false, + "changed": false } } } \ No newline at end of file diff --git a/boss.json b/boss.json index bb54c54..76bf353 100644 --- a/boss.json +++ b/boss.json @@ -6,6 +6,6 @@ "mainsrc": "src/", "projects": [], "dependencies": { - "github.com/hunsche/DataSetConverter4Delphi": "^1.0.0" + "github.com/hunsche/DataSetConverter4Delphi": "^2.0.0" } } \ No newline at end of file diff --git a/boss.lock b/boss.lock deleted file mode 100644 index 50f37c2..0000000 --- a/boss.lock +++ /dev/null @@ -1,18 +0,0 @@ -{ - "hash": "b14e6a77427d10f868e9622e3b2074b0", - "updated": "2019-05-30T11:49:11.4625948-03:00", - "installedModules": { - "github.com/hunsche/datasetconverter4delphi": { - "name": "DataSetConverter4Delphi", - "version": "1.0.0", - "hash": "d2cde03db15e9ec92e83dee63893caab5ed2fa5aa6f94f77a15cdf41ecaec27a", - "artifacts": { - "bin": [], - "dcp": [], - "dcu": [], - "bpl": [] - }, - "failed": false - } - } -} \ No newline at end of file diff --git a/ragna.dproj b/ragna.dproj index 137613b..c6b2af4 100644 --- a/ragna.dproj +++ b/ragna.dproj @@ -1,8 +1,8 @@ - + {D9E8CA95-FBB1-42EA-A7B4-909AC5ACFADD} ragna.dpk - 18.6 + 18.7 None True Debug @@ -53,7 +53,7 @@ All true ragna - C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\src\;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\unittest\;modules\.dcp;modules\.dcu;modules;modules\DataSetConverter4Delphi\src;modules\DataSetConverter4Delphi\unittest;$(DCC_UnitSearchPath) + C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\src\;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\unittest\;modules\.dcp;modules\.dcu;modules;modules\DataSetConverter4Delphi\src;$(DCC_UnitSearchPath) None @@ -223,6 +223,12 @@ 1 + + + res\values + 1 + + res\drawable @@ -259,6 +265,36 @@ 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + res\drawable-small @@ -283,6 +319,12 @@ 1 + + + res\values + 1 + + 1 @@ -381,6 +423,17 @@ 1 + + + 1 + + + 1 + + + 1 + + 1 @@ -392,6 +445,39 @@ 1 + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + 1 @@ -403,6 +489,61 @@ 1 + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + 1 @@ -414,6 +555,116 @@ 1 + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + 1 @@ -447,6 +698,28 @@ 1 + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + 1 @@ -566,4 +839,4 @@ - \ No newline at end of file + diff --git a/src/Ragna.Impl.pas b/src/Ragna.Impl.pas index d93fb05..d59d040 100644 --- a/src/Ragna.Impl.pas +++ b/src/Ragna.Impl.pas @@ -2,8 +2,7 @@ interface -uses Ragna.Intf, FireDAC.Comp.Client, System.JSON, Data.DB, Ragna.Criteria, - DataSetConverter4D.Helper; +uses Ragna.Intf, FireDAC.Comp.Client, System.JSON, Data.DB, Ragna.Criteria; type @@ -44,7 +43,7 @@ implementation { TRagna } -uses Ragna.State, System.SysUtils, Ragna; +uses Ragna.State, System.SysUtils, Ragna, DataSetConverter4D; constructor TRagna.Create(AQuery: TFDQuery); begin From 5eb8b9836a84962f3e0a5a1956e16582458b7350 Mon Sep 17 00:00:00 2001 From: Carlos Henrique Ribeiro Modesto Date: Wed, 31 Jul 2019 16:24:11 -0300 Subject: [PATCH 22/45] Specific message if ConnectionDefs is nil If you tried use Ragna with no Connection Defs, it used to raise a generic exception, now the method has a specific message to handle this exception --- src/Ragna.Criteria.pas | 375 +++++++++++++++++++++-------------------- 1 file changed, 188 insertions(+), 187 deletions(-) diff --git a/src/Ragna.Criteria.pas b/src/Ragna.Criteria.pas index 2f01d11..d977890 100644 --- a/src/Ragna.Criteria.pas +++ b/src/Ragna.Criteria.pas @@ -1,189 +1,190 @@ unit Ragna.Criteria; - -interface - -uses - FireDAC.Comp.Client, StrUtils, Ragna.Intf, Data.DB, FireDAC.Stan.Param, - System.Hash; - -type - - TOperatorType = (otWhere, otOr, otLike, otEquals, otOrder, otAnd); - - TDefaultCriteria = class(TInterfacedObject, ICriteria) - const - OPERATORS: array [low(TOperatorType) .. High(TOperatorType)] of string = ('WHERE', 'OR', 'LIKE', '=', - 'ORDER BY', 'AND'); - private - FQuery: TFDQuery; - public - procedure Where(AField: string); overload; - procedure Where(AField: TField); overload; - procedure Where(AValue: Boolean); overload; - procedure &Or(AField: string); overload; - procedure &Or(AField: TField); overload; - procedure &And(AField: string); overload; - procedure &And(AField: TField); overload; - procedure Like(AValue: string); - procedure &Equals(AValue: Int64); overload; - procedure &Equals(AValue: Boolean); overload; - procedure &Equals(AValue: string); overload; - procedure Order(AField: TField); - constructor Create(AQuery: TFDQuery); - end; - - TManagerCriteria = class - private - FCriteria: ICriteria; - function GetDrive(AQuery: TFDQuery): string; - function GetInstanceCriteria(AQuery: TFDQuery): ICriteria; - public - constructor Create(AQuery: TFDQuery); - destructor Destroy; override; - property Criteria: ICriteria read FCriteria write FCriteria; - end; - -implementation - -uses - FireDAC.Stan.Intf, SysUtils; - -{ TDefaultCriteria } - -procedure TDefaultCriteria.&And(AField: string); -const - PHRASE = ' %s %s'; -begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otAnd], AField])); -end; - -procedure TDefaultCriteria.&And(AField: TField); -const - PHRASE = ' %s %s'; -begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otAnd], AField.Origin])); -end; - -procedure TDefaultCriteria.&Or(AField: string); -const - PHRASE = ' %s %s'; -begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otOr], AField])); -end; - -constructor TDefaultCriteria.Create(AQuery: TFDQuery); -begin - FQuery := AQuery; -end; - -procedure TDefaultCriteria.Equals(AValue: string); -const - PHRASE = '%s ''%s'''; -begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otEquals], AValue])); -end; - -procedure TDefaultCriteria.Equals(AValue: Int64); -const - PHRASE = '%s %d'; -begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otEquals], AValue])); -end; - -procedure TDefaultCriteria.Where(AField: TField); -const - PHRASE = '%s %s'; -begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otWhere], AField.Origin])); -end; - -procedure TDefaultCriteria.Equals(AValue: Boolean); -const - PHRASE = '%s %s'; -begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otEquals], BoolToStr(AValue, True)])); -end; - -procedure TDefaultCriteria.Like(AValue: string); -const - PHRASE = '::text %s %s'; -var - LKeyParam: string; - LParam: TFDParam; -begin - LKeyParam := THashMD5.Create.HashAsString; - FQuery.SQL.Text := FQuery.SQL.Text + format(PHRASE, [OPERATORS[otLike], ':' + LKeyParam]); - LParam := FQuery.ParamByName(LKeyParam); - LParam.DataType := ftString; - LParam.Value := AValue; -end; - -procedure TDefaultCriteria.Order(AField: TField); -const - PHRASE = '%s %s'; -begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otOrder], AField.Origin])); -end; - -procedure TDefaultCriteria.Where(AField: string); -const - PHRASE = '%s %s'; -begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otWhere], AField])); -end; - -procedure TDefaultCriteria.Where(AValue: Boolean); -const - PHRASE = '%s %s'; -begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otWhere], BoolToStr(AValue, True)])); -end; - -procedure TDefaultCriteria.&Or(AField: TField); -const - PHRASE = ' %s %s'; -begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otOr], AField.Origin])); -end; - -{ TCriteria } - -constructor TManagerCriteria.Create(AQuery: TFDQuery); -begin - FCriteria := GetInstanceCriteria(AQuery); -end; - -destructor TManagerCriteria.Destroy; -begin - inherited; -end; - -function TManagerCriteria.GetDrive(AQuery: TFDQuery): string; -var - LDef: IFDStanConnectionDef; -begin - Result := AQuery.Connection.DriverName; - if Result.IsEmpty and not AQuery.Connection.ConnectionDefName.IsEmpty then - begin - LDef := FDManager.ConnectionDefs.FindConnectionDef(AQuery.Connection.ConnectionDefName); - Result := LDef.Params.DriverID; - end; -end; - -function TManagerCriteria.GetInstanceCriteria(AQuery: TFDQuery): ICriteria; -var - LCriteria: ICriteria; -begin - LCriteria := nil; - - case AnsiIndexStr(GetDrive(AQuery), ['PG']) of - 0: - LCriteria := TDefaultCriteria.Create(AQuery); - else - LCriteria := TDefaultCriteria.Create(AQuery); - end; - - Result := LCriteria; -end; - + +interface + +uses + FireDAC.Comp.Client, StrUtils, Ragna.Intf, Data.DB, FireDAC.Stan.Param, + System.Hash; + +type + + TOperatorType = (otWhere, otOr, otLike, otEquals, otOrder, otAnd); + + TDefaultCriteria = class(TInterfacedObject, ICriteria) + const + OPERATORS: array [low(TOperatorType) .. High(TOperatorType)] of string = ('WHERE', 'OR', 'LIKE', '=', 'ORDER BY', 'AND'); + private + FQuery: TFDQuery; + public + procedure Where(AField: string); overload; + procedure Where(AField: TField); overload; + procedure Where(AValue: Boolean); overload; + procedure &Or(AField: string); overload; + procedure &Or(AField: TField); overload; + procedure &And(AField: string); overload; + procedure &And(AField: TField); overload; + procedure Like(AValue: string); + procedure &Equals(AValue: Int64); overload; + procedure &Equals(AValue: Boolean); overload; + procedure &Equals(AValue: string); overload; + procedure Order(AField: TField); + constructor Create(AQuery: TFDQuery); + end; + + TManagerCriteria = class + private + FCriteria: ICriteria; + function GetDrive(AQuery: TFDQuery): string; + function GetInstanceCriteria(AQuery: TFDQuery): ICriteria; + public + constructor Create(AQuery: TFDQuery); + destructor Destroy; override; + property Criteria: ICriteria read FCriteria write FCriteria; + end; + +implementation + +uses + FireDAC.Stan.Intf, SysUtils; + +{ TDefaultCriteria } + +procedure TDefaultCriteria.&And(AField: string); +const + PHRASE = ' %s %s'; +begin + FQuery.SQL.Add(format(PHRASE, [OPERATORS[otAnd], AField])); +end; + +procedure TDefaultCriteria.&And(AField: TField); +const + PHRASE = ' %s %s'; +begin + FQuery.SQL.Add(format(PHRASE, [OPERATORS[otAnd], AField.Origin])); +end; + +procedure TDefaultCriteria.&Or(AField: string); +const + PHRASE = ' %s %s'; +begin + FQuery.SQL.Add(format(PHRASE, [OPERATORS[otOr], AField])); +end; + +constructor TDefaultCriteria.Create(AQuery: TFDQuery); +begin + FQuery := AQuery; +end; + +procedure TDefaultCriteria.Equals(AValue: string); +const + PHRASE = '%s ''%s'''; +begin + FQuery.SQL.Add(format(PHRASE, [OPERATORS[otEquals], AValue])); +end; + +procedure TDefaultCriteria.Equals(AValue: Int64); +const + PHRASE = '%s %d'; +begin + FQuery.SQL.Add(format(PHRASE, [OPERATORS[otEquals], AValue])); +end; + +procedure TDefaultCriteria.Where(AField: TField); +const + PHRASE = '%s %s'; +begin + FQuery.SQL.Add(format(PHRASE, [OPERATORS[otWhere], AField.Origin])); +end; + +procedure TDefaultCriteria.Equals(AValue: Boolean); +const + PHRASE = '%s %s'; +begin + FQuery.SQL.Add(format(PHRASE, [OPERATORS[otEquals], BoolToStr(AValue, True)])); +end; + +procedure TDefaultCriteria.Like(AValue: string); +const + PHRASE = '::text %s %s'; +var + LKeyParam: string; + LParam: TFDParam; +begin + LKeyParam := THashMD5.Create.HashAsString; + FQuery.SQL.Text := FQuery.SQL.Text + format(PHRASE, [OPERATORS[otLike], ':' + LKeyParam]); + LParam := FQuery.ParamByName(LKeyParam); + LParam.DataType := ftString; + LParam.Value := AValue; +end; + +procedure TDefaultCriteria.Order(AField: TField); +const + PHRASE = '%s %s'; +begin + FQuery.SQL.Add(format(PHRASE, [OPERATORS[otOrder], AField.Origin])); +end; + +procedure TDefaultCriteria.Where(AField: string); +const + PHRASE = '%s %s'; +begin + FQuery.SQL.Add(format(PHRASE, [OPERATORS[otWhere], AField])); +end; + +procedure TDefaultCriteria.Where(AValue: Boolean); +const + PHRASE = '%s %s'; +begin + FQuery.SQL.Add(format(PHRASE, [OPERATORS[otWhere], BoolToStr(AValue, True)])); +end; + +procedure TDefaultCriteria.&Or(AField: TField); +const + PHRASE = ' %s %s'; +begin + FQuery.SQL.Add(format(PHRASE, [OPERATORS[otOr], AField.Origin])); +end; + +{ TCriteria } + +constructor TManagerCriteria.Create(AQuery: TFDQuery); +begin + FCriteria := GetInstanceCriteria(AQuery); +end; + +destructor TManagerCriteria.Destroy; +begin + inherited; +end; + +function TManagerCriteria.GetDrive(AQuery: TFDQuery): string; +var + LDef: IFDStanConnectionDef; +begin + Result := AQuery.Connection.DriverName; + if Result.IsEmpty and not AQuery.Connection.ConnectionDefName.IsEmpty then + begin + LDef := FDManager.ConnectionDefs.FindConnectionDef(AQuery.Connection.ConnectionDefName); + if LDef = nil then + raise Exception.Create('ConnectionDefs "' + AQuery.Connection.ConnectionDefName + '" not found'); + Result := LDef.Params.DriverID; + end; +end; + +function TManagerCriteria.GetInstanceCriteria(AQuery: TFDQuery): ICriteria; +var + LCriteria: ICriteria; +begin + LCriteria := nil; + + case AnsiIndexStr(GetDrive(AQuery), ['PG']) of + 0: + LCriteria := TDefaultCriteria.Create(AQuery); + else + LCriteria := TDefaultCriteria.Create(AQuery); + end; + + Result := LCriteria; +end; + end. From 931934e484eff1fc97a8d03d35f88968c21e9bb9 Mon Sep 17 00:00:00 2001 From: viniciussanchez Date: Wed, 15 Apr 2020 11:57:03 -0300 Subject: [PATCH 23/45] Organization --- boss-lock.json | 12 ++-- boss.json | 4 +- ragna.dpk | 12 ++-- ragna.dproj | 21 ++++--- .../Ragna.Criteria.Impl.pas} | 37 +++--------- src/{ => core}/Ragna.Impl.pas | 60 ++++++------------- src/{ => helpers}/Ragna.pas | 47 +++------------ src/interfaces/Ragna.Criteria.Intf.pas | 26 ++++++++ src/{ => interfaces}/Ragna.Intf.pas | 22 +------ src/{ => state}/Ragna.State.pas | 25 +++----- 10 files changed, 95 insertions(+), 171 deletions(-) rename src/{Ragna.Criteria.pas => core/Ragna.Criteria.Impl.pas} (85%) rename src/{ => core}/Ragna.Impl.pas (82%) rename src/{ => helpers}/Ragna.pas (94%) create mode 100644 src/interfaces/Ragna.Criteria.Intf.pas rename src/{ => interfaces}/Ragna.Intf.pas (51%) rename src/{ => state}/Ragna.State.pas (80%) diff --git a/boss-lock.json b/boss-lock.json index 81a4822..3a8be72 100644 --- a/boss-lock.json +++ b/boss-lock.json @@ -1,11 +1,11 @@ { - "hash": "b14e6a77427d10f868e9622e3b2074b0", - "updated": "2019-07-26T10:10:24.8937824-03:00", + "hash": "d41d8cd98f00b204e9800998ecf8427e", + "updated": "2020-04-15T11:05:15.0912204-03:00", "installedModules": { - "github.com/hunsche/datasetconverter4delphi": { - "name": "DataSetConverter4Delphi", - "version": "2.0.0", - "hash": "86494a27f5010c6819d370b1d4008621", + "github.com/viniciussanchez/dataset-serialize": { + "name": "dataset-serialize", + "version": "v2.0.3", + "hash": "0eef525d669652f4bb1468bfbdea879b", "artifacts": {}, "failed": false, "changed": false diff --git a/boss.json b/boss.json index 76bf353..fdec0b7 100644 --- a/boss.json +++ b/boss.json @@ -3,9 +3,9 @@ "description": "", "version": "1.0.0", "homepage": "", - "mainsrc": "src/", + "mainsrc": "src", "projects": [], "dependencies": { - "github.com/hunsche/DataSetConverter4Delphi": "^2.0.0" + "github.com/viniciussanchez/dataset-serialize": "^v2.0.3" } } \ No newline at end of file diff --git a/ragna.dpk b/ragna.dpk index 74363c9..31828e2 100644 --- a/ragna.dpk +++ b/ragna.dpk @@ -36,11 +36,11 @@ requires FireDACCommon; contains - Ragna.Criteria in 'src\Ragna.Criteria.pas', - Ragna.Impl in 'src\Ragna.Impl.pas', - Ragna.Intf in 'src\Ragna.Intf.pas', - Ragna in 'src\Ragna.pas', - Ragna.State in 'src\Ragna.State.pas'; + Ragna.Intf in 'src\interfaces\Ragna.Intf.pas', + Ragna.Criteria.Intf in 'src\interfaces\Ragna.Criteria.Intf.pas', + Ragna.Criteria.Impl in 'src\core\Ragna.Criteria.Impl.pas', + Ragna.Impl in 'src\core\Ragna.Impl.pas', + Ragna in 'src\helpers\Ragna.pas', + Ragna.State in 'src\state\Ragna.State.pas'; end. - diff --git a/ragna.dproj b/ragna.dproj index c6b2af4..99ba7d7 100644 --- a/ragna.dproj +++ b/ragna.dproj @@ -53,7 +53,7 @@ All true ragna - C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\src\;C:\Users\hunsc\projects\hashload\ragna\modules\DataSetConverter4Delphi\unittest\;modules\.dcp;modules\.dcu;modules;modules\DataSetConverter4Delphi\src;$(DCC_UnitSearchPath) + modules\.dcp;modules\.dcu;modules;modules\dataset-serialize\samples\src;modules\dataset-serialize\src\core;modules\dataset-serialize\src\helpers;modules\dataset-serialize\src\providers;modules\dataset-serialize\src\singletons;modules\dataset-serialize\src\types;$(DCC_UnitSearchPath) None @@ -94,11 +94,12 @@ - - - - - + + + + + + Cfg_2 Base @@ -117,8 +118,10 @@ - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components + Embarcadero DBExpress DataSnap Native Server Components + ExpressPivotGrid OLAP by Developer Express Inc. + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components ragna.dpk @@ -130,7 +133,7 @@ true - + ragna.bpl true diff --git a/src/Ragna.Criteria.pas b/src/core/Ragna.Criteria.Impl.pas similarity index 85% rename from src/Ragna.Criteria.pas rename to src/core/Ragna.Criteria.Impl.pas index d977890..7cab1ac 100644 --- a/src/Ragna.Criteria.pas +++ b/src/core/Ragna.Criteria.Impl.pas @@ -1,18 +1,15 @@ -unit Ragna.Criteria; - +unit Ragna.Criteria.Impl; + interface -uses - FireDAC.Comp.Client, StrUtils, Ragna.Intf, Data.DB, FireDAC.Stan.Param, - System.Hash; +uses FireDAC.Comp.Client, StrUtils, Data.DB, FireDAC.Stan.Param, System.Hash, Ragna.Criteria.Intf; type - TOperatorType = (otWhere, otOr, otLike, otEquals, otOrder, otAnd); TDefaultCriteria = class(TInterfacedObject, ICriteria) const - OPERATORS: array [low(TOperatorType) .. High(TOperatorType)] of string = ('WHERE', 'OR', 'LIKE', '=', 'ORDER BY', 'AND'); + OPERATORS: array [low(TOperatorType) .. high(TOperatorType)] of string = ('WHERE', 'OR', 'LIKE', '=', 'ORDER BY', 'AND'); private FQuery: TFDQuery; public @@ -38,16 +35,12 @@ TManagerCriteria = class function GetInstanceCriteria(AQuery: TFDQuery): ICriteria; public constructor Create(AQuery: TFDQuery); - destructor Destroy; override; property Criteria: ICriteria read FCriteria write FCriteria; end; implementation -uses - FireDAC.Stan.Intf, SysUtils; - -{ TDefaultCriteria } +uses FireDAC.Stan.Intf, SysUtils; procedure TDefaultCriteria.&And(AField: string); const @@ -145,18 +138,11 @@ procedure TDefaultCriteria.&Or(AField: TField); FQuery.SQL.Add(format(PHRASE, [OPERATORS[otOr], AField.Origin])); end; -{ TCriteria } - constructor TManagerCriteria.Create(AQuery: TFDQuery); begin FCriteria := GetInstanceCriteria(AQuery); end; -destructor TManagerCriteria.Destroy; -begin - inherited; -end; - function TManagerCriteria.GetDrive(AQuery: TFDQuery): string; var LDef: IFDStanConnectionDef; @@ -172,19 +158,14 @@ function TManagerCriteria.GetDrive(AQuery: TFDQuery): string; end; function TManagerCriteria.GetInstanceCriteria(AQuery: TFDQuery): ICriteria; -var - LCriteria: ICriteria; begin - LCriteria := nil; - case AnsiIndexStr(GetDrive(AQuery), ['PG']) of 0: - LCriteria := TDefaultCriteria.Create(AQuery); - else - LCriteria := TDefaultCriteria.Create(AQuery); + Result := TDefaultCriteria.Create(AQuery); + else + Result := TDefaultCriteria.Create(AQuery); end; - - Result := LCriteria; end; end. + \ No newline at end of file diff --git a/src/Ragna.Impl.pas b/src/core/Ragna.Impl.pas similarity index 82% rename from src/Ragna.Impl.pas rename to src/core/Ragna.Impl.pas index d59d040..d9f1782 100644 --- a/src/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -2,10 +2,9 @@ interface -uses Ragna.Intf, FireDAC.Comp.Client, System.JSON, Data.DB, Ragna.Criteria; +uses Ragna.Intf, Ragna.Criteria.Intf, FireDAC.Comp.Client, System.JSON, Data.DB, Ragna.Criteria.Impl; type - TRagna = class(TInterfacedObject, IRagna) private FQuery: TFDQuery; @@ -34,16 +33,14 @@ TRagna = class(TInterfacedObject, IRagna) procedure EditFromJson(const AJSON: TJSONObject); overload; procedure EditFromJson(const AJSON: TJSONArray); overload; constructor Create(AQuery: TFDQuery); - destructor Destroy; Override; + destructor Destroy; override; property Query: TFDQuery read FQuery write FQuery; property Criteria: ICriteria read FCriteria write FCriteria; end; implementation -{ TRagna } - -uses Ragna.State, System.SysUtils, Ragna, DataSetConverter4D; +uses Ragna.State, System.SysUtils, Ragna, DataSet.Serialize; constructor TRagna.Create(AQuery: TFDQuery); begin @@ -76,18 +73,18 @@ destructor TRagna.Destroy; procedure TRagna.SaveState; var LKey: TFDQuery; - LSQL: string; + LSql: string; LRagnaState: TRagnaState; begin LKey := FQuery; LRagnaState := TRagnaState.GetInstance; - if not LRagnaState.GetState(LKey, LSQL) then + if not LRagnaState.GetState(LKey, LSql) then LRagnaState.SetState(LKey, FQuery.SQL.Text); end; procedure TRagna.EditFromJson(const AJSON: TJSONArray); begin - FQuery.FromJSONArray(AJSON); + FQuery.LoadFromJSON(AJSON); end; procedure TRagna.EndCriteria; @@ -101,16 +98,12 @@ procedure TRagna.FindById(AField: TField; AValue: Int64); begin OpenEmpty; LField := GetTableName + '.' + AField.Origin; - - FQuery - .Reset - .Where(LField) - .Equals(AValue); + FQuery.Reset.Where(LField).Equals(AValue); end; procedure TRagna.EditFromJson(const AJSON: TJSONObject); begin - FQuery.RecordFromJSONObject(AJSON); + FQuery.LoadFromJSON(AJSON); end; function TRagna.GetTableName: string; @@ -136,17 +129,13 @@ procedure TRagna.OpenUp; procedure TRagna.OpenEmpty; begin - FQuery - .Where('1') - .Equals('2') - .OpenUp; + FQuery.Where('1').Equals('2').OpenUp; end; procedure TRagna.Paginate(AOffSet, ALimit: integer); begin if AOffSet > 0 then FQuery.FetchOptions.RecsSkip := AOffSet; - if ALimit > 0 then FQuery.FetchOptions.RecsMax := ALimit; end; @@ -165,19 +154,11 @@ procedure TRagna.RadicalResearch(AValue: string; AFields: array of TField); if HasField(AFields) and not AValue.IsEmpty then begin LSearch := '%' + AValue + '%'; - - FQuery - .Where(AFields[0]) - .Like(LSearch); - + FQuery.Where(AFields[0]).Like(LSearch); if ((Length(AFields) - 1) >= 2) then begin for LCount := 1 to Length(AFields) - 1 do - begin - FQuery - .&Or(AFields[LCount]) - .Like(LSearch); - end; + FQuery.&Or(AFields[LCount]).Like(LSearch); end; end; end; @@ -190,13 +171,13 @@ procedure TRagna.RaiseNotFound; procedure TRagna.Reset; var LKey: TFDQuery; - LSQL: string; + LSql: string; LRagnaState: TRagnaState; begin LKey := FQuery; LRagnaState := TRagnaState.GetInstance; - LRagnaState.GetState(LKey, LSQL); - FQuery.SQL.Text := LSQL; + LRagnaState.GetState(LKey, LSql); + FQuery.SQL.Text := LSql; end; procedure TRagna.StartCriteria; @@ -208,24 +189,17 @@ procedure TRagna.ToJson(out AJSON: TJSONObject); begin if FQuery.IsEmpty then RaiseNotFound; - - AJSON := FQuery.AsJSONObject; + AJSON := FQuery.ToJSONObject; end; procedure TRagna.ToJson(out AJSON: TJSONArray); begin - if FQuery.IsEmpty then - AJSON := TJSONArray.Create - else - AJSON := FQuery.AsJSONArray; + AJSON := FQuery.ToJSONArray; end; procedure TRagna.UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject); begin - FQuery - .FindById(AField, AValue) - .OpenUp - .EditFromJson(ABody); + FQuery.FindById(AField, AValue).OpenUp.EditFromJson(ABody); end; end. diff --git a/src/Ragna.pas b/src/helpers/Ragna.pas similarity index 94% rename from src/Ragna.pas rename to src/helpers/Ragna.pas index 34c17f8..cf4ffcb 100644 --- a/src/Ragna.pas +++ b/src/helpers/Ragna.pas @@ -2,20 +2,16 @@ interface -uses - FireDAC.Comp.Client, System.JSON, Data.DB, Ragna.Impl; +uses FireDAC.Comp.Client, System.JSON, Data.DB, Ragna.Impl, Ragna.Criteria.Impl; type - TRagnaHelper = class helper for TFDQuery public function Paginate(AOffSet, ALimit: integer): TFDQuery; - function RadicalResearch(AValue: string; AFields: array of TField) - : TFDQuery; + function RadicalResearch(AValue: string; AFields: array of TField): TFDQuery; function Remove(AField: TField; AValue: Int64): TFDQuery; function FindById(AField: TField; AValue: Int64): TFDQuery; - function UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject) - : TFDQuery; + function UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject): TFDQuery; function New(ABody: TJSONObject): TFDQuery; overload; function New(ABody: TJSONArray): TFDQuery; overload; function OpenUp: TFDQuery; @@ -36,7 +32,7 @@ TRagnaHelper = class helper for TFDQuery function Like(AValue: string): TFDQuery; function &Equals(AValue: Int64): TFDQuery; overload; function &Equals(AValue: Boolean): TFDQuery; overload; - function &Equals(AValue: String): TFDQuery; overload; + function &Equals(AValue: string): TFDQuery; overload; function Order(AField: TField): TFDQuery; end; @@ -54,7 +50,6 @@ function TRagnaHelper.&Or(AField: TField): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -68,7 +63,6 @@ function TRagnaHelper.&And(AField: TField): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -82,7 +76,6 @@ function TRagnaHelper.&And(AField: string): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -96,7 +89,6 @@ function TRagnaHelper.&Or(AField: string): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -110,7 +102,6 @@ function TRagnaHelper.Remove(AField: TField; AValue: Int64): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -124,7 +115,6 @@ function TRagnaHelper.EditFromJson(const AJSON: TJSONArray): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -138,11 +128,10 @@ function TRagnaHelper.EndCriteria: TFDQuery; finally LRagna.Free; end; - Result := Self; end; -function TRagnaHelper.Equals(AValue: String): TFDQuery; +function TRagnaHelper.Equals(AValue: string): TFDQuery; var LRagna: TRagna; begin @@ -152,7 +141,6 @@ function TRagnaHelper.Equals(AValue: String): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -166,7 +154,6 @@ function TRagnaHelper.Equals(AValue: Boolean): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -180,7 +167,6 @@ function TRagnaHelper.Equals(AValue: Int64): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -194,7 +180,6 @@ function TRagnaHelper.FindById(AField: TField; AValue: Int64): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -208,7 +193,6 @@ function TRagnaHelper.EditFromJson(const AJSON: TJSONObject): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -222,7 +206,6 @@ function TRagnaHelper.Like(AValue: string): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -236,7 +219,6 @@ function TRagnaHelper.New(ABody: TJSONArray): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -250,7 +232,6 @@ function TRagnaHelper.OpenUp: TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -264,7 +245,6 @@ function TRagnaHelper.Order(AField: TField): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -278,7 +258,6 @@ function TRagnaHelper.Paginate(AOffSet, ALimit: integer): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -292,12 +271,10 @@ function TRagnaHelper.New(ABody: TJSONObject): TFDQuery; finally LRagna.Free; end; - Result := Self; end; -function TRagnaHelper.RadicalResearch(AValue: string; AFields: array of TField) - : TFDQuery; +function TRagnaHelper.RadicalResearch(AValue: string; AFields: array of TField): TFDQuery; var LRagna: TRagna; begin @@ -307,7 +284,6 @@ function TRagnaHelper.RadicalResearch(AValue: string; AFields: array of TField) finally LRagna.Free; end; - Result := Self; end; @@ -321,7 +297,6 @@ function TRagnaHelper.Reset: TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -335,7 +310,6 @@ function TRagnaHelper.StartCriteria: TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -349,7 +323,6 @@ function TRagnaHelper.ToJson(out AJSON: TJSONObject): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -363,12 +336,10 @@ function TRagnaHelper.ToJson(out AJSON: TJSONArray): TFDQuery; finally LRagna.Free; end; - Result := Self; end; -function TRagnaHelper.UpdateById(AField: TField; AValue: Int64; - ABody: TJSONObject): TFDQuery; +function TRagnaHelper.UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject): TFDQuery; var LRagna: TRagna; begin @@ -378,7 +349,6 @@ function TRagnaHelper.UpdateById(AField: TField; AValue: Int64; finally LRagna.Free; end; - Result := Self; end; @@ -392,7 +362,6 @@ function TRagnaHelper.Where(AField: string): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -406,7 +375,6 @@ function TRagnaHelper.Where(AValue: Boolean): TFDQuery; finally LRagna.Free; end; - Result := Self; end; @@ -420,7 +388,6 @@ function TRagnaHelper.Where(AField: TField): TFDQuery; finally LRagna.Free; end; - Result := Self; end; diff --git a/src/interfaces/Ragna.Criteria.Intf.pas b/src/interfaces/Ragna.Criteria.Intf.pas new file mode 100644 index 0000000..b48947b --- /dev/null +++ b/src/interfaces/Ragna.Criteria.Intf.pas @@ -0,0 +1,26 @@ +unit Ragna.Criteria.Intf; + +interface + +uses Data.DB; + +type + ICriteria = interface + ['{BC7603D3-DB7D-4A61-AA73-E1152A933E07}'] + procedure Where(AField: string); overload; + procedure Where(AField: TField); overload; + procedure Where(AValue: Boolean); overload; + procedure &Or(AField: string); overload; + procedure &Or(AField: TField); overload; + procedure &And(AField: string); overload; + procedure &And(AField: TField); overload; + procedure Like(AValue: string); + procedure &Equals(AValue: Int64); overload; + procedure &Equals(AValue: Boolean); overload; + procedure &Equals(AValue: string); overload; + procedure Order(AField: TField); + end; + +implementation + +end. diff --git a/src/Ragna.Intf.pas b/src/interfaces/Ragna.Intf.pas similarity index 51% rename from src/Ragna.Intf.pas rename to src/interfaces/Ragna.Intf.pas index 852d98b..311ea19 100644 --- a/src/Ragna.Intf.pas +++ b/src/interfaces/Ragna.Intf.pas @@ -2,14 +2,12 @@ interface -uses - FireDAC.Comp.Client, System.JSON, Data.DB; +uses FireDAC.Comp.Client, System.JSON, Data.DB; type - IRagna = interface ['{0F1AD1E9-A82C-44BE-9208-685B9C3C77F9}'] - procedure Paginate(AOffSet, ALimit: integer); + procedure Paginate(AOffSet, ALimit: Integer); procedure RadicalResearch(AValue: string; AFields: array of TField); procedure Remove(AField: TField; AValue: Int64); procedure FindById(AField: TField; AValue: Int64); @@ -25,22 +23,6 @@ interface procedure EditFromJson(const AJSON: TJSONObject); end; - ICriteria = interface - ['{BC7603D3-DB7D-4A61-AA73-E1152A933E07}'] - procedure Where(AField: string); overload; - procedure Where(AField: TField); overload; - procedure Where(AValue: Boolean); overload; - procedure &Or(AField: string); overload; - procedure &Or(AField: TField); overload; - procedure &And(AField: string); overload; - procedure &And(AField: TField); overload; - procedure Like(AValue: string); - procedure &Equals(AValue: Int64); overload; - procedure &Equals(AValue: Boolean); overload; - procedure &Equals(AValue: string); overload; - procedure Order(AField: TField); - end; - implementation end. diff --git a/src/Ragna.State.pas b/src/state/Ragna.State.pas similarity index 80% rename from src/Ragna.State.pas rename to src/state/Ragna.State.pas index 7ebe541..6262176 100644 --- a/src/Ragna.State.pas +++ b/src/state/Ragna.State.pas @@ -2,22 +2,18 @@ interface -uses - System.Generics.Collections, FireDac.Comp.Client, System.Rtti; +uses System.Generics.Collections, FireDac.Comp.Client, System.Rtti; type - TListQueryAndSql = TDictionary; TRagnaState = class private - FSecret: string; FStates: TListQueryAndSql; - FVmi : TVirtualMethodInterceptor; + FVmi: TVirtualMethodInterceptor; class var FInstance: TRagnaState; - procedure OnBeforVMI(Instance: TObject; - Method: TRttiMethod; const Args: TArray; out DoInvoke: Boolean; - out Result: TValue); + procedure OnBeforVMI(Instance: TObject; Method: TRttiMethod; const Args: TArray; out DoInvoke: Boolean; + out Result: TValue); public destructor Destroy; override; property States: TListQueryAndSql read FStates write FStates; @@ -30,9 +26,6 @@ TRagnaState = class implementation - -{ TRagnaState } - constructor TRagnaState.Create; begin FVmi := TVirtualMethodInterceptor.Create(TFDQuery); @@ -63,8 +56,8 @@ function TRagnaState.GetState(AQuery: TFDQuery; out ASQL: string): Boolean; end; end; -procedure TRagnaState.OnBeforVMI(Instance: TObject; Method: TRttiMethod; - const Args: TArray; out DoInvoke: Boolean; out Result: TValue); +procedure TRagnaState.OnBeforVMI(Instance: TObject; Method: TRttiMethod; const Args: TArray; out DoInvoke: Boolean; + out Result: TValue); begin if Method.Name <> 'BeforeDestruction' then Exit; @@ -94,11 +87,9 @@ procedure TRagnaState.SetState(AQuery: TFDQuery; ASQL: string); end; initialization - -TRagnaState.GetInstance; + TRagnaState.GetInstance; finalization - -TRagnaState.Release; + TRagnaState.Release; end. From 0c33ba27f90ffe6131c89e99c9620f7825625c32 Mon Sep 17 00:00:00 2001 From: viniciussanchez Date: Wed, 15 Apr 2020 14:16:24 -0300 Subject: [PATCH 24/45] Created record helper to Operators --- ragna.dpk | 3 ++- ragna.dproj | 1 + src/core/Ragna.Criteria.Impl.pas | 30 +++++++++++++---------------- src/types/Ragna.Types.pas | 33 ++++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 18 deletions(-) create mode 100644 src/types/Ragna.Types.pas diff --git a/ragna.dpk b/ragna.dpk index 31828e2..69da73c 100644 --- a/ragna.dpk +++ b/ragna.dpk @@ -41,6 +41,7 @@ contains Ragna.Criteria.Impl in 'src\core\Ragna.Criteria.Impl.pas', Ragna.Impl in 'src\core\Ragna.Impl.pas', Ragna in 'src\helpers\Ragna.pas', - Ragna.State in 'src\state\Ragna.State.pas'; + Ragna.State in 'src\state\Ragna.State.pas', + Ragna.Types in 'src\types\Ragna.Types.pas'; end. diff --git a/ragna.dproj b/ragna.dproj index 99ba7d7..7e0453e 100644 --- a/ragna.dproj +++ b/ragna.dproj @@ -100,6 +100,7 @@ + Cfg_2 Base diff --git a/src/core/Ragna.Criteria.Impl.pas b/src/core/Ragna.Criteria.Impl.pas index 7cab1ac..8544816 100644 --- a/src/core/Ragna.Criteria.Impl.pas +++ b/src/core/Ragna.Criteria.Impl.pas @@ -2,14 +2,10 @@ interface -uses FireDAC.Comp.Client, StrUtils, Data.DB, FireDAC.Stan.Param, System.Hash, Ragna.Criteria.Intf; +uses FireDAC.Comp.Client, StrUtils, Data.DB, FireDAC.Stan.Param, System.Hash, Ragna.Criteria.Intf, Ragna.Types; type - TOperatorType = (otWhere, otOr, otLike, otEquals, otOrder, otAnd); - TDefaultCriteria = class(TInterfacedObject, ICriteria) - const - OPERATORS: array [low(TOperatorType) .. high(TOperatorType)] of string = ('WHERE', 'OR', 'LIKE', '=', 'ORDER BY', 'AND'); private FQuery: TFDQuery; public @@ -46,21 +42,21 @@ procedure TDefaultCriteria.&And(AField: string); const PHRASE = ' %s %s'; begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otAnd], AField])); + FQuery.SQL.Add(Format(PHRASE, [otAnd.ToString, AField])); end; procedure TDefaultCriteria.&And(AField: TField); const PHRASE = ' %s %s'; begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otAnd], AField.Origin])); + FQuery.SQL.Add(Format(PHRASE, [otAnd.ToString, AField.Origin])); end; procedure TDefaultCriteria.&Or(AField: string); const PHRASE = ' %s %s'; begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otOr], AField])); + FQuery.SQL.Add(Format(PHRASE, [otOr.ToString, AField])); end; constructor TDefaultCriteria.Create(AQuery: TFDQuery); @@ -72,28 +68,28 @@ procedure TDefaultCriteria.Equals(AValue: string); const PHRASE = '%s ''%s'''; begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otEquals], AValue])); + FQuery.SQL.Add(Format(PHRASE, [otEquals.ToString, AValue])); end; procedure TDefaultCriteria.Equals(AValue: Int64); const PHRASE = '%s %d'; begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otEquals], AValue])); + FQuery.SQL.Add(Format(PHRASE, [otEquals.ToString, AValue])); end; procedure TDefaultCriteria.Where(AField: TField); const PHRASE = '%s %s'; begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otWhere], AField.Origin])); + FQuery.SQL.Add(Format(PHRASE, [otWhere.ToString, AField.Origin])); end; procedure TDefaultCriteria.Equals(AValue: Boolean); const PHRASE = '%s %s'; begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otEquals], BoolToStr(AValue, True)])); + FQuery.SQL.Add(Format(PHRASE, [otEquals.ToString, BoolToStr(AValue, True)])); end; procedure TDefaultCriteria.Like(AValue: string); @@ -104,7 +100,7 @@ procedure TDefaultCriteria.Like(AValue: string); LParam: TFDParam; begin LKeyParam := THashMD5.Create.HashAsString; - FQuery.SQL.Text := FQuery.SQL.Text + format(PHRASE, [OPERATORS[otLike], ':' + LKeyParam]); + FQuery.SQL.Text := FQuery.SQL.Text + Format(PHRASE, [otLike.ToString, ':' + LKeyParam]); LParam := FQuery.ParamByName(LKeyParam); LParam.DataType := ftString; LParam.Value := AValue; @@ -114,28 +110,28 @@ procedure TDefaultCriteria.Order(AField: TField); const PHRASE = '%s %s'; begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otOrder], AField.Origin])); + FQuery.SQL.Add(Format(PHRASE, [otOrder.ToString, AField.Origin])); end; procedure TDefaultCriteria.Where(AField: string); const PHRASE = '%s %s'; begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otWhere], AField])); + FQuery.SQL.Add(Format(PHRASE, [otWhere.ToString, AField])); end; procedure TDefaultCriteria.Where(AValue: Boolean); const PHRASE = '%s %s'; begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otWhere], BoolToStr(AValue, True)])); + FQuery.SQL.Add(Format(PHRASE, [otWhere.ToString, BoolToStr(AValue, True)])); end; procedure TDefaultCriteria.&Or(AField: TField); const PHRASE = ' %s %s'; begin - FQuery.SQL.Add(format(PHRASE, [OPERATORS[otOr], AField.Origin])); + FQuery.SQL.Add(Format(PHRASE, [otOr.ToString, AField.Origin])); end; constructor TManagerCriteria.Create(AQuery: TFDQuery); diff --git a/src/types/Ragna.Types.pas b/src/types/Ragna.Types.pas new file mode 100644 index 0000000..04723f3 --- /dev/null +++ b/src/types/Ragna.Types.pas @@ -0,0 +1,33 @@ +unit Ragna.Types; + +interface + +type + TOperatorType = (otWhere, otOr, otLike, otEquals, otOrder, otAnd); + + TOperatorTypeHelper = record helper for TOperatorType + public + function ToString: string; + end; + +implementation + +function TOperatorTypeHelper.ToString: string; +begin + case Self of + otWhere: + Result := 'WHERE'; + otOr: + Result := 'OR'; + otLike: + Result := 'LIKE'; + otEquals: + Result := '='; + otOrder: + Result := 'ORDER BY'; + otAnd: + Result := 'AND'; + end; +end; + +end. From 47368adc1b92d04695d7b0e918ad85d842264d94 Mon Sep 17 00:00:00 2001 From: viniciussanchez Date: Wed, 15 Apr 2020 14:20:20 -0300 Subject: [PATCH 25/45] Added OpenEmpty function --- src/core/Ragna.Impl.pas | 2 +- src/helpers/Ragna.pas | 14 ++++++++++++++ src/interfaces/Ragna.Intf.pas | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index d9f1782..a3c72a5 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -14,7 +14,6 @@ TRagna = class(TInterfacedObject, IRagna) private function GetTableName: string; function HasField(AFields: array of TField): Boolean; - procedure OpenEmpty; procedure RaiseNotFound; public procedure Paginate(AOffSet, ALimit: integer); @@ -25,6 +24,7 @@ TRagna = class(TInterfacedObject, IRagna) procedure New(ABody: TJSONObject); overload; procedure New(ABody: TJSONArray); overload; procedure OpenUp; + procedure OpenEmpty; procedure StartCriteria; deprecated; procedure EndCriteria; deprecated; procedure Reset; diff --git a/src/helpers/Ragna.pas b/src/helpers/Ragna.pas index cf4ffcb..078937e 100644 --- a/src/helpers/Ragna.pas +++ b/src/helpers/Ragna.pas @@ -15,6 +15,7 @@ TRagnaHelper = class helper for TFDQuery function New(ABody: TJSONObject): TFDQuery; overload; function New(ABody: TJSONArray): TFDQuery; overload; function OpenUp: TFDQuery; + function OpenEmpty: TFDQuery; function StartCriteria: TFDQuery; deprecated; function EndCriteria: TFDQuery; deprecated; function Reset: TFDQuery; @@ -222,6 +223,19 @@ function TRagnaHelper.New(ABody: TJSONArray): TFDQuery; Result := Self; end; +function TRagnaHelper.OpenEmpty: TFDQuery; +var + LRagna: TRagna; +begin + LRagna := TRagna.Create(Self); + try + LRagna.OpenEmpty; + finally + LRagna.Free; + end; + Result := Self; +end; + function TRagnaHelper.OpenUp: TFDQuery; var LRagna: TRagna; diff --git a/src/interfaces/Ragna.Intf.pas b/src/interfaces/Ragna.Intf.pas index 311ea19..96e2720 100644 --- a/src/interfaces/Ragna.Intf.pas +++ b/src/interfaces/Ragna.Intf.pas @@ -15,6 +15,7 @@ interface procedure New(ABody: TJSONObject); overload; procedure New(ABody: TJSONArray); overload; procedure OpenUp; + procedure OpenEmpty; procedure StartCriteria; deprecated; procedure EndCriteria; deprecated; procedure Reset; From aa13e5e60cad8f06e67be300f6e1f84985c154fb Mon Sep 17 00:00:00 2001 From: viniciussanchez Date: Wed, 15 Apr 2020 14:33:00 -0300 Subject: [PATCH 26/45] Added const parameters --- src/core/Ragna.Criteria.Impl.pas | 64 +++++++++++----------- src/core/Ragna.Impl.pas | 36 ++++++------ src/helpers/Ragna.pas | 76 +++++++++++++------------- src/interfaces/Ragna.Criteria.Intf.pas | 24 ++++---- src/interfaces/Ragna.Intf.pas | 14 ++--- src/state/Ragna.State.pas | 8 +-- 6 files changed, 111 insertions(+), 111 deletions(-) diff --git a/src/core/Ragna.Criteria.Impl.pas b/src/core/Ragna.Criteria.Impl.pas index 8544816..0c8ddea 100644 --- a/src/core/Ragna.Criteria.Impl.pas +++ b/src/core/Ragna.Criteria.Impl.pas @@ -9,28 +9,28 @@ TDefaultCriteria = class(TInterfacedObject, ICriteria) private FQuery: TFDQuery; public - procedure Where(AField: string); overload; - procedure Where(AField: TField); overload; - procedure Where(AValue: Boolean); overload; - procedure &Or(AField: string); overload; - procedure &Or(AField: TField); overload; - procedure &And(AField: string); overload; - procedure &And(AField: TField); overload; - procedure Like(AValue: string); - procedure &Equals(AValue: Int64); overload; - procedure &Equals(AValue: Boolean); overload; - procedure &Equals(AValue: string); overload; - procedure Order(AField: TField); - constructor Create(AQuery: TFDQuery); + procedure Where(const AField: string); overload; + procedure Where(const AField: TField); overload; + procedure Where(const AValue: Boolean); overload; + procedure &Or(const AField: string); overload; + procedure &Or(const AField: TField); overload; + procedure &And(const AField: string); overload; + procedure &And(const AField: TField); overload; + procedure Like(const AValue: string); + procedure &Equals(const AValue: Int64); overload; + procedure &Equals(const AValue: Boolean); overload; + procedure &Equals(const AValue: string); overload; + procedure Order(const AField: TField); + constructor Create(const AQuery: TFDQuery); end; TManagerCriteria = class private FCriteria: ICriteria; - function GetDrive(AQuery: TFDQuery): string; - function GetInstanceCriteria(AQuery: TFDQuery): ICriteria; + function GetDrive(const AQuery: TFDQuery): string; + function GetInstanceCriteria(const AQuery: TFDQuery): ICriteria; public - constructor Create(AQuery: TFDQuery); + constructor Create(const AQuery: TFDQuery); property Criteria: ICriteria read FCriteria write FCriteria; end; @@ -38,61 +38,61 @@ implementation uses FireDAC.Stan.Intf, SysUtils; -procedure TDefaultCriteria.&And(AField: string); +procedure TDefaultCriteria.&And(const AField: string); const PHRASE = ' %s %s'; begin FQuery.SQL.Add(Format(PHRASE, [otAnd.ToString, AField])); end; -procedure TDefaultCriteria.&And(AField: TField); +procedure TDefaultCriteria.&And(const AField: TField); const PHRASE = ' %s %s'; begin FQuery.SQL.Add(Format(PHRASE, [otAnd.ToString, AField.Origin])); end; -procedure TDefaultCriteria.&Or(AField: string); +procedure TDefaultCriteria.&Or(const AField: string); const PHRASE = ' %s %s'; begin FQuery.SQL.Add(Format(PHRASE, [otOr.ToString, AField])); end; -constructor TDefaultCriteria.Create(AQuery: TFDQuery); +constructor TDefaultCriteria.Create(const AQuery: TFDQuery); begin FQuery := AQuery; end; -procedure TDefaultCriteria.Equals(AValue: string); +procedure TDefaultCriteria.Equals(const AValue: string); const PHRASE = '%s ''%s'''; begin FQuery.SQL.Add(Format(PHRASE, [otEquals.ToString, AValue])); end; -procedure TDefaultCriteria.Equals(AValue: Int64); +procedure TDefaultCriteria.Equals(const AValue: Int64); const PHRASE = '%s %d'; begin FQuery.SQL.Add(Format(PHRASE, [otEquals.ToString, AValue])); end; -procedure TDefaultCriteria.Where(AField: TField); +procedure TDefaultCriteria.Where(const AField: TField); const PHRASE = '%s %s'; begin FQuery.SQL.Add(Format(PHRASE, [otWhere.ToString, AField.Origin])); end; -procedure TDefaultCriteria.Equals(AValue: Boolean); +procedure TDefaultCriteria.Equals(const AValue: Boolean); const PHRASE = '%s %s'; begin FQuery.SQL.Add(Format(PHRASE, [otEquals.ToString, BoolToStr(AValue, True)])); end; -procedure TDefaultCriteria.Like(AValue: string); +procedure TDefaultCriteria.Like(const AValue: string); const PHRASE = '::text %s %s'; var @@ -106,40 +106,40 @@ procedure TDefaultCriteria.Like(AValue: string); LParam.Value := AValue; end; -procedure TDefaultCriteria.Order(AField: TField); +procedure TDefaultCriteria.Order(const AField: TField); const PHRASE = '%s %s'; begin FQuery.SQL.Add(Format(PHRASE, [otOrder.ToString, AField.Origin])); end; -procedure TDefaultCriteria.Where(AField: string); +procedure TDefaultCriteria.Where(const AField: string); const PHRASE = '%s %s'; begin FQuery.SQL.Add(Format(PHRASE, [otWhere.ToString, AField])); end; -procedure TDefaultCriteria.Where(AValue: Boolean); +procedure TDefaultCriteria.Where(const AValue: Boolean); const PHRASE = '%s %s'; begin FQuery.SQL.Add(Format(PHRASE, [otWhere.ToString, BoolToStr(AValue, True)])); end; -procedure TDefaultCriteria.&Or(AField: TField); +procedure TDefaultCriteria.&Or(const AField: TField); const PHRASE = ' %s %s'; begin FQuery.SQL.Add(Format(PHRASE, [otOr.ToString, AField.Origin])); end; -constructor TManagerCriteria.Create(AQuery: TFDQuery); +constructor TManagerCriteria.Create(const AQuery: TFDQuery); begin FCriteria := GetInstanceCriteria(AQuery); end; -function TManagerCriteria.GetDrive(AQuery: TFDQuery): string; +function TManagerCriteria.GetDrive(const AQuery: TFDQuery): string; var LDef: IFDStanConnectionDef; begin @@ -153,7 +153,7 @@ function TManagerCriteria.GetDrive(AQuery: TFDQuery): string; end; end; -function TManagerCriteria.GetInstanceCriteria(AQuery: TFDQuery): ICriteria; +function TManagerCriteria.GetInstanceCriteria(const AQuery: TFDQuery): ICriteria; begin case AnsiIndexStr(GetDrive(AQuery), ['PG']) of 0: diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index a3c72a5..3c45e3a 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -13,16 +13,16 @@ TRagna = class(TInterfacedObject, IRagna) procedure SaveState; private function GetTableName: string; - function HasField(AFields: array of TField): Boolean; + function HasField(const AFields: array of TField): Boolean; procedure RaiseNotFound; public - procedure Paginate(AOffSet, ALimit: integer); - procedure RadicalResearch(AValue: string; AFields: array of TField); - procedure Remove(AField: TField; AValue: Int64); - procedure FindById(AField: TField; AValue: Int64); - procedure UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject); - procedure New(ABody: TJSONObject); overload; - procedure New(ABody: TJSONArray); overload; + procedure Paginate(const AOffSet, ALimit: integer); + procedure RadicalResearch(const AValue: string; const AFields: array of TField); + procedure Remove(const AField: TField; const AValue: Int64); + procedure FindById(const AField: TField; const AValue: Int64); + procedure UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject); + procedure New(const ABody: TJSONObject); overload; + procedure New(const ABody: TJSONArray); overload; procedure OpenUp; procedure OpenEmpty; procedure StartCriteria; deprecated; @@ -32,7 +32,7 @@ TRagna = class(TInterfacedObject, IRagna) procedure ToJson(out AJSON: TJSONObject); overload; procedure EditFromJson(const AJSON: TJSONObject); overload; procedure EditFromJson(const AJSON: TJSONArray); overload; - constructor Create(AQuery: TFDQuery); + constructor Create(const AQuery: TFDQuery); destructor Destroy; override; property Query: TFDQuery read FQuery write FQuery; property Criteria: ICriteria read FCriteria write FCriteria; @@ -42,7 +42,7 @@ implementation uses Ragna.State, System.SysUtils, Ragna, DataSet.Serialize; -constructor TRagna.Create(AQuery: TFDQuery); +constructor TRagna.Create(const AQuery: TFDQuery); begin FQuery := AQuery; SaveState; @@ -50,7 +50,7 @@ constructor TRagna.Create(AQuery: TFDQuery); FCriteria := FManagerCriteria.Criteria; end; -procedure TRagna.Remove(AField: TField; AValue: Int64); +procedure TRagna.Remove(const AField: TField; const AValue: Int64); const DELETE_SQL = 'DELETE FROM %s WHERE %s = :ID'; DELETED: array [0 .. 1] of Boolean = (False, True); @@ -92,7 +92,7 @@ procedure TRagna.EndCriteria; Reset; end; -procedure TRagna.FindById(AField: TField; AValue: Int64); +procedure TRagna.FindById(const AField: TField; const AValue: Int64); var LField: string; begin @@ -111,12 +111,12 @@ function TRagna.GetTableName: string; Result := FQuery.Table.Table.SourceName; end; -function TRagna.HasField(AFields: array of TField): Boolean; +function TRagna.HasField(const AFields: array of TField): Boolean; begin Result := Length(AFields) > 0; end; -procedure TRagna.New(ABody: TJSONArray); +procedure TRagna.New(const ABody: TJSONArray); begin OpenEmpty; FQuery.EditFromJson(ABody); @@ -132,7 +132,7 @@ procedure TRagna.OpenEmpty; FQuery.Where('1').Equals('2').OpenUp; end; -procedure TRagna.Paginate(AOffSet, ALimit: integer); +procedure TRagna.Paginate(const AOffSet, ALimit: integer); begin if AOffSet > 0 then FQuery.FetchOptions.RecsSkip := AOffSet; @@ -140,13 +140,13 @@ procedure TRagna.Paginate(AOffSet, ALimit: integer); FQuery.FetchOptions.RecsMax := ALimit; end; -procedure TRagna.New(ABody: TJSONObject); +procedure TRagna.New(const ABody: TJSONObject); begin OpenEmpty; FQuery.EditFromJson(ABody); end; -procedure TRagna.RadicalResearch(AValue: string; AFields: array of TField); +procedure TRagna.RadicalResearch(const AValue: string; const AFields: array of TField); var LSearch: string; LCount: integer; @@ -197,7 +197,7 @@ procedure TRagna.ToJson(out AJSON: TJSONArray); AJSON := FQuery.ToJSONArray; end; -procedure TRagna.UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject); +procedure TRagna.UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject); begin FQuery.FindById(AField, AValue).OpenUp.EditFromJson(ABody); end; diff --git a/src/helpers/Ragna.pas b/src/helpers/Ragna.pas index 078937e..c8987fe 100644 --- a/src/helpers/Ragna.pas +++ b/src/helpers/Ragna.pas @@ -7,13 +7,13 @@ interface type TRagnaHelper = class helper for TFDQuery public - function Paginate(AOffSet, ALimit: integer): TFDQuery; - function RadicalResearch(AValue: string; AFields: array of TField): TFDQuery; - function Remove(AField: TField; AValue: Int64): TFDQuery; - function FindById(AField: TField; AValue: Int64): TFDQuery; - function UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject): TFDQuery; - function New(ABody: TJSONObject): TFDQuery; overload; - function New(ABody: TJSONArray): TFDQuery; overload; + function Paginate(const AOffSet, ALimit: integer): TFDQuery; + function RadicalResearch(const AValue: string; const AFields: array of TField): TFDQuery; + function Remove(const AField: TField; const AValue: Int64): TFDQuery; + function FindById(const AField: TField; const AValue: Int64): TFDQuery; + function UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject): TFDQuery; + function New(const ABody: TJSONObject): TFDQuery; overload; + function New(const ABody: TJSONArray): TFDQuery; overload; function OpenUp: TFDQuery; function OpenEmpty: TFDQuery; function StartCriteria: TFDQuery; deprecated; @@ -23,25 +23,25 @@ TRagnaHelper = class helper for TFDQuery function ToJson(out AJSON: TJSONObject): TFDQuery; overload; function EditFromJson(const AJSON: TJSONObject): TFDQuery; overload; function EditFromJson(const AJSON: TJSONArray): TFDQuery; overload; - function Where(AField: string): TFDQuery; overload; - function Where(AField: TField): TFDQuery; overload; - function Where(AValue: Boolean): TFDQuery; overload; - function &Or(AField: TField): TFDQuery; overload; - function &Or(AField: string): TFDQuery; overload; - function &And(AField: TField): TFDQuery; overload; - function &And(AField: string): TFDQuery; overload; - function Like(AValue: string): TFDQuery; - function &Equals(AValue: Int64): TFDQuery; overload; - function &Equals(AValue: Boolean): TFDQuery; overload; - function &Equals(AValue: string): TFDQuery; overload; - function Order(AField: TField): TFDQuery; + function Where(const AField: string): TFDQuery; overload; + function Where(const AField: TField): TFDQuery; overload; + function Where(const AValue: Boolean): TFDQuery; overload; + function &Or(const AField: TField): TFDQuery; overload; + function &Or(const AField: string): TFDQuery; overload; + function &And(const AField: TField): TFDQuery; overload; + function &And(const AField: string): TFDQuery; overload; + function Like(const AValue: string): TFDQuery; + function &Equals(const AValue: Int64): TFDQuery; overload; + function &Equals(const AValue: Boolean): TFDQuery; overload; + function &Equals(const AValue: string): TFDQuery; overload; + function Order(const AField: TField): TFDQuery; end; implementation uses System.SysUtils; -function TRagnaHelper.&Or(AField: TField): TFDQuery; +function TRagnaHelper.&Or(const AField: TField): TFDQuery; var LRagna: TRagna; begin @@ -54,7 +54,7 @@ function TRagnaHelper.&Or(AField: TField): TFDQuery; Result := Self; end; -function TRagnaHelper.&And(AField: TField): TFDQuery; +function TRagnaHelper.&And(const AField: TField): TFDQuery; var LRagna: TRagna; begin @@ -67,7 +67,7 @@ function TRagnaHelper.&And(AField: TField): TFDQuery; Result := Self; end; -function TRagnaHelper.&And(AField: string): TFDQuery; +function TRagnaHelper.&And(const AField: string): TFDQuery; var LRagna: TRagna; begin @@ -80,7 +80,7 @@ function TRagnaHelper.&And(AField: string): TFDQuery; Result := Self; end; -function TRagnaHelper.&Or(AField: string): TFDQuery; +function TRagnaHelper.&Or(const AField: string): TFDQuery; var LRagna: TRagna; begin @@ -93,7 +93,7 @@ function TRagnaHelper.&Or(AField: string): TFDQuery; Result := Self; end; -function TRagnaHelper.Remove(AField: TField; AValue: Int64): TFDQuery; +function TRagnaHelper.Remove(const AField: TField; const AValue: Int64): TFDQuery; var LRagna: TRagna; begin @@ -132,7 +132,7 @@ function TRagnaHelper.EndCriteria: TFDQuery; Result := Self; end; -function TRagnaHelper.Equals(AValue: string): TFDQuery; +function TRagnaHelper.Equals(const AValue: string): TFDQuery; var LRagna: TRagna; begin @@ -145,7 +145,7 @@ function TRagnaHelper.Equals(AValue: string): TFDQuery; Result := Self; end; -function TRagnaHelper.Equals(AValue: Boolean): TFDQuery; +function TRagnaHelper.Equals(const AValue: Boolean): TFDQuery; var LRagna: TRagna; begin @@ -158,7 +158,7 @@ function TRagnaHelper.Equals(AValue: Boolean): TFDQuery; Result := Self; end; -function TRagnaHelper.Equals(AValue: Int64): TFDQuery; +function TRagnaHelper.Equals(const AValue: Int64): TFDQuery; var LRagna: TRagna; begin @@ -171,7 +171,7 @@ function TRagnaHelper.Equals(AValue: Int64): TFDQuery; Result := Self; end; -function TRagnaHelper.FindById(AField: TField; AValue: Int64): TFDQuery; +function TRagnaHelper.FindById(const AField: TField; const AValue: Int64): TFDQuery; var LRagna: TRagna; begin @@ -197,7 +197,7 @@ function TRagnaHelper.EditFromJson(const AJSON: TJSONObject): TFDQuery; Result := Self; end; -function TRagnaHelper.Like(AValue: string): TFDQuery; +function TRagnaHelper.Like(const AValue: string): TFDQuery; var LRagna: TRagna; begin @@ -210,7 +210,7 @@ function TRagnaHelper.Like(AValue: string): TFDQuery; Result := Self; end; -function TRagnaHelper.New(ABody: TJSONArray): TFDQuery; +function TRagnaHelper.New(const ABody: TJSONArray): TFDQuery; var LRagna: TRagna; begin @@ -249,7 +249,7 @@ function TRagnaHelper.OpenUp: TFDQuery; Result := Self; end; -function TRagnaHelper.Order(AField: TField): TFDQuery; +function TRagnaHelper.Order(const AField: TField): TFDQuery; var LRagna: TRagna; begin @@ -262,7 +262,7 @@ function TRagnaHelper.Order(AField: TField): TFDQuery; Result := Self; end; -function TRagnaHelper.Paginate(AOffSet, ALimit: integer): TFDQuery; +function TRagnaHelper.Paginate(const AOffSet, ALimit: integer): TFDQuery; var LRagna: TRagna; begin @@ -275,7 +275,7 @@ function TRagnaHelper.Paginate(AOffSet, ALimit: integer): TFDQuery; Result := Self; end; -function TRagnaHelper.New(ABody: TJSONObject): TFDQuery; +function TRagnaHelper.New(const ABody: TJSONObject): TFDQuery; var LRagna: TRagna; begin @@ -288,7 +288,7 @@ function TRagnaHelper.New(ABody: TJSONObject): TFDQuery; Result := Self; end; -function TRagnaHelper.RadicalResearch(AValue: string; AFields: array of TField): TFDQuery; +function TRagnaHelper.RadicalResearch(const AValue: string; const AFields: array of TField): TFDQuery; var LRagna: TRagna; begin @@ -353,7 +353,7 @@ function TRagnaHelper.ToJson(out AJSON: TJSONArray): TFDQuery; Result := Self; end; -function TRagnaHelper.UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject): TFDQuery; +function TRagnaHelper.UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject): TFDQuery; var LRagna: TRagna; begin @@ -366,7 +366,7 @@ function TRagnaHelper.UpdateById(AField: TField; AValue: Int64; ABody: TJSONObje Result := Self; end; -function TRagnaHelper.Where(AField: string): TFDQuery; +function TRagnaHelper.Where(const AField: string): TFDQuery; var LRagna: TRagna; begin @@ -379,7 +379,7 @@ function TRagnaHelper.Where(AField: string): TFDQuery; Result := Self; end; -function TRagnaHelper.Where(AValue: Boolean): TFDQuery; +function TRagnaHelper.Where(const AValue: Boolean): TFDQuery; var LRagna: TRagna; begin @@ -392,7 +392,7 @@ function TRagnaHelper.Where(AValue: Boolean): TFDQuery; Result := Self; end; -function TRagnaHelper.Where(AField: TField): TFDQuery; +function TRagnaHelper.Where(const AField: TField): TFDQuery; var LRagna: TRagna; begin diff --git a/src/interfaces/Ragna.Criteria.Intf.pas b/src/interfaces/Ragna.Criteria.Intf.pas index b48947b..8224aed 100644 --- a/src/interfaces/Ragna.Criteria.Intf.pas +++ b/src/interfaces/Ragna.Criteria.Intf.pas @@ -7,18 +7,18 @@ interface type ICriteria = interface ['{BC7603D3-DB7D-4A61-AA73-E1152A933E07}'] - procedure Where(AField: string); overload; - procedure Where(AField: TField); overload; - procedure Where(AValue: Boolean); overload; - procedure &Or(AField: string); overload; - procedure &Or(AField: TField); overload; - procedure &And(AField: string); overload; - procedure &And(AField: TField); overload; - procedure Like(AValue: string); - procedure &Equals(AValue: Int64); overload; - procedure &Equals(AValue: Boolean); overload; - procedure &Equals(AValue: string); overload; - procedure Order(AField: TField); + procedure Where(const AField: string); overload; + procedure Where(const AField: TField); overload; + procedure Where(const AValue: Boolean); overload; + procedure &Or(const AField: string); overload; + procedure &Or(const AField: TField); overload; + procedure &And(const AField: string); overload; + procedure &And(const AField: TField); overload; + procedure Like(const AValue: string); + procedure &Equals(const AValue: Int64); overload; + procedure &Equals(const AValue: Boolean); overload; + procedure &Equals(const AValue: string); overload; + procedure Order(const AField: TField); end; implementation diff --git a/src/interfaces/Ragna.Intf.pas b/src/interfaces/Ragna.Intf.pas index 96e2720..5cb686a 100644 --- a/src/interfaces/Ragna.Intf.pas +++ b/src/interfaces/Ragna.Intf.pas @@ -7,13 +7,13 @@ interface type IRagna = interface ['{0F1AD1E9-A82C-44BE-9208-685B9C3C77F9}'] - procedure Paginate(AOffSet, ALimit: Integer); - procedure RadicalResearch(AValue: string; AFields: array of TField); - procedure Remove(AField: TField; AValue: Int64); - procedure FindById(AField: TField; AValue: Int64); - procedure UpdateById(AField: TField; AValue: Int64; ABody: TJSONObject); - procedure New(ABody: TJSONObject); overload; - procedure New(ABody: TJSONArray); overload; + procedure Paginate(const AOffSet, ALimit: Integer); + procedure RadicalResearch(const AValue: string; const AFields: array of TField); + procedure Remove(const AField: TField; const AValue: Int64); + procedure FindById(const AField: TField; const AValue: Int64); + procedure UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject); + procedure New(const ABody: TJSONObject); overload; + procedure New(const ABody: TJSONArray); overload; procedure OpenUp; procedure OpenEmpty; procedure StartCriteria; deprecated; diff --git a/src/state/Ragna.State.pas b/src/state/Ragna.State.pas index 6262176..f5315c6 100644 --- a/src/state/Ragna.State.pas +++ b/src/state/Ragna.State.pas @@ -17,8 +17,8 @@ TRagnaState = class public destructor Destroy; override; property States: TListQueryAndSql read FStates write FStates; - procedure SetState(AQuery: TFDQuery; ASQL: string); - function GetState(AQuery: TFDQuery; out ASQL: string): Boolean; + procedure SetState(const AQuery: TFDQuery; const ASQL: string); + function GetState(const AQuery: TFDQuery; out ASQL: string): Boolean; class function GetInstance: TRagnaState; class procedure Release; constructor Create; @@ -46,7 +46,7 @@ class function TRagnaState.GetInstance: TRagnaState; Result := FInstance; end; -function TRagnaState.GetState(AQuery: TFDQuery; out ASQL: string): Boolean; +function TRagnaState.GetState(const AQuery: TFDQuery; out ASQL: string): Boolean; begin TMonitor.Enter(FStates); try @@ -74,7 +74,7 @@ class procedure TRagnaState.Release; FInstance.Free; end; -procedure TRagnaState.SetState(AQuery: TFDQuery; ASQL: string); +procedure TRagnaState.SetState(const AQuery: TFDQuery; const ASQL: string); begin TMonitor.Enter(FStates); try From e660811d351aef7b5bf44d26b58cdeeb06fca746 Mon Sep 17 00:00:00 2001 From: viniciussanchez Date: Wed, 15 Apr 2020 14:34:29 -0300 Subject: [PATCH 27/45] Remove StartCriteria --- src/core/Ragna.Impl.pas | 6 ------ src/helpers/Ragna.pas | 14 -------------- src/interfaces/Ragna.Intf.pas | 1 - 3 files changed, 21 deletions(-) diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index 3c45e3a..5cb82bb 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -25,7 +25,6 @@ TRagna = class(TInterfacedObject, IRagna) procedure New(const ABody: TJSONArray); overload; procedure OpenUp; procedure OpenEmpty; - procedure StartCriteria; deprecated; procedure EndCriteria; deprecated; procedure Reset; procedure ToJson(out AJSON: TJSONArray); overload; @@ -180,11 +179,6 @@ procedure TRagna.Reset; FQuery.SQL.Text := LSql; end; -procedure TRagna.StartCriteria; -begin -// SaveState; -end; - procedure TRagna.ToJson(out AJSON: TJSONObject); begin if FQuery.IsEmpty then diff --git a/src/helpers/Ragna.pas b/src/helpers/Ragna.pas index c8987fe..70f41e9 100644 --- a/src/helpers/Ragna.pas +++ b/src/helpers/Ragna.pas @@ -16,7 +16,6 @@ TRagnaHelper = class helper for TFDQuery function New(const ABody: TJSONArray): TFDQuery; overload; function OpenUp: TFDQuery; function OpenEmpty: TFDQuery; - function StartCriteria: TFDQuery; deprecated; function EndCriteria: TFDQuery; deprecated; function Reset: TFDQuery; function ToJson(out AJSON: TJSONArray): TFDQuery; overload; @@ -314,19 +313,6 @@ function TRagnaHelper.Reset: TFDQuery; Result := Self; end; -function TRagnaHelper.StartCriteria: TFDQuery; -var - LRagna: TRagna; -begin - LRagna := TRagna.Create(Self); - try - LRagna.StartCriteria; - finally - LRagna.Free; - end; - Result := Self; -end; - function TRagnaHelper.ToJson(out AJSON: TJSONObject): TFDQuery; var LRagna: TRagna; diff --git a/src/interfaces/Ragna.Intf.pas b/src/interfaces/Ragna.Intf.pas index 5cb686a..0ca33c1 100644 --- a/src/interfaces/Ragna.Intf.pas +++ b/src/interfaces/Ragna.Intf.pas @@ -16,7 +16,6 @@ interface procedure New(const ABody: TJSONArray); overload; procedure OpenUp; procedure OpenEmpty; - procedure StartCriteria; deprecated; procedure EndCriteria; deprecated; procedure Reset; procedure ToJson(out AJSON: TJSONArray); overload; From a40ef007fddc79ecaa9fb3a508d79ccb1968474d Mon Sep 17 00:00:00 2001 From: viniciussanchez Date: Wed, 15 Apr 2020 14:45:03 -0300 Subject: [PATCH 28/45] Removed EndCriteria --- src/core/Ragna.Impl.pas | 28 +++++++--------------------- src/helpers/Ragna.pas | 18 ++---------------- src/interfaces/Ragna.Intf.pas | 1 - 3 files changed, 9 insertions(+), 38 deletions(-) diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index 5cb82bb..eb1dd38 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -16,7 +16,7 @@ TRagna = class(TInterfacedObject, IRagna) function HasField(const AFields: array of TField): Boolean; procedure RaiseNotFound; public - procedure Paginate(const AOffSet, ALimit: integer); + procedure Paginate(const AOffSet, ALimit: Integer); procedure RadicalResearch(const AValue: string; const AFields: array of TField); procedure Remove(const AField: TField; const AValue: Int64); procedure FindById(const AField: TField; const AValue: Int64); @@ -25,7 +25,6 @@ TRagna = class(TInterfacedObject, IRagna) procedure New(const ABody: TJSONArray); overload; procedure OpenUp; procedure OpenEmpty; - procedure EndCriteria; deprecated; procedure Reset; procedure ToJson(out AJSON: TJSONArray); overload; procedure ToJson(out AJSON: TJSONObject); overload; @@ -54,7 +53,7 @@ procedure TRagna.Remove(const AField: TField; const AValue: Int64); DELETE_SQL = 'DELETE FROM %s WHERE %s = :ID'; DELETED: array [0 .. 1] of Boolean = (False, True); var - LDeleted: integer; + LDeleted: Integer; LSql: string; begin OpenEmpty; @@ -71,14 +70,10 @@ destructor TRagna.Destroy; procedure TRagna.SaveState; var - LKey: TFDQuery; LSql: string; - LRagnaState: TRagnaState; begin - LKey := FQuery; - LRagnaState := TRagnaState.GetInstance; - if not LRagnaState.GetState(LKey, LSql) then - LRagnaState.SetState(LKey, FQuery.SQL.Text); + if not TRagnaState.GetInstance.GetState(FQuery, LSql) then + TRagnaState.GetInstance.SetState(FQuery, FQuery.SQL.Text); end; procedure TRagna.EditFromJson(const AJSON: TJSONArray); @@ -86,11 +81,6 @@ procedure TRagna.EditFromJson(const AJSON: TJSONArray); FQuery.LoadFromJSON(AJSON); end; -procedure TRagna.EndCriteria; -begin - Reset; -end; - procedure TRagna.FindById(const AField: TField; const AValue: Int64); var LField: string; @@ -131,7 +121,7 @@ procedure TRagna.OpenEmpty; FQuery.Where('1').Equals('2').OpenUp; end; -procedure TRagna.Paginate(const AOffSet, ALimit: integer); +procedure TRagna.Paginate(const AOffSet, ALimit: Integer); begin if AOffSet > 0 then FQuery.FetchOptions.RecsSkip := AOffSet; @@ -148,7 +138,7 @@ procedure TRagna.New(const ABody: TJSONObject); procedure TRagna.RadicalResearch(const AValue: string; const AFields: array of TField); var LSearch: string; - LCount: integer; + LCount: Integer; begin if HasField(AFields) and not AValue.IsEmpty then begin @@ -169,13 +159,9 @@ procedure TRagna.RaiseNotFound; procedure TRagna.Reset; var - LKey: TFDQuery; LSql: string; - LRagnaState: TRagnaState; begin - LKey := FQuery; - LRagnaState := TRagnaState.GetInstance; - LRagnaState.GetState(LKey, LSql); + TRagnaState.GetInstance.GetState(FQuery, LSql); FQuery.SQL.Text := LSql; end; diff --git a/src/helpers/Ragna.pas b/src/helpers/Ragna.pas index 70f41e9..1b4120b 100644 --- a/src/helpers/Ragna.pas +++ b/src/helpers/Ragna.pas @@ -7,7 +7,7 @@ interface type TRagnaHelper = class helper for TFDQuery public - function Paginate(const AOffSet, ALimit: integer): TFDQuery; + function Paginate(const AOffSet, ALimit: Integer): TFDQuery; function RadicalResearch(const AValue: string; const AFields: array of TField): TFDQuery; function Remove(const AField: TField; const AValue: Int64): TFDQuery; function FindById(const AField: TField; const AValue: Int64): TFDQuery; @@ -16,7 +16,6 @@ TRagnaHelper = class helper for TFDQuery function New(const ABody: TJSONArray): TFDQuery; overload; function OpenUp: TFDQuery; function OpenEmpty: TFDQuery; - function EndCriteria: TFDQuery; deprecated; function Reset: TFDQuery; function ToJson(out AJSON: TJSONArray): TFDQuery; overload; function ToJson(out AJSON: TJSONObject): TFDQuery; overload; @@ -118,19 +117,6 @@ function TRagnaHelper.EditFromJson(const AJSON: TJSONArray): TFDQuery; Result := Self; end; -function TRagnaHelper.EndCriteria: TFDQuery; -var - LRagna: TRagna; -begin - LRagna := TRagna.Create(Self); - try - LRagna.EndCriteria; - finally - LRagna.Free; - end; - Result := Self; -end; - function TRagnaHelper.Equals(const AValue: string): TFDQuery; var LRagna: TRagna; @@ -261,7 +247,7 @@ function TRagnaHelper.Order(const AField: TField): TFDQuery; Result := Self; end; -function TRagnaHelper.Paginate(const AOffSet, ALimit: integer): TFDQuery; +function TRagnaHelper.Paginate(const AOffSet, ALimit: Integer): TFDQuery; var LRagna: TRagna; begin diff --git a/src/interfaces/Ragna.Intf.pas b/src/interfaces/Ragna.Intf.pas index 0ca33c1..0937cd7 100644 --- a/src/interfaces/Ragna.Intf.pas +++ b/src/interfaces/Ragna.Intf.pas @@ -16,7 +16,6 @@ interface procedure New(const ABody: TJSONArray); overload; procedure OpenUp; procedure OpenEmpty; - procedure EndCriteria; deprecated; procedure Reset; procedure ToJson(out AJSON: TJSONArray); overload; procedure ToJson(out AJSON: TJSONObject); overload; From 6cbf0d2685d9dbbde5629d491d5aa86ea14da175 Mon Sep 17 00:00:00 2001 From: viniciussanchez Date: Wed, 15 Apr 2020 14:52:13 -0300 Subject: [PATCH 29/45] Added overload Order method --- src/core/Ragna.Criteria.Impl.pas | 16 ++++++++++++---- src/interfaces/Ragna.Criteria.Intf.pas | 3 ++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/core/Ragna.Criteria.Impl.pas b/src/core/Ragna.Criteria.Impl.pas index 0c8ddea..1a42ae6 100644 --- a/src/core/Ragna.Criteria.Impl.pas +++ b/src/core/Ragna.Criteria.Impl.pas @@ -20,7 +20,8 @@ TDefaultCriteria = class(TInterfacedObject, ICriteria) procedure &Equals(const AValue: Int64); overload; procedure &Equals(const AValue: Boolean); overload; procedure &Equals(const AValue: string); overload; - procedure Order(const AField: TField); + procedure Order(const AField: string); overload; + procedure Order(const AField: TField); overload; constructor Create(const AQuery: TFDQuery); end; @@ -40,14 +41,14 @@ implementation procedure TDefaultCriteria.&And(const AField: string); const - PHRASE = ' %s %s'; + PHRASE = '%s %s'; begin FQuery.SQL.Add(Format(PHRASE, [otAnd.ToString, AField])); end; procedure TDefaultCriteria.&And(const AField: TField); const - PHRASE = ' %s %s'; + PHRASE = '%s %s'; begin FQuery.SQL.Add(Format(PHRASE, [otAnd.ToString, AField.Origin])); end; @@ -129,11 +130,18 @@ procedure TDefaultCriteria.Where(const AValue: Boolean); procedure TDefaultCriteria.&Or(const AField: TField); const - PHRASE = ' %s %s'; + PHRASE = '%s %s'; begin FQuery.SQL.Add(Format(PHRASE, [otOr.ToString, AField.Origin])); end; +procedure TDefaultCriteria.Order(const AField: string); +const + PHRASE = '%s %s'; +begin + FQuery.SQL.Add(Format(PHRASE, [otOrder.ToString, AField])); +end; + constructor TManagerCriteria.Create(const AQuery: TFDQuery); begin FCriteria := GetInstanceCriteria(AQuery); diff --git a/src/interfaces/Ragna.Criteria.Intf.pas b/src/interfaces/Ragna.Criteria.Intf.pas index 8224aed..1246d0a 100644 --- a/src/interfaces/Ragna.Criteria.Intf.pas +++ b/src/interfaces/Ragna.Criteria.Intf.pas @@ -18,7 +18,8 @@ interface procedure &Equals(const AValue: Int64); overload; procedure &Equals(const AValue: Boolean); overload; procedure &Equals(const AValue: string); overload; - procedure Order(const AField: TField); + procedure Order(const AField: string); overload; + procedure Order(const AField: TField); overload; end; implementation From a5aafb0f882f3276668e1b2e52c11068ae25e3d5 Mon Sep 17 00:00:00 2001 From: viniciussanchez Date: Wed, 15 Apr 2020 15:00:33 -0300 Subject: [PATCH 30/45] Criteria improvements --- src/core/Ragna.Criteria.Impl.pas | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/core/Ragna.Criteria.Impl.pas b/src/core/Ragna.Criteria.Impl.pas index 1a42ae6..0e2a33b 100644 --- a/src/core/Ragna.Criteria.Impl.pas +++ b/src/core/Ragna.Criteria.Impl.pas @@ -47,10 +47,8 @@ procedure TDefaultCriteria.&And(const AField: string); end; procedure TDefaultCriteria.&And(const AField: TField); -const - PHRASE = '%s %s'; begin - FQuery.SQL.Add(Format(PHRASE, [otAnd.ToString, AField.Origin])); + Self.And(AField.Origin); end; procedure TDefaultCriteria.&Or(const AField: string); @@ -80,10 +78,8 @@ procedure TDefaultCriteria.Equals(const AValue: Int64); end; procedure TDefaultCriteria.Where(const AField: TField); -const - PHRASE = '%s %s'; begin - FQuery.SQL.Add(Format(PHRASE, [otWhere.ToString, AField.Origin])); + Self.Where(AField.Origin); end; procedure TDefaultCriteria.Equals(const AValue: Boolean); @@ -108,10 +104,8 @@ procedure TDefaultCriteria.Like(const AValue: string); end; procedure TDefaultCriteria.Order(const AField: TField); -const - PHRASE = '%s %s'; begin - FQuery.SQL.Add(Format(PHRASE, [otOrder.ToString, AField.Origin])); + Self.Order(AField.Origin); end; procedure TDefaultCriteria.Where(const AField: string); @@ -122,17 +116,13 @@ procedure TDefaultCriteria.Where(const AField: string); end; procedure TDefaultCriteria.Where(const AValue: Boolean); -const - PHRASE = '%s %s'; begin - FQuery.SQL.Add(Format(PHRASE, [otWhere.ToString, BoolToStr(AValue, True)])); + Self.Where(BoolToStr(AValue, True)); end; procedure TDefaultCriteria.&Or(const AField: TField); -const - PHRASE = '%s %s'; begin - FQuery.SQL.Add(Format(PHRASE, [otOr.ToString, AField.Origin])); + Self.Or(AField.Origin); end; procedure TDefaultCriteria.Order(const AField: string); From 46cbd661e788a1662af17657e8e072bab467221f Mon Sep 17 00:00:00 2001 From: viniciussanchez Date: Wed, 15 Apr 2020 15:20:50 -0300 Subject: [PATCH 31/45] Improvements --- src/core/Ragna.Criteria.Impl.pas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/Ragna.Criteria.Impl.pas b/src/core/Ragna.Criteria.Impl.pas index 0e2a33b..b8e0b6e 100644 --- a/src/core/Ragna.Criteria.Impl.pas +++ b/src/core/Ragna.Criteria.Impl.pas @@ -48,7 +48,7 @@ procedure TDefaultCriteria.&And(const AField: string); procedure TDefaultCriteria.&And(const AField: TField); begin - Self.And(AField.Origin); + Self.&And(AField.Origin); end; procedure TDefaultCriteria.&Or(const AField: string); @@ -122,7 +122,7 @@ procedure TDefaultCriteria.Where(const AValue: Boolean); procedure TDefaultCriteria.&Or(const AField: TField); begin - Self.Or(AField.Origin); + Self.&Or(AField.Origin); end; procedure TDefaultCriteria.Order(const AField: string); From 0d6662d92bf5f90b413ff4179b1e49d77cb2b958 Mon Sep 17 00:00:00 2001 From: viniciussanchez Date: Wed, 15 Apr 2020 15:25:59 -0300 Subject: [PATCH 32/45] Update gitignore --- .gitignore | 58 +++++++++++++++++++++++++++++++++++++++++------------ ragna.res | Bin 0 -> 616 bytes 2 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 ragna.res diff --git a/.gitignore b/.gitignore index 5d2aa5d..acd27c1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,32 @@ -dist/ -**/Win32/ -**/Win64/ -**/Linux64/ -**/__history/ -**/__recovery/ -src/*.~* -*.res +# Uncomment these types if you want even more clean repository. But be careful. +# It can make harm to an existing project source. Read explanations below. +# +# Resource files are binaries containing manifest, project icon and version info. +# They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. +#*.res +# +# Type library file (binary). In old Delphi versions it should be stored. +# Since Delphi 2009 it is produced from .ridl file and can safely be ignored. +#*.tlb +# +# Diagram Portfolio file. Used by the diagram editor up to Delphi 7. +# Uncomment this if you are not using diagrams or use newer Delphi version. +#*.ddp +# +# Visual LiveBindings file. Added in Delphi XE2. +# Uncomment this if you are not using LiveBindings Designer. +#*.vlb +# +# Deployment Manager configuration file for your project. Added in Delphi XE2. +# Uncomment this if it is not mobile development and you do not use remote debug feature. +#*.deployproj +# +# C++ object files produced when C/C++ Output file generation is configured. +# Uncomment this if you are not using external objects (zlib library for example). +#*.obj +# + +# Delphi compiler-generated binaries (safe to delete) *.exe *.dll *.bpl @@ -23,15 +44,26 @@ src/*.~* *.a *.o *.ocx + +# Delphi autogenerated files (duplicated info) +*.cfg +*.hpp +*Resource.rc + +# Delphi local files (user-specific info) *.local *.identcache *.projdata *.tvsconfig *.dsk -*.dcu -*.exe -*.so + +# Delphi history and backups +__history/ +__recovery/ *.~* -*.a + +# Castalia statistics file (since XE7 Castalia is distributed with Delphi) *.stat -/modules/ \ No newline at end of file + +# Boss dependency manager vendor folder https://github.com/HashLoad/boss +modules/ \ No newline at end of file diff --git a/ragna.res b/ragna.res new file mode 100644 index 0000000000000000000000000000000000000000..d07df7cf15e08673f7f2594611b59a19cde0132d GIT binary patch literal 616 zcmZXSPfNo<5XE04i1p;jvj>kN6><>-DO7F2Kc$9VOKqbB+Kt5e@%%O(dh;6?e>-t$ z+AhpwcJ|HNw=82ifdVEB=o6;JCu7>W~-TtE1FrJJbVFhq>R;`IKqZtND-kx&8r<5K{dB literal 0 HcmV?d00001 From 10ef5e97138f361362c2e53a690af40c36552309 Mon Sep 17 00:00:00 2001 From: viniciussanchez Date: Sat, 16 May 2020 10:39:04 -0300 Subject: [PATCH 33/45] Implement ToJSONObject and ToJSONArray #4 --- ragna.dproj | 149 +++++++++++++++++++++++++++++++++- src/core/Ragna.Impl.pas | 26 ++++-- src/interfaces/Ragna.Intf.pas | 6 +- 3 files changed, 169 insertions(+), 12 deletions(-) diff --git a/ragna.dproj b/ragna.dproj index 7e0453e..382377c 100644 --- a/ragna.dproj +++ b/ragna.dproj @@ -2,7 +2,7 @@ {D9E8CA95-FBB1-42EA-A7B4-909AC5ACFADD} ragna.dpk - 18.7 + 18.8 None True Debug @@ -18,6 +18,11 @@ Base true + + true + Base + true + true Base @@ -53,12 +58,21 @@ All true ragna - modules\.dcp;modules\.dcu;modules;modules\dataset-serialize\samples\src;modules\dataset-serialize\src\core;modules\dataset-serialize\src\helpers;modules\dataset-serialize\src\providers;modules\dataset-serialize\src\singletons;modules\dataset-serialize\src\types;$(DCC_UnitSearchPath) + $(DCC_UnitSearchPath);modules\.dcp;modules\.dcu;modules;modules\dataset-serialize\samples\src;modules\dataset-serialize\src\core;modules\dataset-serialize\src\helpers;modules\dataset-serialize\src\providers;modules\dataset-serialize\src\singletons;modules\dataset-serialize\src\types None android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services-ads-7.0.0.dex.jar;google-play-services-analytics-7.0.0.dex.jar;google-play-services-base-7.0.0.dex.jar;google-play-services-identity-7.0.0.dex.jar;google-play-services-maps-7.0.0.dex.jar;google-play-services-panorama-7.0.0.dex.jar;google-play-services-plus-7.0.0.dex.jar;google-play-services-wallet-7.0.0.dex.jar + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + true + Base + true + None + android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services-ads-7.0.0.dex.jar;google-play-services-analytics-7.0.0.dex.jar;google-play-services-base-7.0.0.dex.jar;google-play-services-identity-7.0.0.dex.jar;google-play-services-maps-7.0.0.dex.jar;google-play-services-panorama-7.0.0.dex.jar;google-play-services-plus-7.0.0.dex.jar;google-play-services-wallet-7.0.0.dex.jar + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug @@ -178,12 +192,20 @@ classes 1 + + classes + 1 + res\xml 1 + + res\xml + 1 + @@ -196,138 +218,242 @@ library\lib\armeabi 1 + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + library\lib\mips 1 + + library\lib\mips + 1 + library\lib\armeabi-v7a 1 + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + res\drawable 1 + + res\drawable + 1 + res\values 1 + + res\values + 1 + res\values-v21 1 + + res\values-v21 + 1 + res\values 1 + + res\values + 1 + res\drawable 1 + + res\drawable + 1 + res\drawable-xxhdpi 1 + + res\drawable-xxhdpi + 1 + res\drawable-ldpi 1 + + res\drawable-ldpi + 1 + res\drawable-mdpi 1 + + res\drawable-mdpi + 1 + res\drawable-hdpi 1 + + res\drawable-hdpi + 1 + res\drawable-xhdpi 1 + + res\drawable-xhdpi + 1 + res\drawable-mdpi 1 + + res\drawable-mdpi + 1 + res\drawable-hdpi 1 + + res\drawable-hdpi + 1 + res\drawable-xhdpi 1 + + res\drawable-xhdpi + 1 + res\drawable-xxhdpi 1 + + res\drawable-xxhdpi + 1 + res\drawable-xxxhdpi 1 + + res\drawable-xxxhdpi + 1 + res\drawable-small 1 + + res\drawable-small + 1 + res\drawable-normal 1 + + res\drawable-normal + 1 + res\drawable-large 1 + + res\drawable-large + 1 + res\drawable-xlarge 1 + + res\drawable-xlarge + 1 + res\values 1 + + res\values + 1 + @@ -397,6 +523,9 @@ 0 + + 0 + 0 @@ -728,6 +857,9 @@ 1 + + 1 + @@ -771,6 +903,10 @@ library\lib\armeabi-v7a 1 + + library\lib\arm64-v8a + 1 + 1 @@ -793,6 +929,12 @@ 0 + + + library\lib\armeabi-v7a + 1 + + 1 @@ -830,10 +972,11 @@ + False - False + False True False diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index eb1dd38..82c289b 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -16,6 +16,9 @@ TRagna = class(TInterfacedObject, IRagna) function HasField(const AFields: array of TField): Boolean; procedure RaiseNotFound; public + constructor Create(const AQuery: TFDQuery); + property Query: TFDQuery read FQuery write FQuery; + property Criteria: ICriteria read FCriteria write FCriteria; procedure Paginate(const AOffSet, ALimit: Integer); procedure RadicalResearch(const AValue: string; const AFields: array of TField); procedure Remove(const AField: TField; const AValue: Int64); @@ -26,14 +29,13 @@ TRagna = class(TInterfacedObject, IRagna) procedure OpenUp; procedure OpenEmpty; procedure Reset; - procedure ToJson(out AJSON: TJSONArray); overload; - procedure ToJson(out AJSON: TJSONObject); overload; + procedure ToJson(out AJSON: TJSONArray); overload; deprecated; + procedure ToJson(out AJSON: TJSONObject); overload; deprecated; procedure EditFromJson(const AJSON: TJSONObject); overload; procedure EditFromJson(const AJSON: TJSONArray); overload; - constructor Create(const AQuery: TFDQuery); + function ToJSONArray: TJSONArray; + function ToJSONObject: TJSONObject; destructor Destroy; override; - property Query: TFDQuery read FQuery write FQuery; - property Criteria: ICriteria read FCriteria write FCriteria; end; implementation @@ -166,15 +168,25 @@ procedure TRagna.Reset; end; procedure TRagna.ToJson(out AJSON: TJSONObject); +begin + AJSON := Self.ToJSONObject; +end; + +function TRagna.ToJSONArray: TJSONArray; +begin + Result := FQuery.ToJSONArray; +end; + +function TRagna.ToJSONObject: TJSONObject; begin if FQuery.IsEmpty then RaiseNotFound; - AJSON := FQuery.ToJSONObject; + Result := FQuery.ToJSONObject; end; procedure TRagna.ToJson(out AJSON: TJSONArray); begin - AJSON := FQuery.ToJSONArray; + AJSON := Self.ToJSONArray; end; procedure TRagna.UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject); diff --git a/src/interfaces/Ragna.Intf.pas b/src/interfaces/Ragna.Intf.pas index 0937cd7..54c51d7 100644 --- a/src/interfaces/Ragna.Intf.pas +++ b/src/interfaces/Ragna.Intf.pas @@ -17,9 +17,11 @@ interface procedure OpenUp; procedure OpenEmpty; procedure Reset; - procedure ToJson(out AJSON: TJSONArray); overload; - procedure ToJson(out AJSON: TJSONObject); overload; + procedure ToJson(out AJSON: TJSONArray); overload; deprecated; + procedure ToJson(out AJSON: TJSONObject); overload; deprecated; procedure EditFromJson(const AJSON: TJSONObject); + function ToJSONArray: TJSONArray; + function ToJSONObject: TJSONObject; end; implementation From 39b48819923de8292068fbb9d545bd6b09d70656 Mon Sep 17 00:00:00 2001 From: viniciussanchez Date: Sat, 16 May 2020 10:58:30 -0300 Subject: [PATCH 34/45] Improvements class helper --- src/core/Ragna.Criteria.Impl.pas | 2 +- src/core/Ragna.Impl.pas | 16 ++-- src/helpers/Ragna.pas | 142 +++++++++++-------------------- src/interfaces/Ragna.Intf.pas | 7 +- 4 files changed, 63 insertions(+), 104 deletions(-) diff --git a/src/core/Ragna.Criteria.Impl.pas b/src/core/Ragna.Criteria.Impl.pas index b8e0b6e..9b18ebb 100644 --- a/src/core/Ragna.Criteria.Impl.pas +++ b/src/core/Ragna.Criteria.Impl.pas @@ -8,7 +8,6 @@ interface TDefaultCriteria = class(TInterfacedObject, ICriteria) private FQuery: TFDQuery; - public procedure Where(const AField: string); overload; procedure Where(const AField: TField); overload; procedure Where(const AValue: Boolean); overload; @@ -22,6 +21,7 @@ TDefaultCriteria = class(TInterfacedObject, ICriteria) procedure &Equals(const AValue: string); overload; procedure Order(const AField: string); overload; procedure Order(const AField: TField); overload; + public constructor Create(const AQuery: TFDQuery); end; diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index 82c289b..f2e2671 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -14,11 +14,9 @@ TRagna = class(TInterfacedObject, IRagna) private function GetTableName: string; function HasField(const AFields: array of TField): Boolean; + function ToJSONObject: TJSONObject; + function ToJSONArray: TJSONArray; procedure RaiseNotFound; - public - constructor Create(const AQuery: TFDQuery); - property Query: TFDQuery read FQuery write FQuery; - property Criteria: ICriteria read FCriteria write FCriteria; procedure Paginate(const AOffSet, ALimit: Integer); procedure RadicalResearch(const AValue: string; const AFields: array of TField); procedure Remove(const AField: TField; const AValue: Int64); @@ -29,12 +27,14 @@ TRagna = class(TInterfacedObject, IRagna) procedure OpenUp; procedure OpenEmpty; procedure Reset; - procedure ToJson(out AJSON: TJSONArray); overload; deprecated; - procedure ToJson(out AJSON: TJSONObject); overload; deprecated; + procedure ToJson(out AJSON: TJSONArray); overload; + procedure ToJson(out AJSON: TJSONObject); overload; procedure EditFromJson(const AJSON: TJSONObject); overload; procedure EditFromJson(const AJSON: TJSONArray); overload; - function ToJSONArray: TJSONArray; - function ToJSONObject: TJSONObject; + public + constructor Create(const AQuery: TFDQuery); + property Query: TFDQuery read FQuery write FQuery; + property Criteria: ICriteria read FCriteria write FCriteria; destructor Destroy; override; end; diff --git a/src/helpers/Ragna.pas b/src/helpers/Ragna.pas index 1b4120b..485b9bb 100644 --- a/src/helpers/Ragna.pas +++ b/src/helpers/Ragna.pas @@ -17,8 +17,10 @@ TRagnaHelper = class helper for TFDQuery function OpenUp: TFDQuery; function OpenEmpty: TFDQuery; function Reset: TFDQuery; - function ToJson(out AJSON: TJSONArray): TFDQuery; overload; - function ToJson(out AJSON: TJSONObject): TFDQuery; overload; + function ToJson(out AJSON: TJSONArray): TFDQuery; overload; deprecated; + function ToJson(out AJSON: TJSONObject): TFDQuery; overload; deprecated; + function ToJSONObject: TJSONObject; + function ToJSONArray: TJSONArray; function EditFromJson(const AJSON: TJSONObject): TFDQuery; overload; function EditFromJson(const AJSON: TJSONArray): TFDQuery; overload; function Where(const AField: string): TFDQuery; overload; @@ -37,7 +39,7 @@ TRagnaHelper = class helper for TFDQuery implementation -uses System.SysUtils; +uses System.SysUtils, Ragna.Intf; function TRagnaHelper.&Or(const AField: TField): TFDQuery; var @@ -93,27 +95,19 @@ function TRagnaHelper.&Or(const AField: string): TFDQuery; function TRagnaHelper.Remove(const AField: TField; const AValue: Int64): TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.Remove(AField, AValue); - finally - LRagna.Free; - end; + LRagna.Remove(AField, AValue); Result := Self; end; function TRagnaHelper.EditFromJson(const AJSON: TJSONArray): TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.EditFromJson(AJSON); - finally - LRagna.Free; - end; + LRagna.EditFromJson(AJSON); Result := Self; end; @@ -122,11 +116,7 @@ function TRagnaHelper.Equals(const AValue: string): TFDQuery; LRagna: TRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.Criteria.Equals(AValue); - finally - LRagna.Free; - end; + LRagna.Criteria.Equals(AValue); Result := Self; end; @@ -158,27 +148,19 @@ function TRagnaHelper.Equals(const AValue: Int64): TFDQuery; function TRagnaHelper.FindById(const AField: TField; const AValue: Int64): TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.FindById(AField, AValue); - finally - LRagna.Free; - end; + LRagna.FindById(AField, AValue); Result := Self; end; function TRagnaHelper.EditFromJson(const AJSON: TJSONObject): TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.EditFromJson(AJSON); - finally - LRagna.Free; - end; + LRagna.EditFromJson(AJSON); Result := Self; end; @@ -197,40 +179,28 @@ function TRagnaHelper.Like(const AValue: string): TFDQuery; function TRagnaHelper.New(const ABody: TJSONArray): TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.New(ABody); - finally - LRagna.Free; - end; + LRagna.New(ABody); Result := Self; end; function TRagnaHelper.OpenEmpty: TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.OpenEmpty; - finally - LRagna.Free; - end; + LRagna.OpenEmpty; Result := Self; end; function TRagnaHelper.OpenUp: TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.OpenUp; - finally - LRagna.Free; - end; + LRagna.OpenUp; Result := Self; end; @@ -249,92 +219,80 @@ function TRagnaHelper.Order(const AField: TField): TFDQuery; function TRagnaHelper.Paginate(const AOffSet, ALimit: Integer): TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.Paginate(AOffSet, ALimit); - finally - LRagna.Free; - end; + LRagna.Paginate(AOffSet, ALimit); Result := Self; end; function TRagnaHelper.New(const ABody: TJSONObject): TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.New(ABody); - finally - LRagna.Free; - end; + LRagna.New(ABody); Result := Self; end; function TRagnaHelper.RadicalResearch(const AValue: string; const AFields: array of TField): TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.RadicalResearch(AValue, AFields); - finally - LRagna.Free; - end; + LRagna.RadicalResearch(AValue, AFields); Result := Self; end; function TRagnaHelper.Reset: TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.Reset; - finally - LRagna.Free; - end; + LRagna.Reset; Result := Self; end; function TRagnaHelper.ToJson(out AJSON: TJSONObject): TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.ToJson(AJSON); - finally - LRagna.Free; - end; + LRagna.ToJson(AJSON); Result := Self; end; +function TRagnaHelper.ToJSONArray: TJSONArray; +var + LRagna: IRagna; +begin + LRagna := TRagna.Create(Self); + Result := LRagna.ToJSONArray; +end; + +function TRagnaHelper.ToJSONObject: TJSONObject; +var + LRagna: IRagna; +begin + LRagna := TRagna.Create(Self); + Result := LRagna.ToJSONObject; +end; + function TRagnaHelper.ToJson(out AJSON: TJSONArray): TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.ToJson(AJSON); - finally - LRagna.Free; - end; + LRagna.ToJson(AJSON); Result := Self; end; function TRagnaHelper.UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject): TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.UpdateById(AField, AValue, ABody); - finally - LRagna.Free; - end; + LRagna.UpdateById(AField, AValue, ABody); Result := Self; end; diff --git a/src/interfaces/Ragna.Intf.pas b/src/interfaces/Ragna.Intf.pas index 54c51d7..9b3e885 100644 --- a/src/interfaces/Ragna.Intf.pas +++ b/src/interfaces/Ragna.Intf.pas @@ -17,9 +17,10 @@ interface procedure OpenUp; procedure OpenEmpty; procedure Reset; - procedure ToJson(out AJSON: TJSONArray); overload; deprecated; - procedure ToJson(out AJSON: TJSONObject); overload; deprecated; - procedure EditFromJson(const AJSON: TJSONObject); + procedure ToJson(out AJSON: TJSONArray); overload; + procedure ToJson(out AJSON: TJSONObject); overload; + procedure EditFromJson(const AJSON: TJSONObject); overload; + procedure EditFromJson(const AJSON: TJSONArray); overload; function ToJSONArray: TJSONArray; function ToJSONObject: TJSONObject; end; From 5eba059bd099c22f14bebb1dc1345c7aa899102a Mon Sep 17 00:00:00 2001 From: Valeir de Melo Date: Sat, 12 Sep 2020 10:30:52 -0400 Subject: [PATCH 35/45] fixing stack overflow in tojsonobject and tojsonarray --- src/core/Ragna.Impl.pas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index f2e2671..205c601 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -174,14 +174,14 @@ procedure TRagna.ToJson(out AJSON: TJSONObject); function TRagna.ToJSONArray: TJSONArray; begin - Result := FQuery.ToJSONArray; + Result := (FQuery as TDataSet).ToJSONArray; end; function TRagna.ToJSONObject: TJSONObject; begin if FQuery.IsEmpty then RaiseNotFound; - Result := FQuery.ToJSONObject; + Result := (FQuery as TDataSet).ToJSONObject; end; procedure TRagna.ToJson(out AJSON: TJSONArray); From c7c1297f736bf7fd3f102bed83a8ed0f4f89c5bd Mon Sep 17 00:00:00 2001 From: viniciussanchez Date: Wed, 7 Oct 2020 13:39:05 -0300 Subject: [PATCH 36/45] Owns false to load from json --- boss-lock.json | 4 ++-- boss.json | 2 +- ragna.dproj | 2 +- src/core/Ragna.Impl.pas | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/boss-lock.json b/boss-lock.json index 3a8be72..a662b7a 100644 --- a/boss-lock.json +++ b/boss-lock.json @@ -4,8 +4,8 @@ "installedModules": { "github.com/viniciussanchez/dataset-serialize": { "name": "dataset-serialize", - "version": "v2.0.3", - "hash": "0eef525d669652f4bb1468bfbdea879b", + "version": "v2.1.6", + "hash": "0c9bfe2d09c47c5d024995181983e2f2", "artifacts": {}, "failed": false, "changed": false diff --git a/boss.json b/boss.json index fdec0b7..4d5e8f1 100644 --- a/boss.json +++ b/boss.json @@ -6,6 +6,6 @@ "mainsrc": "src", "projects": [], "dependencies": { - "github.com/viniciussanchez/dataset-serialize": "^v2.0.3" + "github.com/viniciussanchez/dataset-serialize": "^v2.1.6" } } \ No newline at end of file diff --git a/ragna.dproj b/ragna.dproj index 382377c..8b0a179 100644 --- a/ragna.dproj +++ b/ragna.dproj @@ -58,7 +58,7 @@ All true ragna - $(DCC_UnitSearchPath);modules\.dcp;modules\.dcu;modules;modules\dataset-serialize\samples\src;modules\dataset-serialize\src\core;modules\dataset-serialize\src\helpers;modules\dataset-serialize\src\providers;modules\dataset-serialize\src\singletons;modules\dataset-serialize\src\types + $(DCC_UnitSearchPath);modules\.dcp;modules\.dcu;modules;modules\dataset-serialize\samples\basic\src;modules\dataset-serialize\samples\configuration\src;modules\dataset-serialize\samples\master-detail\src;modules\dataset-serialize\src\core;modules\dataset-serialize\src\helpers;modules\dataset-serialize\src\providers;modules\dataset-serialize\src\singletons;modules\dataset-serialize\src\types None diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index 205c601..a68d78a 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -80,7 +80,7 @@ procedure TRagna.SaveState; procedure TRagna.EditFromJson(const AJSON: TJSONArray); begin - FQuery.LoadFromJSON(AJSON); + FQuery.LoadFromJSON(AJSON, False); end; procedure TRagna.FindById(const AField: TField; const AValue: Int64); @@ -94,7 +94,7 @@ procedure TRagna.FindById(const AField: TField; const AValue: Int64); procedure TRagna.EditFromJson(const AJSON: TJSONObject); begin - FQuery.LoadFromJSON(AJSON); + FQuery.LoadFromJSON(AJSON, False); end; function TRagna.GetTableName: string; From 7686b99a1eb3fbd91e203fb2df42c484c8581203 Mon Sep 17 00:00:00 2001 From: "jmjardim05@hotmail.com" Date: Sat, 11 Sep 2021 17:24:20 -0300 Subject: [PATCH 37/45] fix UpdateById --- src/core/Ragna.Impl.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index a68d78a..c09b898 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -191,7 +191,7 @@ procedure TRagna.ToJson(out AJSON: TJSONArray); procedure TRagna.UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject); begin - FQuery.FindById(AField, AValue).OpenUp.EditFromJson(ABody); + FQuery.FindById(AField, AValue).OpenUp.MergeFromJSONObject(ABody, False); end; end. From 41c99602c9c85dd095bff4a49092719544eedf5f Mon Sep 17 00:00:00 2001 From: Vinicius Sanchez Date: Tue, 3 May 2022 14:19:17 -0300 Subject: [PATCH 38/45] #12 #8 --- .gitignore | 6 +- boss-lock.json | 8 +- boss.json | 2 +- ragna.dproj | 2 +- src/core/Ragna.Criteria.Impl.pas | 64 +++++++++----- src/core/Ragna.Impl.pas | 38 ++++++-- src/helpers/Ragna.pas | 116 ++++++++++++++----------- src/interfaces/Ragna.Criteria.Intf.pas | 7 +- src/interfaces/Ragna.Intf.pas | 4 + src/state/Ragna.State.pas | 23 ++--- src/types/Ragna.Types.pas | 20 +++-- 11 files changed, 180 insertions(+), 110 deletions(-) diff --git a/.gitignore b/.gitignore index acd27c1..469898e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,10 @@ # Uncomment these types if you want even more clean repository. But be careful. # It can make harm to an existing project source. Read explanations below. -# + # Resource files are binaries containing manifest, project icon and version info. # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. -#*.res -# +*.res + # Type library file (binary). In old Delphi versions it should be stored. # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. #*.tlb diff --git a/boss-lock.json b/boss-lock.json index a662b7a..fb8dd53 100644 --- a/boss-lock.json +++ b/boss-lock.json @@ -1,11 +1,11 @@ { - "hash": "d41d8cd98f00b204e9800998ecf8427e", - "updated": "2020-04-15T11:05:15.0912204-03:00", + "hash": "b14e6a77427d10f868e9622e3b2074b0", + "updated": "2022-05-03T11:38:24.2808549-03:00", "installedModules": { "github.com/viniciussanchez/dataset-serialize": { "name": "dataset-serialize", - "version": "v2.1.6", - "hash": "0c9bfe2d09c47c5d024995181983e2f2", + "version": "v2.4.0", + "hash": "f47b044fca0d9bb347f856798fb20cad", "artifacts": {}, "failed": false, "changed": false diff --git a/boss.json b/boss.json index 4d5e8f1..2652a9d 100644 --- a/boss.json +++ b/boss.json @@ -6,6 +6,6 @@ "mainsrc": "src", "projects": [], "dependencies": { - "github.com/viniciussanchez/dataset-serialize": "^v2.1.6" + "github.com/viniciussanchez/dataset-serialize": "^v2.4.0" } } \ No newline at end of file diff --git a/ragna.dproj b/ragna.dproj index 8b0a179..1cd83d9 100644 --- a/ragna.dproj +++ b/ragna.dproj @@ -58,7 +58,7 @@ All true ragna - $(DCC_UnitSearchPath);modules\.dcp;modules\.dcu;modules;modules\dataset-serialize\samples\basic\src;modules\dataset-serialize\samples\configuration\src;modules\dataset-serialize\samples\master-detail\src;modules\dataset-serialize\src\core;modules\dataset-serialize\src\helpers;modules\dataset-serialize\src\providers;modules\dataset-serialize\src\singletons;modules\dataset-serialize\src\types + $(DCC_UnitSearchPath);modules\.dcp;modules\.dcu;modules;modules\dataset-serialize\src None diff --git a/src/core/Ragna.Criteria.Impl.pas b/src/core/Ragna.Criteria.Impl.pas index 9b18ebb..2f0544a 100644 --- a/src/core/Ragna.Criteria.Impl.pas +++ b/src/core/Ragna.Criteria.Impl.pas @@ -1,13 +1,18 @@ unit Ragna.Criteria.Impl; +{$IF DEFINED(FPC)} + {$MODE DELPHI}{$H+} +{$ENDIF} + interface -uses FireDAC.Comp.Client, StrUtils, Data.DB, FireDAC.Stan.Param, System.Hash, Ragna.Criteria.Intf, Ragna.Types; +uses {$IFDEF UNIDAC}Uni{$ELSE}FireDAC.Comp.Client, FireDAC.Stan.Param{$ENDIF}, + StrUtils, Data.DB, System.Hash, Ragna.Criteria.Intf, Ragna.Types; type TDefaultCriteria = class(TInterfacedObject, ICriteria) private - FQuery: TFDQuery; + FQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; procedure Where(const AField: string); overload; procedure Where(const AField: TField); overload; procedure Where(const AValue: Boolean); overload; @@ -15,23 +20,24 @@ TDefaultCriteria = class(TInterfacedObject, ICriteria) procedure &Or(const AField: TField); overload; procedure &And(const AField: string); overload; procedure &And(const AField: TField); overload; - procedure Like(const AValue: string); + procedure Like(const AValue: string); overload; + procedure Like(const AValue: TField); overload; procedure &Equals(const AValue: Int64); overload; procedure &Equals(const AValue: Boolean); overload; procedure &Equals(const AValue: string); overload; procedure Order(const AField: string); overload; procedure Order(const AField: TField); overload; public - constructor Create(const AQuery: TFDQuery); + constructor Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); end; TManagerCriteria = class private FCriteria: ICriteria; - function GetDrive(const AQuery: TFDQuery): string; - function GetInstanceCriteria(const AQuery: TFDQuery): ICriteria; + function GetDrive(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}): string; + function GetInstanceCriteria(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}): ICriteria; public - constructor Create(const AQuery: TFDQuery); + constructor Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); property Criteria: ICriteria read FCriteria write FCriteria; end; @@ -43,7 +49,7 @@ procedure TDefaultCriteria.&And(const AField: string); const PHRASE = '%s %s'; begin - FQuery.SQL.Add(Format(PHRASE, [otAnd.ToString, AField])); + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.AND.ToString, AField])); end; procedure TDefaultCriteria.&And(const AField: TField); @@ -55,10 +61,10 @@ procedure TDefaultCriteria.&Or(const AField: string); const PHRASE = ' %s %s'; begin - FQuery.SQL.Add(Format(PHRASE, [otOr.ToString, AField])); + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.OR.ToString, AField])); end; -constructor TDefaultCriteria.Create(const AQuery: TFDQuery); +constructor TDefaultCriteria.Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); begin FQuery := AQuery; end; @@ -67,14 +73,19 @@ procedure TDefaultCriteria.Equals(const AValue: string); const PHRASE = '%s ''%s'''; begin - FQuery.SQL.Add(Format(PHRASE, [otEquals.ToString, AValue])); + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue])); +end; + +procedure TDefaultCriteria.Like(const AValue: TField); +begin + Like(AValue.AsString); end; procedure TDefaultCriteria.Equals(const AValue: Int64); const PHRASE = '%s %d'; begin - FQuery.SQL.Add(Format(PHRASE, [otEquals.ToString, AValue])); + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue])); end; procedure TDefaultCriteria.Where(const AField: TField); @@ -86,21 +97,24 @@ procedure TDefaultCriteria.Equals(const AValue: Boolean); const PHRASE = '%s %s'; begin - FQuery.SQL.Add(Format(PHRASE, [otEquals.ToString, BoolToStr(AValue, True)])); + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, BoolToStr(AValue, True)])); end; procedure TDefaultCriteria.Like(const AValue: string); const - PHRASE = '::text %s %s'; + PHRASE = ' %s %s'; var LKeyParam: string; - LParam: TFDParam; + LParam: {$IFDEF UNIDAC}TUniParam{$ELSE}TFDParam{$ENDIF}; begin LKeyParam := THashMD5.Create.HashAsString; - FQuery.SQL.Text := FQuery.SQL.Text + Format(PHRASE, [otLike.ToString, ':' + LKeyParam]); + FQuery.SQL.Text := FQuery.SQL.Text + Format(PHRASE, [TOperatorType.LIKE.ToString, ':' + LKeyParam]); LParam := FQuery.ParamByName(LKeyParam); LParam.DataType := ftString; - LParam.Value := AValue; + if Pos('%', AValue) <= 0 then + LParam.Value := AValue + '%' + else + LParam.Value := AValue; end; procedure TDefaultCriteria.Order(const AField: TField); @@ -112,7 +126,7 @@ procedure TDefaultCriteria.Where(const AField: string); const PHRASE = '%s %s'; begin - FQuery.SQL.Add(Format(PHRASE, [otWhere.ToString, AField])); + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.WHERE.ToString, AField])); end; procedure TDefaultCriteria.Where(const AValue: Boolean); @@ -129,15 +143,20 @@ procedure TDefaultCriteria.Order(const AField: string); const PHRASE = '%s %s'; begin - FQuery.SQL.Add(Format(PHRASE, [otOrder.ToString, AField])); + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.ORDER.ToString, AField])); end; -constructor TManagerCriteria.Create(const AQuery: TFDQuery); +constructor TManagerCriteria.Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); begin FCriteria := GetInstanceCriteria(AQuery); end; -function TManagerCriteria.GetDrive(const AQuery: TFDQuery): string; +function TManagerCriteria.GetDrive(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}): string; +{$IFDEF UNIDAC} +begin + Result := AQuery.Connection.ProviderName; +end; +{$ELSE} var LDef: IFDStanConnectionDef; begin @@ -150,8 +169,9 @@ function TManagerCriteria.GetDrive(const AQuery: TFDQuery): string; Result := LDef.Params.DriverID; end; end; +{$ENDIF} -function TManagerCriteria.GetInstanceCriteria(const AQuery: TFDQuery): ICriteria; +function TManagerCriteria.GetInstanceCriteria(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}): ICriteria; begin case AnsiIndexStr(GetDrive(AQuery), ['PG']) of 0: diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index c09b898..2f42294 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -1,23 +1,31 @@ unit Ragna.Impl; +{$IF DEFINED(FPC)} + {$MODE DELPHI}{$H+} +{$ENDIF} + interface -uses Ragna.Intf, Ragna.Criteria.Intf, FireDAC.Comp.Client, System.JSON, Data.DB, Ragna.Criteria.Impl; +uses {$IFDEF UNIDAC}Uni, SqlClassesUni{$ELSE}FireDAC.Comp.Client{$ENDIF}, Ragna.Intf, Ragna.Criteria.Intf, System.JSON, Data.DB, Ragna.Criteria.Impl; type TRagna = class(TInterfacedObject, IRagna) private - FQuery: TFDQuery; + FQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; FManagerCriteria: TManagerCriteria; FCriteria: ICriteria; procedure SaveState; private + {$IFDEF UNIDAC} + function GetTableName(AField: TField): string; + {$ELSE} function GetTableName: string; + {$ENDIF} function HasField(const AFields: array of TField): Boolean; function ToJSONObject: TJSONObject; function ToJSONArray: TJSONArray; procedure RaiseNotFound; - procedure Paginate(const AOffSet, ALimit: Integer); + procedure Paginate(const AOffSet, ALimit: Integer); {$IFDEF UNIDAC} deprecated 'Not implemented for UniDAC';{$ENDIF} procedure RadicalResearch(const AValue: string; const AFields: array of TField); procedure Remove(const AField: TField; const AValue: Int64); procedure FindById(const AField: TField; const AValue: Int64); @@ -32,8 +40,8 @@ TRagna = class(TInterfacedObject, IRagna) procedure EditFromJson(const AJSON: TJSONObject); overload; procedure EditFromJson(const AJSON: TJSONArray); overload; public - constructor Create(const AQuery: TFDQuery); - property Query: TFDQuery read FQuery write FQuery; + constructor Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); + property Query: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF} read FQuery write FQuery; property Criteria: ICriteria read FCriteria write FCriteria; destructor Destroy; override; end; @@ -42,7 +50,7 @@ implementation uses Ragna.State, System.SysUtils, Ragna, DataSet.Serialize; -constructor TRagna.Create(const AQuery: TFDQuery); +constructor TRagna.Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); begin FQuery := AQuery; SaveState; @@ -59,7 +67,7 @@ procedure TRagna.Remove(const AField: TField; const AValue: Int64); LSql: string; begin OpenEmpty; - LSql := Format(DELETE_SQL, [GetTableName, AField.FieldName]); + LSql := Format(DELETE_SQL, [{$IFDEF UNIDAC}GetTableName(AField){$ELSE}GetTableName{$ENDIF}, AField.FieldName]); LDeleted := FQuery.Connection.ExecSQL(LSql, [AValue]); if not DELETED[LDeleted] then RaiseNotFound; @@ -88,7 +96,7 @@ procedure TRagna.FindById(const AField: TField; const AValue: Int64); LField: string; begin OpenEmpty; - LField := GetTableName + '.' + AField.Origin; + LField := {$IFDEF UNIDAC}GetTableName(AField){$ELSE}GetTableName{$ENDIF} + '.' + AField.Origin; FQuery.Reset.Where(LField).Equals(AValue); end; @@ -97,10 +105,20 @@ procedure TRagna.EditFromJson(const AJSON: TJSONObject); FQuery.LoadFromJSON(AJSON, False); end; +{$IFDEF UNIDAC} +function TRagna.GetTableName(AField: TField): string; +var + LFieldDesc: TSqlFieldDesc; +begin + LFieldDesc := TSqlFieldDesc(FQuery.GetFieldDesc(AField)); + Result := LFieldDesc.BaseTableName; +end; +{$ELSE} function TRagna.GetTableName: string; begin Result := FQuery.Table.Table.SourceName; end; +{$ENDIF} function TRagna.HasField(const AFields: array of TField): Boolean; begin @@ -125,10 +143,14 @@ procedure TRagna.OpenEmpty; procedure TRagna.Paginate(const AOffSet, ALimit: Integer); begin + {$IFDEF UNIDAC} + raise Exception.Create('Not implemented for UniDAC'); + {$ELSE} if AOffSet > 0 then FQuery.FetchOptions.RecsSkip := AOffSet; if ALimit > 0 then FQuery.FetchOptions.RecsMax := ALimit; + {$ENDIF} end; procedure TRagna.New(const ABody: TJSONObject); diff --git a/src/helpers/Ragna.pas b/src/helpers/Ragna.pas index 485b9bb..3e53736 100644 --- a/src/helpers/Ragna.pas +++ b/src/helpers/Ragna.pas @@ -1,47 +1,52 @@ unit Ragna; +{$IF DEFINED(FPC)} + {$MODE DELPHI}{$H+} +{$ENDIF} + interface -uses FireDAC.Comp.Client, System.JSON, Data.DB, Ragna.Impl, Ragna.Criteria.Impl; +uses {$IFDEF UNIDAC}Uni{$ELSE}FireDAC.Comp.Client{$ENDIF}, System.JSON, Data.DB, Ragna.Impl, Ragna.Criteria.Impl; type - TRagnaHelper = class helper for TFDQuery + TRagnaHelper = class helper for {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF} public - function Paginate(const AOffSet, ALimit: Integer): TFDQuery; - function RadicalResearch(const AValue: string; const AFields: array of TField): TFDQuery; - function Remove(const AField: TField; const AValue: Int64): TFDQuery; - function FindById(const AField: TField; const AValue: Int64): TFDQuery; - function UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject): TFDQuery; - function New(const ABody: TJSONObject): TFDQuery; overload; - function New(const ABody: TJSONArray): TFDQuery; overload; - function OpenUp: TFDQuery; - function OpenEmpty: TFDQuery; - function Reset: TFDQuery; - function ToJson(out AJSON: TJSONArray): TFDQuery; overload; deprecated; - function ToJson(out AJSON: TJSONObject): TFDQuery; overload; deprecated; + function Paginate(const AOffSet, ALimit: Integer): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; + function RadicalResearch(const AValue: string; const AFields: array of TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; + function Remove(const AField: TField; const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; + function FindById(const AField: TField; const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; + function UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; + function New(const ABody: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function New(const ABody: TJSONArray): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function OpenUp: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; + function OpenEmpty: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; + function Reset: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; + function ToJson(out AJSON: TJSONArray): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; deprecated; + function ToJson(out AJSON: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; deprecated; function ToJSONObject: TJSONObject; function ToJSONArray: TJSONArray; - function EditFromJson(const AJSON: TJSONObject): TFDQuery; overload; - function EditFromJson(const AJSON: TJSONArray): TFDQuery; overload; - function Where(const AField: string): TFDQuery; overload; - function Where(const AField: TField): TFDQuery; overload; - function Where(const AValue: Boolean): TFDQuery; overload; - function &Or(const AField: TField): TFDQuery; overload; - function &Or(const AField: string): TFDQuery; overload; - function &And(const AField: TField): TFDQuery; overload; - function &And(const AField: string): TFDQuery; overload; - function Like(const AValue: string): TFDQuery; - function &Equals(const AValue: Int64): TFDQuery; overload; - function &Equals(const AValue: Boolean): TFDQuery; overload; - function &Equals(const AValue: string): TFDQuery; overload; - function Order(const AField: TField): TFDQuery; + function EditFromJson(const AJSON: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function EditFromJson(const AJSON: TJSONArray): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function Where(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function Where(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function Where(const AValue: Boolean): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function &Or(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function &Or(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function &And(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function &And(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function Like(const AValue: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function Like(const AValue: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function &Equals(const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function &Equals(const AValue: Boolean): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function &Equals(const AValue: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function Order(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; end; implementation uses System.SysUtils, Ragna.Intf; -function TRagnaHelper.&Or(const AField: TField): TFDQuery; +function TRagnaHelper.&Or(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; begin @@ -54,7 +59,7 @@ function TRagnaHelper.&Or(const AField: TField): TFDQuery; Result := Self; end; -function TRagnaHelper.&And(const AField: TField): TFDQuery; +function TRagnaHelper.&And(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; begin @@ -67,7 +72,7 @@ function TRagnaHelper.&And(const AField: TField): TFDQuery; Result := Self; end; -function TRagnaHelper.&And(const AField: string): TFDQuery; +function TRagnaHelper.&And(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; begin @@ -80,7 +85,7 @@ function TRagnaHelper.&And(const AField: string): TFDQuery; Result := Self; end; -function TRagnaHelper.&Or(const AField: string): TFDQuery; +function TRagnaHelper.&Or(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; begin @@ -93,7 +98,7 @@ function TRagnaHelper.&Or(const AField: string): TFDQuery; Result := Self; end; -function TRagnaHelper.Remove(const AField: TField; const AValue: Int64): TFDQuery; +function TRagnaHelper.Remove(const AField: TField; const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; begin @@ -102,7 +107,7 @@ function TRagnaHelper.Remove(const AField: TField; const AValue: Int64): TFDQuer Result := Self; end; -function TRagnaHelper.EditFromJson(const AJSON: TJSONArray): TFDQuery; +function TRagnaHelper.EditFromJson(const AJSON: TJSONArray): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; begin @@ -111,7 +116,7 @@ function TRagnaHelper.EditFromJson(const AJSON: TJSONArray): TFDQuery; Result := Self; end; -function TRagnaHelper.Equals(const AValue: string): TFDQuery; +function TRagnaHelper.Equals(const AValue: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; begin @@ -120,7 +125,7 @@ function TRagnaHelper.Equals(const AValue: string): TFDQuery; Result := Self; end; -function TRagnaHelper.Equals(const AValue: Boolean): TFDQuery; +function TRagnaHelper.Equals(const AValue: Boolean): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; begin @@ -133,7 +138,7 @@ function TRagnaHelper.Equals(const AValue: Boolean): TFDQuery; Result := Self; end; -function TRagnaHelper.Equals(const AValue: Int64): TFDQuery; +function TRagnaHelper.Equals(const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; begin @@ -146,7 +151,7 @@ function TRagnaHelper.Equals(const AValue: Int64): TFDQuery; Result := Self; end; -function TRagnaHelper.FindById(const AField: TField; const AValue: Int64): TFDQuery; +function TRagnaHelper.FindById(const AField: TField; const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; begin @@ -155,7 +160,12 @@ function TRagnaHelper.FindById(const AField: TField; const AValue: Int64): TFDQu Result := Self; end; -function TRagnaHelper.EditFromJson(const AJSON: TJSONObject): TFDQuery; +function TRagnaHelper.Like(const AValue: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; +begin + +end; + +function TRagnaHelper.EditFromJson(const AJSON: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; begin @@ -164,7 +174,7 @@ function TRagnaHelper.EditFromJson(const AJSON: TJSONObject): TFDQuery; Result := Self; end; -function TRagnaHelper.Like(const AValue: string): TFDQuery; +function TRagnaHelper.Like(const AValue: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; begin @@ -177,7 +187,7 @@ function TRagnaHelper.Like(const AValue: string): TFDQuery; Result := Self; end; -function TRagnaHelper.New(const ABody: TJSONArray): TFDQuery; +function TRagnaHelper.New(const ABody: TJSONArray): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; begin @@ -186,7 +196,7 @@ function TRagnaHelper.New(const ABody: TJSONArray): TFDQuery; Result := Self; end; -function TRagnaHelper.OpenEmpty: TFDQuery; +function TRagnaHelper.OpenEmpty: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; begin @@ -195,7 +205,7 @@ function TRagnaHelper.OpenEmpty: TFDQuery; Result := Self; end; -function TRagnaHelper.OpenUp: TFDQuery; +function TRagnaHelper.OpenUp: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; begin @@ -204,7 +214,7 @@ function TRagnaHelper.OpenUp: TFDQuery; Result := Self; end; -function TRagnaHelper.Order(const AField: TField): TFDQuery; +function TRagnaHelper.Order(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; begin @@ -217,7 +227,7 @@ function TRagnaHelper.Order(const AField: TField): TFDQuery; Result := Self; end; -function TRagnaHelper.Paginate(const AOffSet, ALimit: Integer): TFDQuery; +function TRagnaHelper.Paginate(const AOffSet, ALimit: Integer): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; begin @@ -226,7 +236,7 @@ function TRagnaHelper.Paginate(const AOffSet, ALimit: Integer): TFDQuery; Result := Self; end; -function TRagnaHelper.New(const ABody: TJSONObject): TFDQuery; +function TRagnaHelper.New(const ABody: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; begin @@ -235,7 +245,7 @@ function TRagnaHelper.New(const ABody: TJSONObject): TFDQuery; Result := Self; end; -function TRagnaHelper.RadicalResearch(const AValue: string; const AFields: array of TField): TFDQuery; +function TRagnaHelper.RadicalResearch(const AValue: string; const AFields: array of TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; begin @@ -244,7 +254,7 @@ function TRagnaHelper.RadicalResearch(const AValue: string; const AFields: array Result := Self; end; -function TRagnaHelper.Reset: TFDQuery; +function TRagnaHelper.Reset: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; begin @@ -253,7 +263,7 @@ function TRagnaHelper.Reset: TFDQuery; Result := Self; end; -function TRagnaHelper.ToJson(out AJSON: TJSONObject): TFDQuery; +function TRagnaHelper.ToJson(out AJSON: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; begin @@ -278,7 +288,7 @@ function TRagnaHelper.ToJSONObject: TJSONObject; Result := LRagna.ToJSONObject; end; -function TRagnaHelper.ToJson(out AJSON: TJSONArray): TFDQuery; +function TRagnaHelper.ToJson(out AJSON: TJSONArray): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; begin @@ -296,7 +306,7 @@ function TRagnaHelper.UpdateById(const AField: TField; const AValue: Int64; cons Result := Self; end; -function TRagnaHelper.Where(const AField: string): TFDQuery; +function TRagnaHelper.Where(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; begin @@ -309,7 +319,7 @@ function TRagnaHelper.Where(const AField: string): TFDQuery; Result := Self; end; -function TRagnaHelper.Where(const AValue: Boolean): TFDQuery; +function TRagnaHelper.Where(const AValue: Boolean): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; begin @@ -322,7 +332,7 @@ function TRagnaHelper.Where(const AValue: Boolean): TFDQuery; Result := Self; end; -function TRagnaHelper.Where(const AField: TField): TFDQuery; +function TRagnaHelper.Where(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; begin diff --git a/src/interfaces/Ragna.Criteria.Intf.pas b/src/interfaces/Ragna.Criteria.Intf.pas index 1246d0a..54924ae 100644 --- a/src/interfaces/Ragna.Criteria.Intf.pas +++ b/src/interfaces/Ragna.Criteria.Intf.pas @@ -1,5 +1,9 @@ unit Ragna.Criteria.Intf; +{$IF DEFINED(FPC)} + {$MODE DELPHI}{$H+} +{$ENDIF} + interface uses Data.DB; @@ -14,7 +18,8 @@ interface procedure &Or(const AField: TField); overload; procedure &And(const AField: string); overload; procedure &And(const AField: TField); overload; - procedure Like(const AValue: string); + procedure Like(const AValue: string); overload; + procedure Like(const AValue: TField); overload; procedure &Equals(const AValue: Int64); overload; procedure &Equals(const AValue: Boolean); overload; procedure &Equals(const AValue: string); overload; diff --git a/src/interfaces/Ragna.Intf.pas b/src/interfaces/Ragna.Intf.pas index 9b3e885..8fda85b 100644 --- a/src/interfaces/Ragna.Intf.pas +++ b/src/interfaces/Ragna.Intf.pas @@ -1,5 +1,9 @@ unit Ragna.Intf; +{$IF DEFINED(FPC)} + {$MODE DELPHI}{$H+} +{$ENDIF} + interface uses FireDAC.Comp.Client, System.JSON, Data.DB; diff --git a/src/state/Ragna.State.pas b/src/state/Ragna.State.pas index f5315c6..9ca9fa9 100644 --- a/src/state/Ragna.State.pas +++ b/src/state/Ragna.State.pas @@ -1,24 +1,27 @@ unit Ragna.State; +{$IF DEFINED(FPC)} + {$MODE DELPHI}{$H+} +{$ENDIF} + interface -uses System.Generics.Collections, FireDac.Comp.Client, System.Rtti; +uses System.Generics.Collections, {$IFDEF UNIDAC}Uni{$ELSE}FireDac.Comp.Client{$ENDIF}, System.Rtti; type - TListQueryAndSql = TDictionary; + TListQueryAndSql = TDictionary<{$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}, string>; TRagnaState = class private FStates: TListQueryAndSql; FVmi: TVirtualMethodInterceptor; class var FInstance: TRagnaState; - procedure OnBeforVMI(Instance: TObject; Method: TRttiMethod; const Args: TArray; out DoInvoke: Boolean; - out Result: TValue); + procedure OnBeforVMI(Instance: TObject; Method: TRttiMethod; const Args: TArray; out DoInvoke: Boolean; out Result: TValue); public destructor Destroy; override; property States: TListQueryAndSql read FStates write FStates; - procedure SetState(const AQuery: TFDQuery; const ASQL: string); - function GetState(const AQuery: TFDQuery; out ASQL: string): Boolean; + procedure SetState(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; const ASQL: string); + function GetState(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; out ASQL: string): Boolean; class function GetInstance: TRagnaState; class procedure Release; constructor Create; @@ -28,7 +31,7 @@ implementation constructor TRagnaState.Create; begin - FVmi := TVirtualMethodInterceptor.Create(TFDQuery); + FVmi := TVirtualMethodInterceptor.Create({$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); FVmi.OnBefore := OnBeforVMI; FStates := TListQueryAndSql.Create; end; @@ -46,7 +49,7 @@ class function TRagnaState.GetInstance: TRagnaState; Result := FInstance; end; -function TRagnaState.GetState(const AQuery: TFDQuery; out ASQL: string): Boolean; +function TRagnaState.GetState(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; out ASQL: string): Boolean; begin TMonitor.Enter(FStates); try @@ -63,7 +66,7 @@ procedure TRagnaState.OnBeforVMI(Instance: TObject; Method: TRttiMethod; const A Exit; TMonitor.Enter(FStates); try - FStates.Remove(Instance as TFDQuery); + FStates.Remove(Instance as {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); finally TMonitor.Exit(FStates); end; @@ -74,7 +77,7 @@ class procedure TRagnaState.Release; FInstance.Free; end; -procedure TRagnaState.SetState(const AQuery: TFDQuery; const ASQL: string); +procedure TRagnaState.SetState(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; const ASQL: string); begin TMonitor.Enter(FStates); try diff --git a/src/types/Ragna.Types.pas b/src/types/Ragna.Types.pas index 04723f3..6277405 100644 --- a/src/types/Ragna.Types.pas +++ b/src/types/Ragna.Types.pas @@ -1,9 +1,15 @@ unit Ragna.Types; +{$IF DEFINED(FPC)} + {$MODE DELPHI}{$H+} +{$ENDIF} + interface type - TOperatorType = (otWhere, otOr, otLike, otEquals, otOrder, otAnd); +{$SCOPEDENUMS ON} + TOperatorType = (WHERE, &OR, LIKE, EQUALS, ORDER, &AND); +{$SCOPEDENUMS OFF} TOperatorTypeHelper = record helper for TOperatorType public @@ -15,17 +21,17 @@ implementation function TOperatorTypeHelper.ToString: string; begin case Self of - otWhere: + TOperatorType.WHERE: Result := 'WHERE'; - otOr: + TOperatorType.OR: Result := 'OR'; - otLike: + TOperatorType.LIKE: Result := 'LIKE'; - otEquals: + TOperatorType.EQUALS: Result := '='; - otOrder: + TOperatorType.ORDER: Result := 'ORDER BY'; - otAnd: + TOperatorType.AND: Result := 'AND'; end; end; From 59ddd1998f7e48b7ee69194bb2e0c24ad078b8f0 Mon Sep 17 00:00:00 2001 From: Vinicius Sanchez Date: Tue, 3 May 2022 16:16:19 -0300 Subject: [PATCH 39/45] Samples --- samples/Samples.dpr | 21 + samples/Samples.dproj | 980 +++++++++++++++++++++++++ samples/src/Views.Samples.dfm | 175 +++++ samples/src/Views.Samples.pas | 116 +++ src/core/Ragna.Criteria.Impl.pas | 58 +- src/core/Ragna.Impl.pas | 35 +- src/helpers/Ragna.pas | 98 +-- src/interfaces/Ragna.Criteria.Intf.pas | 18 +- src/interfaces/Ragna.Intf.pas | 8 +- 9 files changed, 1366 insertions(+), 143 deletions(-) create mode 100644 samples/Samples.dpr create mode 100644 samples/Samples.dproj create mode 100644 samples/src/Views.Samples.dfm create mode 100644 samples/src/Views.Samples.pas diff --git a/samples/Samples.dpr b/samples/Samples.dpr new file mode 100644 index 0000000..bb547e0 --- /dev/null +++ b/samples/Samples.dpr @@ -0,0 +1,21 @@ +program Samples; + +uses + Vcl.Forms, + Views.Samples in 'src\Views.Samples.pas' {FrmRagnaSamples}, + Ragna.Criteria.Impl in '..\src\core\Ragna.Criteria.Impl.pas', + Ragna.Impl in '..\src\core\Ragna.Impl.pas', + Ragna in '..\src\helpers\Ragna.pas', + Ragna.Criteria.Intf in '..\src\interfaces\Ragna.Criteria.Intf.pas', + Ragna.Intf in '..\src\interfaces\Ragna.Intf.pas', + Ragna.State in '..\src\state\Ragna.State.pas', + Ragna.Types in '..\src\types\Ragna.Types.pas'; + +{$R *.res} + +begin + Application.Initialize; + Application.MainFormOnTaskbar := True; + Application.CreateForm(TFrmRagnaSamples, FrmRagnaSamples); + Application.Run; +end. diff --git a/samples/Samples.dproj b/samples/Samples.dproj new file mode 100644 index 0000000..beed690 --- /dev/null +++ b/samples/Samples.dproj @@ -0,0 +1,980 @@ + + + {4FF886E7-EF89-4410-871B-B4283C20426D} + 18.8 + VCL + Samples.dpr + True + Debug + Win32 + 1 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + Samples + + + DBXSqliteDriver;dxFlowChartRS26;dxPSdxMapControlLnkRS26;DBXDb2Driver;vclactnband;dxBarRS26;vclFireDAC;dxFireDACEMFRS26;tethering;dxSpreadSheetInplaceRichEditRS26;FireDACADSDriver;dxSkinVisualStudio2013BlueRS26;dxRichEditCoreRS26;dxPSdxSpreadSheetLnkRS26;dxSkinSharpPlusRS26;FireDACMSSQLDriver;vcltouch;vcldb;svn;dxPSTeeChartRS26;dxSkinFoggyRS26;dxSkinVisualStudio2013DarkRS26;dxSkinOffice2013DarkGrayRS26;dxGDIPlusRS26;dxAuthorizationAgentsRS26;dxPSdxFCLnkRS26;vclib;frxTee26;dxPSLnksRS26;FireDACDBXDriver;cxGridRS26;dxPsPrVwAdvRS26;dxPDFViewerRS26;dxSkinSpringTimeRS26;boss_ide;vclx;dxPScxTLLnkRS26;dxSkinOffice2010BlueRS26;RESTBackendComponents;dxSkinOffice2016DarkRS26;VCLRESTComponents;dxSkinMoneyTwinsRS26;dxSkinOffice2016ColorfulRS26;fsTee26;dxSkinValentineRS26;dxSkinHighContrastRS26;vclie;bindengine;CloudService;dxmdsRS26;FireDACMySQLDriver;fsIBX26;frx26;dxdborRS26;DataSnapClient;dxSkinOffice2013WhiteRS26;dxFireDACServerModeRS26;bindcompdbx;fsFD26;DBXSybaseASEDriver;IndyIPServer;cxPivotGridRS26;IndySystem;fsADO26;frxDBX26;dxSkinDarkRoomRS26;cxTreeListdxBarPopupMenuRS26;dsnapcon;cxTreeListRS26;dxPScxPivotGridLnkRS26;cxSchedulerRibbonStyleEventEditorRS26;dxPSCoreRS26;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxSpreadSheetRS26;dxBarExtItemsRS26;dxPSdxGaugeControlLnkRS26;emshosting;dxSkinLondonLiquidSkyRS26;DBXOdbcDriver;FireDACTDataDriver;FMXTee;dxdbtrRS26;dxRichEditControlCoreRS26;soaprtl;DbxCommonDriver;dxFlowChartAdvancedCustomizeFormRS26;dxSkinLiquidSkyRS26;dxSkinSevenRS26;dxDockingRS26;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;cxLibraryRS26;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;cxDataRS26;dxPScxSchedulerLnkRS26;dxSpreadSheetConditionalFormattingDialogsRS26;appanalytics;dxRibbonCustomizationFormRS26;cxSchedulerGridRS26;IndyIPClient;bindcompvcl;dxSkinVisualStudio2013LightRS26;TeeUI;dxADOEMFRS26;VclSmp;FireDACODBCDriver;dxRibbonRS26;DataSnapIndy10ServerTransport;dxPScxCommonRS26;dxRichEditDocumentModelRS26;DataSnapProviderClient;FireDACMongoDBDriver;dxPScxGridLnkRS26;dxSkinDevExpressDarkStyleRS26;dxSpreadSheetCoreRS26;RESTComponents;dxSkinGlassOceansRS26;DBXInterBaseDriver;dxPScxExtCommonRS26;dxSkinPumpkinRS26;emsclientfiredac;dxSkinXmas2008BlueRS26;DataSnapFireDAC;svnui;frxFD26;dxSkinOffice2007SilverRS26;cxPageControlRS26;dxSkinTheBezierRS26;dxSkinDevExpressStyleRS26;DBXMSSQLDriver;dxRichEditControlRS26;DatasnapConnectorsFreePascal;dxGaugeControlRS26;dxorgcRS26;dxPScxVGridLnkRS26;bindcompfmx;dxSkinOffice2007PinkRS26;DBXOracleDriver;inetdb;dxSkinOffice2007BlueRS26;dxSkinStardustRS26;CEF4Delphi;dxBarDBNavRS26;dxDBXServerModeRS26;dxSkinTheAsphaltWorldRS26;dxSkinSilverRS26;FmxTeeUI;emsedge;dxLayoutControlRS26;fmx;FireDACIBDriver;fmxdae;dxServerModeRS26;dxWizardControlRS26;dxSkinBlueprintRS26;dxSkiniMaginaryRS26;dxTabbedMDIRS26;fs26;dxEMFRS26;dbexpress;IndyCore;dxComnRS26;frxIntIO26;dsnap;emsclient;DataSnapCommon;dxSkinSharpRS26;FireDACCommon;DataSnapConnectors;cxSchedulerTreeBrowserRS26;dxADOServerModeRS26;soapserver;dxSkinOffice2007BlackRS26;cxVerticalGridRS26;dxtrmdRS26;FireDACOracleDriver;DBXMySQLDriver;cxEditorsRS26;cxSchedulerRS26;cxSchedulerWebServiceStorageRS26;DBXFirebirdDriver;dxSkinMetropolisDarkRS26;dxSkinOffice2010BlackRS26;dxPSdxLCLnkRS26;FireDACCommonODBC;FireDACCommonDriver;dxMapControlRS26;dxSkinBlackRS26;dxSkinOffice2013LightGrayRS26;frxIntIOIndy26;inet;dxSpellCheckerRS26;dxSkinCoffeeRS26;IndyIPCommon;dxSpreadSheetCoreConditionalFormattingDialogsRS26;vcl;dxPSdxDBOCLnkRS26;frxDB26;dxSkinMetropolisRS26;FireDACDb2Driver;dxSpreadSheetReportDesignerRS26;dxPScxPCProdRS26;dxNavBarRS26;fsDB26;dxCoreRS26;cxExportRS26;TeeDB;FireDAC;dxThemeRS26;dxHttpIndyRequestRS26;dxPSPrVwRibbonRS26;dxSkinOffice2010SilverRS26;frxe26;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;dxSkinSevenClassicRS26;cxPivotGridChartRS26;dxPSRichEditControlLnkRS26;frxIBX26;dxPSDBTeeChartRS26;ibxpress;Tee;DataSnapServer;ibxbindings;dxPSdxDBTVLnkRS26;vclwinx;FireDACDSDriver;frxADO26;dxOfficeCoreRS26;dxTileControlRS26;dxSkinsCoreRS26;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;dxSkinLilianRS26;dxSkinSummer2008RS26;DBXInformixDriver;dxPSdxOCLnkRS26;dxSkinVS2010RS26;dxSkinBlueRS26;dmvcframeworkRT;dbxcds;adortl;dxSkinMcSkinRS26;dxSkinDarkSideRS26;dmvcframeworkDT;dxSpreadSheetCoreDialogsRS26;dxBarExtDBItemsRS26;dsnapxml;dbrtl;IndyProtocols;inetdbxpress;dxSkinOffice2007GreenRS26;dxRichEditInplaceRS26;dxSkinWhiteprintRS26;dxPSdxPDFViewerLnkRS26;dxSkinCaramelRS26;fmxase;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + + + DBXSqliteDriver;dxFlowChartRS26;dxPSdxMapControlLnkRS26;DBXDb2Driver;vclactnband;dxBarRS26;vclFireDAC;dxFireDACEMFRS26;tethering;dxSpreadSheetInplaceRichEditRS26;FireDACADSDriver;dxSkinVisualStudio2013BlueRS26;dxRichEditCoreRS26;dxPSdxSpreadSheetLnkRS26;dxSkinSharpPlusRS26;FireDACMSSQLDriver;vcltouch;vcldb;dxPSTeeChartRS26;dxSkinFoggyRS26;dxSkinVisualStudio2013DarkRS26;dxSkinOffice2013DarkGrayRS26;dxGDIPlusRS26;dxAuthorizationAgentsRS26;dxPSdxFCLnkRS26;vclib;dxPSLnksRS26;FireDACDBXDriver;cxGridRS26;dxPsPrVwAdvRS26;dxPDFViewerRS26;dxSkinSpringTimeRS26;vclx;dxPScxTLLnkRS26;dxSkinOffice2010BlueRS26;RESTBackendComponents;dxSkinOffice2016DarkRS26;VCLRESTComponents;dxSkinMoneyTwinsRS26;dxSkinOffice2016ColorfulRS26;dxSkinValentineRS26;dxSkinHighContrastRS26;vclie;bindengine;CloudService;dxmdsRS26;FireDACMySQLDriver;dxdborRS26;DataSnapClient;dxSkinOffice2013WhiteRS26;dxFireDACServerModeRS26;bindcompdbx;DBXSybaseASEDriver;IndyIPServer;cxPivotGridRS26;IndySystem;dxSkinDarkRoomRS26;cxTreeListdxBarPopupMenuRS26;dsnapcon;cxTreeListRS26;dxPScxPivotGridLnkRS26;cxSchedulerRibbonStyleEventEditorRS26;dxPSCoreRS26;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxSpreadSheetRS26;dxBarExtItemsRS26;dxPSdxGaugeControlLnkRS26;emshosting;dxSkinLondonLiquidSkyRS26;DBXOdbcDriver;FireDACTDataDriver;FMXTee;dxdbtrRS26;dxRichEditControlCoreRS26;soaprtl;DbxCommonDriver;dxFlowChartAdvancedCustomizeFormRS26;dxSkinLiquidSkyRS26;dxSkinSevenRS26;dxDockingRS26;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;cxLibraryRS26;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;cxDataRS26;dxPScxSchedulerLnkRS26;dxSpreadSheetConditionalFormattingDialogsRS26;appanalytics;dxRibbonCustomizationFormRS26;cxSchedulerGridRS26;IndyIPClient;bindcompvcl;dxSkinVisualStudio2013LightRS26;TeeUI;dxADOEMFRS26;VclSmp;FireDACODBCDriver;dxRibbonRS26;DataSnapIndy10ServerTransport;dxPScxCommonRS26;dxRichEditDocumentModelRS26;DataSnapProviderClient;FireDACMongoDBDriver;dxPScxGridLnkRS26;dxSkinDevExpressDarkStyleRS26;dxSpreadSheetCoreRS26;RESTComponents;dxSkinGlassOceansRS26;DBXInterBaseDriver;dxPScxExtCommonRS26;dxSkinPumpkinRS26;emsclientfiredac;dxSkinXmas2008BlueRS26;DataSnapFireDAC;dxSkinOffice2007SilverRS26;cxPageControlRS26;dxSkinTheBezierRS26;dxSkinDevExpressStyleRS26;DBXMSSQLDriver;dxRichEditControlRS26;DatasnapConnectorsFreePascal;dxGaugeControlRS26;dxorgcRS26;dxPScxVGridLnkRS26;bindcompfmx;dxSkinOffice2007PinkRS26;DBXOracleDriver;inetdb;dxSkinOffice2007BlueRS26;dxSkinStardustRS26;CEF4Delphi;dxBarDBNavRS26;dxDBXServerModeRS26;dxSkinTheAsphaltWorldRS26;dxSkinSilverRS26;FmxTeeUI;emsedge;dxLayoutControlRS26;fmx;FireDACIBDriver;fmxdae;dxServerModeRS26;dxWizardControlRS26;dxSkinBlueprintRS26;dxSkiniMaginaryRS26;dxTabbedMDIRS26;dxEMFRS26;dbexpress;IndyCore;dxComnRS26;dsnap;emsclient;DataSnapCommon;dxSkinSharpRS26;FireDACCommon;DataSnapConnectors;cxSchedulerTreeBrowserRS26;dxADOServerModeRS26;soapserver;dxSkinOffice2007BlackRS26;cxVerticalGridRS26;dxtrmdRS26;FireDACOracleDriver;DBXMySQLDriver;cxEditorsRS26;cxSchedulerRS26;cxSchedulerWebServiceStorageRS26;DBXFirebirdDriver;dxSkinMetropolisDarkRS26;dxSkinOffice2010BlackRS26;dxPSdxLCLnkRS26;FireDACCommonODBC;FireDACCommonDriver;dxMapControlRS26;dxSkinBlackRS26;dxSkinOffice2013LightGrayRS26;inet;dxSpellCheckerRS26;dxSkinCoffeeRS26;IndyIPCommon;dxSpreadSheetCoreConditionalFormattingDialogsRS26;vcl;dxPSdxDBOCLnkRS26;dxSkinMetropolisRS26;FireDACDb2Driver;dxSpreadSheetReportDesignerRS26;dxPScxPCProdRS26;dxNavBarRS26;dxCoreRS26;cxExportRS26;TeeDB;FireDAC;dxThemeRS26;dxHttpIndyRequestRS26;dxPSPrVwRibbonRS26;dxSkinOffice2010SilverRS26;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;dxSkinSevenClassicRS26;cxPivotGridChartRS26;dxPSRichEditControlLnkRS26;dxPSDBTeeChartRS26;ibxpress;Tee;DataSnapServer;ibxbindings;dxPSdxDBTVLnkRS26;vclwinx;FireDACDSDriver;dxOfficeCoreRS26;dxTileControlRS26;dxSkinsCoreRS26;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;dxSkinLilianRS26;dxSkinSummer2008RS26;DBXInformixDriver;dxPSdxOCLnkRS26;dxSkinVS2010RS26;dxSkinBlueRS26;dbxcds;adortl;dxSkinMcSkinRS26;dxSkinDarkSideRS26;dxSpreadSheetCoreDialogsRS26;dxBarExtDBItemsRS26;dsnapxml;dbrtl;IndyProtocols;inetdbxpress;dxSkinOffice2007GreenRS26;dxRichEditInplaceRS26;dxSkinWhiteprintRS26;dxPSdxPDFViewerLnkRS26;dxSkinCaramelRS26;fmxase;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + true + PerMonitorV2 + ..\modules\dataset-serialize\src;$(DCC_UnitSearchPath) + true + 1033 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + + MainSource + + +
FrmRagnaSamples
+ dfm +
+ + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + Application + + + + Samples.dpr + + + + + + Samples.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + True + False + + + 12 + + + + +
diff --git a/samples/src/Views.Samples.dfm b/samples/src/Views.Samples.dfm new file mode 100644 index 0000000..d0aa4c3 --- /dev/null +++ b/samples/src/Views.Samples.dfm @@ -0,0 +1,175 @@ +object FrmRagnaSamples: TFrmRagnaSamples + Left = 0 + Top = 0 + Caption = 'Ragna samples' + ClientHeight = 442 + ClientWidth = 658 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object DBGrid1: TDBGrid + Left = 0 + Top = 208 + Width = 658 + Height = 234 + Align = alBottom + DataSource = dsCountry + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'Tahoma' + TitleFont.Style = [] + end + object Button1: TButton + Left = 24 + Top = 16 + Width = 75 + Height = 25 + Caption = 'Open' + TabOrder = 1 + OnClick = Button1Click + end + object Button2: TButton + Left = 24 + Top = 47 + Width = 75 + Height = 25 + Caption = 'Open empty' + TabOrder = 2 + OnClick = Button2Click + end + object Button3: TButton + Left = 24 + Top = 78 + Width = 75 + Height = 25 + Caption = 'Or' + TabOrder = 3 + OnClick = Button3Click + end + object Button4: TButton + Left = 105 + Top = 78 + Width = 75 + Height = 25 + Caption = 'And' + TabOrder = 4 + OnClick = Button4Click + end + object Button5: TButton + Left = 186 + Top = 78 + Width = 75 + Height = 25 + Caption = 'Like' + TabOrder = 5 + OnClick = Button5Click + end + object Button6: TButton + Left = 267 + Top = 78 + Width = 75 + Height = 25 + Caption = 'Order' + TabOrder = 6 + OnClick = Button6Click + end + object mmJson: TMemo + Left = 0 + Top = 119 + Width = 658 + Height = 89 + Align = alBottom + TabOrder = 7 + ExplicitLeft = 465 + ExplicitTop = 8 + ExplicitWidth = 185 + end + object Button7: TButton + Left = 105 + Top = 47 + Width = 75 + Height = 25 + Caption = 'JSON Object' + TabOrder = 8 + OnClick = Button7Click + end + object Button8: TButton + Left = 186 + Top = 47 + Width = 75 + Height = 25 + Caption = 'JSON Array' + TabOrder = 9 + OnClick = Button8Click + end + object Button9: TButton + Left = 267 + Top = 47 + Width = 75 + Height = 25 + Caption = 'Append' + TabOrder = 10 + OnClick = Button9Click + end + object Button10: TButton + Left = 348 + Top = 47 + Width = 75 + Height = 25 + Caption = 'Edit' + TabOrder = 11 + OnClick = Button10Click + end + object dsCountry: TDataSource + DataSet = Country + Left = 304 + Top = 240 + end + object Country: TFDQuery + Connection = FDConnection + SQL.Strings = ( + 'select * from country') + Left = 344 + Top = 240 + object CountryName: TWideStringField + FieldName = 'Name' + Origin = 'Name' + ProviderFlags = [pfInUpdate, pfInWhere, pfInKey] + Size = 24 + end + object CountryCapital: TWideStringField + FieldName = 'Capital' + Origin = 'Capital' + Size = 24 + end + object CountryContinent: TWideStringField + FieldName = 'Continent' + Origin = 'Continent' + Size = 24 + end + object CountryArea: TFloatField + FieldName = 'Area' + Origin = 'Area' + end + object CountryPopulation: TFloatField + FieldName = 'Population' + Origin = 'Population' + end + end + object FDConnection: TFDConnection + Params.Strings = ( + 'ConnectionDef=DBDEMOS') + Connected = True + LoginPrompt = False + Left = 384 + Top = 240 + end +end diff --git a/samples/src/Views.Samples.pas b/samples/src/Views.Samples.pas new file mode 100644 index 0000000..2c6b1c0 --- /dev/null +++ b/samples/src/Views.Samples.pas @@ -0,0 +1,116 @@ +unit Views.Samples; + +interface + +uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, + Vcl.Dialogs, Data.DB, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, + FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, FireDAC.Comp.DataSet, FireDAC.Comp.Client, Vcl.Grids, + Vcl.DBGrids, FireDAC.UI.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Phys, FireDAC.Phys.MSAcc, FireDAC.Phys.MSAccDef, + FireDAC.VCLUI.Wait, Vcl.StdCtrls, FireDAC.Phys.IB, FireDAC.Phys.IBDef; + +type + TFrmRagnaSamples = class(TForm) + DBGrid1: TDBGrid; + dsCountry: TDataSource; + Country: TFDQuery; + Button1: TButton; + FDConnection: TFDConnection; + CountryName: TWideStringField; + CountryCapital: TWideStringField; + CountryContinent: TWideStringField; + CountryArea: TFloatField; + CountryPopulation: TFloatField; + Button2: TButton; + Button3: TButton; + Button4: TButton; + Button5: TButton; + Button6: TButton; + mmJson: TMemo; + Button7: TButton; + Button8: TButton; + Button9: TButton; + Button10: TButton; + procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure Button4Click(Sender: TObject); + procedure Button6Click(Sender: TObject); + procedure Button5Click(Sender: TObject); + procedure Button8Click(Sender: TObject); + procedure Button7Click(Sender: TObject); + procedure Button9Click(Sender: TObject); + procedure Button10Click(Sender: TObject); + end; + +var + FrmRagnaSamples: TFrmRagnaSamples; + +implementation + +{$R *.dfm} + +uses Ragna; + +procedure TFrmRagnaSamples.Button10Click(Sender: TObject); +begin + Country + .OpenUp + .EditFromJson('{"name":"A","capital":"B","continent":"C","area":1,"population":2}'); +end; + +procedure TFrmRagnaSamples.Button1Click(Sender: TObject); +begin + Country.OpenUp; +end; + +procedure TFrmRagnaSamples.Button2Click(Sender: TObject); +begin + Country.OpenEmpty; +end; + +procedure TFrmRagnaSamples.Button3Click(Sender: TObject); +begin + Country + .Where(CountryName).Equals('Brazil') + .&Or(CountryName).Equals('Canada') + .OpenUp; +end; + +procedure TFrmRagnaSamples.Button4Click(Sender: TObject); +begin + Country + .Where(CountryName).Equals('Brazil') + .&And(CountryCapital).Equals('Brasilia') + .OpenUp; +end; + +procedure TFrmRagnaSamples.Button5Click(Sender: TObject); +begin + Country + .Where(CountryName).Like('B') + .OpenUp; +end; + +procedure TFrmRagnaSamples.Button6Click(Sender: TObject); +begin + Country + .Order(CountryName) + .OpenUp; +end; + +procedure TFrmRagnaSamples.Button7Click(Sender: TObject); +begin + mmJson.Lines.Text := Country.OpenUp.ToJSONObject.ToString; +end; + +procedure TFrmRagnaSamples.Button8Click(Sender: TObject); +begin + mmJson.Lines.Text := Country.OpenUp.ToJSONArray.ToString; +end; + +procedure TFrmRagnaSamples.Button9Click(Sender: TObject); +begin + Country.New('{"name":"A","capital":"B","continent":"C","area":1,"population":2}'); +end; + +end. diff --git a/src/core/Ragna.Criteria.Impl.pas b/src/core/Ragna.Criteria.Impl.pas index 2f0544a..37a4a49 100644 --- a/src/core/Ragna.Criteria.Impl.pas +++ b/src/core/Ragna.Criteria.Impl.pas @@ -13,20 +13,14 @@ interface TDefaultCriteria = class(TInterfacedObject, ICriteria) private FQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; - procedure Where(const AField: string); overload; - procedure Where(const AField: TField); overload; - procedure Where(const AValue: Boolean); overload; - procedure &Or(const AField: string); overload; - procedure &Or(const AField: TField); overload; - procedure &And(const AField: string); overload; - procedure &And(const AField: TField); overload; - procedure Like(const AValue: string); overload; - procedure Like(const AValue: TField); overload; + procedure Where(const AField: string); + procedure &Or(const AField: string); + procedure &And(const AField: string); + procedure Like(const AValue: string); procedure &Equals(const AValue: Int64); overload; procedure &Equals(const AValue: Boolean); overload; procedure &Equals(const AValue: string); overload; - procedure Order(const AField: string); overload; - procedure Order(const AField: TField); overload; + procedure Order(const AField: string); public constructor Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); end; @@ -52,11 +46,6 @@ procedure TDefaultCriteria.&And(const AField: string); FQuery.SQL.Add(Format(PHRASE, [TOperatorType.AND.ToString, AField])); end; -procedure TDefaultCriteria.&And(const AField: TField); -begin - Self.&And(AField.Origin); -end; - procedure TDefaultCriteria.&Or(const AField: string); const PHRASE = ' %s %s'; @@ -69,16 +58,11 @@ constructor TDefaultCriteria.Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE FQuery := AQuery; end; -procedure TDefaultCriteria.Equals(const AValue: string); +procedure TDefaultCriteria.Equals(const AValue: Boolean); const - PHRASE = '%s ''%s'''; -begin - FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue])); -end; - -procedure TDefaultCriteria.Like(const AValue: TField); + PHRASE = '%s %s'; begin - Like(AValue.AsString); + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, BoolToStr(AValue, True)])); end; procedure TDefaultCriteria.Equals(const AValue: Int64); @@ -88,16 +72,11 @@ procedure TDefaultCriteria.Equals(const AValue: Int64); FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue])); end; -procedure TDefaultCriteria.Where(const AField: TField); -begin - Self.Where(AField.Origin); -end; - -procedure TDefaultCriteria.Equals(const AValue: Boolean); +procedure TDefaultCriteria.Equals(const AValue: string); const - PHRASE = '%s %s'; + PHRASE = '%s ''%s'''; begin - FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, BoolToStr(AValue, True)])); + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue])); end; procedure TDefaultCriteria.Like(const AValue: string); @@ -117,11 +96,6 @@ procedure TDefaultCriteria.Like(const AValue: string); LParam.Value := AValue; end; -procedure TDefaultCriteria.Order(const AField: TField); -begin - Self.Order(AField.Origin); -end; - procedure TDefaultCriteria.Where(const AField: string); const PHRASE = '%s %s'; @@ -129,16 +103,6 @@ procedure TDefaultCriteria.Where(const AField: string); FQuery.SQL.Add(Format(PHRASE, [TOperatorType.WHERE.ToString, AField])); end; -procedure TDefaultCriteria.Where(const AValue: Boolean); -begin - Self.Where(BoolToStr(AValue, True)); -end; - -procedure TDefaultCriteria.&Or(const AField: TField); -begin - Self.&Or(AField.Origin); -end; - procedure TDefaultCriteria.Order(const AField: string); const PHRASE = '%s %s'; diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index 2f42294..62f5e15 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -30,15 +30,15 @@ TRagna = class(TInterfacedObject, IRagna) procedure Remove(const AField: TField; const AValue: Int64); procedure FindById(const AField: TField; const AValue: Int64); procedure UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject); - procedure New(const ABody: TJSONObject); overload; - procedure New(const ABody: TJSONArray); overload; procedure OpenUp; procedure OpenEmpty; procedure Reset; - procedure ToJson(out AJSON: TJSONArray); overload; - procedure ToJson(out AJSON: TJSONObject); overload; procedure EditFromJson(const AJSON: TJSONObject); overload; procedure EditFromJson(const AJSON: TJSONArray); overload; + procedure EditFromJson(const AJSON: string); overload; + procedure New(const ABody: TJSONObject); overload; + procedure New(const ABody: TJSONArray); overload; + procedure New(const ABody: string); overload; public constructor Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); property Query: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF} read FQuery write FQuery; @@ -78,6 +78,11 @@ destructor TRagna.Destroy; FManagerCriteria.Free; end; +procedure TRagna.EditFromJson(const AJSON: string); +begin + FQuery.MergeFromJSONObject(AJSON); +end; + procedure TRagna.SaveState; var LSql: string; @@ -102,7 +107,7 @@ procedure TRagna.FindById(const AField: TField; const AValue: Int64); procedure TRagna.EditFromJson(const AJSON: TJSONObject); begin - FQuery.LoadFromJSON(AJSON, False); + FQuery.MergeFromJSONObject(AJSON, False); end; {$IFDEF UNIDAC} @@ -125,10 +130,16 @@ function TRagna.HasField(const AFields: array of TField): Boolean; Result := Length(AFields) > 0; end; +procedure TRagna.New(const ABody: string); +begin + OpenEmpty; + FQuery.LoadFromJSON(ABody); +end; + procedure TRagna.New(const ABody: TJSONArray); begin OpenEmpty; - FQuery.EditFromJson(ABody); + FQuery.LoadFromJSON(ABody); end; procedure TRagna.OpenUp; @@ -156,7 +167,7 @@ procedure TRagna.Paginate(const AOffSet, ALimit: Integer); procedure TRagna.New(const ABody: TJSONObject); begin OpenEmpty; - FQuery.EditFromJson(ABody); + FQuery.LoadFromJSON(ABody); end; procedure TRagna.RadicalResearch(const AValue: string; const AFields: array of TField); @@ -189,11 +200,6 @@ procedure TRagna.Reset; FQuery.SQL.Text := LSql; end; -procedure TRagna.ToJson(out AJSON: TJSONObject); -begin - AJSON := Self.ToJSONObject; -end; - function TRagna.ToJSONArray: TJSONArray; begin Result := (FQuery as TDataSet).ToJSONArray; @@ -206,11 +212,6 @@ function TRagna.ToJSONObject: TJSONObject; Result := (FQuery as TDataSet).ToJSONObject; end; -procedure TRagna.ToJson(out AJSON: TJSONArray); -begin - AJSON := Self.ToJSONArray; -end; - procedure TRagna.UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject); begin FQuery.FindById(AField, AValue).OpenUp.MergeFromJSONObject(ABody, False); diff --git a/src/helpers/Ragna.pas b/src/helpers/Ragna.pas index 3e53736..4ca549e 100644 --- a/src/helpers/Ragna.pas +++ b/src/helpers/Ragna.pas @@ -16,17 +16,17 @@ TRagnaHelper = class helper for {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF function Remove(const AField: TField; const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; function FindById(const AField: TField; const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; function UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; - function New(const ABody: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; - function New(const ABody: TJSONArray): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function Reset: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; function OpenUp: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; function OpenEmpty: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; - function Reset: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; - function ToJson(out AJSON: TJSONArray): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; deprecated; - function ToJson(out AJSON: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; deprecated; function ToJSONObject: TJSONObject; function ToJSONArray: TJSONArray; + function New(const ABody: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function New(const ABody: TJSONArray): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function New(const ABody: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; function EditFromJson(const AJSON: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; function EditFromJson(const AJSON: TJSONArray): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function EditFromJson(const AJSON: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; function Where(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; function Where(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; function Where(const AValue: Boolean): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; @@ -39,7 +39,8 @@ TRagnaHelper = class helper for {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF function &Equals(const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; function &Equals(const AValue: Boolean): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; function &Equals(const AValue: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; - function Order(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; + function Order(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function Order(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; end; implementation @@ -47,19 +48,16 @@ implementation uses System.SysUtils, Ragna.Intf; function TRagnaHelper.&Or(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; -var - LRagna: TRagna; begin - LRagna := TRagna.Create(Self); - try - LRagna.Criteria.&Or(AField); - finally - LRagna.Free; - end; - Result := Self; + Result := &Or(AField.Origin); end; function TRagnaHelper.&And(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; +begin + Result := &And(AField.Origin); +end; + +function TRagnaHelper.&And(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; begin @@ -72,26 +70,26 @@ function TRagnaHelper.&And(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE Result := Self; end; -function TRagnaHelper.&And(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; +function TRagnaHelper.&Or(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; begin LRagna := TRagna.Create(Self); try - LRagna.Criteria.&And(AField); + LRagna.Criteria.&Or(AField); finally LRagna.Free; end; Result := Self; end; -function TRagnaHelper.&Or(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; +function TRagnaHelper.Order(const AField: string): TFDQuery; var LRagna: TRagna; begin LRagna := TRagna.Create(Self); try - LRagna.Criteria.&Or(AField); + LRagna.Criteria.Order(AField); finally LRagna.Free; end; @@ -116,6 +114,15 @@ function TRagnaHelper.EditFromJson(const AJSON: TJSONArray): {$IFDEF UNIDAC}TUni Result := Self; end; +function TRagnaHelper.EditFromJson(const AJSON: string): TFDQuery; +var + LRagna: IRagna; +begin + LRagna := TRagna.Create(Self); + LRagna.EditFromJson(AJSON); + Result := Self; +end; + function TRagnaHelper.Equals(const AValue: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; @@ -162,7 +169,7 @@ function TRagnaHelper.FindById(const AField: TField; const AValue: Int64): {$IFD function TRagnaHelper.Like(const AValue: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; begin - + Result := Like(AValue.AsString); end; function TRagnaHelper.EditFromJson(const AJSON: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; @@ -215,16 +222,8 @@ function TRagnaHelper.OpenUp: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; end; function TRagnaHelper.Order(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; -var - LRagna: TRagna; begin - LRagna := TRagna.Create(Self); - try - LRagna.Criteria.Order(AField); - finally - LRagna.Free; - end; - Result := Self; + Result := Order(AField.Origin); end; function TRagnaHelper.Paginate(const AOffSet, ALimit: Integer): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; @@ -263,15 +262,6 @@ function TRagnaHelper.Reset: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; Result := Self; end; -function TRagnaHelper.ToJson(out AJSON: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; -var - LRagna: IRagna; -begin - LRagna := TRagna.Create(Self); - LRagna.ToJson(AJSON); - Result := Self; -end; - function TRagnaHelper.ToJSONArray: TJSONArray; var LRagna: IRagna; @@ -288,15 +278,6 @@ function TRagnaHelper.ToJSONObject: TJSONObject; Result := LRagna.ToJSONObject; end; -function TRagnaHelper.ToJson(out AJSON: TJSONArray): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; -var - LRagna: IRagna; -begin - LRagna := TRagna.Create(Self); - LRagna.ToJson(AJSON); - Result := Self; -end; - function TRagnaHelper.UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject): TFDQuery; var LRagna: IRagna; @@ -320,28 +301,21 @@ function TRagnaHelper.Where(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELS end; function TRagnaHelper.Where(const AValue: Boolean): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; -var - LRagna: TRagna; begin - LRagna := TRagna.Create(Self); - try - LRagna.Criteria.Where(AValue); - finally - LRagna.Free; - end; - Result := Self; + Result := Where(BoolToStr(AValue, True)); end; function TRagnaHelper.Where(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; +begin + Result := Where(AField.Origin); +end; + +function TRagnaHelper.New(const ABody: string): TFDQuery; var - LRagna: TRagna; + LRagna: IRagna; begin LRagna := TRagna.Create(Self); - try - LRagna.Criteria.Where(AField); - finally - LRagna.Free; - end; + LRagna.New(ABody); Result := Self; end; diff --git a/src/interfaces/Ragna.Criteria.Intf.pas b/src/interfaces/Ragna.Criteria.Intf.pas index 54924ae..f621de4 100644 --- a/src/interfaces/Ragna.Criteria.Intf.pas +++ b/src/interfaces/Ragna.Criteria.Intf.pas @@ -6,25 +6,17 @@ interface -uses Data.DB; - type ICriteria = interface ['{BC7603D3-DB7D-4A61-AA73-E1152A933E07}'] - procedure Where(const AField: string); overload; - procedure Where(const AField: TField); overload; - procedure Where(const AValue: Boolean); overload; - procedure &Or(const AField: string); overload; - procedure &Or(const AField: TField); overload; - procedure &And(const AField: string); overload; - procedure &And(const AField: TField); overload; - procedure Like(const AValue: string); overload; - procedure Like(const AValue: TField); overload; + procedure Where(const AField: string); + procedure &Or(const AField: string); + procedure &And(const AField: string); + procedure Like(const AValue: string); procedure &Equals(const AValue: Int64); overload; procedure &Equals(const AValue: Boolean); overload; procedure &Equals(const AValue: string); overload; - procedure Order(const AField: string); overload; - procedure Order(const AField: TField); overload; + procedure Order(const AField: string); end; implementation diff --git a/src/interfaces/Ragna.Intf.pas b/src/interfaces/Ragna.Intf.pas index 8fda85b..b9ef070 100644 --- a/src/interfaces/Ragna.Intf.pas +++ b/src/interfaces/Ragna.Intf.pas @@ -16,15 +16,15 @@ interface procedure Remove(const AField: TField; const AValue: Int64); procedure FindById(const AField: TField; const AValue: Int64); procedure UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject); - procedure New(const ABody: TJSONObject); overload; - procedure New(const ABody: TJSONArray); overload; procedure OpenUp; procedure OpenEmpty; procedure Reset; - procedure ToJson(out AJSON: TJSONArray); overload; - procedure ToJson(out AJSON: TJSONObject); overload; procedure EditFromJson(const AJSON: TJSONObject); overload; procedure EditFromJson(const AJSON: TJSONArray); overload; + procedure EditFromJson(const AJSON: string); overload; + procedure New(const ABody: TJSONObject); overload; + procedure New(const ABody: TJSONArray); overload; + procedure New(const ABody: string); overload; function ToJSONArray: TJSONArray; function ToJSONObject: TJSONObject; end; From f835ebc5dcc15e1fedea747ccf3e1612eb702500 Mon Sep 17 00:00:00 2001 From: Vinicius Sanchez Date: Tue, 3 May 2022 17:00:53 -0300 Subject: [PATCH 40/45] Create documentation #3 --- README.md | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/README.md b/README.md index 981d037..2cd2dfc 100644 --- a/README.md +++ b/README.md @@ -1 +1,108 @@ # ragna +Ragna Ragna is a query builder for projects written in Delphi, compatible with FireDAC and UniDAC components. +
We created a channel on Telegram for questions and support:

+ + + + +## ⚙️ Installation +Installation is done using the [`boss install`](https://github.com/HashLoad/boss) command: +``` sh +boss install ragna +``` +If you choose to install manually, simply add the following folders to your project, in *Project > Options > Resource Compiler > Directories and Conditionals > Include file search path* +``` +../ragna/src/core +../ragna/src/helpers +../ragna/src/interfaces +../ragna/src/state +../ragna/src/types +``` + +## ⚡️ Quickstart +You need to use Ragna +```pascal +uses Ragna; +``` + +* Open query +```delphi +begin + Country.OpenUp; +end; +``` + +* Open empty query +```delphi +begin + Country.OpenEmpty; +end; +``` + +* Where +```delphi +begin + Country + .Where(CountryName).Equals('Brazil') + .OpenUp; +end; +``` + +* Or +```delphi +begin + Country + .Where(CountryName).Equals('Brazil') + .&Or(CountryName).Equals('Canada') + .OpenUp; +end; +``` + +* And +```delphi +begin + Country + .Where(CountryName).Equals('Brazil') + .&And(CountryCapital).Equals('Brasilia') + .OpenUp; +end; +``` + +* Like +```delphi +begin + Country + .Where(CountryName).Like('B') + .OpenUp; +end; +``` + +* Order +```delphi +begin + Country + .Order(CountryName) + .OpenUp; +end; +``` + +* To JSON object +```delphi +var + LJson: TJSONObject; +begin + LJson := Country.OpenUp.ToJSONObject; +end; +``` + +* To JSON array +```delphi +var + LJson: TJSONArray; +begin + LJson := Country.OpenUp.ToJSONArray; +end; +``` + +## ⚠️ License +`Ragna` is free and open-source middleware licensed under the [MIT License](https://github.com/HashLoad/ragna/blob/master/LICENSE). From 7b28e55e0ada9258120eb3b4c5e506aa87b7e534 Mon Sep 17 00:00:00 2001 From: Vinicius Sanchez Date: Tue, 31 Jan 2023 22:48:47 -0300 Subject: [PATCH 41/45] Remove warnings --- src/core/Ragna.Criteria.Impl.pas | 294 +++++++++++++++---------------- 1 file changed, 147 insertions(+), 147 deletions(-) diff --git a/src/core/Ragna.Criteria.Impl.pas b/src/core/Ragna.Criteria.Impl.pas index 37a4a49..3955178 100644 --- a/src/core/Ragna.Criteria.Impl.pas +++ b/src/core/Ragna.Criteria.Impl.pas @@ -1,149 +1,149 @@ unit Ragna.Criteria.Impl; - -{$IF DEFINED(FPC)} - {$MODE DELPHI}{$H+} -{$ENDIF} - -interface - -uses {$IFDEF UNIDAC}Uni{$ELSE}FireDAC.Comp.Client, FireDAC.Stan.Param{$ENDIF}, - StrUtils, Data.DB, System.Hash, Ragna.Criteria.Intf, Ragna.Types; - -type - TDefaultCriteria = class(TInterfacedObject, ICriteria) - private - FQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; - procedure Where(const AField: string); - procedure &Or(const AField: string); - procedure &And(const AField: string); - procedure Like(const AValue: string); - procedure &Equals(const AValue: Int64); overload; - procedure &Equals(const AValue: Boolean); overload; - procedure &Equals(const AValue: string); overload; - procedure Order(const AField: string); - public - constructor Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); - end; - - TManagerCriteria = class - private - FCriteria: ICriteria; - function GetDrive(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}): string; - function GetInstanceCriteria(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}): ICriteria; - public - constructor Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); - property Criteria: ICriteria read FCriteria write FCriteria; - end; - -implementation - -uses FireDAC.Stan.Intf, SysUtils; - -procedure TDefaultCriteria.&And(const AField: string); -const - PHRASE = '%s %s'; -begin - FQuery.SQL.Add(Format(PHRASE, [TOperatorType.AND.ToString, AField])); -end; - -procedure TDefaultCriteria.&Or(const AField: string); -const - PHRASE = ' %s %s'; -begin - FQuery.SQL.Add(Format(PHRASE, [TOperatorType.OR.ToString, AField])); -end; - -constructor TDefaultCriteria.Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); -begin - FQuery := AQuery; -end; - -procedure TDefaultCriteria.Equals(const AValue: Boolean); -const - PHRASE = '%s %s'; -begin - FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, BoolToStr(AValue, True)])); -end; - -procedure TDefaultCriteria.Equals(const AValue: Int64); -const - PHRASE = '%s %d'; -begin - FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue])); -end; - -procedure TDefaultCriteria.Equals(const AValue: string); -const - PHRASE = '%s ''%s'''; -begin - FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue])); -end; - -procedure TDefaultCriteria.Like(const AValue: string); -const - PHRASE = ' %s %s'; -var - LKeyParam: string; - LParam: {$IFDEF UNIDAC}TUniParam{$ELSE}TFDParam{$ENDIF}; -begin - LKeyParam := THashMD5.Create.HashAsString; - FQuery.SQL.Text := FQuery.SQL.Text + Format(PHRASE, [TOperatorType.LIKE.ToString, ':' + LKeyParam]); - LParam := FQuery.ParamByName(LKeyParam); - LParam.DataType := ftString; - if Pos('%', AValue) <= 0 then - LParam.Value := AValue + '%' - else - LParam.Value := AValue; -end; - -procedure TDefaultCriteria.Where(const AField: string); -const - PHRASE = '%s %s'; -begin - FQuery.SQL.Add(Format(PHRASE, [TOperatorType.WHERE.ToString, AField])); -end; - -procedure TDefaultCriteria.Order(const AField: string); -const - PHRASE = '%s %s'; -begin - FQuery.SQL.Add(Format(PHRASE, [TOperatorType.ORDER.ToString, AField])); -end; - -constructor TManagerCriteria.Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); -begin - FCriteria := GetInstanceCriteria(AQuery); -end; - -function TManagerCriteria.GetDrive(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}): string; -{$IFDEF UNIDAC} -begin - Result := AQuery.Connection.ProviderName; -end; -{$ELSE} -var - LDef: IFDStanConnectionDef; -begin - Result := AQuery.Connection.DriverName; - if Result.IsEmpty and not AQuery.Connection.ConnectionDefName.IsEmpty then - begin - LDef := FDManager.ConnectionDefs.FindConnectionDef(AQuery.Connection.ConnectionDefName); - if LDef = nil then - raise Exception.Create('ConnectionDefs "' + AQuery.Connection.ConnectionDefName + '" not found'); - Result := LDef.Params.DriverID; - end; -end; -{$ENDIF} - -function TManagerCriteria.GetInstanceCriteria(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}): ICriteria; -begin - case AnsiIndexStr(GetDrive(AQuery), ['PG']) of - 0: - Result := TDefaultCriteria.Create(AQuery); - else - Result := TDefaultCriteria.Create(AQuery); - end; -end; - + +{$IF DEFINED(FPC)} + {$MODE DELPHI}{$H+} +{$ENDIF} + +interface + +uses {$IFDEF UNIDAC}Uni{$ELSE}FireDAC.Comp.Client, FireDAC.Stan.Param{$ENDIF}, + StrUtils, Data.DB, System.Hash, Ragna.Criteria.Intf, Ragna.Types; + +type + TDefaultCriteria = class(TInterfacedObject, ICriteria) + private + FQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; + procedure Where(const AField: string); + procedure &Or(const AField: string); + procedure &And(const AField: string); + procedure Like(const AValue: string); + procedure &Equals(const AValue: Int64); reintroduce; overload; + procedure &Equals(const AValue: Boolean); reintroduce; overload; + procedure &Equals(const AValue: string); reintroduce; overload; + procedure Order(const AField: string); + public + constructor Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); + end; + + TManagerCriteria = class + private + FCriteria: ICriteria; + function GetDrive(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}): string; + function GetInstanceCriteria(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}): ICriteria; + public + constructor Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); + property Criteria: ICriteria read FCriteria write FCriteria; + end; + +implementation + +uses FireDAC.Stan.Intf, SysUtils; + +procedure TDefaultCriteria.&And(const AField: string); +const + PHRASE = '%s %s'; +begin + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.AND.ToString, AField])); +end; + +procedure TDefaultCriteria.&Or(const AField: string); +const + PHRASE = ' %s %s'; +begin + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.OR.ToString, AField])); +end; + +constructor TDefaultCriteria.Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); +begin + FQuery := AQuery; +end; + +procedure TDefaultCriteria.Equals(const AValue: Boolean); +const + PHRASE = '%s %s'; +begin + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, BoolToStr(AValue, True)])); +end; + +procedure TDefaultCriteria.Equals(const AValue: Int64); +const + PHRASE = '%s %d'; +begin + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue])); +end; + +procedure TDefaultCriteria.Equals(const AValue: string); +const + PHRASE = '%s ''%s'''; +begin + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue])); +end; + +procedure TDefaultCriteria.Like(const AValue: string); +const + PHRASE = ' %s %s'; +var + LKeyParam: string; + LParam: {$IFDEF UNIDAC}TUniParam{$ELSE}TFDParam{$ENDIF}; +begin + LKeyParam := THashMD5.Create.HashAsString; + FQuery.SQL.Text := FQuery.SQL.Text + Format(PHRASE, [TOperatorType.LIKE.ToString, ':' + LKeyParam]); + LParam := FQuery.ParamByName(LKeyParam); + LParam.DataType := ftString; + if Pos('%', AValue) <= 0 then + LParam.Value := AValue + '%' + else + LParam.Value := AValue; +end; + +procedure TDefaultCriteria.Where(const AField: string); +const + PHRASE = '%s %s'; +begin + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.WHERE.ToString, AField])); +end; + +procedure TDefaultCriteria.Order(const AField: string); +const + PHRASE = '%s %s'; +begin + FQuery.SQL.Add(Format(PHRASE, [TOperatorType.ORDER.ToString, AField])); +end; + +constructor TManagerCriteria.Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); +begin + FCriteria := GetInstanceCriteria(AQuery); +end; + +function TManagerCriteria.GetDrive(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}): string; +{$IFDEF UNIDAC} +begin + Result := AQuery.Connection.ProviderName; +end; +{$ELSE} +var + LDef: IFDStanConnectionDef; +begin + Result := AQuery.Connection.DriverName; + if Result.IsEmpty and not AQuery.Connection.ConnectionDefName.IsEmpty then + begin + LDef := FDManager.ConnectionDefs.FindConnectionDef(AQuery.Connection.ConnectionDefName); + if LDef = nil then + raise Exception.Create('ConnectionDefs "' + AQuery.Connection.ConnectionDefName + '" not found'); + Result := LDef.Params.DriverID; + end; +end; +{$ENDIF} + +function TManagerCriteria.GetInstanceCriteria(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}): ICriteria; +begin + case AnsiIndexStr(GetDrive(AQuery), ['PG']) of + 0: + Result := TDefaultCriteria.Create(AQuery); + else + Result := TDefaultCriteria.Create(AQuery); + end; +end; + end. - \ No newline at end of file + From e07db3827c6480fa6154521bdfc33e5852681bc1 Mon Sep 17 00:00:00 2001 From: Vinicius Sanchez Date: Mon, 27 Feb 2023 22:17:02 -0300 Subject: [PATCH 42/45] Bug fix OpenEmpty --- samples/Samples.dproj | 288 ++++++++++++++++++++++++++++++++++++++-- src/core/Ragna.Impl.pas | 2 - 2 files changed, 277 insertions(+), 13 deletions(-) diff --git a/samples/Samples.dproj b/samples/Samples.dproj index beed690..b24c3f5 100644 --- a/samples/Samples.dproj +++ b/samples/Samples.dproj @@ -1,7 +1,7 @@  {4FF886E7-EF89-4410-871B-B4283C20426D} - 18.8 + 19.4 VCL Samples.dpr True @@ -112,10 +112,6 @@ - - Cfg_2 - Base - Base @@ -123,6 +119,10 @@ Cfg_1 Base + + Cfg_2 + Base + Delphi.Personality.12 @@ -152,6 +152,16 @@ 0 + + + classes + 64 + + + classes + 64 + + classes @@ -280,6 +290,16 @@ 1 + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + res\drawable-ldpi @@ -443,6 +463,11 @@ 1 .framework + + Contents\MacOS + 1 + .framework + 0 @@ -470,6 +495,11 @@ 1 .dylib + + Contents\MacOS + 1 + .dylib + 0 .dll;.bpl @@ -498,6 +528,11 @@ 1 .dylib + + Contents\MacOS + 1 + .dylib + 0 .bpl @@ -527,10 +562,40 @@ Contents\Resources\StartUp\ 0 + + Contents\Resources\StartUp\ + 0 + 0 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + 1 @@ -630,6 +695,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -641,6 +716,66 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + 1 @@ -740,6 +875,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -751,6 +896,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -795,6 +950,86 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + 1 @@ -842,6 +1077,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + 1 @@ -858,6 +1103,10 @@ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + @@ -868,6 +1117,10 @@ ..\ 1 + + ..\ + 1 + @@ -878,6 +1131,10 @@ Contents 1 + + Contents + 1 + @@ -888,6 +1145,10 @@ Contents\Resources 1 + + Contents\Resources + 1 + @@ -918,6 +1179,10 @@ Contents\MacOS 1 + + Contents\MacOS + 1 + 0 @@ -956,16 +1221,17 @@ 1 - - + + + + - - - - + + + True diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index 62f5e15..fcb6078 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -66,7 +66,6 @@ procedure TRagna.Remove(const AField: TField; const AValue: Int64); LDeleted: Integer; LSql: string; begin - OpenEmpty; LSql := Format(DELETE_SQL, [{$IFDEF UNIDAC}GetTableName(AField){$ELSE}GetTableName{$ENDIF}, AField.FieldName]); LDeleted := FQuery.Connection.ExecSQL(LSql, [AValue]); if not DELETED[LDeleted] then @@ -100,7 +99,6 @@ procedure TRagna.FindById(const AField: TField; const AValue: Int64); var LField: string; begin - OpenEmpty; LField := {$IFDEF UNIDAC}GetTableName(AField){$ELSE}GetTableName{$ENDIF} + '.' + AField.Origin; FQuery.Reset.Where(LField).Equals(AValue); end; From 7390f69d206762f58eec5a377086af76259daad1 Mon Sep 17 00:00:00 2001 From: Vinicius Sanchez Date: Mon, 27 Feb 2023 23:54:30 -0300 Subject: [PATCH 43/45] Bug fix GetTableName --- src/core/Ragna.Impl.pas | 87 ++++++++++++++++++++++++++++++----------- 1 file changed, 65 insertions(+), 22 deletions(-) diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index fcb6078..ac68c19 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -16,11 +16,6 @@ TRagna = class(TInterfacedObject, IRagna) FCriteria: ICriteria; procedure SaveState; private - {$IFDEF UNIDAC} - function GetTableName(AField: TField): string; - {$ELSE} - function GetTableName: string; - {$ENDIF} function HasField(const AFields: array of TField): Boolean; function ToJSONObject: TJSONObject; function ToJSONArray: TJSONArray; @@ -39,6 +34,8 @@ TRagna = class(TInterfacedObject, IRagna) procedure New(const ABody: TJSONObject); overload; procedure New(const ABody: TJSONArray); overload; procedure New(const ABody: string); overload; + function GetTableName(const CommandText: string): string; + function RemoverEspacosParenteses(const Texto: string): string; public constructor Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); property Query: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF} read FQuery write FQuery; @@ -66,7 +63,7 @@ procedure TRagna.Remove(const AField: TField; const AValue: Int64); LDeleted: Integer; LSql: string; begin - LSql := Format(DELETE_SQL, [{$IFDEF UNIDAC}GetTableName(AField){$ELSE}GetTableName{$ENDIF}, AField.FieldName]); + LSql := Format(DELETE_SQL, [GetTableName(FQuery.sql.Text), AField.FieldName]); LDeleted := FQuery.Connection.ExecSQL(LSql, [AValue]); if not DELETED[LDeleted] then RaiseNotFound; @@ -99,7 +96,7 @@ procedure TRagna.FindById(const AField: TField; const AValue: Int64); var LField: string; begin - LField := {$IFDEF UNIDAC}GetTableName(AField){$ELSE}GetTableName{$ENDIF} + '.' + AField.Origin; + LField := GetTableName(FQuery.SQL.Text) + '.' + AField.Origin; FQuery.Reset.Where(LField).Equals(AValue); end; @@ -108,21 +105,6 @@ procedure TRagna.EditFromJson(const AJSON: TJSONObject); FQuery.MergeFromJSONObject(AJSON, False); end; -{$IFDEF UNIDAC} -function TRagna.GetTableName(AField: TField): string; -var - LFieldDesc: TSqlFieldDesc; -begin - LFieldDesc := TSqlFieldDesc(FQuery.GetFieldDesc(AField)); - Result := LFieldDesc.BaseTableName; -end; -{$ELSE} -function TRagna.GetTableName: string; -begin - Result := FQuery.Table.Table.SourceName; -end; -{$ENDIF} - function TRagna.HasField(const AFields: array of TField): Boolean; begin Result := Length(AFields) > 0; @@ -215,4 +197,65 @@ procedure TRagna.UpdateById(const AField: TField; const AValue: Int64; const ABo FQuery.FindById(AField, AValue).OpenUp.MergeFromJSONObject(ABody, False); end; +function TRagna.GetTableName(const CommandText: string): string; +var + LCopy: Boolean; + I, ParentesesAbertos: Integer; + Tabela, LFrom: string; +begin + LCopy := False; + Tabela := EmptyStr; + Result := RemoverEspacosParenteses(CommandText.Replace(' ', EmptyStr)); + ParentesesAbertos := 0; + for I := 1 to Result.Length do + begin + if Result[I] = '(' then + begin + if Copy(LowerCase(Result), I + 1, 6) = 'select' then + begin + Inc(ParentesesAbertos); + Continue; + end; + if ParentesesAbertos > 0 then + Inc(ParentesesAbertos); + end + else if (Result[I] = ')') and (ParentesesAbertos > 0) then + begin + Dec(ParentesesAbertos); + Continue; + end; + if (ParentesesAbertos = 0) then + begin + LFrom := Copy(Result, I-5, 5); + if LFrom.ToLower.Equals('from ') then + LCopy := True; + if LCopy then + begin + if Ord(Result[I]) = 10 then + Break; + Tabela := Tabela + Result[I]; + end; + end; + end; + Result := Tabela.Trim; +end; + +function TRagna.RemoverEspacosParenteses(const Texto: string): string; +var + I: Integer; +begin + Result := EmptyStr; + for I := 1 to Pred(Texto.Length) do + begin + if not Result.Trim.IsEmpty then + begin + if (Result[Result.Length] = '(') and (Texto[I] = ' ') then + Continue; + if (Texto[I] = ' ') and (Texto[I + 1] = ')') then + Continue; + end; + Result := Result + Texto[I]; + end; +end; + end. From 892b25e35b576c77780ce5b161eb1221aab542e7 Mon Sep 17 00:00:00 2001 From: Vinicius Sanchez Date: Tue, 28 Feb 2023 17:13:23 -0300 Subject: [PATCH 44/45] Bug fix --- .gitignore | 2 +- ragna.dproj | 501 ++++++++++++++++++---------------------- src/core/Ragna.Impl.pas | 2 +- 3 files changed, 233 insertions(+), 272 deletions(-) diff --git a/.gitignore b/.gitignore index 469898e..5570b9b 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,6 @@ # C++ object files produced when C/C++ Output file generation is configured. # Uncomment this if you are not using external objects (zlib library for example). #*.obj -# # Delphi compiler-generated binaries (safe to delete) *.exe @@ -55,6 +54,7 @@ *.identcache *.projdata *.tvsconfig +*.skincfg *.dsk # Delphi history and backups diff --git a/ragna.dproj b/ragna.dproj index 1cd83d9..72a5d96 100644 --- a/ragna.dproj +++ b/ragna.dproj @@ -2,7 +2,7 @@ {D9E8CA95-FBB1-42EA-A7B4-909AC5ACFADD} ragna.dpk - 18.8 + 19.5 None True Debug @@ -23,6 +23,26 @@ Base true + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + true Base @@ -58,11 +78,12 @@ All true ragna - $(DCC_UnitSearchPath);modules\.dcp;modules\.dcu;modules;modules\dataset-serialize\src + modules\.dcp;modules\.dcu;modules;modules\dataset-serialize\src;$(DCC_UnitSearchPath) None android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services-ads-7.0.0.dex.jar;google-play-services-analytics-7.0.0.dex.jar;google-play-services-base-7.0.0.dex.jar;google-play-services-identity-7.0.0.dex.jar;google-play-services-maps-7.0.0.dex.jar;google-play-services-panorama-7.0.0.dex.jar;google-play-services-plus-7.0.0.dex.jar;google-play-services-wallet-7.0.0.dex.jar + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= @@ -72,6 +93,28 @@ true None android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services-ads-7.0.0.dex.jar;google-play-services-analytics-7.0.0.dex.jar;google-play-services-base-7.0.0.dex.jar;google-play-services-identity-7.0.0.dex.jar;google-play-services-maps-7.0.0.dex.jar;google-play-services-panorama-7.0.0.dex.jar;google-play-services-plus-7.0.0.dex.jar;google-play-services-wallet-7.0.0.dex.jar + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + + + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + Debug + $(MSBuildProjectName) + + + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false + Debug + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false + Debug Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) @@ -115,10 +158,6 @@ - - Cfg_2 - Base - Base @@ -126,6 +165,10 @@ Cfg_1 Base + + Cfg_2 + Base + Delphi.Personality.12 @@ -142,28 +185,8 @@ ragna.dpk - - - - true - - - - - ragna.bpl - true - - - - - true - - - - - true - - + + true @@ -174,11 +197,14 @@ true - + + true + + 1 @@ -187,14 +213,14 @@ 0 - + classes - 1 + 64 classes - 1 + 64 @@ -315,6 +341,16 @@ 1 + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + res\drawable-ldpi @@ -475,6 +511,10 @@ 1 .framework + + 1 + .framework + 0 @@ -488,6 +528,10 @@ 1 .dylib + + 1 + .dylib + 0 .dll;.bpl @@ -502,7 +546,7 @@ 1 .dylib - + 1 .dylib @@ -514,6 +558,10 @@ 1 .dylib + + 1 + .dylib + 0 .bpl @@ -532,7 +580,7 @@ 0 - + 0 @@ -541,442 +589,355 @@ 0 + + 0 + 0 - - - 1 - - + + 1 - + 1 - - + + + + + + Contents\Resources 1 - + + Contents\Resources 1 - + + Contents\Resources 1 - - - 1 - - + + + library\lib\armeabi-v7a 1 - + + library\lib\arm64-v8a 1 - - 1 1 - - 1 - - - - + 1 - + 1 - + 1 - - - + 1 - + 1 - - 1 + + 0 - - - 1 - - - 1 - - + + + library\lib\armeabi-v7a 1 - - - 1 - - + + 1 - + 1 - + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 - + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 - + + + + 1 1 - + 1 - - - 1 - - + + + Assets 1 - + + Assets 1 - - - 1 - - + + + Assets 1 - + + Assets 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - 1 - - - - - 1 - - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - + - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - - - - - 1 - - - 1 - - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - 1 - - - 1 - - - 1 - - - 1 - - - 0 - - - - - library\lib\armeabi-v7a + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - - Assets - 1 - - - Assets - 1 - - - - - Assets + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - Assets + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1 - - + + + + + - - - - + + + False False + False + False + False + False + False True False diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index ac68c19..d567932 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -245,7 +245,7 @@ function TRagna.RemoverEspacosParenteses(const Texto: string): string; I: Integer; begin Result := EmptyStr; - for I := 1 to Pred(Texto.Length) do + for I := 1 to Texto.Length do begin if not Result.Trim.IsEmpty then begin From 43c516f867d212a3e512975cd502b2fc95c170ea Mon Sep 17 00:00:00 2001 From: Everton Garcia Date: Tue, 27 Jun 2023 11:43:40 -0400 Subject: [PATCH 45/45] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20de=20m=C3=A9tod?= =?UTF-8?q?os=20onde=20a=20"Key"=20=C3=A9=20um=20TGuid.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/Ragna.Criteria.Impl.pas | 36 ++++---- src/core/Ragna.Impl.pas | 106 ++++++++++++++++------- src/helpers/Ragna.pas | 113 +++++++++++++++++-------- src/interfaces/Ragna.Criteria.Intf.pas | 1 + src/interfaces/Ragna.Intf.pas | 12 ++- 5 files changed, 179 insertions(+), 89 deletions(-) diff --git a/src/core/Ragna.Criteria.Impl.pas b/src/core/Ragna.Criteria.Impl.pas index 3955178..f98902b 100644 --- a/src/core/Ragna.Criteria.Impl.pas +++ b/src/core/Ragna.Criteria.Impl.pas @@ -1,14 +1,10 @@ unit Ragna.Criteria.Impl; - {$IF DEFINED(FPC)} {$MODE DELPHI}{$H+} {$ENDIF} - interface - uses {$IFDEF UNIDAC}Uni{$ELSE}FireDAC.Comp.Client, FireDAC.Stan.Param{$ENDIF}, StrUtils, Data.DB, System.Hash, Ragna.Criteria.Intf, Ragna.Types; - type TDefaultCriteria = class(TInterfacedObject, ICriteria) private @@ -20,11 +16,11 @@ TDefaultCriteria = class(TInterfacedObject, ICriteria) procedure &Equals(const AValue: Int64); reintroduce; overload; procedure &Equals(const AValue: Boolean); reintroduce; overload; procedure &Equals(const AValue: string); reintroduce; overload; + procedure &Equals(const AValue: TGuid); reintroduce; overload; procedure Order(const AField: string); public constructor Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); end; - TManagerCriteria = class private FCriteria: ICriteria; @@ -34,51 +30,42 @@ TManagerCriteria = class constructor Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); property Criteria: ICriteria read FCriteria write FCriteria; end; - implementation - uses FireDAC.Stan.Intf, SysUtils; - procedure TDefaultCriteria.&And(const AField: string); const PHRASE = '%s %s'; begin FQuery.SQL.Add(Format(PHRASE, [TOperatorType.AND.ToString, AField])); end; - procedure TDefaultCriteria.&Or(const AField: string); const PHRASE = ' %s %s'; begin FQuery.SQL.Add(Format(PHRASE, [TOperatorType.OR.ToString, AField])); end; - constructor TDefaultCriteria.Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); begin FQuery := AQuery; end; - procedure TDefaultCriteria.Equals(const AValue: Boolean); const PHRASE = '%s %s'; begin FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, BoolToStr(AValue, True)])); end; - procedure TDefaultCriteria.Equals(const AValue: Int64); const PHRASE = '%s %d'; begin FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue])); end; - procedure TDefaultCriteria.Equals(const AValue: string); const PHRASE = '%s ''%s'''; begin FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue])); end; - procedure TDefaultCriteria.Like(const AValue: string); const PHRASE = ' %s %s'; @@ -95,26 +82,22 @@ procedure TDefaultCriteria.Like(const AValue: string); else LParam.Value := AValue; end; - procedure TDefaultCriteria.Where(const AField: string); const PHRASE = '%s %s'; begin FQuery.SQL.Add(Format(PHRASE, [TOperatorType.WHERE.ToString, AField])); end; - procedure TDefaultCriteria.Order(const AField: string); const PHRASE = '%s %s'; begin FQuery.SQL.Add(Format(PHRASE, [TOperatorType.ORDER.ToString, AField])); end; - constructor TManagerCriteria.Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); begin FCriteria := GetInstanceCriteria(AQuery); end; - function TManagerCriteria.GetDrive(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}): string; {$IFDEF UNIDAC} begin @@ -134,7 +117,6 @@ function TManagerCriteria.GetDrive(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE} end; end; {$ENDIF} - function TManagerCriteria.GetInstanceCriteria(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}): ICriteria; begin case AnsiIndexStr(GetDrive(AQuery), ['PG']) of @@ -144,6 +126,20 @@ function TManagerCriteria.GetInstanceCriteria(const AQuery: {$IFDEF UNIDAC}TUniQ Result := TDefaultCriteria.Create(AQuery); end; end; +procedure TDefaultCriteria.Equals(const AValue: TGuid); +const + PHRASE = ' %s %s'; +var + LKeyParam: string; + LParam: {$IFDEF UNIDAC}TUniParam{$ELSE}TFDParam{$ENDIF}; +begin + LKeyParam := THashMD5.Create.HashAsString; -end. + FQuery.SQL.Text := FQuery.SQL.Text + Format(PHRASE, [TOperatorType.EQUALS.ToString, ':' + LKeyParam]); + LParam := FQuery.ParamByName(LKeyParam); + LParam.DataType := ftGuid; + LParam.AsGUID := AValue; +end; + +end. diff --git a/src/core/Ragna.Impl.pas b/src/core/Ragna.Impl.pas index d567932..39997f2 100644 --- a/src/core/Ragna.Impl.pas +++ b/src/core/Ragna.Impl.pas @@ -1,13 +1,9 @@ unit Ragna.Impl; - {$IF DEFINED(FPC)} {$MODE DELPHI}{$H+} {$ENDIF} - interface - uses {$IFDEF UNIDAC}Uni, SqlClassesUni{$ELSE}FireDAC.Comp.Client{$ENDIF}, Ragna.Intf, Ragna.Criteria.Intf, System.JSON, Data.DB, Ragna.Criteria.Impl; - type TRagna = class(TInterfacedObject, IRagna) private @@ -22,9 +18,15 @@ TRagna = class(TInterfacedObject, IRagna) procedure RaiseNotFound; procedure Paginate(const AOffSet, ALimit: Integer); {$IFDEF UNIDAC} deprecated 'Not implemented for UniDAC';{$ENDIF} procedure RadicalResearch(const AValue: string; const AFields: array of TField); - procedure Remove(const AField: TField; const AValue: Int64); - procedure FindById(const AField: TField; const AValue: Int64); - procedure UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject); + procedure Remove(const AField: TField; const AValue: Int64); overload; + procedure Remove(const AField: TField; const AValue: string; const AGuid: Boolean = False); overload; + procedure Remove(const AField: TField; const AValue: TGuid); overload; + procedure FindById(const AField: TField; const AValue: TGuid); overload; + procedure FindById(const AField: TField; const AValue: Int64); overload; + procedure FindById(const AField: TField; const AValue: string; const AGuid: Boolean = False); overload; + procedure UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject); overload; + procedure UpdateById(const AField: TField; const AValue: string; const ABody: TJSONObject; const AGuid: Boolean = False); overload; + procedure UpdateById(const AField: TField; const AValue: TGuid; const ABody: TJSONObject); overload; procedure OpenUp; procedure OpenEmpty; procedure Reset; @@ -42,11 +44,8 @@ TRagna = class(TInterfacedObject, IRagna) property Criteria: ICriteria read FCriteria write FCriteria; destructor Destroy; override; end; - implementation - uses Ragna.State, System.SysUtils, Ragna, DataSet.Serialize; - constructor TRagna.Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}); begin FQuery := AQuery; @@ -54,7 +53,6 @@ constructor TRagna.Create(const AQuery: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{ FManagerCriteria := TManagerCriteria.Create(FQuery); FCriteria := FManagerCriteria.Criteria; end; - procedure TRagna.Remove(const AField: TField; const AValue: Int64); const DELETE_SQL = 'DELETE FROM %s WHERE %s = :ID'; @@ -68,16 +66,35 @@ procedure TRagna.Remove(const AField: TField; const AValue: Int64); if not DELETED[LDeleted] then RaiseNotFound; end; - destructor TRagna.Destroy; begin FManagerCriteria.Free; end; - procedure TRagna.EditFromJson(const AJSON: string); begin FQuery.MergeFromJSONObject(AJSON); end; +procedure TRagna.FindById(const AField: TField; const AValue: TGuid); +var + LField: string; +begin + LField := GetTableName(FQuery.SQL.Text) + '.' + AField.Origin; + FQuery.Reset.Where(LField).Equals(AValue); +end; + +procedure TRagna.FindById(const AField: TField; const AValue: string; + const AGuid: Boolean); +var + LField: string; +begin + if AGuid then + FindById(AField, StringToGuid(AValue)) + else + begin + LField := GetTableName(FQuery.SQL.Text) + '.' + AField.Origin; + FQuery.Reset.Where(LField).Equals(AValue); + end; +end; procedure TRagna.SaveState; var @@ -86,12 +103,10 @@ procedure TRagna.SaveState; if not TRagnaState.GetInstance.GetState(FQuery, LSql) then TRagnaState.GetInstance.SetState(FQuery, FQuery.SQL.Text); end; - procedure TRagna.EditFromJson(const AJSON: TJSONArray); begin FQuery.LoadFromJSON(AJSON, False); end; - procedure TRagna.FindById(const AField: TField; const AValue: Int64); var LField: string; @@ -99,39 +114,32 @@ procedure TRagna.FindById(const AField: TField; const AValue: Int64); LField := GetTableName(FQuery.SQL.Text) + '.' + AField.Origin; FQuery.Reset.Where(LField).Equals(AValue); end; - procedure TRagna.EditFromJson(const AJSON: TJSONObject); begin FQuery.MergeFromJSONObject(AJSON, False); end; - function TRagna.HasField(const AFields: array of TField): Boolean; begin Result := Length(AFields) > 0; end; - procedure TRagna.New(const ABody: string); begin OpenEmpty; FQuery.LoadFromJSON(ABody); end; - procedure TRagna.New(const ABody: TJSONArray); begin OpenEmpty; FQuery.LoadFromJSON(ABody); end; - procedure TRagna.OpenUp; begin FQuery.Open; end; - procedure TRagna.OpenEmpty; begin FQuery.Where('1').Equals('2').OpenUp; end; - procedure TRagna.Paginate(const AOffSet, ALimit: Integer); begin {$IFDEF UNIDAC} @@ -143,13 +151,11 @@ procedure TRagna.Paginate(const AOffSet, ALimit: Integer); FQuery.FetchOptions.RecsMax := ALimit; {$ENDIF} end; - procedure TRagna.New(const ABody: TJSONObject); begin OpenEmpty; FQuery.LoadFromJSON(ABody); end; - procedure TRagna.RadicalResearch(const AValue: string; const AFields: array of TField); var LSearch: string; @@ -166,12 +172,10 @@ procedure TRagna.RadicalResearch(const AValue: string; const AFields: array of T end; end; end; - procedure TRagna.RaiseNotFound; begin raise Exception.Create('Resource not found!'); end; - procedure TRagna.Reset; var LSql: string; @@ -179,18 +183,27 @@ procedure TRagna.Reset; TRagnaState.GetInstance.GetState(FQuery, LSql); FQuery.SQL.Text := LSql; end; - function TRagna.ToJSONArray: TJSONArray; begin Result := (FQuery as TDataSet).ToJSONArray; end; - function TRagna.ToJSONObject: TJSONObject; begin if FQuery.IsEmpty then RaiseNotFound; Result := (FQuery as TDataSet).ToJSONObject; end; +procedure TRagna.UpdateById(const AField: TField; const AValue: TGuid; + const ABody: TJSONObject); +begin + FQuery.FindById(AField, AValue).OpenUp.MergeFromJSONObject(ABody, False); +end; + +procedure TRagna.UpdateById(const AField: TField; const AValue: string; + const ABody: TJSONObject; const AGuid: Boolean); +begin + FQuery.FindById(AField, AValue, AGuid).OpenUp.MergeFromJSONObject(ABody, False); +end; procedure TRagna.UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject); begin @@ -239,6 +252,42 @@ function TRagna.GetTableName(const CommandText: string): string; end; Result := Tabela.Trim; end; +procedure TRagna.Remove(const AField: TField; const AValue: string; + const AGuid: Boolean); +const + DELETE_SQL = 'DELETE FROM %s WHERE %s = :ID'; + DELETED: array [0 .. 1] of Boolean = (False, True); +var + LDeleted: Integer; + LSql: string; +begin + if AGuid then + Remove(AField, StringToGUID(AValue)) + else + begin + LDeleted := FQuery.Connection.ExecSQL(LSql, [AValue]); + if not DELETED[LDeleted] then + RaiseNotFound; + end; +end; + +procedure TRagna.Remove(const AField: TField; const AValue: TGuid); +const + DELETE_SQL = 'DELETE FROM %s WHERE %s = :ID'; + DELETED: array [0 .. 1] of Boolean = (False, True); +var + LDeleted: Integer; + LSql: string; +begin + LSql := Format(DELETE_SQL, [GetTableName(FQuery.sql.Text), AField.FieldName]); + + FQuery.SQL.Text := LSQL; + FQuery.ParamByName('ID').AsGUID := AValue; + LDeleted := FQuery.ExecSQL(true); + + if not DELETED[LDeleted] then + RaiseNotFound; +end; function TRagna.RemoverEspacosParenteses(const Texto: string): string; var @@ -257,5 +306,4 @@ function TRagna.RemoverEspacosParenteses(const Texto: string): string; Result := Result + Texto[I]; end; end; - end. diff --git a/src/helpers/Ragna.pas b/src/helpers/Ragna.pas index 4ca549e..8f63e2e 100644 --- a/src/helpers/Ragna.pas +++ b/src/helpers/Ragna.pas @@ -1,21 +1,23 @@ unit Ragna; - {$IF DEFINED(FPC)} {$MODE DELPHI}{$H+} {$ENDIF} - interface - uses {$IFDEF UNIDAC}Uni{$ELSE}FireDAC.Comp.Client{$ENDIF}, System.JSON, Data.DB, Ragna.Impl, Ragna.Criteria.Impl; - type TRagnaHelper = class helper for {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF} public function Paginate(const AOffSet, ALimit: Integer): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; function RadicalResearch(const AValue: string; const AFields: array of TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; - function Remove(const AField: TField; const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; - function FindById(const AField: TField; const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; - function UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; + function Remove(const AField: TField; const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function Remove(const AField: TField; const AValue: TGuid): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function Remove(const AField: TField; const AValue: string; const AGuid: Boolean = False): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function FindById(const AField: TField; const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function FindById(const AField: TField; const AValue: TGuid): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function FindById(const AField: TField; const AValue: string; const AGuid: Boolean = False): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function UpdateById(const AField: TField; const AValue: TGuid; const ABody: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function UpdateById(const AField: TField; const AValue: string; const ABody: TJSONObject; const AGuid: Boolean = False): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; function Reset: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; function OpenUp: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; function OpenEmpty: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; @@ -39,24 +41,20 @@ TRagnaHelper = class helper for {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF function &Equals(const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; function &Equals(const AValue: Boolean): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; function &Equals(const AValue: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; + function &Equals(const AValue: TGuid): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; function Order(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; function Order(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; overload; end; - implementation - uses System.SysUtils, Ragna.Intf; - function TRagnaHelper.&Or(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; begin Result := &Or(AField.Origin); end; - function TRagnaHelper.&And(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; begin Result := &And(AField.Origin); end; - function TRagnaHelper.&And(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; @@ -69,7 +67,6 @@ function TRagnaHelper.&And(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE end; Result := Self; end; - function TRagnaHelper.&Or(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; @@ -82,7 +79,6 @@ function TRagnaHelper.&Or(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE} end; Result := Self; end; - function TRagnaHelper.Order(const AField: string): TFDQuery; var LRagna: TRagna; @@ -95,7 +91,6 @@ function TRagnaHelper.Order(const AField: string): TFDQuery; end; Result := Self; end; - function TRagnaHelper.Remove(const AField: TField; const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; @@ -104,7 +99,6 @@ function TRagnaHelper.Remove(const AField: TField; const AValue: Int64): {$IFDEF LRagna.Remove(AField, AValue); Result := Self; end; - function TRagnaHelper.EditFromJson(const AJSON: TJSONArray): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; @@ -113,7 +107,6 @@ function TRagnaHelper.EditFromJson(const AJSON: TJSONArray): {$IFDEF UNIDAC}TUni LRagna.EditFromJson(AJSON); Result := Self; end; - function TRagnaHelper.EditFromJson(const AJSON: string): TFDQuery; var LRagna: IRagna; @@ -122,7 +115,6 @@ function TRagnaHelper.EditFromJson(const AJSON: string): TFDQuery; LRagna.EditFromJson(AJSON); Result := Self; end; - function TRagnaHelper.Equals(const AValue: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; @@ -131,7 +123,6 @@ function TRagnaHelper.Equals(const AValue: string): {$IFDEF UNIDAC}TUniQuery{$EL LRagna.Criteria.Equals(AValue); Result := Self; end; - function TRagnaHelper.Equals(const AValue: Boolean): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; @@ -144,7 +135,6 @@ function TRagnaHelper.Equals(const AValue: Boolean): {$IFDEF UNIDAC}TUniQuery{$E end; Result := Self; end; - function TRagnaHelper.Equals(const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; @@ -157,7 +147,6 @@ function TRagnaHelper.Equals(const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELS end; Result := Self; end; - function TRagnaHelper.FindById(const AField: TField; const AValue: Int64): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; @@ -166,12 +155,10 @@ function TRagnaHelper.FindById(const AField: TField; const AValue: Int64): {$IFD LRagna.FindById(AField, AValue); Result := Self; end; - function TRagnaHelper.Like(const AValue: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; begin Result := Like(AValue.AsString); end; - function TRagnaHelper.EditFromJson(const AJSON: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; @@ -180,7 +167,6 @@ function TRagnaHelper.EditFromJson(const AJSON: TJSONObject): {$IFDEF UNIDAC}TUn LRagna.EditFromJson(AJSON); Result := Self; end; - function TRagnaHelper.Like(const AValue: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; @@ -193,7 +179,6 @@ function TRagnaHelper.Like(const AValue: string): {$IFDEF UNIDAC}TUniQuery{$ELSE end; Result := Self; end; - function TRagnaHelper.New(const ABody: TJSONArray): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; @@ -202,7 +187,6 @@ function TRagnaHelper.New(const ABody: TJSONArray): {$IFDEF UNIDAC}TUniQuery{$EL LRagna.New(ABody); Result := Self; end; - function TRagnaHelper.OpenEmpty: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; @@ -211,7 +195,6 @@ function TRagnaHelper.OpenEmpty: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF} LRagna.OpenEmpty; Result := Self; end; - function TRagnaHelper.OpenUp: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; @@ -220,12 +203,10 @@ function TRagnaHelper.OpenUp: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; LRagna.OpenUp; Result := Self; end; - function TRagnaHelper.Order(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; begin Result := Order(AField.Origin); end; - function TRagnaHelper.Paginate(const AOffSet, ALimit: Integer): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; @@ -234,7 +215,6 @@ function TRagnaHelper.Paginate(const AOffSet, ALimit: Integer): {$IFDEF UNIDAC}T LRagna.Paginate(AOffSet, ALimit); Result := Self; end; - function TRagnaHelper.New(const ABody: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; @@ -243,7 +223,6 @@ function TRagnaHelper.New(const ABody: TJSONObject): {$IFDEF UNIDAC}TUniQuery{$E LRagna.New(ABody); Result := Self; end; - function TRagnaHelper.RadicalResearch(const AValue: string; const AFields: array of TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: IRagna; @@ -252,6 +231,25 @@ function TRagnaHelper.RadicalResearch(const AValue: string; const AFields: array LRagna.RadicalResearch(AValue, AFields); Result := Self; end; +function TRagnaHelper.Remove(const AField: TField; const AValue: string; + const AGuid: Boolean): TFDQuery; +var + LRagna: IRagna; +begin + LRagna := TRagna.Create(Self); + LRagna.Remove(AField, AValue, AGuid); + Result := Self; +end; + +function TRagnaHelper.Remove(const AField: TField; + const AValue: TGuid): TFDQuery; +var + LRagna: IRagna; +begin + LRagna := TRagna.Create(Self); + LRagna.Remove(AField, AValue); + Result := Self; +end; function TRagnaHelper.Reset: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var @@ -261,7 +259,6 @@ function TRagnaHelper.Reset: {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; LRagna.Reset; Result := Self; end; - function TRagnaHelper.ToJSONArray: TJSONArray; var LRagna: IRagna; @@ -269,7 +266,6 @@ function TRagnaHelper.ToJSONArray: TJSONArray; LRagna := TRagna.Create(Self); Result := LRagna.ToJSONArray; end; - function TRagnaHelper.ToJSONObject: TJSONObject; var LRagna: IRagna; @@ -277,6 +273,25 @@ function TRagnaHelper.ToJSONObject: TJSONObject; LRagna := TRagna.Create(Self); Result := LRagna.ToJSONObject; end; +function TRagnaHelper.UpdateById(const AField: TField; const AValue: TGuid; + const ABody: TJSONObject): TFDQuery; +var + LRagna: IRagna; +begin + LRagna := TRagna.Create(Self); + LRagna.UpdateById(AField, AValue, ABody); + Result := Self; +end; + +function TRagnaHelper.UpdateById(const AField: TField; const AValue: string; + const ABody: TJSONObject; const AGuid: Boolean): TFDQuery; +var + LRagna: IRagna; +begin + LRagna := TRagna.Create(Self); + LRagna.UpdateById(AField, AValue, ABody, AGuid); + Result := Self; +end; function TRagnaHelper.UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject): TFDQuery; var @@ -286,7 +301,6 @@ function TRagnaHelper.UpdateById(const AField: TField; const AValue: Int64; cons LRagna.UpdateById(AField, AValue, ABody); Result := Self; end; - function TRagnaHelper.Where(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; var LRagna: TRagna; @@ -299,17 +313,14 @@ function TRagnaHelper.Where(const AField: string): {$IFDEF UNIDAC}TUniQuery{$ELS end; Result := Self; end; - function TRagnaHelper.Where(const AValue: Boolean): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; begin Result := Where(BoolToStr(AValue, True)); end; - function TRagnaHelper.Where(const AField: TField): {$IFDEF UNIDAC}TUniQuery{$ELSE}TFDQuery{$ENDIF}; begin Result := Where(AField.Origin); end; - function TRagnaHelper.New(const ABody: string): TFDQuery; var LRagna: IRagna; @@ -318,5 +329,33 @@ function TRagnaHelper.New(const ABody: string): TFDQuery; LRagna.New(ABody); Result := Self; end; +function TRagnaHelper.Equals(const AValue: TGuid): TFDQuery; +var + LRagna: TRagna; +begin + LRagna := TRagna.Create(Self); + LRagna.Criteria.Equals(AValue); + Result := Self; +end; + +function TRagnaHelper.FindById(const AField: TField; + const AValue: TGuid): TFDQuery; +var + LRagna: IRagna; +begin + LRagna := TRagna.Create(Self); + LRagna.FindById(AField, AValue); + Result := Self; +end; + +function TRagnaHelper.FindById(const AField: TField; const AValue: string; + const AGuid: Boolean): TFDQuery; +var + LRagna: IRagna; +begin + LRagna := TRagna.Create(Self); + LRagna.FindById(AField, AValue, AGuid); + Result := Self; +end; end. diff --git a/src/interfaces/Ragna.Criteria.Intf.pas b/src/interfaces/Ragna.Criteria.Intf.pas index f621de4..92dfe0e 100644 --- a/src/interfaces/Ragna.Criteria.Intf.pas +++ b/src/interfaces/Ragna.Criteria.Intf.pas @@ -16,6 +16,7 @@ interface procedure &Equals(const AValue: Int64); overload; procedure &Equals(const AValue: Boolean); overload; procedure &Equals(const AValue: string); overload; + procedure &Equals(const AValue: TGuid); overload; procedure Order(const AField: string); end; diff --git a/src/interfaces/Ragna.Intf.pas b/src/interfaces/Ragna.Intf.pas index b9ef070..68857ba 100644 --- a/src/interfaces/Ragna.Intf.pas +++ b/src/interfaces/Ragna.Intf.pas @@ -13,9 +13,15 @@ interface ['{0F1AD1E9-A82C-44BE-9208-685B9C3C77F9}'] procedure Paginate(const AOffSet, ALimit: Integer); procedure RadicalResearch(const AValue: string; const AFields: array of TField); - procedure Remove(const AField: TField; const AValue: Int64); - procedure FindById(const AField: TField; const AValue: Int64); - procedure UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject); + procedure Remove(const AField: TField; const AValue: Int64); overload; + procedure Remove(const AField: TField; const AValue: string; const AGuid: Boolean = False); overload; + procedure Remove(const AField: TField; const AValue: TGuid); overload; + procedure FindById(const AField: TField; const AValue: TGuid); overload; + procedure FindById(const AField: TField; const AValue: Int64); overload; + procedure FindById(const AField: TField; const AValue: string; const AGuid: Boolean = False); overload; + procedure UpdateById(const AField: TField; const AValue: Int64; const ABody: TJSONObject); overload; + procedure UpdateById(const AField: TField; const AValue: string; const ABody: TJSONObject; const AGuid: Boolean = False); overload; + procedure UpdateById(const AField: TField; const AValue: TGuid; const ABody: TJSONObject); overload; procedure OpenUp; procedure OpenEmpty; procedure Reset;