sqldbtoolsunit.pas 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. unit SQLDBToolsUnit;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, toolsunit,
  6. db,
  7. sqldb, ibconnection, mysql40conn, mysql41conn, mysql50conn, pqconnection,odbcconn,oracleconnection;
  8. type TSQLDBTypes = (mysql40,mysql41,mysql50,postgresql,interbase,odbc,oracle);
  9. const MySQLdbTypes = [mysql40,mysql41,mysql50];
  10. DBTypesNames : Array [TSQLDBTypes] of String[19] =
  11. ('MYSQL40','MYSQL41','MYSQL50','POSTGRESQL','INTERBASE','ODBC','ORACLE');
  12. type
  13. { TSQLDBConnector }
  14. TSQLDBConnector = class(TDBConnector)
  15. FConnection : TSQLConnection;
  16. FTransaction : TSQLTransaction;
  17. FQuery : TSQLQuery;
  18. private
  19. procedure CreateFConnection;
  20. procedure CreateFTransaction;
  21. Function CreateQuery : TSQLQuery;
  22. protected
  23. procedure CreateNDatasets; override;
  24. procedure CreateFieldDataset; override;
  25. procedure DropNDatasets; override;
  26. procedure DropFieldDataset; override;
  27. Function InternalGetNDataset(n : integer) : TDataset; override;
  28. Function InternalGetFieldDataset : TDataSet; override;
  29. public
  30. destructor Destroy; override;
  31. constructor Create; override;
  32. property Connection : TSQLConnection read FConnection;
  33. property Transaction : TSQLTransaction read FTransaction;
  34. property Query : TSQLQuery read FQuery;
  35. end;
  36. var SQLDbType : TSQLDBTypes;
  37. implementation
  38. { TSQLDBConnector }
  39. procedure TSQLDBConnector.CreateFConnection;
  40. var i : TSQLDBTypes;
  41. begin
  42. for i := low(DBTypesNames) to high(DBTypesNames) do
  43. if UpperCase(dbconnectorparams) = DBTypesNames[i] then sqldbtype := i;
  44. if SQLDbType = MYSQL40 then Fconnection := tMySQL40Connection.Create(nil);
  45. if SQLDbType = MYSQL41 then Fconnection := tMySQL41Connection.Create(nil);
  46. if SQLDbType = MYSQL50 then Fconnection := tMySQL50Connection.Create(nil);
  47. if SQLDbType = POSTGRESQL then Fconnection := tpqConnection.Create(nil);
  48. if SQLDbType = INTERBASE then Fconnection := tIBConnection.Create(nil);
  49. if SQLDbType = ODBC then Fconnection := tODBCConnection.Create(nil);
  50. if SQLDbType = ORACLE then Fconnection := TOracleConnection.Create(nil);
  51. if not assigned(Fconnection) then writeln('Invalid database-type, check if a valid database-type was provided in the file ''database.ini''');
  52. with Fconnection do
  53. begin
  54. DatabaseName := dbname;
  55. UserName := dbuser;
  56. Password := dbpassword;
  57. HostName := dbhostname;
  58. open;
  59. end;
  60. end;
  61. procedure TSQLDBConnector.CreateFTransaction;
  62. begin
  63. Ftransaction := tsqltransaction.create(nil);
  64. with Ftransaction do
  65. database := Fconnection;
  66. end;
  67. Function TSQLDBConnector.CreateQuery : TSQLQuery;
  68. begin
  69. Result := TSQLQuery.create(nil);
  70. with Result do
  71. begin
  72. database := Fconnection;
  73. transaction := Ftransaction;
  74. end;
  75. end;
  76. procedure TSQLDBConnector.CreateNDatasets;
  77. var CountID : Integer;
  78. begin
  79. try
  80. Ftransaction.StartTransaction;
  81. Fconnection.ExecuteDirect('create table FPDEV ( ' +
  82. ' ID INT NOT NULL, ' +
  83. ' NAME VARCHAR(50), ' +
  84. ' PRIMARY KEY (ID) ' +
  85. ') ');
  86. FTransaction.CommitRetaining;
  87. for countID := 1 to MaxDataSet do
  88. Fconnection.ExecuteDirect('insert into FPDEV (ID,NAME)' +
  89. 'values ('+inttostr(countID)+',''TestName'+inttostr(countID)+''')');
  90. Ftransaction.Commit;
  91. except
  92. if Ftransaction.Active then Ftransaction.Rollback
  93. end;
  94. end;
  95. procedure TSQLDBConnector.CreateFieldDataset;
  96. var CountID : Integer;
  97. begin
  98. try
  99. Ftransaction.StartTransaction;
  100. Fconnection.ExecuteDirect('create table FPDEV_FIELD ( ' +
  101. ' ID INT NOT NULL, ' +
  102. ' FSTRING VARCHAR(10), ' +
  103. ' FINTEGER INT, ' +
  104. ' FDATE DATE, ' +
  105. ' FDATETIME TIMESTAMP, ' +
  106. ' PRIMARY KEY (ID) ' +
  107. ') ');
  108. FTransaction.CommitRetaining;
  109. for countID := 0 to testValuesCount-1 do
  110. Fconnection.ExecuteDirect('insert into FPDEV_FIELD (ID,FSTRING,FINTEGER,FDATE,FDATETIME)' +
  111. 'values ('+inttostr(countID)+','''+testStringValues[CountID]+''','''+inttostr(testIntValues[CountID])+''','''+testDateValues[CountID]+''','''+testDateValues[CountID]+''')');
  112. Ftransaction.Commit;
  113. except
  114. if Ftransaction.Active then Ftransaction.Rollback
  115. end;
  116. end;
  117. procedure TSQLDBConnector.DropNDatasets;
  118. begin
  119. try
  120. if Ftransaction.Active then Ftransaction.Rollback;
  121. Ftransaction.StartTransaction;
  122. Fconnection.ExecuteDirect('DROP TABLE FPDEV');
  123. Ftransaction.Commit;
  124. Except
  125. if Ftransaction.Active then Ftransaction.Rollback
  126. end;
  127. end;
  128. procedure TSQLDBConnector.DropFieldDataset;
  129. begin
  130. try
  131. if Ftransaction.Active then Ftransaction.Rollback;
  132. Ftransaction.StartTransaction;
  133. Fconnection.ExecuteDirect('DROP TABLE FPDEV_FIELD');
  134. Ftransaction.Commit;
  135. Except
  136. if Ftransaction.Active then Ftransaction.Rollback
  137. end;
  138. end;
  139. function TSQLDBConnector.InternalGetNDataset(n: integer): TDataset;
  140. begin
  141. Result := CreateQuery;
  142. with (Result as TSQLQuery) do
  143. begin
  144. sql.clear;
  145. sql.add('SELECT * FROM FPDEV WHERE ID < '+inttostr(n+1));
  146. end;
  147. end;
  148. function TSQLDBConnector.InternalGetFieldDataset: TDataSet;
  149. begin
  150. Result := CreateQuery;
  151. with (Result as TSQLQuery) do
  152. begin
  153. sql.clear;
  154. sql.add('SELECT * FROM FPDEV_FIELD');
  155. end;
  156. end;
  157. destructor TSQLDBConnector.Destroy;
  158. begin
  159. try
  160. if Ftransaction.Active then Ftransaction.Rollback;
  161. Ftransaction.StartTransaction;
  162. Fconnection.ExecuteDirect('DROP TABLE FPDEV2');
  163. Ftransaction.Commit;
  164. Except
  165. if Ftransaction.Active then Ftransaction.Rollback
  166. end;
  167. inherited Destroy;
  168. FreeAndNil(FQuery);
  169. FreeAndNil(FTransaction);
  170. FreeAndNil(FConnection);
  171. end;
  172. constructor TSQLDBConnector.Create;
  173. begin
  174. FConnection := nil;
  175. CreateFConnection;
  176. CreateFTransaction;
  177. FQuery := CreateQuery;
  178. FConnection.Transaction := FTransaction;
  179. Inherited;
  180. end;
  181. initialization
  182. RegisterClass(TSQLDBConnector);
  183. end.