tcsetup.pas 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. unit tcsetup;
  2. {$mode ObjFPC}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testutils, testregistry, testdecorator, dbtests, sqldb, pqconnection;
  6. type
  7. { TDBHelper }
  8. TDBHelper = class
  9. class var SQL : TTestSQL;
  10. class var Conn : TPQConnection;
  11. class function CreateQuery(const aSQL : String) : TSQLQuery;
  12. class procedure setup;
  13. class procedure ClearTable(const aTable : string);
  14. class function IDQuery(const aSQL : String) : Int64;
  15. class procedure ExecAndCommit(Qry: TSQLQuery);
  16. class procedure ExecSQL(const aSQL: String);
  17. class function CountRecords(const aTable : String; const aFilter : String = '') : Int64;
  18. class procedure MaybeRollback;
  19. end;
  20. { TDBDecorator }
  21. TDBDecorator = class(TTestSetup)
  22. Public
  23. procedure OneTimeSetup; override;
  24. procedure OneTimeTearDown; override;
  25. end;
  26. implementation
  27. uses inifiles;
  28. const
  29. SDatabase = 'Database';
  30. KeyName = 'Name';
  31. KeyHost = 'Host';
  32. KeyUser = 'UserName';
  33. KeyPassword = 'Password';
  34. KeyPort = 'Port';
  35. { TDBDecorator }
  36. class function TDBHelper.CreateQuery(const aSQL: String): TSQLQuery;
  37. begin
  38. Result:=TSQLQuery.Create(Conn);
  39. Result.DataBase:=Conn;
  40. Result.Transaction:=Conn.Transaction;
  41. Result.SQL.Text:=aSQL;
  42. end;
  43. class procedure TDBHelper.setup;
  44. var
  45. Ini : TCustomIniFile;
  46. lFileName,lName,lHost,lUser,lPassword: String;
  47. lPort : Integer;
  48. begin
  49. lFileName:=ExtractFilePath(Paramstr(0))+'testdigest.ini';
  50. if not FileExists(lFileName) then
  51. TAssert.Fail('No config filename %s',[lFileName]);
  52. Ini:=TMemIniFile.Create(lFileName);
  53. try
  54. lName:=Ini.ReadString(SDatabase,KeyName,'');
  55. if lName='testsuite' then
  56. TAssert.Fail('As a precaution, test database cannot be called testsuite');
  57. lHost:=Ini.ReadString(SDatabase,KeyHost,'');
  58. lUser:=Ini.ReadString(SDatabase,KeyUser,'');
  59. lPassword:=Ini.ReadString(SDatabase,KeyPassword,'');
  60. lPort:=Ini.ReadInteger(SDatabase,KeyPort,0);
  61. finally
  62. Ini.Free;
  63. end;
  64. SQL:=TTestSQL.create(lName,lHost,lUser,lPassword,lPort);
  65. if not SQL.ConnectToDatabase then
  66. TAssert.Fail('Could not connect to database');
  67. Conn:=TPQConnection.Create(Nil);
  68. Conn.DatabaseName:=lName;
  69. Conn.HostName:=lHost;
  70. Conn.UserName:=lUser;
  71. Conn.Password:=lPassword;
  72. if lPort<>0 then
  73. Conn.Params.values['port']:=IntToStr(lPort);
  74. conn.Transaction:=TSQLTransaction.Create(Conn);
  75. conn.Connected:=True;
  76. (*
  77. l:=TStringList.Create;
  78. try
  79. conn.GetTableNames(l);
  80. writeln('Tables:');
  81. Writeln('-------');
  82. Writeln(l.text);
  83. Writeln('-------');
  84. finally
  85. l.Free
  86. end;
  87. *)
  88. end;
  89. class procedure TDBHelper.ExecAndCommit(Qry : TSQLQuery);
  90. begin
  91. if not Qry.SQLTransaction.Active then
  92. Qry.SQLTransaction.StartTransaction;
  93. try
  94. Qry.ExecSQL;
  95. if Qry.SQLTransaction.Active then
  96. Qry.SQLTransaction.Commit;
  97. except
  98. if Qry.SQLTransaction.Active then
  99. Qry.SQLTransaction.RollBack;
  100. Raise;
  101. end;
  102. end;
  103. class procedure TDBHelper.ExecSQL(const aSQL : String);
  104. var
  105. Qry : TSQLQuery;
  106. begin
  107. // Truncate would be faster, but we have foreign keys
  108. Qry:=CreateQuery(aSQL);
  109. try
  110. ExecAndCommit(Qry);
  111. finally
  112. Qry.Free;
  113. end;
  114. end;
  115. class function TDBHelper.CountRecords(const aTable: String; const aFilter: String): Int64;
  116. var
  117. lSQL : String;
  118. begin
  119. lSQL:='select count(*) as thecount from '+aTable;
  120. if aFilter<>'' then
  121. lSQL:=lSQL+' where '+aFilter;
  122. Result:=IDQuery(lSQL);
  123. end;
  124. class procedure TDBHelper.MaybeRollback;
  125. begin
  126. if Assigned(Conn) and Assigned(Conn.Transaction) and Conn.Transaction.Active then
  127. Conn.Transaction.RollBack;
  128. end;
  129. class procedure TDBHelper.ClearTable(const aTable: string);
  130. begin
  131. // Truncate would be faster, but we have foreign keys
  132. ExecSQL('delete from '+aTable);
  133. end;
  134. class function TDBHelper.IDQuery(const aSQL: String): Int64;
  135. var
  136. Qry : TSQLQuery;
  137. begin
  138. Qry:=CreateQuery(aSQL);
  139. try
  140. if not Qry.SQLTransaction.Active then
  141. Qry.SQLTransaction.StartTransaction;
  142. try
  143. Qry.Open;
  144. Result:=Qry.Fields[0].AsLargeInt;
  145. if Qry.SQLTransaction.Active then
  146. Qry.SQLTransaction.Commit;
  147. except
  148. if Qry.SQLTransaction.Active then
  149. Qry.SQLTransaction.RollBack;
  150. Raise;
  151. end;
  152. finally
  153. Qry.Free;
  154. end;
  155. end;
  156. procedure TDBDecorator.OneTimeSetup;
  157. begin
  158. TDBHelper.Setup;
  159. end;
  160. procedure TDBDecorator.OneTimeTearDown;
  161. begin
  162. FreeAndNil(TDBHelper.SQL);
  163. FreeAndNil(TDBHelper.Conn);
  164. end;
  165. end.