diff options
Diffstat (limited to 'tests/utils/dbtests.pp')
-rw-r--r-- | tests/utils/dbtests.pp | 288 |
1 files changed, 138 insertions, 150 deletions
diff --git a/tests/utils/dbtests.pp b/tests/utils/dbtests.pp index 340c552567..5a19e8e716 100644 --- a/tests/utils/dbtests.pp +++ b/tests/utils/dbtests.pp @@ -6,7 +6,7 @@ unit dbtests; Interface Uses - mysql55dyn, testu; + sqldb, testu; { --------------------------------------------------------------------- High-level access @@ -34,21 +34,19 @@ function AddTestHistoryEntry(TestRunID,TestPreviousID : Integer) : boolean; Low-level DB access. ---------------------------------------------------------------------} - -Type - TQueryResult = PMYSQL_RES; - Function ConnectToDatabase(DatabaseName,Host,User,Password,Port : String) : Boolean; Procedure DisconnectDatabase; Function InsertQuery(const Query : string) : Integer; -Function RunQuery (Qry : String; Var res : TQueryResult) : Boolean ; -Procedure FreeQueryResult (Res : TQueryResult); -Function GetResultField (Res : TQueryResult; Id : Integer) : String; +Function ExecuteQuery (Qry : String; Silent : Boolean) : Boolean ; +Function OpenQuery (Qry : String; Out Res : TSQLQuery; Silent : Boolean) : Boolean ; +Procedure FreeQueryResult (Var Res : TSQLQuery); +Function GetResultField (Res : TSQLQuery; Id : Integer) : String; Function IDQuery(Qry : String) : Integer; Function StringQuery(Qry : String) : String; Function EscapeSQL( S : String) : String; Function SQLDate(D : TDateTime) : String; + var RelSrcDir, TestSrcDir : string; @@ -56,141 +54,158 @@ var Implementation Uses - SysUtils; + SysUtils, pqconnection; + +Var + Connection : TPQConnection; { --------------------------------------------------------------------- Low-level DB access. ---------------------------------------------------------------------} - -Var - Connection : PMYSQL; - - Function ConnectToDatabase(DatabaseName,Host,User,Password,Port : String) : Boolean; -Var - S : String; - PortNb : longint; - Error : word; begin - Verbose(V_DEBUG,'Connection params : '+DatabaseName+' '+Host+' '+User+' '+Password+' '+Port); - if Port<>'' then - begin - Val(Port,PortNb,Error); - if Error<>0 then - PortNb:=0; - end - else - PortNB:=0; - Connection:=mysql_init(Nil); - Result:=mysql_real_connect(Connection,PChar(Host),PChar(User),PChar(Password),Nil,PortNb,Nil,CLIENT_MULTI_RESULTS)<>Nil; - If Not Result then - begin - S:=Strpas(mysql_error(connection)); - Verbose(V_ERROR,'Failed to connect to database : '+S); - end - else - begin - Result:=Mysql_select_db(Connection,Pchar(DatabaseName))>=0; - If Not result then + Result:=False; + Verbose(V_SQL,'Connection params : '+DatabaseName+' '+Host+' '+User+' '+Port); + Connection:=TPQConnection.Create(Nil); + try + Connection.Hostname:=Host; + Connection.DatabaseName:=DatabaseName; + Connection.Username:=User; + Connection.Password:=Password; + Connection.Connected:=true; + Connection.Transaction:=TSQLTransaction.Create(Connection); + if (Port<>'') then + Connection.Params.Values['Port']:=Port; + except + On E : Exception do begin - S:=StrPas(mysql_error(connection)); - DisconnectDatabase; - Verbose(V_Error,'Failed to select database : '+S); + Verbose(V_ERROR,'Failed to connect to database : '+E.Message); + FreeAndNil(Connection); end; - end; + end; end; Procedure DisconnectDatabase; begin - mysql_close(Connection); + FreeAndNil(Connection); end; -Function RunQuery (Qry : String; Var res : TQueryResult) : Boolean ; +Function CreateQuery(Const ASQL : String) : TSQLQuery; begin - Verbose(V_DEBUG,'Running query:'+Qry); - Result:=mysql_query(Connection,PChar(qry))=0; - If Not Result then - Verbose(V_WARNING,'Query : '+Qry+'Failed : '+Strpas(mysql_error(connection))) - else - Res:=Mysql_store_result(connection); + Result:=TSQLQuery.Create(Connection); + Result.Database:=Connection; + Result.Transaction:=Connection.Transaction; + Result.SQL.Text:=ASQL; end; -{ No warning if it fails } -Function RunSilentQuery (Qry : String; Var res : TQueryResult) : Boolean ; + + +Function ExecuteQuery (Qry : String; Silent : Boolean) : Boolean ; begin - Verbose(V_DEBUG,'Running silent query:'+Qry); - Result:=mysql_query(Connection,PChar(qry))=0; - If Not Result then - Verbose(V_DEBUG,'Silent query : '+Qry+'Failed : '+Strpas(mysql_error(connection))) - else - Res:=Mysql_store_result(connection); + Verbose(V_SQL,'Executing query:'+Qry); + Result:=False; + try + With CreateQuery(Qry) do + try + ExecSQL; + Result:=True; + (Transaction as TSQLTransaction).Commit; + finally + Free; + end; + except + On E : exception do + begin + Connection.Transaction.RollBack; + if not Silent then + Verbose(V_WARNING,'Query : '+Qry+'Failed : '+E.Message); + end; + end; end; +Function OpenQuery (Qry : String; Out res : TSQLQuery; Silent : Boolean) : Boolean ; -Function GetResultField (Res : TQueryResult; Id : Integer) : String; +begin + Result:=False; + Verbose(V_SQL,'Running query:'+Qry); + Res:=CreateQuery(Qry); + try + Res.Open; + Result:=True; + except + On E : exception do + begin + FreeAndNil(Res); + Try + Connection.Transaction.RollBack; + except + end; + if not Silent then + Verbose(V_WARNING,'Query : '+Qry+'Failed : '+E.Message); + end; + end; +end; + +Function GetResultField (Res : TSQLQuery; Id : Integer) : String; -Var - Row : PPchar; begin - if Res=Nil then + If (Res=Nil) or (ID>=Res.Fields.Count) then Result:='' else - begin - Row:=mysql_fetch_row(Res); - If (Row=Nil) or (Row[ID]=Nil) then - Result:='' - else - Result:=strpas(Row[ID]); - end; - Verbose(V_DEBUG,'Field value '+Result); + Result:=Res.Fields[ID].AsString; + Verbose(V_SQL,'Field value '+Result); end; -Procedure FreeQueryResult (Res : TQueryResult); +Procedure FreeQueryResult(var Res : TSQLQuery); begin - mysql_free_result(Res); + if Assigned(Res) and Assigned(Res.Transaction) then + (Res.Transaction as TSQLTransaction).Commit; + FreeAndNil(Res); end; Function IDQuery(Qry : String) : Integer; Var - Res : TQueryResult; + Res : TSQLQuery; begin Result:=-1; - If RunQuery(Qry,Res) then - begin - Result:=StrToIntDef(GetResultField(Res,0),-1); - FreeQueryResult(Res); + If OpenQuery(Qry,Res,False) then + try + Result:=StrToIntDef(GetResultField(Res,0),-1); + finally + FreeQueryResult(Res); end; end; Function StringQuery(Qry : String) : String; Var - Res : TQueryResult; + Res : TSQLQuery; begin Result:=''; - If RunQuery(Qry,Res) then - begin - Result:=GetResultField(Res,0); - FreeQueryResult(Res); + If OpenQuery(Qry,Res,False) then + try + Result:=GetResultField(Res,0); + finally + FreeQueryResult(Res); end; end; Function EscapeSQL( S : String) : String; begin - Result:=StringReplace(S,'\','\\',[rfReplaceAll]); - Result:=StringReplace(Result,'"','\"',[rfReplaceAll]); - Verbose(V_DEBUG,'EscapeSQL : "'+S+'" -> "'+Result+'"'); +// Result:=StringReplace(S,'\','\\',[rfReplaceAll]); + Result:=StringReplace(S,'''','''''',[rfReplaceAll]); + Verbose(V_SQL,'EscapeSQL : "'+S+'" -> "'+Result+'"'); end; @@ -208,7 +223,7 @@ end; Function GetTestID(Name : string) : Integer; Const - SFromName = 'SELECT T_ID FROM TESTS WHERE (T_NAME="%s")'; + SFromName = 'SELECT T_ID FROM TESTS WHERE (T_NAME=''%s'')'; begin Result:=IDQuery(Format(SFromName,[Name])); @@ -217,7 +232,7 @@ end; Function GetOSID(Name : String) : Integer; Const - SFromName = 'SELECT TO_ID FROM TESTOS WHERE (TO_NAME="%s")'; + SFromName = 'SELECT TO_ID FROM TESTOS WHERE (TO_NAME=''%s'')'; begin Result:=IDQuery(Format(SFromName,[Name])); @@ -226,7 +241,7 @@ end; Function GetVersionID(Name : String) : Integer; Const - SFromName = 'SELECT TV_ID FROM TESTVERSION WHERE (TV_VERSION="%s")'; + SFromName = 'SELECT TV_ID FROM TESTVERSION WHERE (TV_VERSION=''%s'')'; begin Result:=IDQuery(Format(SFromName,[Name])); @@ -235,7 +250,7 @@ end; Function GetCPUID(Name : String) : Integer; Const - SFromName = 'SELECT TC_ID FROM TESTCPU WHERE (TC_NAME="%s")'; + SFromName = 'SELECT TC_ID FROM TESTCPU WHERE (TC_NAME=''%s'')'; begin Result:=IDQuery(Format(SFromName,[Name])); @@ -244,7 +259,7 @@ end; Function GetCategoryID(Name : String) : Integer; Const - SFromName = 'SELECT TCAT_ID FROM TESTCATEGORY WHERE (TCAT_NAME="%s")'; + SFromName = 'SELECT TCAT_ID FROM TESTCATEGORY WHERE (TCAT_NAME=''%s'')'; begin Result:=IDQuery(Format(SFromName,[Name])); @@ -258,24 +273,16 @@ Const ' (TU_OS_FK=%d) '+ ' AND (TU_CPU_FK=%d) '+ ' AND (TU_VERSION_FK=%d) '+ - ' AND (TU_DATE="%s")'; + ' AND (TU_DATE=''%s'')'; begin Result:=IDQuery(Format(SFromIDS,[OSID,CPUID,VERSIONID,SQLDate(Date)])); end; Function InsertQuery(const Query : string) : Integer; -Var - Res : TQueryResult; begin - If RunQuery(Query,Res) then - begin - Result:=mysql_insert_id(connection); - FreeQueryResult(Res); - end - else - Result:=-1; + Result:=IDQuery(Query); end; Function AddRun(OSID, CPUID, VERSIONID, CATEGORYID : Integer; Date : TDateTime) : Integer; @@ -284,12 +291,12 @@ Const SInsertRun = 'INSERT INTO TESTRUN '+ '(TU_OS_FK,TU_CPU_FK,TU_VERSION_FK,TU_CATEGORY_FK,TU_DATE)'+ ' VALUES '+ - '(%d,%d,%d,%d,"%s")'; + '(%d,%d,%d,%d,''%s'') RETURNING TU_ID'; var Qry : string; begin qry:=Format(SInsertRun,[OSID,CPUID,VERSIONID,CATEGORYID,SQLDate(Date)]); - Result:=InsertQuery(Qry); + Result:=IDQuery(Qry); end; function posr(c : Char; const s : AnsiString) : integer; @@ -337,7 +344,7 @@ begin FileName := FileName + '.pp' else exit; - Verbose(V_Debug,'Reading '+FileName); + Verbose(V_Debug,'Reading: '+FileName); assign(t,FileName); {$I-} reset(t); @@ -376,11 +383,10 @@ Function AddTest(Name : String; AddSource : Boolean) : Integer; Const SInsertTest = 'INSERT INTO TESTS (T_NAME,T_ADDDATE)'+ - ' VALUES ("%s",NOW())'; + ' VALUES (''%s'',NOW())'; Var Info : TConfig; - Res : TQueryResult; begin Result:=-1; @@ -388,9 +394,8 @@ begin GetConfig(TestSrcDir+RelSrcDir+Name,Info)) or GetUnitTestConfig(Name,Info) then begin - If RunQuery(Format(SInsertTest,[Name]),Res) then + If ExecuteQuery(Format(SInsertTest,[Name]),False) then begin - FreeQueryResult(Res); Result:=GetTestID(Name); If Result=-1 then Verbose(V_WARNING,'Could not find newly added test!') @@ -406,17 +411,17 @@ begin end; Const - B : Array[Boolean] of String = ('-','+'); + B : Array[Boolean] of String = ('f','t'); Function UpdateTest(ID : Integer; Info : TConfig; Source : String) : Boolean; Const SUpdateTest = 'Update TESTS SET '+ - ' T_CPU="%s", T_OS="%s", T_VERSION="%s",'+ - ' T_GRAPH="%s", T_INTERACTIVE="%s", T_RESULT=%d,'+ - ' T_FAIL="%s", T_RECOMPILE="%s", T_NORUN="%s",'+ - ' T_NEEDLIBRARY="%s", T_KNOWNRUNERROR=%d,'+ - ' T_KNOWN="%s", T_NOTE="%s", T_OPTS = "%s"'+ + ' T_CPU=''%s'', T_OS=''%s'', T_VERSION=''%s'','+ + ' T_GRAPH=''%s'', T_INTERACTIVE=''%s'', T_RESULT=%d,'+ + ' T_FAIL=''%s'', T_RECOMPILE=''%s'', T_NORUN=''%s'','+ + ' T_NEEDLIBRARY=''%s'', T_KNOWNRUNERROR=%d,'+ + ' T_KNOWN=''%s'', T_NOTE=''%s'', T_OPTS = ''%s'''+ ' %s '+ 'WHERE'+ ' T_ID=%d'; @@ -424,13 +429,12 @@ Const Var Qry : String; - Res : TQueryResult; begin If Source<>'' then begin Source:=EscapeSQL(Source); - Source:=', T_SOURCE="'+Source+'"'; + Source:=', T_SOURCE='''+Source+''''; end; With Info do Qry:=Format(SUpdateTest,[EscapeSQL(NeedCPU),'',EscapeSQL(MinVersion), @@ -441,8 +445,7 @@ begin Source, ID ]); - Result:=RunQuery(Qry,res); - FreeQueryResult(Res); + Result:=ExecuteQuery(Qry,False); end; Function AddTestResult(TestID,RunID,TestRes : Integer; @@ -453,37 +456,33 @@ Const SInsertRes='Insert into TESTRESULTS '+ '(TR_TEST_FK,TR_TESTRUN_FK,TR_OK,TR_SKIP,TR_RESULT) '+ ' VALUES '+ - '(%d,%d,"%s","%s",%d) '; + '(%d,%d,''%s'',''%s'',%d) RETURNING TR_ID'; SSelectId='SELECT TR_ID FROM TESTRESULTS WHERE (TR_TEST_FK=%d) '+ ' AND (TR_TESTRUN_FK=%d)'; - SInsertLog='Update TESTRESULTS SET TR_LOG="%s"'+ - ',TR_OK="%s",TR_SKIP="%s",TR_RESULT=%d WHERE (TR_ID=%d)'; + SInsertLog='Update TESTRESULTS SET TR_LOG=''%s'''+ + ',TR_OK=''%s'',TR_SKIP=''%s'',TR_RESULT=%d WHERE (TR_ID=%d)'; Var Qry : String; - Res : TQueryResult; updateValues : boolean; + begin updateValues:=false; Result:=-1; Qry:=Format(SInsertRes, [TestID,RunID,B[OK],B[Skipped],TestRes,EscapeSQL(Log)]); - If RunSilentQuery(Qry,Res) then - Result:=mysql_insert_id(connection) - else + Result:=IDQuery(Qry); + if (Result=-1) then begin - Qry:=format(SSelectId,[TestId,RunId]); - Result:=IDQuery(Qry); - if Result<>-1 then - updateValues:=true; + Qry:=format(SSelectId,[TestId,RunId]); + Result:=IDQuery(Qry); + if Result<>-1 then + UpdateValues:=true; end; if (Result<>-1) and ((Log<>'') or updateValues) then begin - Qry:=format(SInsertLog,[EscapeSQL(Log),B[OK],B[Skipped],TestRes,Result]); - if not RunQuery(Qry,Res) then - begin - Verbose(V_Warning,'Insert Log failed'); - end; - FreeQueryResult(Res); + Qry:=Format(SInsertLog,[EscapeSQL(Log),B[OK],B[Skipped],TestRes,Result]); + if Not ExecuteQuery(Qry,False) then + Verbose(V_Warning,'Insert Log failed'); end; { If test already existed, return false for is_new to avoid double counting } is_new:=not updateValues; @@ -504,12 +503,8 @@ Function CleanTestRun(ID : Integer) : Boolean; Const SDeleteRun = 'DELETE FROM TESTRESULTS WHERE TR_TESTRUN_FK=%d'; -Var - Res : TQueryResult; - begin - Result:=RunQuery(Format(SDeleteRun,[ID]),Res); - FreeQueryResult(Res); + Result:=ExecuteQuery(Format(SDeleteRun,[ID]),False); end; function GetTestPreviousRunHistoryID(TestRunID : Integer) : Integer; @@ -525,21 +520,14 @@ begin end; function AddTestHistoryEntry(TestRunID,TestPreviousID : Integer) : boolean; + var qry : string; - res : TQueryResult; + begin - qry:=format('INSERT INTO TESTRUNHISTORY (TH_ID_FK,TH_PREVIOUS_FK) '+ + Qry:=format('INSERT INTO TESTRUNHISTORY (TH_ID_FK,TH_PREVIOUS_FK) '+ ' VALUES (%d,%d)',[TestRunID,TestPreviousID]); - If RunQuery(qry,res) then - begin - FreeQueryResult(res); - AddTestHistoryEntry:=true; - end - else - AddTestHistoryEntry:=false; + Result:=ExecuteQuery(Qry,False); end; -begin - initialisemysql; end. |