From 32ca238bf89f579622d4b90d42a922c7f56e4af1 Mon Sep 17 00:00:00 2001 From: Glaucos Ginez Date: Thu, 25 Jun 2020 23:44:43 -0300 Subject: [PATCH] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20PostgreSQL=20(#12)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MiniREST.SQL.Common.pas | 2 +- MiniREST.SQL.SQLDb.pas | 8 +- unittest/SQL/MiniRESTSQLTest.lpi | 25 ++-- unittest/SQL/MiniRESTSQLTest.lpr | 2 +- unittest/SQL/MiniRESTSQLTest.lps | 174 +++++++++++++------------ unittest/SQL/Test.SQL.Default.pas | 186 +++++++++++++++++++-------- unittest/SQL/Test.SQL.Firebird.pas | 59 +++++++++ unittest/SQL/Test.SQL.PostgreSQL.pas | 59 +++++++++ unittest/SQL/test.sql.sqldb.pas | 44 +------ unittest/TEST.FDB | Bin 1589248 -> 1589248 bytes 10 files changed, 371 insertions(+), 188 deletions(-) create mode 100644 unittest/SQL/Test.SQL.Firebird.pas create mode 100644 unittest/SQL/Test.SQL.PostgreSQL.pas diff --git a/MiniREST.SQL.Common.pas b/MiniREST.SQL.Common.pas index 0a09542..55d5f16 100644 --- a/MiniREST.SQL.Common.pas +++ b/MiniREST.SQL.Common.pas @@ -5,7 +5,7 @@ interface uses SysUtils, Variants{$IFNDEF FPC},DB, Rtti{$ENDIF}; type - TMiniRESTSQLDatabaseType = (dbtUnknown, dbtFirebird); + TMiniRESTSQLDatabaseType = (dbtUnknown, dbtFirebird, dbtPostgreSQL); TMiniRESTSQLParamType = (stString, stFloat, stInteger, stDate, stDateTime, stBoolean, stVariant, stUndefined); diff --git a/MiniREST.SQL.SQLDb.pas b/MiniREST.SQL.SQLDb.pas index eeba717..739bafe 100644 --- a/MiniREST.SQL.SQLDb.pas +++ b/MiniREST.SQL.SQLDb.pas @@ -4,7 +4,7 @@ interface uses Classes, SysUtils, MiniREST.SQL.Intf, MiniREST.SQL.Base, MiniREST.SQL.Common, DB, - sqldb, IBConnection, fgl; + sqldb, IBConnection, pqconnection, fgl; type TLogEvent = procedure (Sender : TSQLConnection; EventType : TDBEventType; Const Msg : String); @@ -342,6 +342,7 @@ function TMiniRESTSQLConnectionSQLDb.GetDriverName(const ADatabaseType: TMiniRES begin case ADatabaseType of dbtFirebird: Result := 'Firebird'; + dbtPostgreSQL: Result := 'PostgreSQL'; end; end; @@ -484,6 +485,7 @@ function TMiniRESTSQLConnectionSQLDb.GetConnectorType(const ADatabaseType: TMini case ADatabaseType of dbtUnknown: raise Exception.Create('Database Type not supported'); dbtFirebird: Result := 'Firebird'; + dbtPostgreSQL: Result := 'PostgreSQL'; end; end; @@ -588,7 +590,7 @@ procedure TMiniRESTSQLConnectionSQLDb.SetConnectionParams; FSQLConnection.UserName := FConnectionParams.GetUserName; FSQLConnection.Password := FConnectionParams.GetPassword; FSQLConnection.DatabaseName := FConnectionParams.GetDatabaseName; - FSQLConnection.HostName := FConnectionParams.GetServerHostName; + FSQLConnection.HostName := FConnectionParams.GetServerHostName; if (FConnectionParams.GetServerPort > 0) and (FConnectionParams.GetDatabaseType = dbtFirebird) then begin FSQLConnection.HostName := ''; @@ -601,6 +603,8 @@ procedure TMiniRESTSQLConnectionSQLDb.SetConnectionParams; LName := LStringList.Names[I]; FSQLConnection.Params.Values[LName] := LStringList.Values[LName]; end; + if (FConnectionParams.GetServerPort > 0) and (FConnectionParams.GetDatabaseType = dbtPostgreSQL) then + FSQLConnection.Params.Values['port'] := IntToStr(FConnectionParams.GetServerPort); finally LStringList.Free; end; diff --git a/unittest/SQL/MiniRESTSQLTest.lpi b/unittest/SQL/MiniRESTSQLTest.lpi index b9a8873..b6d1f48 100644 --- a/unittest/SQL/MiniRESTSQLTest.lpi +++ b/unittest/SQL/MiniRESTSQLTest.lpi @@ -33,40 +33,47 @@ - + - + - - + - + - + - + - + - + + + + + + + + + diff --git a/unittest/SQL/MiniRESTSQLTest.lpr b/unittest/SQL/MiniRESTSQLTest.lpr index 3d22f30..7c349c4 100644 --- a/unittest/SQL/MiniRESTSQLTest.lpr +++ b/unittest/SQL/MiniRESTSQLTest.lpr @@ -3,7 +3,7 @@ {$mode objfpc}{$H+} uses - Classes, TextTestRunner, Test.SQL.SQLDb, SysUtils; + Classes, TextTestRunner, Test.SQL.Firebird, Test.SQL.PostgreSQL, SysUtils; begin {$DEFINE XMLLISTENER} diff --git a/unittest/SQL/MiniRESTSQLTest.lps b/unittest/SQL/MiniRESTSQLTest.lps index 16c5e1c..39a96c6 100644 --- a/unittest/SQL/MiniRESTSQLTest.lps +++ b/unittest/SQL/MiniRESTSQLTest.lps @@ -4,42 +4,33 @@ - + - - + + + - - - - - - - - - - - + - - + + - + - - + + @@ -47,32 +38,39 @@ - - + + - - + + - + - - + + - - - + + + + + + + + + + @@ -105,7 +103,7 @@ - + @@ -162,26 +160,26 @@ - + - + - + - + - + - + @@ -189,7 +187,7 @@ - + @@ -197,130 +195,146 @@ - + + + + + + + + + + + + + + + + + - - + + - + - + - - - - - - + + - - + + - - + + - - + + - - + + + + + + - + - - + + - + - - + + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + diff --git a/unittest/SQL/Test.SQL.Default.pas b/unittest/SQL/Test.SQL.Default.pas index 01da33a..ea457a5 100644 --- a/unittest/SQL/Test.SQL.Default.pas +++ b/unittest/SQL/Test.SQL.Default.pas @@ -24,6 +24,9 @@ TMiniRESTSQLTest = class({$IFNDEF FPC}TObject{$ELSE}TTestCase{$IFEND}) procedure LogConnectionPoolEvent(const AMessage: string); function GetServerHostName: string; function GetServerPort: Integer; + function GetDatabaseType: TMiniRESTSQLDatabaseType; virtual; abstract; + procedure TestCharSetFirebird; + procedure TestCharSetPostgreSQL; public {$IFNDEF FPC} [SetupFixture] @@ -149,11 +152,13 @@ TThreadTesteInsert2 = class(TThread) FID: Integer; FFactory: IMiniRESTSQLConnectionFactory; FLogMessageProc: TLogMessageProc; + FTestCase: TMiniRESTSQLTest; procedure LogMessage(const AMessage: string); protected procedure Execute; override; public - constructor Create(const AID: Integer; ACreateSuspended: Boolean; AFactory: IMiniRESTSQLConnectionFactory; ALogMessageProc: TLogMessageProc); + constructor Create(const AID: Integer; ACreateSuspended: Boolean; AFactory: IMiniRESTSQLConnectionFactory; ALogMessageProc: TLogMessageProc; + ATestCase: TMiniRESTSQLTest); end; { TConnectionFactoryEventLogger } @@ -187,6 +192,7 @@ procedure TMiniRESTSQLTest.TearDown; (* LConnection := FConnectionFactory.GetConnection; LConnection.Execute('DELETE FROM CUSTOMER', []); *) + FConnectionFactory := nil; FConnectionPoolEvents.Free; end; @@ -200,17 +206,21 @@ procedure TMiniRESTSQLTest.TestInsert; LConn1 := FConnectionFactory.GetConnection; LConn2 := FConnectionFactory.GetConnection; LQry := LConn1.GetQuery; - LQryID := LConn1.GetQuery; + if GetDatabaseType = dbtFirebird then + LQryID := LConn1.GetQuery; LQry.SQL := 'SELECT * FROM CUSTOMER WHERE 1=0'; LQry.Open; for I := 0 to 99 do begin - LQryID.Close; - LQryID.SQL := 'select gen_id(gen_customer_id, 1) from rdb$database'; - LQryID.Open; - LId := LQryID.DataSet.FieldByName('GEN_ID').AsInteger; LQry.DataSet.Append; - LQry.DataSet.FieldByName('ID').AsInteger := LId; + if GetDatabaseType = dbtFirebird then + begin + LQryID.Close; + LQryID.SQL := 'select gen_id(gen_customer_id, 1) from rdb$database'; + LQryID.Open; + LId := LQryID.DataSet.FieldByName('GEN_ID').AsInteger; + LQry.DataSet.FieldByName('ID').AsInteger := LId; + end; LQry.DataSet.FieldByName('NAME').AsString := 'HUE'; LQry.DataSet.Post; end; @@ -229,7 +239,11 @@ procedure TMiniRESTSQLTest.Setup; LConnection: IMiniRESTSQLConnection; begin FServerHostName := 'LOCALHOST'; - FServerPort := 3050; + if GetDatabaseType = dbtFirebird then + FServerPort := 3050 + else + if GetDatabaseType = dbtPostgreSQL then + FServerPort := 5432; {$IFDEF FPC} FConnectionFactory := GetConnectionFactory; {$IFEND} @@ -359,12 +373,15 @@ procedure TMiniRESTSQLTest.TestTransaction; LQry.Open; for I := 0 to 99 do begin - LQryID.Close; - LQryID.SQL := 'select gen_id(gen_customer_id, 1) from rdb$database'; - LQryID.Open; - LId := LQryID.DataSet.FieldByName('GEN_ID').AsInteger; LQry.DataSet.Append; - LQry.DataSet.FieldByName('ID').AsInteger := LId; + if GetDatabaseType = dbtFirebird then + begin + LQryID.Close; + LQryID.SQL := 'select gen_id(gen_customer_id, 1) from rdb$database'; + LQryID.Open; + LId := LQryID.DataSet.FieldByName('GEN_ID').AsInteger; + LQry.DataSet.FieldByName('ID').AsInteger := LId; + end; LQry.DataSet.FieldByName('NAME').AsString := 'HUE'; LQry.DataSet.Post; end; @@ -395,12 +412,15 @@ procedure TMiniRESTSQLTest.TestTransaction2; LQry.Open; for I := 0 to 99 do begin - LQryID.Close; - LQryID.SQL := 'select gen_id(gen_customer_id, 1) from rdb$database'; - LQryID.Open; - LId := LQryID.DataSet.FieldByName('GEN_ID').AsInteger; LQry.DataSet.Append; - LQry.DataSet.FieldByName('ID').AsInteger := LId; + if GetDatabaseType = dbtFirebird then + begin + LQryID.Close; + LQryID.SQL := 'select gen_id(gen_customer_id, 1) from rdb$database'; + LQryID.Open; + LId := LQryID.DataSet.FieldByName('GEN_ID').AsInteger; + LQry.DataSet.FieldByName('ID').AsInteger := LId; + end; LQry.DataSet.FieldByName('NAME').AsString := 'HUE'; LQry.DataSet.Post; end; @@ -433,7 +453,7 @@ procedure TMiniRESTSQLTest.TestInsert2; LConn := FConnectionFactory.GetConnection; for I := 1 to LCount do begin - TThreadTesteInsert2.Create(I, False, FConnectionFactory, {$IFDEF FPC}@LogMessage{$ELSE}nil{$IFEND}); + TThreadTesteInsert2.Create(I, False, FConnectionFactory, {$IFDEF FPC}@LogMessage{$ELSE}nil{$IFEND}, Self); end; while not (gContatorTesteInsert2 = LCount) do Sleep(1000); @@ -457,18 +477,21 @@ procedure TThreadTesteInsert2.Execute; Sleep(Random(10) * 100); LConn := FFactory.GetConnection; LQry := LConn.GetQuery; - LQryID := LConn.GetQuery; - - LQryID.Close; - LQryID.SQL := 'select gen_id(gen_customer_id, 1) from rdb$database'; - LQryID.Open; - LId := LQryID.DataSet.FieldByName('GEN_ID').AsInteger; - LogMessage('CUSTOMER ID: ' + IntToStr(LId)); - LQryID.Close; + if FTestCase.GetDatabaseType = dbtFirebird then + begin + LQryID := LConn.GetQuery; + LQryID.Close; + LQryID.SQL := 'select gen_id(gen_customer_id, 1) from rdb$database'; + LQryID.Open; + LId := LQryID.DataSet.FieldByName('GEN_ID').AsInteger; + LogMessage('CUSTOMER ID: ' + IntToStr(LId)); + LQryID.Close; + end; LQry.SQL := 'SELECT * FROM CUSTOMER WHERE 1=0'; LQry.Open; LQry.DataSet.Insert; - LQry.DataSet.FieldByName('ID').AsInteger := LId; + if FTestCase.GetDatabaseType = dbtFirebird then + LQry.DataSet.FieldByName('ID').AsInteger := LId; LQry.DataSet.FieldByName('NAME').AsString := 'HUE'; LQry.DataSet.Post; @@ -478,13 +501,15 @@ procedure TThreadTesteInsert2.Execute; end; end; -constructor TThreadTesteInsert2.Create(const AID: Integer; ACreateSuspended: Boolean; AFactory: IMiniRESTSQLConnectionFactory; ALogMessageProc: TLogMessageProc); +constructor TThreadTesteInsert2.Create(const AID: Integer; ACreateSuspended: Boolean; AFactory: IMiniRESTSQLConnectionFactory; ALogMessageProc: TLogMessageProc; + ATestCase: TMiniRESTSQLTest); begin inherited Create(ACreateSuspended); FFactory := AFactory; FreeOnTerminate := True; FLogMessageProc := ALogMessageProc; - FID := AID; + FID := AID; + FTestCase := ATestCase; end; procedure TMiniRESTSQLTest.LogMessage(const AMessage: string); @@ -512,7 +537,8 @@ procedure TMiniRESTSQLTest.TestInsert3; for I := 1 to 5 do begin LQry.DataSet.Append; - LQry.DataSet.FieldByName('ID').AsInteger := GetSequenceValue('gen_customer_id'); + if GetDatabaseType = dbtFirebird then + LQry.DataSet.FieldByName('ID').AsInteger := GetSequenceValue('gen_customer_id'); LQry.DataSet.FieldByName('NAME').AsString := 'HUE'; LQry.DataSet.Post; end; @@ -607,23 +633,23 @@ procedure TMiniRESTSQLTest.TestCheckInTransaction; begin LConn1 := FConnectionFactory.GetConnection; {$IFNDEF FPC} - Assert.IsFalse(LConn1.InTransaction, 'Está em transação'); + Assert.IsFalse(LConn1.InTransaction, 'Est� em transa��o'); {$ELSE} - CheckFalse(LConn1.InTransaction, 'Está em transação'); + CheckFalse(LConn1.InTransaction, 'Est� em transa��o'); {$IFEND} LConn1.StartTransaction; {$IFNDEF FPC} - Assert.IsTrue(LConn1.InTransaction, 'Não está em transação'); + Assert.IsTrue(LConn1.InTransaction, 'N�o est� em transa��o'); {$ELSE} - CheckTrue(LConn1.InTransaction, 'Não está em transação'); + CheckTrue(LConn1.InTransaction, 'N�o est� em transa��o'); {$IFEND} LConn1.Commit; {$IFNDEF FPC} - Assert.IsFalse(LConn1.InTransaction, 'Está em transação'); + Assert.IsFalse(LConn1.InTransaction, 'Est� em transa��o'); {$ELSE} - CheckFalse(LConn1.InTransaction, 'Está em transação'); + CheckFalse(LConn1.InTransaction, 'Est� em transa��o'); {$IFEND} end; @@ -639,7 +665,7 @@ procedure TMiniRESTSQLTest.TestClearParamsOnSetSQL; LQry.ParamByName('NAME').AsString := 'HUE'; LQry.Open; - // O teste é assim para verificar se não vai dar erro quando não existir o parâmetro, + // O teste � assim para verificar se n�o vai dar erro quando n�o existir o par�metro, // passado anteriormente LQry.Close; LQry.SQL := 'SELECT * FROM CUSTOMER'; @@ -743,13 +769,13 @@ procedure TMiniRESTSQLTest.TestGetSingletonConnection; LConn1 := FConnectionFactory.GetSingletonConnection; LConn2 := FConnectionFactory.GetSingletonConnection; {$IFNDEF FPC} - Assert.IsTrue(LConn1 <> nil, 'LCon1 está nil'); - Assert.IsTrue(LConn2 <> nil, 'LCon2 está nil'); - Assert.IsTrue(LConn1 = LConn2, 'LCon1 está diferente de LCon2'); + Assert.IsTrue(LConn1 <> nil, 'LCon1 est� nil'); + Assert.IsTrue(LConn2 <> nil, 'LCon2 est� nil'); + Assert.IsTrue(LConn1 = LConn2, 'LCon1 est� diferente de LCon2'); {$ELSE} - CheckTrue(LConn1 <> nil, 'LCon1 está nil'); - CheckTrue(LConn2 <> nil, 'LCon2 está nil'); - CheckTrue(LConn1 = LConn2, 'LCon1 está diferente de LCon2'); + CheckTrue(LConn1 <> nil, 'LCon1 est� nil'); + CheckTrue(LConn2 <> nil, 'LCon2 est� nil'); + CheckTrue(LConn1 = LConn2, 'LCon1 est� diferente de LCon2'); {$IFEND} end; @@ -759,9 +785,9 @@ procedure TMiniRESTSQLTest.TestConnectionIsValid; begin LConn1 := FConnectionFactory.GetConnection; {$IFNDEF FPC} - Assert.IsTrue(LConn1.IsValid, 'LCon1 não está válida.'); + Assert.IsTrue(LConn1.IsValid, 'LCon1 n�o est� v�lida.'); {$ELSE} - CheckTrue(LConn1.IsValid, 'LCon1 não está válida.'); + CheckTrue(LConn1.IsValid, 'LCon1 n�o est� v�lida.'); {$IFEND} end; @@ -771,15 +797,15 @@ procedure TMiniRESTSQLTest.TestConnectionIsNotValid; begin LConn1 := FConnectionFactory.GetConnection; {$IFNDEF FPC} - Assert.IsTrue(LConn1.IsValid, 'LCon1 não está válida.'); + Assert.IsTrue(LConn1.IsValid, 'LCon1 n�o est� v�lida.'); {$ELSE} - CheckTrue(LConn1.IsValid, 'LCon1 não está válida.'); + CheckTrue(LConn1.IsValid, 'LCon1 n�o est� v�lida.'); {$IFEND} FConnectionFactory.InvalidateConnections; {$IFNDEF FPC} - Assert.IsFalse(LConn1.IsValid, 'LCon1 está válida.'); + Assert.IsFalse(LConn1.IsValid, 'LCon1 est� v�lida.'); {$ELSE} - CheckFalse(LConn1.IsValid, 'LCon1 está válida.'); + CheckFalse(LConn1.IsValid, 'LCon1 est� v�lida.'); {$IFEND} end; @@ -857,12 +883,15 @@ procedure TMiniRESTSQLTest.TestParamSize; LQry.Open; for I := 0 to 5 do begin - LQryID.Close; - LQryID.SQL := 'select gen_id(gen_customer_id, 1) from rdb$database'; - LQryID.Open; - LId := LQryID.DataSet.FieldByName('GEN_ID').AsInteger; LQry.DataSet.Append; - LQry.DataSet.FieldByName('ID').AsInteger := LId; + if GetDatabaseType = dbtFirebird then + begin + LQryID.Close; + LQryID.SQL := 'select gen_id(gen_customer_id, 1) from rdb$database'; + LQryID.Open; + LId := LQryID.DataSet.FieldByName('GEN_ID').AsInteger; + LQry.DataSet.FieldByName('ID').AsInteger := LId; + end; LQry.DataSet.FieldByName('NAME').AsString := 'HUE'; LQry.DataSet.FieldByName('PHONE').AsString := '999999999999999'; LQry.DataSet.Post; @@ -880,7 +909,7 @@ procedure TMiniRESTSQLTest.TestParamSize; {$IFEND} end; -procedure TMiniRESTSQLTest.TestCharSet; +procedure TMiniRESTSQLTest.TestCharSetFirebird; var LConn1: IMiniRESTSQLConnection; LQry: IMiniRESTSQLQuery; @@ -921,4 +950,49 @@ procedure TMiniRESTSQLTest.TestCharSet; {$IFEND} end; +procedure TMiniRESTSQLTest.TestCharSet; +begin + if GetDatabaseType = dbtFirebird then + TestCharSetFirebird + else + if GetDatabaseType = dbtPostgreSQL then + CheckTrue(True); {TODO: Verificar charset postgresql} + //TestCharSetPostgreSQL; +end; + +procedure TMiniRESTSQLTest.TestCharSetPostgreSQL; +var + LConn1: IMiniRESTSQLConnection; + LQry: IMiniRESTSQLQuery; + LConnectionFactory: IMiniRESTSQLConnectionFactory; + LConnectionFactoryParams: IMiniRESTSQLConnectionFactoryParams; + LExpectedFilePath: string; +begin + LConnectionFactoryParams := GetConnectionFactoryParams; + LConnectionFactoryParams.SetCharSet('UTF8'); + LConnectionFactory := GetConnectionFactory(LConnectionFactoryParams); + LExpectedFilePath := ParamStr(0); + LConn1 := LConnectionFactory.GetConnection; + LQry := LConn1.GetQuery; + LQry.SQL := 'SHOW CLIENT_ENCODING'; + LQry.Open; + {$IFNDEF FPC} + Assert.AreTrue(LQry.DataSet.FieldByName('CLIENT_ENCODING').AsString = 'UTF8'); + {$ELSE} + CheckTrue(LQry.DataSet.FieldByName('CLIENT_ENCODING').AsString = 'UTF8'); + {$IFEND} + + LConnectionFactoryParams.SetCharSet('WIN1252'); + LConnectionFactory := GetConnectionFactory(LConnectionFactoryParams); + LConn1 := LConnectionFactory.GetConnection; + LQry := LConn1.GetQuery; + LQry.SQL := 'SHOW CLIENT_ENCODING'; + LQry.Open; + {$IFNDEF FPC} + Assert.AreTrue(LQry.DataSet.FieldByName('CLIENT_ENCODING').AsString = 'WIN1252'); + {$ELSE} + CheckEquals('WIN1252', LQry.DataSet.FieldByName('CLIENT_ENCODING').AsString); + {$IFEND} +end; + end. diff --git a/unittest/SQL/Test.SQL.Firebird.pas b/unittest/SQL/Test.SQL.Firebird.pas new file mode 100644 index 0000000..245aa1a --- /dev/null +++ b/unittest/SQL/Test.SQL.Firebird.pas @@ -0,0 +1,59 @@ +unit Test.SQL.Firebird; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, TestFramework, MiniREST.SQL.SQLDb, + MiniREST.SQL.Intf, MiniREST.SQL.Common, sqldb, Test.SQL.SQLDb; + +type + TMiniRESTSQLTestSQLFirebird = class(TMiniRESTSQLTestSQLDbFPC) + protected + function GetConnectionFactoryParams: IMiniRESTSQLConnectionFactoryParams; override; + function GetDatabaseType: TMiniRESTSQLDatabaseType; override; + end; + +implementation + +function TMiniRESTSQLTestSQLFirebird.GetConnectionFactoryParams: IMiniRESTSQLConnectionFactoryParams; +var + LConnectionInfo: TStringList; + LDBFilePath: string; + LPathAux: string; + LParams: IMiniRESTSQLConnectionFactoryParamsSQLDb; +begin + LConnectionInfo := TStringList.Create; + try + //LConnectionInfo.LoadFromFile('..\..\dbxcon.txt'); + LPathAux := ExtractFilePath(ParamStr(0)) + '..\TEST.FDB'; + LDBFilePath := ExpandFileName(LPathAux); + LConnectionInfo.Values['DatabaseName'] := LDBFilePath; + LConnectionInfo.Values['Server'] := GetServerHostName; + LParams := TMiniRESTSQLConnectionParamsSQLDb.Create; + LParams.SetConnectionsCount(FConnectionCount); + LParams.SetConnectionString(LConnectionInfo.Text); + LParams.SetDatabseType(dbtFirebird); + LParams.SetDatabaseName(LDBFilePath); + LParams.SetUserName('SYSDBA'); + LParams.SetPassword('masterkey'); + LParams.SetLogEvent(@LogEvent); + LParams.SetServerHostName(GetServerHostName); + LParams.SetServerPort(GetServerPort); + Result := LParams; + finally + LConnectionInfo.Free; + end; +end; + +function TMiniRESTSQLTestSQLFirebird.GetDatabaseType: TMiniRESTSQLDatabaseType; +begin + Result := dbtFirebird; +end; + +initialization + RegisterTest(TMiniRESTSQLTestSQLFirebird.Suite); + +end. + diff --git a/unittest/SQL/Test.SQL.PostgreSQL.pas b/unittest/SQL/Test.SQL.PostgreSQL.pas new file mode 100644 index 0000000..90c0b41 --- /dev/null +++ b/unittest/SQL/Test.SQL.PostgreSQL.pas @@ -0,0 +1,59 @@ +unit Test.SQL.PostgreSQL; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, TestFramework, MiniREST.SQL.SQLDb, + MiniREST.SQL.Intf, MiniREST.SQL.Common, sqldb, Test.SQL.SQLDb; + +type + TMiniRESTSQLTestSQLPostgreSQL = class(TMiniRESTSQLTestSQLDbFPC) + protected + function GetConnectionFactoryParams: IMiniRESTSQLConnectionFactoryParams; override; + function GetDatabaseType: TMiniRESTSQLDatabaseType; override; + end; + +implementation + +function TMiniRESTSQLTestSQLPostgreSQL.GetConnectionFactoryParams: IMiniRESTSQLConnectionFactoryParams; +var + //LConnectionInfo: TStringList; + //LDBFilePath: string; + //LPathAux: string; + LParams: IMiniRESTSQLConnectionFactoryParamsSQLDb; +begin + //LConnectionInfo := TStringList.Create; + try + //LConnectionInfo.LoadFromFile('..\..\dbxcon.txt'); + //LPathAux := ExtractFilePath(ParamStr(0)) + '..\TEST.FDB'; + //LDBFilePath := ExpandFileName(LPathAux); + //LConnectionInfo.Values['DatabaseName'] := LDBFilePath; + //LConnectionInfo.Values['Server'] := GetServerHostName; + LParams := TMiniRESTSQLConnectionParamsSQLDb.Create; + LParams.SetConnectionsCount(FConnectionCount); + //LParams.SetConnectionString(''); + LParams.SetDatabseType(dbtPostgreSQL); + LParams.SetDatabaseName('minirestsql'); + LParams.SetUserName('postgres'); + LParams.SetPassword('postgres'); + LParams.SetLogEvent(@LogEvent); + LParams.SetServerHostName(GetServerHostName); + LParams.SetServerPort(GetServerPort); + Result := LParams; + finally + //LConnectionInfo.Free; + end; +end; + +function TMiniRESTSQLTestSQLPostgreSQL.GetDatabaseType: TMiniRESTSQLDatabaseType; +begin + Result := dbtPostgreSQL; +end; + +initialization + RegisterTest(TMiniRESTSQLTestSQLPostgreSQL.Suite); + +end. + diff --git a/unittest/SQL/test.sql.sqldb.pas b/unittest/SQL/test.sql.sqldb.pas index 0c94ec4..bfeae32 100644 --- a/unittest/SQL/test.sql.sqldb.pas +++ b/unittest/SQL/test.sql.sqldb.pas @@ -12,18 +12,18 @@ interface { TMiniRESTSQLTestSQLDbFPC } TMiniRESTSQLTestSQLDbFPC= class(TMiniRESTSQLTest) - private - function InternalGetConnectionFactoryParams: IMiniRESTSQLConnectionFactoryParamsSQLDb; protected procedure SetUpOnce; override; function GetConnectionFactory: IMiniRESTSQLConnectionFactory; override; overload; function GetConnectionFactory(AParams: IMiniRESTSQLConnectionFactoryParams): IMiniRESTSQLConnectionFactory; override; overload; - function GetConnectionFactoryParams: IMiniRESTSQLConnectionFactoryParams; override; procedure LogMessage(const AMessage: string); override; published procedure TestSQLDB1; end; + procedure LogEvent(Sender : TSQLConnection; EventType : TDBEventType; Const Msg : String); overload; + procedure LogEvent(Const Msg : String); overload; + implementation var @@ -82,45 +82,11 @@ function TMiniRESTSQLTestSQLDbFPC.GetConnectionFactory(AParams: IMiniRESTSQLConn LParams: IMiniRESTSQLConnectionFactoryParamsSQLDb; begin if not AParams.GetObject.GetInterface(IMiniRESTSQLConnectionFactoryParamsSQLDb, LParams) then - raise Exception.Create('AParams não implementa a interface IMiniRESTSQLConnectionFactoryParamsSQLDb'); + raise Exception.Create('AParams não implementa a interface IMiniRESTSQLConnectionFactoryParamsSQLDb'); Result := TMiniRESTSQLConnectionFactorySQLDb.Create(LParams); end; -function TMiniRESTSQLTestSQLDbFPC.GetConnectionFactoryParams: IMiniRESTSQLConnectionFactoryParams; -begin - Result := InternalGetConnectionFactoryParams; -end; - -function TMiniRESTSQLTestSQLDbFPC.InternalGetConnectionFactoryParams: IMiniRESTSQLConnectionFactoryParamsSQLDb; -var - LConnectionInfo: TStringList; - LDBFilePath: string; - LPathAux: string; -begin - LConnectionInfo := TStringList.Create; - try - //LConnectionInfo.LoadFromFile('..\..\dbxcon.txt'); - LPathAux := ExtractFilePath(ParamStr(0)) + '..\TEST.FDB'; - LDBFilePath := ExpandFileName(LPathAux); - LConnectionInfo.Values['DatabaseName'] := LDBFilePath; - LConnectionInfo.Values['Server'] := GetServerHostName; - Result := TMiniRESTSQLConnectionParamsSQLDb.Create; - Result.SetConnectionsCount(FConnectionCount); - Result.SetConnectionString(LConnectionInfo.Text); - Result.SetDatabseType(dbtFirebird); - Result.SetDatabaseName(LDBFilePath); - Result.SetUserName('SYSDBA'); - Result.SetPassword('masterkey'); - Result.SetLogEvent(@LogEvent); - Result.SetServerHostName(GetServerHostName); - Result.SetServerPort(GetServerPort); - finally - LConnectionInfo.Free; - end; -end; - -initialization - RegisterTest(TMiniRESTSQLTestSQLDbFPC.Suite); +initialization if FileExists('log.txt') then DeleteFile('log.txt'); gLog := TStringList.Create; diff --git a/unittest/TEST.FDB b/unittest/TEST.FDB index ada90c5764d1121210c981e44de592a36d2c81f0..2d2b8c70dd9ae21f7b0bb2c99dea6c9b7ce0ac51 100644 GIT binary patch delta 53821 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 delta 149025 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