dbdigest.pp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777
  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. Found:=(I<ParamCount);
  339. If Not found then
  340. Verbose(V_ERROR,'Option requires argument : '+O)
  341. else
  342. begin
  343. inc(I);
  344. O:=Paramstr(I);
  345. SetOpt(c,o);
  346. end;
  347. end;
  348. Inc(I);
  349. end;
  350. end;
  351. Var
  352. TestCPUID : Integer;
  353. TestOSID : Integer;
  354. TestVersionID : Integer;
  355. TestCategoryID : Integer;
  356. TestRunID : Integer;
  357. ConfigID : Integer;
  358. Procedure GetIDs;
  359. begin
  360. TestCPUID := GetCPUId(TestCPU);
  361. If TestCPUID=-1 then
  362. Verbose(V_Error,'NO ID for CPU "'+TestCPU+'" found.');
  363. TestOSID := GetOSID(TestOS);
  364. If TestOSID=-1 then
  365. Verbose(V_Error,'NO ID for OS "'+TestOS+'" found.');
  366. TestCategoryID := GetCategoryID(TestCategory);
  367. If TestCategoryID=-1 then
  368. begin
  369. // Verbose(V_Error,'NO ID for Category "'+TestCategory+'" found.');
  370. TestCategoryID:=1;
  371. end;
  372. TestVersionID := GetVersionID(TestVersion);
  373. If TestVersionID=-1 then
  374. Verbose(V_Error,'NO ID for version "'+TestVersion+'" found.');
  375. If (Round(TestDate)=0) then
  376. Testdate:=Now;
  377. TestRunID:=GetRunID(TestOSID,TestCPUID,TestVersionID,TestDate);
  378. If (TestRunID=-1) then
  379. begin
  380. TestRunID:=AddRun(TestOSID,TestCPUID,TestVersionID,TestCategoryID,TestDate);
  381. If TestRUnID=-1 then
  382. Verbose(V_Error,'Could not insert new testrun record!');
  383. end
  384. else
  385. CleanTestRun(TestRunID);
  386. end;
  387. var
  388. LongLogFile : Text;
  389. const
  390. UseLongLog : boolean = false;
  391. LongLogOpenCount : longint = 0;
  392. FirstLongLogLine : boolean = true;
  393. Function GetContentsFromLongLog(Line : String) : String;
  394. var
  395. S : String;
  396. IsFirst, IsFound : boolean;
  397. begin
  398. Result:='';
  399. IsFirst:=true;
  400. IsFound:=false;
  401. While Not(EOF(LongLogFile)) do
  402. begin
  403. ReadLn(LongLogFile,S);
  404. if FirstLongLogLine then
  405. begin
  406. { At start of file there is a separation line }
  407. if (pos('>>>>>>>>>>>',S)=1) then
  408. Readln(LongLogFile,S);
  409. FirstLongLogLine:=false;
  410. end;
  411. if pos(Line,S)=1 then
  412. begin
  413. IsFound:=true;
  414. while not eof(LongLogFile) do
  415. begin
  416. ReadLn(LongLogFile,S);
  417. { End of file marker }
  418. if eof(LongLogFile) or (pos('>>>>>>>>>>>',S)=1) then
  419. exit;
  420. Result:=Result+S+LineEnding;
  421. end;
  422. end
  423. else if IsFirst then
  424. begin
  425. Verbose(V_Warning,'Line "'+Line+'" not found as next "'+S+'"');
  426. IsFirst:=false;
  427. end;
  428. end;
  429. if not IsFound then
  430. begin
  431. Verbose(V_Warning,'Line "'+Line+'" not found');
  432. { Restart to get a chance to find others }
  433. if eof(LongLogFile) then
  434. begin
  435. Close(LongLogFile);
  436. Reset(LongLogFile);
  437. inc(LongLogOpenCount);
  438. end;
  439. end;
  440. end;
  441. Function GetLog(Line, FN : String) : String;
  442. begin
  443. if UseLongLog then
  444. begin
  445. Result:=GetContentsFromLongLog(Line);
  446. exit;
  447. end;
  448. FN:=ChangeFileExt(FN,'.log');
  449. If FileExists(FN) then
  450. Result:=GetFileContents(FN)
  451. else
  452. Result:='';
  453. end;
  454. Function GetExecuteLog(Line, FN : String) : String;
  455. begin
  456. if UseLongLog then
  457. begin
  458. Result:=GetContentsFromLongLog(Line);
  459. exit;
  460. end;
  461. FN:=ChangeFileExt(FN,'.elg');
  462. If FileExists(FN) then
  463. Result:=GetFileContents(FN)
  464. else
  465. Result:='';
  466. end;
  467. Procedure Processfile (FN: String);
  468. var
  469. logfile : text;
  470. fullline,line,prevLine : string;
  471. TS,PrevTS : TTestStatus;
  472. ID,PrevID : integer;
  473. Testlog : string;
  474. is_new : boolean;
  475. begin
  476. Assign(logfile,FN);
  477. PrevId:=-1;
  478. PrevLine:='';
  479. is_new:=false;
  480. PrevTS:=low(TTestStatus);
  481. {$i-}
  482. reset(logfile);
  483. if ioresult<>0 then
  484. Verbose(V_Error,'Unable to open log file'+FN);
  485. {$i+}
  486. while not eof(logfile) do
  487. begin
  488. readln(logfile,line);
  489. fullline:=line;
  490. ts:=stFailedToCompile;
  491. If analyse(line,TS) then
  492. begin
  493. Verbose(V_NORMAL,'Analysing result for test '+Line);
  494. If Not ExpectRun[TS] then
  495. begin
  496. ID:=RequireTestID(Line);
  497. if (PrevID<>-1) and (PrevID<>ID) then
  498. begin
  499. { This can only happen if a Successfully compiled message
  500. is not followed by any other line about the same test }
  501. TestLog:='';
  502. AddTestResult(PrevID,TestRunId,ord(PrevTS),
  503. TestOK[PrevTS],TestSkipped[PrevTS],TestLog,is_new);
  504. Verbose(V_Warning,'Orphaned test: "'+prevline+'"');
  505. end;
  506. PrevID:=-1;
  507. If (ID<>-1) then
  508. begin
  509. If Not (TestOK[TS] or TestSkipped[TS]) then
  510. begin
  511. TestLog:=GetExecuteLog(Fullline,Line);
  512. if pos(failed_to_compile,TestLog)=1 then
  513. TestLog:=GetLog(Fullline,Line);
  514. end
  515. else
  516. TestLog:='';
  517. { AddTestResult can fail for test that contain %recompile
  518. as the same }
  519. if AddTestResult(ID,TestRunID,Ord(TS),TestOK[TS],
  520. TestSkipped[TS],TestLog,is_new) <> -1 then
  521. begin
  522. if is_new then
  523. Inc(StatusCount[TS])
  524. else
  525. Verbose(V_Debug,'Test: "'+line+'" was updated');
  526. end
  527. else
  528. begin
  529. Verbose(V_Warning,'Test: "'+line+'" already registered');
  530. end;
  531. end;
  532. end
  533. else
  534. begin
  535. Inc(StatusCount[TS]);
  536. PrevTS:=TS;
  537. PrevID:=RequireTestID(line);
  538. PrevLine:=line;
  539. end;
  540. end
  541. else
  542. begin
  543. Inc(UnknownLines);
  544. Verbose(V_Warning,'Unknown line: "'+line+'"');
  545. end;
  546. end;
  547. close(logfile);
  548. end;
  549. procedure UpdateTestRun;
  550. var
  551. i : TTestStatus;
  552. qry : string;
  553. begin
  554. qry:='UPDATE TESTRUN SET ';
  555. for i:=low(TTestStatus) to high(TTestStatus) do
  556. qry:=qry+format('%s=%d, ',[SQLField[i],StatusCount[i]]);
  557. if TestCompilerDate<>'' then
  558. qry:=qry+format('%s=''%s'', ',[ConfigAddCols[coCompilerDate],EscapeSQL(TestCompilerDate)]);
  559. if TestCompilerFullVersion<>'' then
  560. qry:=qry+format('%s=''%s'', ',[ConfigAddCols[coCompilerFullVersion],EscapeSQL(TestCompilerFullVersion)]);
  561. if TestSvnCompilerRevision<>'' then
  562. qry:=qry+format('%s=''%s'', ',[ConfigAddCols[coSvnCompilerRevision],EscapeSQL(TestSvnCompilerRevision)]);
  563. if TestSvnTestsRevision<>'' then
  564. qry:=qry+format('%s=''%s'', ',[ConfigAddCols[coSvnTestsRevision],EscapeSQL(TestSvnTestsRevision)]);
  565. if TestSvnRTLRevision<>'' then
  566. qry:=qry+format('%s=''%s'', ',[ConfigAddCols[coSvnRTLRevision],EscapeSQL(TestSvnRTLRevision)]);
  567. if TestSvnPackagesRevision<>'' then
  568. qry:=qry+format('%s=''%s'', ',[ConfigAddCols[coSvnPackagesRevision],EscapeSQL(TestSvnPackagesRevision)]);
  569. qry:=qry+format('TU_SUBMITTER=''%s'', TU_MACHINE=''%s'', TU_COMMENT=''%s'', TU_DATE=''%s''',[Submitter,Machine,Comment,SqlDate(TestDate)]);
  570. qry:=qry+' WHERE TU_ID='+format('%d',[TestRunID]);
  571. ExecuteQuery(Qry,False);
  572. end;
  573. function GetTestConfigId : Integer;
  574. var
  575. qry : string;
  576. begin
  577. qry:='SELECT TCONF_ID FROM TESTCONFIG WHERE ' +
  578. 'TCONF_CPU_FK=%d AND ' +
  579. 'TCONF_OS_FK=%d AND ' +
  580. 'TCONF_VERSION_FK=%d AND ' +
  581. 'TCONF_CATEGORY_FK=%d AND ' +
  582. 'TCONF_SUBMITTER=''%s'' AND ' +
  583. 'TCONF_MACHINE=''%s'' AND ' +
  584. 'TCONF_COMMENT=''%s'' ';
  585. ConfigID:=IDQuery(format(qry,[TestCPUID, TestOSID, TestVersionID, TestCategoryID,
  586. Submitter, Machine, Comment]));
  587. GetTestConfigID:=ConfigID;
  588. end;
  589. function UpdateTestConfigID : boolean;
  590. var
  591. qry : string;
  592. firstRunID, lastRunID,PrevRunID : Integer;
  593. RunCount : Integer;
  594. AddCount : boolean;
  595. begin
  596. AddCount:=false;
  597. UpdateTestConfigID:=false;
  598. qry:=format('SELECT TCONF_FIRST_RUN_FK FROM TESTCONFIG WHERE TCONF_ID=%d',[ConfigID]);
  599. FirstRunID:=IDQuery(qry);
  600. if TestRunID<FirstRunID then
  601. begin
  602. Verbose(V_Warning,format('FirstRunID changed from %d to %d',[FirstRunID,TestRunID]));
  603. qry:=format('UPDATE TESTCONFIG SET TCONF_FIRST_RUN_FK=%d WHERE TCONF_ID=%d',
  604. [TestRunID,ConfigID]);
  605. if Not ExecuteQuery(qry,False) then
  606. Verbose(V_Warning,'Update of LastRunID failed');
  607. end;
  608. qry:=format('SELECT TCONF_LAST_RUN_FK FROM TESTCONFIG WHERE TCONF_ID=%d',[ConfigID]);
  609. LastRunID:=IDQuery(qry);
  610. if TestRunID>LastRunID then
  611. begin
  612. qry:=format('UPDATE TESTCONFIG SET TCONF_LAST_RUN_FK=%d WHERE TCONF_ID=%d',
  613. [TestRunID,ConfigID]);
  614. if not ExecuteQuery(qry,False) then
  615. Verbose(V_Warning,'Update of LastRunID failed');
  616. end
  617. else
  618. Verbose(V_Warning,format('LastRunID %di,new %d',[LastRunID,TestRunID]));
  619. qry:=format('SELECT TCONF_NEW_RUN_FK FROM TESTCONFIG WHERE TCONF_ID=%d',[ConfigID]);
  620. PrevRunID:=IDQuery(qry);
  621. if TestRunID<>PrevRunID then
  622. begin
  623. qry:=format('UPDATE TESTCONFIG SET TCONF_NEW_RUN_FK=%d WHERE TCONF_ID=%d',
  624. [TestRunID,ConfigID]);
  625. if not ExecuteQuery(qry,False) then
  626. Verbose(V_Warning,'Update of LastRunID failed');
  627. AddTestHistoryEntry(TestRunID,PrevRunID);
  628. AddCount:=true;
  629. end
  630. else
  631. Verbose(V_Warning,'TestRunID is equal to last!');
  632. qry:=format('SELECT TCONF_COUNT_RUNS FROM TESTCONFIG WHERE TCONF_ID=%d',[ConfigID]);
  633. RunCount:=IDQuery(qry);
  634. { Add one to run count }
  635. if AddCount then
  636. begin
  637. Inc(RunCount);
  638. qry:=format('UPDATE TESTCONFIG SET TCONF_COUNT_RUNS=%d WHERE TCONF_ID=%d',
  639. [RunCount,ConfigID]);
  640. if not ExecuteQuery(qry,False) then
  641. Verbose(V_Warning,'Update of TU_COUNT_RUNS failed');
  642. end;
  643. UpdateTestConfigID:=true;
  644. end;
  645. function InsertNewTestConfigId : longint;
  646. var
  647. qry : string;
  648. begin
  649. qry:='INSERT INTO TESTCONFIG '+
  650. '(TCONF_NEW_RUN_FK,TCONF_FIRST_RUN_FK,TCONF_LAST_RUN_FK,' +
  651. 'TCONF_CPU_FK,TCONF_OS_FK,TCONF_VERSION_FK,TCONF_CATEGORY_FK,'+
  652. 'TCONF_SUBMITTER,TCONF_MACHINE,TCONF_COMMENT,'+
  653. 'TCONF_NEW_DATE,TCONF_FIRST_DATE,TCONF_LAST_DATE) ';
  654. qry:=qry+format(' VALUES(%d,%d,%d,%d,%d,%d,%d,''%s'',''%s'',''%s'',''%s'',''%s'',''%s'') ',
  655. [TestRunID, TestRunID, TestRunID, TestCPUID,
  656. TestOSID, TestVersionID, TestCategoryID,
  657. Submitter, Machine, Comment,
  658. SqlDate(TestDate), SqlDate(TestDate), SqlDate(TestDate)]);
  659. qry:=qry+' RETURNING TCONF_ID';
  660. Result:=InsertQuery(qry);
  661. AddTestHistoryEntry(TestRunID,0);
  662. end;
  663. procedure UpdateTestConfig;
  664. begin
  665. if GetTestPreviousRunHistoryID(TestRunID) <> -1 then
  666. begin
  667. Verbose(V_DEBUG,format('TestRun %d already in TestHistory table',[TestRunID]));
  668. exit;
  669. end;
  670. if GetTestConfigID >= 0 then
  671. begin
  672. if not UpdateTestConfigID then
  673. Verbose(V_Warning, ' Update of TESTCONFIG table failed');
  674. end
  675. else
  676. begin
  677. if InsertNewTestConfigID = -1 then
  678. Verbose(V_Warning, ' Insert of new entry into TESTCONFIG table failed');
  679. end;
  680. end;
  681. begin
  682. ProcessConfigFile('dbdigest.cfg');
  683. ProcessCommandLine;
  684. If LogFileName<>'' then
  685. begin
  686. ConnectToDatabase(DatabaseName,HostName,UserName,Password,Port);
  687. if LongLogFileName<>'' then
  688. begin
  689. {$I-}
  690. Assign(LongLogFile,LongLogFileName);
  691. Reset(LongLogFile);
  692. If IOResult=0 then
  693. begin
  694. UseLongLog:=true;
  695. inc(LongLogOpenCount);
  696. end;
  697. {$I+}
  698. end;
  699. GetIDs;
  700. ProcessFile(LogFileName);
  701. UpdateTestRun;
  702. UpdateTestConfig;
  703. if UseLongLog then
  704. begin
  705. Close(LongLogFile);
  706. if LongLogOpenCount>1 then
  707. Verbose(V_Warning,format('LongLog file was read %d times.',[LongLogOpenCount]));
  708. end
  709. end
  710. else
  711. Verbose(V_ERROR,'Missing log file name');
  712. end.