dbtests.pp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. {$mode objfpc}
  2. {$H+}
  3. unit dbtests;
  4. Interface
  5. Uses
  6. mysql,testu;
  7. { ---------------------------------------------------------------------
  8. High-level access
  9. ---------------------------------------------------------------------}
  10. Function GetTestID(Name : string) : Integer;
  11. Function GetOSID(Name : String) : Integer;
  12. Function GetCPUID(Name : String) : Integer;
  13. Function AddTest(Name : String; AddSource : Boolean) : Integer;
  14. Function UpdateTest(ID : Integer; Info : TConfig; Source : String) : Boolean;
  15. Function AddTestResult(TestID,OSID,CPUID,TestRes : Integer;
  16. OK, Skipped : Boolean;
  17. Log : String;
  18. TestDate : TDateTime) : Integer;
  19. Function RequireTestID(Name : String): Integer;
  20. { ---------------------------------------------------------------------
  21. Low-level DB access.
  22. ---------------------------------------------------------------------}
  23. Type
  24. TQueryResult = PMYSQL_RES;
  25. Function ConnectToDatabase(DatabaseName,Host,User,Password : String) : Boolean;
  26. Procedure DisconnectDatabase;
  27. Function RunQuery (Qry : String; Var res : TQueryResult) : Boolean ;
  28. Procedure FreeQueryResult (Res : TQueryResult);
  29. Function GetResultField (Res : TQueryResult; Id : Integer) : String;
  30. Function IDQuery(Qry : String) : Integer;
  31. Function EscapeSQL( S : String) : String;
  32. Implementation
  33. Uses
  34. SysUtils;
  35. { ---------------------------------------------------------------------
  36. Low-level DB access.
  37. ---------------------------------------------------------------------}
  38. Var
  39. Connection : TMYSQL;
  40. Function ConnectToDatabase(DatabaseName,Host,User,Password : String) : Boolean;
  41. Var
  42. S : String;
  43. begin
  44. Verbose(V_DEBUG,'Connection params : '+DatabaseName+' '+Host+' '+User+' '+Password);
  45. Result:=mysql_connect(@Connection,PChar(Host),PChar(User),PChar(Password))<>Nil;
  46. If Not Result then
  47. begin
  48. S:=Strpas(mysql_error(@connection));
  49. Verbose(V_ERROR,'Failed to connect to database : '+S);
  50. end
  51. else
  52. begin
  53. Result:=Mysql_select_db(@Connection,Pchar(DatabaseName))>=0;
  54. If Not result then
  55. begin
  56. S:=StrPas(mysql_error(@connection));
  57. DisconnectDatabase;
  58. Verbose(V_Error,'Failed to select database : '+S);
  59. end;
  60. end;
  61. end;
  62. Procedure DisconnectDatabase;
  63. begin
  64. mysql_close(@Connection);
  65. end;
  66. Function RunQuery (Qry : String; Var res : TQueryResult) : Boolean ;
  67. begin
  68. Verbose(V_DEBUG,'Running query:'+Qry);
  69. Result:=mysql_query(@Connection,PChar(qry))>=0;
  70. If Not Result then
  71. Verbose(V_WARNING,'Query : '+Qry+'Failed : '+Strpas(mysql_error(@connection)))
  72. else
  73. Res:=Mysql_store_result(@connection);
  74. end;
  75. Function GetResultField (Res : TQueryResult; Id : Integer) : String;
  76. Var
  77. Row : TMYSQL_ROW;
  78. begin
  79. if Res=Nil then
  80. Result:=''
  81. else
  82. begin
  83. Row:=mysql_fetch_row(Res);
  84. If (Row=Nil) or (Row[ID]=Nil) then
  85. Result:=''
  86. else
  87. Result:=strpas(Row[ID]);
  88. end;
  89. Verbose(V_DEBUG,'Field value '+Result);
  90. end;
  91. Procedure FreeQueryResult (Res : TQueryResult);
  92. begin
  93. mysql_free_result(Res);
  94. end;
  95. Function IDQuery(Qry : String) : Integer;
  96. Var
  97. Res : TQueryResult;
  98. begin
  99. Result:=-1;
  100. If RunQuery(Qry,Res) then
  101. begin
  102. Result:=StrToIntDef(GetResultField(Res,0),-1);
  103. FreeQueryResult(Res);
  104. end;
  105. end;
  106. Function EscapeSQL( S : String) : String;
  107. begin
  108. Result:=StringReplace(S,'"','\"',[rfReplaceAll]);
  109. Verbose(V_DEBUG,'EscapeSQL : "'+S+'" -> "'+Result+'"');
  110. end;
  111. { ---------------------------------------------------------------------
  112. High-level access
  113. ---------------------------------------------------------------------}
  114. Function GetTestID(Name : string) : Integer;
  115. Const
  116. SFromName = 'SELECT T_ID FROM TESTS WHERE (T_NAME="%s")';
  117. SFromFullName = 'SELECT T_ID FROM TESTS WHERE (T_FULLNAME="%s")';
  118. Var
  119. FN : String;
  120. begin
  121. FN:=ExtractFileName(Name);
  122. Result:=IDQuery(Format(SFromName,[FN]));
  123. If Result=-1 then
  124. Result:=IDQuery(Format(SFromFullName,[Name]))
  125. end;
  126. Function GetOSID(Name : String) : Integer;
  127. Const
  128. SFromName = 'SELECT TO_ID FROM TESTOS WHERE (TO_NAME="%s")';
  129. begin
  130. Result:=IDQuery(Format(SFromName,[Name]));
  131. end;
  132. Function GetCPUID(Name : String) : Integer;
  133. Const
  134. SFromName = 'SELECT TC_ID FROM TESTCPU WHERE (TC_NAME="%s")';
  135. begin
  136. Result:=IDQuery(Format(SFromName,[Name]));
  137. end;
  138. Function AddTest(Name : String; AddSource : Boolean) : Integer;
  139. Const
  140. SInsertTest = 'INSERT INTO TESTS (T_NAME,T_FULLNAME,T_ADDDATE)'+
  141. ' VALUES ("%s","%s",NOW())';
  142. Var
  143. Info : TConfig;
  144. Res : TQueryResult;
  145. begin
  146. Result:=-1;
  147. If FileExists(Name) and GetConfig(Name,Info) then
  148. begin
  149. If RunQuery(Format(SInsertTest,[ExtractFileName(Name),Name]),Res) then
  150. begin
  151. Result:=GetTestID(Name);
  152. If Result=-1 then
  153. Verbose(V_WARNING,'Kon toegevoegde test niet terugvinden!')
  154. else
  155. If AddSource then
  156. UpdateTest(Result,Info,GetFileContents(Name))
  157. else
  158. UpdateTest(Result,Info,'');
  159. end
  160. end
  161. else
  162. Verbose(V_ERROR,'Kon test "'+Name+'" niet vinden of geen info extraheren.');
  163. end;
  164. Const
  165. B : Array[Boolean] of String = ('-','+');
  166. Function UpdateTest(ID : Integer; Info : TConfig; Source : String) : Boolean;
  167. Const
  168. SUpdateTest = 'Update TESTS SET '+
  169. ' T_CPU="%s", T_OS="%s", T_VERSION="%s",'+
  170. ' T_GRAPH="%s", T_INTERACTIVE="%s", T_RESULT=%d,'+
  171. ' T_FAIL="%s", T_RECOMPILE="%s", T_NORUN="%s",'+
  172. ' T_NEEDLIBRARY="%s", T_KNOWNRUNERROR=%d,'+
  173. ' T_KNOWN="%s", T_NOTE="%s", T_OPTS = "%s"'+
  174. ' %s '+
  175. 'WHERE'+
  176. ' T_ID=%d';
  177. Var
  178. Qry : String;
  179. Res : TQueryResult;
  180. begin
  181. If Source<>'' then
  182. begin
  183. Source:=EscapeSQL(Source);
  184. Source:=', T_SOURCE="'+Source+'"';
  185. end;
  186. With Info do
  187. Qry:=Format(SUpdateTest,[EscapeSQL(NeedCPU),'',EscapeSQL(NeedVersion),
  188. B[usesGraph],B[IsInteractive],ResultCode,
  189. B[ShouldFail],B[NeedRecompile],B[NoRun],
  190. B[NeedLibrary],KnownRunError,
  191. B[IsKnown],EscapeSQL(Note),EscapeSQL(NeedOptions),
  192. Source,
  193. ID
  194. ]);
  195. Result:=RunQuery(Qry,res)
  196. end;
  197. Function AddTestResult(TestID,OSID,CPUID,TestRes : Integer;
  198. OK, Skipped : Boolean;
  199. Log : String;
  200. TestDate : TDateTime) : Integer;
  201. Const
  202. SInsertRes = 'Insert into TESTRESULTS ('+
  203. ' TR_TEST_FK, TR_DATE, TR_CPU_FK, TR_OS_FK,'+
  204. ' TR_OK, TR_SKIP, TR_RESULT, TR_LOG)'+
  205. 'VALUES ('+
  206. ' %d,"%s",%d,%d,'+
  207. ' "%s","%s",%d,"%s")';
  208. Var
  209. Qry : String;
  210. Res : TQueryResult;
  211. begin
  212. Result:=-1;
  213. Qry:=Format(SInsertRes,[TestID,FormatDateTime('yyyymmdd',TestDate),CPUID,OSID,
  214. B[OK],B[Skipped],TestRes,EscapeSQL(Log)
  215. ]);
  216. If RunQuery(Qry,Res) then
  217. Result:=mysql_insert_id(@connection);
  218. end;
  219. Function RequireTestID(Name : String): Integer;
  220. begin
  221. Result:=GetTestID(Name);
  222. If Result=-1 then
  223. Result:=AddTest(Name,FileExists(Name));
  224. If Result=-1 then
  225. Verbose(V_WARNING,'Could not find or create entry for test '+Name);
  226. end;
  227. end.