dbtests.pp 7.5 KB

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