dbdigest.pp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  1. {
  2. This file is part of the Free Pascal test suite.
  3. Copyright (c) 2002 by the Free Pascal development team.
  4. This program inserts the last tests run
  5. into TESTSUITE database.
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {$mode objfpc}
  13. {$h+}
  14. {$ifndef win32}
  15. {$linklib pthread}
  16. {$endif}
  17. program dbdigest;
  18. uses
  19. sysutils,teststr,testu,tresults,dbtests;
  20. Var
  21. StatusCount : Array[TTestStatus] of Integer;
  22. UnknownLines : integer;
  23. Procedure ExtractTestFileName(Var Line : string);
  24. Var I : integer;
  25. begin
  26. I:=Pos(' ',Line);
  27. If (I<>0) then
  28. Line:=Copy(Line,1,I-1);
  29. end;
  30. Function Analyse(Var Line : string; Var Status : TTestStatus) : Boolean;
  31. Var
  32. TS : TTestStatus;
  33. begin
  34. Result:=False;
  35. For TS:=FirstStatus to LastStatus do
  36. begin
  37. Result:=Pos(StatusText[TS],Line)=1;
  38. If Result then
  39. begin
  40. Status:=TS;
  41. Delete(Line,1,Length(StatusText[TS]));
  42. ExtractTestFileName(Line);
  43. Break;
  44. end;
  45. end;
  46. end;
  47. Type
  48. TConfigOpt = (
  49. coDatabaseName,
  50. coHost,
  51. coUserName,
  52. coPassword,
  53. coPort,
  54. coLogFile,
  55. coLongLogFile,
  56. coOS,
  57. coCPU,
  58. coCategory,
  59. coVersion,
  60. coDate,
  61. coSubmitter,
  62. coMachine,
  63. coComment,
  64. coTestSrcDir,
  65. coRelSrcDir,
  66. coVerbose,
  67. coSQL
  68. );
  69. { Additional options only for dbdigest.cfg file }
  70. TConfigAddOpt = (
  71. coCompilerDate,
  72. coCompilerFullVersion,
  73. coSvnCompilerRevision,
  74. coSvnTestsRevision,
  75. coSvnRTLRevision,
  76. coSvnPackagesRevision
  77. );
  78. Const
  79. ConfigStrings : Array [TConfigOpt] of string = (
  80. 'databasename',
  81. 'host',
  82. 'username',
  83. 'password',
  84. 'port',
  85. 'logfile',
  86. 'longlogfile',
  87. 'os',
  88. 'cpu',
  89. 'category',
  90. 'version',
  91. 'date',
  92. 'submitter',
  93. 'machine',
  94. 'comment',
  95. 'testsrcdir',
  96. 'relsrcdir',
  97. 'verbose',
  98. 'sql'
  99. );
  100. ConfigOpts : Array[TConfigOpt] of char =(
  101. 'd', { coDatabaseName }
  102. 'h', { coHost }
  103. 'u', { coUserName }
  104. 'p', { coPassword }
  105. 'P', { coPort }
  106. 'l', { coLogFile }
  107. 'L', { coLongLogFile }
  108. 'o', { coOS }
  109. 'c', { coCPU }
  110. 'a', { coCategory }
  111. 'v', { coVersion }
  112. 't', { coDate }
  113. 's', { coSubmitter }
  114. 'm', { coMachine }
  115. 'C', { coComment }
  116. 'S', { coTestSrcDir }
  117. 'r', { coRelSrcDir }
  118. 'V', { coVerbose }
  119. 'Q' { coSQL }
  120. );
  121. ConfigAddStrings : Array [TConfigAddOpt] of string = (
  122. 'compilerdate',
  123. 'compilerfullversion',
  124. 'svncompilerrevision',
  125. 'svntestsrevision',
  126. 'svnrtlrevision',
  127. 'svnpackagesrevision'
  128. );
  129. ConfigAddCols : Array [TConfigAddOpt] of string = (
  130. 'TU_COMPILERDATE',
  131. 'TU_COMPILERFULLVERSION',
  132. 'TU_SVNCOMPILERREVISION',
  133. 'TU_SVNTESTSREVISION',
  134. 'TU_SVNRTLREVISION',
  135. 'TU_SVNPACKAGESREVISION'
  136. );
  137. Var
  138. TestOS,
  139. TestCPU,
  140. TestVersion,
  141. TestCategory,
  142. DatabaseName,
  143. HostName,
  144. UserName,
  145. Password,
  146. Port,
  147. LongLogFileName,
  148. LogFileName,
  149. Submitter,
  150. Machine,
  151. Comment : String;
  152. TestDate : TDateTime;
  153. TestCompilerDate,
  154. TestCompilerFullVersion,
  155. TestSvnCompilerRevision,
  156. TestSvnTestsRevision,
  157. TestSvnRTLRevision,
  158. TestSvnPackagesRevision : String;
  159. Procedure SetAddOpt (O : TConfigAddOpt; Value : string);
  160. begin
  161. Case O of
  162. coCompilerDate:
  163. TestCompilerDate:=Value;
  164. coCompilerFullVersion:
  165. TestCompilerFullVersion:=Value;
  166. coSvnCompilerRevision:
  167. TestSvnCompilerRevision:=Value;
  168. coSvnTestsRevision:
  169. TestSvnTestsRevision:=Value;
  170. coSvnRTLRevision:
  171. TestSvnRTLRevision:=Value;
  172. coSvnPackagesRevision:
  173. TestSvnPackagesRevision:=Value;
  174. end;
  175. end;
  176. Procedure SetOpt (O : TConfigOpt; Value : string);
  177. var
  178. year,month,day,min,hour : word;
  179. begin
  180. Case O of
  181. coDatabaseName : DatabaseName:=Value;
  182. coHost : HostName:=Value;
  183. coUserName : UserName:=Value;
  184. coPassword : Password:=Value;
  185. coPort : Port:=Value;
  186. coLogFile : LogFileName:=Value;
  187. coLongLogFile : LongLogFileName:=Value;
  188. coOS : TestOS:=Value;
  189. coCPU : TestCPU:=Value;
  190. coCategory : TestCategory:=Value;
  191. coVersion : TestVersion:=Value;
  192. coSQL : DoSQL:=True;
  193. coDate :
  194. begin
  195. { Formated like YYYYMMDDhhmm }
  196. if Length(value)=12 then
  197. begin
  198. year:=StrToInt(Copy(value,1,4));
  199. month:=StrToInt(Copy(value,5,2));
  200. day:=StrToInt(Copy(Value,7,2));
  201. hour:=StrToInt(Copy(Value,9,2));
  202. min:=StrToInt(Copy(Value,11,2));
  203. TestDate:=EncodeDate(year,month,day)+EncodeTime(hour,min,0,0);
  204. end
  205. else
  206. Verbose(V_Error,'Error in date format, use YYYYMMDDhhmm');
  207. end;
  208. coSubmitter : Submitter:=Value;
  209. coMachine : Machine:=Value;
  210. coComment : Comment:=Value;
  211. coVerbose : DoVerbose:=true;
  212. coTestSrcDir :
  213. begin
  214. TestSrcDir:=Value;
  215. if (TestSrcDir<>'') and (TestSrcDir[length(TestSrcDir)]<>'/') then
  216. TestSrcDir:=TestSrcDir+'/';
  217. end;
  218. coRelSrcDir :
  219. begin
  220. RelSrcDir:=Value;
  221. if (RelSrcDir<>'') and (RelSrcDir[length(RelSrcDir)]<>'/') then
  222. RelSrcDir:=RelSrcDir+'/';
  223. if (RelSrcDir<>'') and (RelSrcDir[1]='/') then
  224. RelSrcDir:=copy(RelSrcDir,2,length(RelSrcDir)-1);
  225. end;
  226. end;
  227. end;
  228. Function ProcessOption(S: String) : Boolean;
  229. Var
  230. N : String;
  231. I : Integer;
  232. co : TConfigOpt;
  233. coa : TConfigAddOpt;
  234. begin
  235. Verbose(V_DEBUG,'Processing option: '+S);
  236. I:=Pos('=',S);
  237. Result:=(I<>0);
  238. If Result then
  239. begin
  240. N:=Copy(S,1,I-1);
  241. Delete(S,1,I);
  242. For co:=low(TConfigOpt) to high(TConfigOpt) do
  243. begin
  244. Result:=CompareText(ConfigStrings[co],N)=0;
  245. If Result then
  246. begin
  247. SetOpt(co,S);
  248. Exit;
  249. end;
  250. end;
  251. For coa:=low(TConfigAddOpt) to high(TConfigAddOpt) do
  252. begin
  253. Result:=CompareText(ConfigAddStrings[coa],N)=0;
  254. If Result then
  255. begin
  256. SetAddOpt(coa,S);
  257. Exit;
  258. end;
  259. end;
  260. end;
  261. Verbose(V_ERROR,'Unknown option : '+n+S);
  262. end;
  263. Procedure ProcessConfigfile(FN : String);
  264. Var
  265. F : Text;
  266. S : String;
  267. I : Integer;
  268. begin
  269. // Set the default value for old digests without RelSrcDir to the rtl/compiler
  270. // testsuite
  271. RelSrcDir:='tests/';
  272. If Not FileExists(FN) Then
  273. Exit;
  274. Verbose(V_DEBUG,'Parsing config file: '+FN);
  275. Assign(F,FN);
  276. {$i-}
  277. Reset(F);
  278. If IOResult<>0 then
  279. Exit;
  280. {$I+}
  281. While not(EOF(F)) do
  282. begin
  283. ReadLn(F,S);
  284. S:=trim(S);
  285. I:=Pos('#',S);
  286. If I<>0 then
  287. S:=Copy(S,1,I-1);
  288. If (S<>'') then
  289. ProcessOption(S);
  290. end;
  291. Close(F);
  292. end;
  293. Procedure ProcessCommandLine;
  294. Var
  295. I : Integer;
  296. O : String;
  297. c,co : TConfigOpt;
  298. ShortOptFound, Found : Boolean;
  299. begin
  300. I:=1;
  301. While I<=ParamCount do
  302. begin
  303. O:=Paramstr(I);
  304. ShortOptFound:=(Length(O)=2) and (O[1]='-');
  305. If ShortOptFound then
  306. For co:=low(TConfigOpt) to high(TConfigOpt) do
  307. begin
  308. Found:=(O[2]=ConfigOpts[co]);
  309. If Found then
  310. begin
  311. c:=co;
  312. Break;
  313. end;
  314. end;
  315. If not ShortOptFound then
  316. begin
  317. Found:=false;
  318. { accept long options }
  319. if (copy(O,1,2)='--') then
  320. begin
  321. { remove -- }
  322. O:=copy(O,3,length(O));
  323. For co:=low(TConfigOpt) to high(TConfigOpt) do
  324. begin
  325. Found:=(O=ConfigStrings[co]);
  326. If Found then
  327. begin
  328. c:=co;
  329. Break;
  330. end;
  331. end;
  332. end
  333. end;
  334. if not Found then
  335. Verbose(V_ERROR,'Illegal command-line option : '+O)
  336. else
  337. begin
  338. if c=coverbose then
  339. begin
  340. Found:=true;
  341. o:='';
  342. end
  343. else
  344. Found:=(I<ParamCount);
  345. If Not found then
  346. Verbose(V_ERROR,'Option requires argument : '+O)
  347. else
  348. begin
  349. inc(I);
  350. O:=Paramstr(I);
  351. SetOpt(c,o);
  352. end;
  353. end;
  354. Inc(I);
  355. end;
  356. end;
  357. Var
  358. TestCPUID : Integer;
  359. TestOSID : Integer;
  360. TestVersionID : Integer;
  361. TestCategoryID : Integer;
  362. TestRunID : Integer;
  363. ConfigID : Integer;
  364. Procedure GetIDs;
  365. begin
  366. TestCPUID := GetCPUId(TestCPU);
  367. If TestCPUID=-1 then
  368. Verbose(V_Error,'NO ID for CPU "'+TestCPU+'" found.');
  369. TestOSID := GetOSID(TestOS);
  370. If TestOSID=-1 then
  371. Verbose(V_Error,'NO ID for OS "'+TestOS+'" found.');
  372. TestCategoryID := GetCategoryID(TestCategory);
  373. If TestCategoryID=-1 then
  374. begin
  375. // Verbose(V_Error,'NO ID for Category "'+TestCategory+'" found.');
  376. TestCategoryID:=1;
  377. end;
  378. TestVersionID := GetVersionID(TestVersion);
  379. If TestVersionID=-1 then
  380. Verbose(V_Error,'NO ID for version "'+TestVersion+'" found.');
  381. If (Round(TestDate)=0) then
  382. Testdate:=Now;
  383. TestRunID:=GetRunID(TestOSID,TestCPUID,TestVersionID,TestDate);
  384. If (TestRunID=-1) then
  385. begin
  386. TestRunID:=AddRun(TestOSID,TestCPUID,TestVersionID,TestCategoryID,TestDate);
  387. If TestRUnID=-1 then
  388. Verbose(V_Error,'Could not insert new testrun record!');
  389. end
  390. else
  391. CleanTestRun(TestRunID);
  392. end;
  393. var
  394. LongLogFile : Text;
  395. const
  396. UseLongLog : boolean = false;
  397. LongLogOpenCount : longint = 0;
  398. FirstLongLogLine : boolean = true;
  399. Function GetContentsFromLongLog(Line : String) : String;
  400. var
  401. S : String;
  402. IsFirst, IsFound : boolean;
  403. begin
  404. Result:='';
  405. IsFirst:=true;
  406. IsFound:=false;
  407. While Not(EOF(LongLogFile)) do
  408. begin
  409. ReadLn(LongLogFile,S);
  410. if FirstLongLogLine then
  411. begin
  412. { At start of file there is a separation line }
  413. if (pos('>>>>>>>>>>>',S)=1) then
  414. Readln(LongLogFile,S);
  415. FirstLongLogLine:=false;
  416. end;
  417. if pos(Line,S)=1 then
  418. begin
  419. IsFound:=true;
  420. while not eof(LongLogFile) do
  421. begin
  422. ReadLn(LongLogFile,S);
  423. { End of file marker }
  424. if eof(LongLogFile) or (pos('>>>>>>>>>>>',S)=1) then
  425. exit;
  426. Result:=Result+S+LineEnding;
  427. end;
  428. end
  429. else if IsFirst then
  430. begin
  431. Verbose(V_Warning,'Line "'+Line+'" not found as next "'+S+'"');
  432. IsFirst:=false;
  433. end;
  434. end;
  435. if not IsFound then
  436. begin
  437. Verbose(V_Warning,'Line "'+Line+'" not found');
  438. { Restart to get a chance to find others }
  439. if eof(LongLogFile) then
  440. begin
  441. Close(LongLogFile);
  442. Reset(LongLogFile);
  443. inc(LongLogOpenCount);
  444. end;
  445. end;
  446. end;
  447. Function GetLog(Line, FN : String) : String;
  448. begin
  449. if UseLongLog then
  450. begin
  451. Result:=GetContentsFromLongLog(Line);
  452. exit;
  453. end;
  454. FN:=ChangeFileExt(FN,'.log');
  455. If FileExists(FN) then
  456. Result:=GetFileContents(FN)
  457. else
  458. Result:='';
  459. end;
  460. Function GetExecuteLog(Line, FN : String) : String;
  461. begin
  462. if UseLongLog then
  463. begin
  464. Result:=GetContentsFromLongLog(Line);
  465. exit;
  466. end;
  467. FN:=ChangeFileExt(FN,'.elg');
  468. If FileExists(FN) then
  469. Result:=GetFileContents(FN)
  470. else
  471. Result:='';
  472. end;
  473. Procedure Processfile (FN: String);
  474. var
  475. logfile : text;
  476. fullline,line,prevLine : string;
  477. TS,PrevTS : TTestStatus;
  478. ID,PrevID : integer;
  479. Testlog : string;
  480. is_new : boolean;
  481. begin
  482. Assign(logfile,FN);
  483. PrevId:=-1;
  484. PrevLine:='';
  485. is_new:=false;
  486. PrevTS:=low(TTestStatus);
  487. {$i-}
  488. reset(logfile);
  489. if ioresult<>0 then
  490. Verbose(V_Error,'Unable to open log file'+FN);
  491. {$i+}
  492. while not eof(logfile) do
  493. begin
  494. readln(logfile,line);
  495. fullline:=line;
  496. If analyse(line,TS) then
  497. begin
  498. Verbose(V_NORMAL,'Analysing result for test '+Line);
  499. If Not ExpectRun[TS] then
  500. begin
  501. ID:=RequireTestID(Line);
  502. if (PrevID<>-1) and (PrevID<>ID) then
  503. begin
  504. { This can only happen if a Successfully compiled message
  505. is not followed by any other line about the same test }
  506. TestLog:='';
  507. AddTestResult(PrevID,TestRunId,ord(PrevTS),
  508. TestOK[PrevTS],TestSkipped[PrevTS],TestLog,is_new);
  509. Verbose(V_Warning,'Orphaned test: "'+prevline+'"');
  510. end;
  511. PrevID:=-1;
  512. If (ID<>-1) then
  513. begin
  514. If Not (TestOK[TS] or TestSkipped[TS]) then
  515. begin
  516. TestLog:=GetExecuteLog(Fullline,Line);
  517. if pos(failed_to_compile,TestLog)=1 then
  518. TestLog:=GetLog(Fullline,Line);
  519. end
  520. else
  521. TestLog:='';
  522. { AddTestResult can fail for test that contain %recompile
  523. as the same }
  524. if AddTestResult(ID,TestRunID,Ord(TS),TestOK[TS],
  525. TestSkipped[TS],TestLog,is_new) <> -1 then
  526. begin
  527. if is_new then
  528. Inc(StatusCount[TS])
  529. else
  530. Verbose(V_Debug,'Test: "'+line+'" was updated');
  531. end
  532. else
  533. begin
  534. Verbose(V_Warning,'Test: "'+line+'" already registered');
  535. end;
  536. end;
  537. end
  538. else
  539. begin
  540. Inc(StatusCount[TS]);
  541. PrevTS:=TS;
  542. PrevID:=RequireTestID(line);
  543. PrevLine:=line;
  544. end;
  545. end
  546. else
  547. begin
  548. Inc(UnknownLines);
  549. Verbose(V_Warning,'Unknown line: "'+line+'"');
  550. end;
  551. end;
  552. close(logfile);
  553. end;
  554. procedure UpdateTestRun;
  555. var
  556. i : TTestStatus;
  557. qry : string;
  558. res : TQueryResult;
  559. begin
  560. qry:='UPDATE TESTRUN SET ';
  561. for i:=low(TTestStatus) to high(TTestStatus) do
  562. qry:=qry+format('%s=%d, ',[SQLField[i],StatusCount[i]]);
  563. if TestCompilerDate<>'' then
  564. qry:=qry+format('%s="%s", ',[ConfigAddCols[coCompilerDate],EscapeSQL(TestCompilerDate)]);
  565. if TestCompilerFullVersion<>'' then
  566. qry:=qry+format('%s="%s", ',[ConfigAddCols[coCompilerFullVersion],EscapeSQL(TestCompilerFullVersion)]);
  567. if TestSvnCompilerRevision<>'' then
  568. qry:=qry+format('%s="%s", ',[ConfigAddCols[coSvnCompilerRevision],EscapeSQL(TestSvnCompilerRevision)]);
  569. if TestSvnTestsRevision<>'' then
  570. qry:=qry+format('%s="%s", ',[ConfigAddCols[coSvnTestsRevision],EscapeSQL(TestSvnTestsRevision)]);
  571. if TestSvnRTLRevision<>'' then
  572. qry:=qry+format('%s="%s", ',[ConfigAddCols[coSvnRTLRevision],EscapeSQL(TestSvnRTLRevision)]);
  573. if TestSvnPackagesRevision<>'' then
  574. qry:=qry+format('%s="%s", ',[ConfigAddCols[coSvnPackagesRevision],EscapeSQL(TestSvnPackagesRevision)]);
  575. qry:=qry+format('TU_SUBMITTER="%s", TU_MACHINE="%s", TU_COMMENT="%s", TU_DATE="%s"',[Submitter,Machine,Comment,SqlDate(TestDate)]);
  576. qry:=qry+' WHERE TU_ID='+format('%d',[TestRunID]);
  577. if RunQuery(Qry,res) then
  578. FreeQueryResult(Res);
  579. end;
  580. function GetTestConfigId : Integer;
  581. var
  582. qry : string;
  583. begin
  584. qry:='SELECT TCONF_ID FROM TESTCONFIG WHERE ' +
  585. 'TCONF_CPU_FK=%d AND ' +
  586. 'TCONF_OS_FK=%d AND ' +
  587. 'TCONF_VERSION_FK=%d AND ' +
  588. 'TCONF_CATEGORY_FK=%d AND ' +
  589. 'TCONF_SUBMITTER="%s" AND ' +
  590. 'TCONF_MACHINE="%s" AND ' +
  591. 'TCONF_COMMENT="%s" ';
  592. ConfigID:=IDQuery(format(qry,[TestCPUID, TestOSID, TestVersionID, TestCategoryID,
  593. Submitter, Machine, Comment]));
  594. GetTestConfigID:=ConfigID;
  595. end;
  596. function UpdateTestConfigID : boolean;
  597. var
  598. qry : string;
  599. firstRunID, lastRunID,PrevRunID : Integer;
  600. RunCount : Integer;
  601. res : TQueryResult;
  602. AddCount : boolean;
  603. begin
  604. AddCount:=false;
  605. UpdateTestConfigID:=false;
  606. qry:=format('SELECT TCONF_FIRST_RUN_FK FROM TESTCONFIG WHERE TCONF_ID=%d',[ConfigID]);
  607. FirstRunID:=IDQuery(qry);
  608. if TestRunID<FirstRunID then
  609. begin
  610. Verbose(V_Warning,format('FirstRunID changed from %d to %d',[FirstRunID,TestRunID]));
  611. qry:=format('UPDATE TESTCONFIG SET TCONF_FIRST_RUN_FK=%d WHERE TCONF_ID=%d',
  612. [TestRunID,ConfigID]);
  613. if RunQuery(qry,res) then
  614. FreeQueryResult(res)
  615. else
  616. Verbose(V_Warning,'Update of LastRunID failed');
  617. end;
  618. qry:=format('SELECT TCONF_LAST_RUN_FK FROM TESTCONFIG WHERE TCONF_ID=%d',[ConfigID]);
  619. LastRunID:=IDQuery(qry);
  620. if TestRunID>LastRunID then
  621. begin
  622. qry:=format('UPDATE TESTCONFIG SET TCONF_LAST_RUN_FK=%d WHERE TCONF_ID=%d',
  623. [TestRunID,ConfigID]);
  624. if RunQuery(qry,res) then
  625. FreeQueryResult(res)
  626. else
  627. Verbose(V_Warning,'Update of LastRunID failed');
  628. end
  629. else
  630. Verbose(V_Warning,format('LastRunID %di,new %d',[LastRunID,TestRunID]));
  631. qry:=format('SELECT TCONF_NEW_RUN_FK FROM TESTCONFIG WHERE TCONF_ID=%d',[ConfigID]);
  632. PrevRunID:=IDQuery(qry);
  633. if TestRunID<>PrevRunID then
  634. begin
  635. qry:=format('UPDATE TESTCONFIG SET TCONF_NEW_RUN_FK=%d WHERE TCONF_ID=%d',
  636. [TestRunID,ConfigID]);
  637. if RunQuery(qry,res) then
  638. FreeQueryResult(res)
  639. else
  640. Verbose(V_Warning,'Update of LastRunID failed');
  641. AddTestHistoryEntry(TestRunID,PrevRunID);
  642. AddCount:=true;
  643. end
  644. else
  645. Verbose(V_Warning,'TestRunID is equal to last!');
  646. qry:=format('SELECT TCONF_COUNT_RUNS FROM TESTCONFIG WHERE TCONF_ID=%d',[ConfigID]);
  647. RunCount:=IDQuery(qry);
  648. { Add one to run count }
  649. if AddCount then
  650. begin
  651. Inc(RunCount);
  652. qry:=format('UPDATE TESTCONFIG SET TCONF_COUNT_RUNS=%d WHERE TCONF_ID=%d',
  653. [RunCount,ConfigID]);
  654. if RunQuery(qry,res) then
  655. FreeQueryResult(res)
  656. else
  657. Verbose(V_Warning,'Update of TU_COUNT_RUNS failed');
  658. end;
  659. UpdateTestConfigID:=true;
  660. end;
  661. function InsertNewTestConfigId : longint;
  662. var
  663. qry : string;
  664. begin
  665. qry:='INSERT INTO TESTCONFIG '+
  666. '(TCONF_NEW_RUN_FK,TCONF_FIRST_RUN_FK,TCONF_LAST_RUN_FK,' +
  667. 'TCONF_CPU_FK,TCONF_OS_FK,TCONF_VERSION_FK,TCONF_CATEGORY_FK,'+
  668. 'TCONF_SUBMITTER,TCONF_MACHINE,TCONF_COMMENT,'+
  669. 'TCONF_NEW_DATE,TCONF_FIRST_DATE,TCONF_LAST_DATE) ';
  670. qry:=qry+format(' VALUES(%d,%d,%d,%d,%d,%d,%d,"%s","%s","%s","%s","%s","%s") ',
  671. [TestRunID, TestRunID, TestRunID, TestCPUID,
  672. TestOSID, TestVersionID, TestCategoryID,
  673. Submitter, Machine, Comment,
  674. SqlDate(TestDate), SqlDate(TestDate), SqlDate(TestDate)]);
  675. Result:=InsertQuery(qry);
  676. AddTestHistoryEntry(TestRunID,0);
  677. end;
  678. procedure UpdateTestConfig;
  679. var
  680. qry : string;
  681. res : TQueryResult;
  682. begin
  683. qry:='SHOW TABLES LIKE ''TESTCONFIG''';
  684. if not RunQuery(Qry,Res) then
  685. exit;
  686. { Row_Count is zero if table does not exist }
  687. if Res^.Row_Count=0 then exit;
  688. FreeQueryResult(Res);
  689. if GetTestPreviousRunHistoryID(TestRunID) <> -1 then
  690. begin
  691. Verbose(V_DEBUG,format('TestRun %d already in TestHistory table',[TestRunID]));
  692. exit;
  693. end;
  694. if GetTestConfigID >= 0 then
  695. begin
  696. if not UpdateTestConfigID then
  697. Verbose(V_Warning, ' Update of TESTCONFIG table failed');
  698. end
  699. else
  700. begin
  701. if InsertNewTestConfigID = -1 then
  702. Verbose(V_Warning, ' Insert of new entry into TESTCONFIG table failed');
  703. end;
  704. end;
  705. begin
  706. ProcessConfigFile('dbdigest.cfg');
  707. ProcessCommandLine;
  708. If LogFileName<>'' then
  709. begin
  710. ConnectToDatabase(DatabaseName,HostName,UserName,Password,Port);
  711. if LongLogFileName<>'' then
  712. begin
  713. {$I-}
  714. Assign(LongLogFile,LongLogFileName);
  715. Reset(LongLogFile);
  716. If IOResult=0 then
  717. begin
  718. UseLongLog:=true;
  719. inc(LongLogOpenCount);
  720. end;
  721. {$I+}
  722. end;
  723. GetIDs;
  724. ProcessFile(LogFileName);
  725. UpdateTestRun;
  726. UpdateTestConfig;
  727. if UseLongLog then
  728. begin
  729. Close(LongLogFile);
  730. if LongLogOpenCount>1 then
  731. Verbose(V_Warning,format('LongLog file was read %d times.',[LongLogOpenCount]));
  732. end
  733. end
  734. else
  735. Verbose(V_ERROR,'Missing log file name');
  736. end.