dbdigest.pp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  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. ts:=stFailedToCompile;
  497. If analyse(line,TS) then
  498. begin
  499. Verbose(V_NORMAL,'Analysing result for test '+Line);
  500. If Not ExpectRun[TS] then
  501. begin
  502. ID:=RequireTestID(Line);
  503. if (PrevID<>-1) and (PrevID<>ID) then
  504. begin
  505. { This can only happen if a Successfully compiled message
  506. is not followed by any other line about the same test }
  507. TestLog:='';
  508. AddTestResult(PrevID,TestRunId,ord(PrevTS),
  509. TestOK[PrevTS],TestSkipped[PrevTS],TestLog,is_new);
  510. Verbose(V_Warning,'Orphaned test: "'+prevline+'"');
  511. end;
  512. PrevID:=-1;
  513. If (ID<>-1) then
  514. begin
  515. If Not (TestOK[TS] or TestSkipped[TS]) then
  516. begin
  517. TestLog:=GetExecuteLog(Fullline,Line);
  518. if pos(failed_to_compile,TestLog)=1 then
  519. TestLog:=GetLog(Fullline,Line);
  520. end
  521. else
  522. TestLog:='';
  523. { AddTestResult can fail for test that contain %recompile
  524. as the same }
  525. if AddTestResult(ID,TestRunID,Ord(TS),TestOK[TS],
  526. TestSkipped[TS],TestLog,is_new) <> -1 then
  527. begin
  528. if is_new then
  529. Inc(StatusCount[TS])
  530. else
  531. Verbose(V_Debug,'Test: "'+line+'" was updated');
  532. end
  533. else
  534. begin
  535. Verbose(V_Warning,'Test: "'+line+'" already registered');
  536. end;
  537. end;
  538. end
  539. else
  540. begin
  541. Inc(StatusCount[TS]);
  542. PrevTS:=TS;
  543. PrevID:=RequireTestID(line);
  544. PrevLine:=line;
  545. end;
  546. end
  547. else
  548. begin
  549. Inc(UnknownLines);
  550. Verbose(V_Warning,'Unknown line: "'+line+'"');
  551. end;
  552. end;
  553. close(logfile);
  554. end;
  555. procedure UpdateTestRun;
  556. var
  557. i : TTestStatus;
  558. qry : string;
  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. ExecuteQuery(Qry,False);
  578. end;
  579. function GetTestConfigId : Integer;
  580. var
  581. qry : string;
  582. begin
  583. qry:='SELECT TCONF_ID FROM TESTCONFIG WHERE ' +
  584. 'TCONF_CPU_FK=%d AND ' +
  585. 'TCONF_OS_FK=%d AND ' +
  586. 'TCONF_VERSION_FK=%d AND ' +
  587. 'TCONF_CATEGORY_FK=%d AND ' +
  588. 'TCONF_SUBMITTER=''%s'' AND ' +
  589. 'TCONF_MACHINE=''%s'' AND ' +
  590. 'TCONF_COMMENT=''%s'' ';
  591. ConfigID:=IDQuery(format(qry,[TestCPUID, TestOSID, TestVersionID, TestCategoryID,
  592. Submitter, Machine, Comment]));
  593. GetTestConfigID:=ConfigID;
  594. end;
  595. function UpdateTestConfigID : boolean;
  596. var
  597. qry : string;
  598. firstRunID, lastRunID,PrevRunID : Integer;
  599. RunCount : Integer;
  600. AddCount : boolean;
  601. begin
  602. AddCount:=false;
  603. UpdateTestConfigID:=false;
  604. qry:=format('SELECT TCONF_FIRST_RUN_FK FROM TESTCONFIG WHERE TCONF_ID=%d',[ConfigID]);
  605. FirstRunID:=IDQuery(qry);
  606. if TestRunID<FirstRunID then
  607. begin
  608. Verbose(V_Warning,format('FirstRunID changed from %d to %d',[FirstRunID,TestRunID]));
  609. qry:=format('UPDATE TESTCONFIG SET TCONF_FIRST_RUN_FK=%d WHERE TCONF_ID=%d',
  610. [TestRunID,ConfigID]);
  611. if Not ExecuteQuery(qry,False) then
  612. Verbose(V_Warning,'Update of LastRunID failed');
  613. end;
  614. qry:=format('SELECT TCONF_LAST_RUN_FK FROM TESTCONFIG WHERE TCONF_ID=%d',[ConfigID]);
  615. LastRunID:=IDQuery(qry);
  616. if TestRunID>LastRunID then
  617. begin
  618. qry:=format('UPDATE TESTCONFIG SET TCONF_LAST_RUN_FK=%d WHERE TCONF_ID=%d',
  619. [TestRunID,ConfigID]);
  620. if not ExecuteQuery(qry,False) then
  621. Verbose(V_Warning,'Update of LastRunID failed');
  622. end
  623. else
  624. Verbose(V_Warning,format('LastRunID %di,new %d',[LastRunID,TestRunID]));
  625. qry:=format('SELECT TCONF_NEW_RUN_FK FROM TESTCONFIG WHERE TCONF_ID=%d',[ConfigID]);
  626. PrevRunID:=IDQuery(qry);
  627. if TestRunID<>PrevRunID then
  628. begin
  629. qry:=format('UPDATE TESTCONFIG SET TCONF_NEW_RUN_FK=%d WHERE TCONF_ID=%d',
  630. [TestRunID,ConfigID]);
  631. if not ExecuteQuery(qry,False) then
  632. Verbose(V_Warning,'Update of LastRunID failed');
  633. AddTestHistoryEntry(TestRunID,PrevRunID);
  634. AddCount:=true;
  635. end
  636. else
  637. Verbose(V_Warning,'TestRunID is equal to last!');
  638. qry:=format('SELECT TCONF_COUNT_RUNS FROM TESTCONFIG WHERE TCONF_ID=%d',[ConfigID]);
  639. RunCount:=IDQuery(qry);
  640. { Add one to run count }
  641. if AddCount then
  642. begin
  643. Inc(RunCount);
  644. qry:=format('UPDATE TESTCONFIG SET TCONF_COUNT_RUNS=%d WHERE TCONF_ID=%d',
  645. [RunCount,ConfigID]);
  646. if not ExecuteQuery(qry,False) then
  647. Verbose(V_Warning,'Update of TU_COUNT_RUNS failed');
  648. end;
  649. UpdateTestConfigID:=true;
  650. end;
  651. function InsertNewTestConfigId : longint;
  652. var
  653. qry : string;
  654. begin
  655. qry:='INSERT INTO TESTCONFIG '+
  656. '(TCONF_NEW_RUN_FK,TCONF_FIRST_RUN_FK,TCONF_LAST_RUN_FK,' +
  657. 'TCONF_CPU_FK,TCONF_OS_FK,TCONF_VERSION_FK,TCONF_CATEGORY_FK,'+
  658. 'TCONF_SUBMITTER,TCONF_MACHINE,TCONF_COMMENT,'+
  659. 'TCONF_NEW_DATE,TCONF_FIRST_DATE,TCONF_LAST_DATE) ';
  660. qry:=qry+format(' VALUES(%d,%d,%d,%d,%d,%d,%d,''%s'',''%s'',''%s'',''%s'',''%s'',''%s'') ',
  661. [TestRunID, TestRunID, TestRunID, TestCPUID,
  662. TestOSID, TestVersionID, TestCategoryID,
  663. Submitter, Machine, Comment,
  664. SqlDate(TestDate), SqlDate(TestDate), SqlDate(TestDate)]);
  665. qry:=qry+' RETURNING TCONF_ID';
  666. Result:=InsertQuery(qry);
  667. AddTestHistoryEntry(TestRunID,0);
  668. end;
  669. procedure UpdateTestConfig;
  670. begin
  671. if GetTestPreviousRunHistoryID(TestRunID) <> -1 then
  672. begin
  673. Verbose(V_DEBUG,format('TestRun %d already in TestHistory table',[TestRunID]));
  674. exit;
  675. end;
  676. if GetTestConfigID >= 0 then
  677. begin
  678. if not UpdateTestConfigID then
  679. Verbose(V_Warning, ' Update of TESTCONFIG table failed');
  680. end
  681. else
  682. begin
  683. if InsertNewTestConfigID = -1 then
  684. Verbose(V_Warning, ' Insert of new entry into TESTCONFIG table failed');
  685. end;
  686. end;
  687. begin
  688. ProcessConfigFile('dbdigest.cfg');
  689. ProcessCommandLine;
  690. If LogFileName<>'' then
  691. begin
  692. ConnectToDatabase(DatabaseName,HostName,UserName,Password,Port);
  693. if LongLogFileName<>'' then
  694. begin
  695. {$I-}
  696. Assign(LongLogFile,LongLogFileName);
  697. Reset(LongLogFile);
  698. If IOResult=0 then
  699. begin
  700. UseLongLog:=true;
  701. inc(LongLogOpenCount);
  702. end;
  703. {$I+}
  704. end;
  705. GetIDs;
  706. ProcessFile(LogFileName);
  707. UpdateTestRun;
  708. UpdateTestConfig;
  709. if UseLongLog then
  710. begin
  711. Close(LongLogFile);
  712. if LongLogOpenCount>1 then
  713. Verbose(V_Warning,format('LongLog file was read %d times.',[LongLogOpenCount]));
  714. end
  715. end
  716. else
  717. Verbose(V_ERROR,'Missing log file name');
  718. end.