dbtests.pp 8.5 KB

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