dbtests.pp 8.8 KB

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