fpddsqldb.pp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2007 by Michael Van Canneyt, member of the
  4. Free Pascal development team
  5. SQLDB Data Dictionary Engine common Implementation.
  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. unit fpddsqldb;
  13. {$mode objfpc}{$H+}
  14. interface
  15. uses
  16. Classes, SysUtils, DB, sqldb, fpdatadict;
  17. Type
  18. { TSQLDBDDEngine }
  19. TSQLDBDDEngine = Class(TFPDDEngine)
  20. Private
  21. FConn: TSQLConnection;
  22. Protected
  23. Function SQLDataTypeToFieldType(const SQLDataType: string) : TFieldType; virtual;
  24. Function CreateConnection(AConnectString : String) : TSQLConnection; virtual; abstract;
  25. Function CreateSQLQuery(ADatasetOwner: TComponent) : TSQLQuery;
  26. Property Connection : TSQLConnection Read FConn;
  27. Public
  28. Procedure Disconnect ; override;
  29. Function HostSupported: Boolean; virtual;
  30. Function Connect(const AConnectString : String) : Boolean; override;
  31. Function GetTableList(List : TStrings) : Integer; override;
  32. Function ImportFields(Table : TDDTableDef) : Integer; override;
  33. Function ImportIndexes(Table : TDDTableDef) : Integer; override;
  34. Function ViewTable(Const TableName: String; DatasetOwner : TComponent) : TDataset; override;
  35. Function RunQuery(SQL : String) : Integer; override;
  36. Function CreateQuery(SQL : String; DatasetOwner : TComponent) : TDataset; override;
  37. Procedure SetQueryStatement(SQL : String; AQuery : TDataset); override;
  38. Function GetTableIndexDefs(ATableName : String; Defs : TDDIndexDefs) : integer ; override;
  39. Class function EngineCapabilities : TFPDDEngineCapabilities; override;
  40. end;
  41. Const
  42. // used in connectionstring
  43. KeyHostName = 'Host';
  44. KeyDatabaseName = 'Database';
  45. KeyUserName = 'User';
  46. KeyPassword = 'Password';
  47. KeyEncode = 'Trivial';
  48. KeyCharset = 'Charset';
  49. implementation
  50. uses strutils;
  51. Resourcestring
  52. SErrQueryNotSQLQuery = 'Query object "%s" is not a SQL Query';
  53. { TSQLDBDDEngine }
  54. function TSQLDBDDEngine.HostSupported: Boolean;
  55. begin
  56. Result:=True;
  57. end;
  58. function TSQLDBDDEngine.SQLDataTypeToFieldType(const SQLDataType: string
  59. ): TFieldType;
  60. begin
  61. // ANSI standard types
  62. case SQLDataType of
  63. 'char' : Result := ftFixedChar;
  64. 'varchar' : Result := ftString;
  65. 'smallint': Result := ftSmallint;
  66. 'int',
  67. 'integer' : Result := ftInteger;
  68. 'bigint' : Result := ftLargeInt;
  69. 'float' : Result := ftFloat;
  70. 'date' : Result := ftDate;
  71. 'time' : Result := ftTime;
  72. 'datetime': Result := ftDateTime;
  73. else Result := ftUnknown;
  74. end;
  75. end;
  76. function TSQLDBDDEngine.CreateSQLQuery(ADatasetOwner: TComponent): TSQLQuery;
  77. begin
  78. Result:=TSQLQuery.Create(ADatasetOwner);
  79. Result.DataBase:=FConn;
  80. Result.Transaction:=FConn.TRansaction;
  81. end;
  82. procedure TSQLDBDDEngine.Disconnect;
  83. begin
  84. FreeAndNil(FConn);
  85. FConnectString:='';
  86. FConnected:=False;
  87. end;
  88. function TSQLDBDDEngine.Connect(const AConnectString: String): Boolean;
  89. Var
  90. L : TStringList;
  91. begin
  92. FConn:=CreateConnection(AConnectString);
  93. FConn.Transaction:=TSQLTransaction.Create(FConn);
  94. L:=TStringList.Create;
  95. Try
  96. L.CommaText:=AConnectString;
  97. If HostSupported then
  98. FConn.HostName:=L.Values[KeyHostName];
  99. FConn.DatabaseName:=L.Values[KeyDatabaseName];
  100. FConn.UserName:=L.Values[KeyUserName];
  101. FConn.Password:=XorDecode(KeyEncode,L.Values[KeyPassword]);
  102. FConn.LoginPrompt:=False;
  103. FConn.Connected:=True;
  104. FConn.CharSet:=L.Values[KeyCharset];
  105. FConnected:=True;
  106. FConnectString:=AConnectString;
  107. Result:=True;
  108. Finally
  109. L.Free;
  110. end;
  111. end;
  112. function TSQLDBDDEngine.GetTableList(List: TStrings): Integer;
  113. begin
  114. FConn.GetTableNames(List,False);
  115. result := list.count;
  116. end;
  117. function TSQLDBDDEngine.ImportFields(Table: TDDTableDef): Integer;
  118. Const
  119. SQL = 'SELECT * FROM %s WHERE (1=0)';
  120. Var
  121. Q : TSQLQuery;
  122. begin
  123. Q:=CreateSQLQuery(Nil);
  124. try
  125. Q.Sql.Text:=Format(SQL,[Table.TableName]);
  126. Q.Open;
  127. try
  128. Result:=Table.ImportFromDataset(Q);
  129. finally
  130. Q.CLose;
  131. end;
  132. finally
  133. Q.Free;
  134. end;
  135. end;
  136. function TSQLDBDDEngine.ImportIndexes(Table: TDDTableDef): Integer;
  137. begin
  138. end;
  139. function TSQLDBDDEngine.ViewTable(const TableName: String;
  140. DatasetOwner: TComponent): TDataset;
  141. Var
  142. Q : TSQLQuery;
  143. begin
  144. Q:=CreateSQLQuery(DatasetOwner);
  145. Q.SQL.Text:='SELECT * FROM '+TableName;
  146. Result:=Q;
  147. end;
  148. function TSQLDBDDEngine.RunQuery(SQL: String): Integer;
  149. Var
  150. Q : TSQLQuery;
  151. begin
  152. Q:=CreateSQLQuery(Nil);
  153. Try
  154. Q.SQL.Text:=SQL;
  155. Q.ExecSQL;
  156. Result:=0;
  157. Finally
  158. Q.Free;
  159. end;
  160. end;
  161. function TSQLDBDDEngine.CreateQuery(SQL: String; DatasetOwner: TComponent
  162. ): TDataset;
  163. Var
  164. Q : TSQLQuery;
  165. begin
  166. Q:=CreateSQLQuery(Nil);
  167. Result:=Q;
  168. Q.SQL.Text:=SQL;
  169. Q.Open;
  170. end;
  171. procedure TSQLDBDDEngine.SetQueryStatement(SQL: String; AQuery: TDataset);
  172. begin
  173. If Not (AQuery is TSQLQuery) then
  174. Raise EDataDict.CreateFmt(SErrQueryNotSQLQuery,[AQuery.ClassName]);
  175. (AQuery as TSQLQuery).SQL.Text:=SQL;
  176. end;
  177. function TSQLDBDDEngine.GetTableIndexDefs(ATableName: String; Defs: TDDIndexDefs
  178. ): integer;
  179. Var
  180. Q : TSQLQuery;
  181. begin
  182. Q:=TSQLQuery.Create(Self);
  183. Try
  184. Q.Database:=FConn;
  185. Q.Transaction:=FConn.Transaction;
  186. Q.SQL.text:=Format('SELECT * FROM %s WHERE (1=2)',[ATableName]);
  187. Q.ReadOnly:=False;
  188. Q.Prepare;
  189. Q.ServerIndexDefs.Update;
  190. IndexDefsToDDIndexDefs(Q.ServerIndexDefs,Defs);
  191. Result:=Defs.Count;
  192. finally
  193. Q.Free;
  194. end;
  195. end;
  196. class function TSQLDBDDEngine.EngineCapabilities: TFPDDEngineCapabilities;
  197. begin
  198. Result:=[ecImport, ecViewTable, ecRunQuery, ecTableIndexes];
  199. end;
  200. end.