fpddsqldb.pp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  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, sqltypes, 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 GetObjectList(ASchemaType: TSchemaType; AList : TSqlObjectIdentifierList): Integer; override;
  33. Function ImportFields(Table : TDDTableDef) : Integer; override;
  34. Function ImportIndexes(Table : TDDTableDef) : Integer; override;
  35. Function ViewTable(Const TableName: String; DatasetOwner : TComponent) : TDataset; override;
  36. Function RunQuery(SQL : String) : Integer; override; overload;
  37. Function RunQuery(SQL : String; Params : TParams) : Integer; override; overload;
  38. Procedure ApplyParams(DS : TDataset; Params : TParams); virtual;
  39. Function CreateQuery(SQL : String; DatasetOwner : TComponent) : TDataset; override;
  40. Procedure SetQueryStatement(SQL : String; AQuery : TDataset); override;
  41. Function GetTableIndexDefs(ATableName : String; Defs : TDDIndexDefs) : integer ; override;
  42. Class function EngineCapabilities : TFPDDEngineCapabilities; override;
  43. end;
  44. Const
  45. // used in connectionstring
  46. KeyHostName = 'Host';
  47. KeyDatabaseName = 'Database';
  48. KeyUserName = 'User';
  49. KeyPassword = 'Password';
  50. KeyEncode = 'Trivial';
  51. KeyCharset = 'Charset';
  52. implementation
  53. uses strutils;
  54. Resourcestring
  55. SErrQueryNotSQLQuery = 'Query object "%s" is not a SQL Query';
  56. { TSQLDBDDEngine }
  57. function TSQLDBDDEngine.HostSupported: Boolean;
  58. begin
  59. Result:=True;
  60. end;
  61. function TSQLDBDDEngine.SQLDataTypeToFieldType(const SQLDataType: string
  62. ): TFieldType;
  63. begin
  64. // ANSI standard types
  65. case SQLDataType of
  66. 'char' : Result := ftFixedChar;
  67. 'varchar' : Result := ftString;
  68. 'smallint': Result := ftSmallint;
  69. 'int',
  70. 'integer' : Result := ftInteger;
  71. 'bigint' : Result := ftLargeInt;
  72. 'float' : Result := ftFloat;
  73. 'date' : Result := ftDate;
  74. 'time' : Result := ftTime;
  75. 'datetime': Result := ftDateTime;
  76. else Result := ftUnknown;
  77. end;
  78. end;
  79. function TSQLDBDDEngine.CreateSQLQuery(ADatasetOwner: TComponent): TSQLQuery;
  80. begin
  81. Result:=TSQLQuery.Create(ADatasetOwner);
  82. Result.DataBase:=FConn;
  83. Result.Transaction:=FConn.TRansaction;
  84. end;
  85. procedure TSQLDBDDEngine.Disconnect;
  86. begin
  87. FreeAndNil(FConn);
  88. FConnectString:='';
  89. FConnected:=False;
  90. end;
  91. function TSQLDBDDEngine.Connect(const AConnectString: String): Boolean;
  92. Var
  93. L : TStringList;
  94. begin
  95. FConn:=CreateConnection(AConnectString);
  96. FConn.Transaction:=TSQLTransaction.Create(FConn);
  97. L:=TStringList.Create;
  98. Try
  99. L.CommaText:=AConnectString;
  100. If HostSupported then
  101. FConn.HostName:=L.Values[KeyHostName];
  102. FConn.DatabaseName:=L.Values[KeyDatabaseName];
  103. FConn.UserName:=L.Values[KeyUserName];
  104. FConn.Password:=XorDecode(KeyEncode,L.Values[KeyPassword]);
  105. FConn.LoginPrompt:=False;
  106. FConn.Connected:=True;
  107. FConn.CharSet:=L.Values[KeyCharset];
  108. FConnected:=True;
  109. FConnectString:=AConnectString;
  110. Result:=True;
  111. Finally
  112. L.Free;
  113. end;
  114. end;
  115. function TSQLDBDDEngine.GetTableList(List: TStrings): Integer;
  116. begin
  117. FConn.GetTableNames(List,False);
  118. result := list.count;
  119. end;
  120. Function TSQLDBDDEngine.GetObjectList(ASchemaType: TSchemaType; AList : TSqlObjectIdentifierList): Integer;
  121. begin
  122. Result := FConn.GetObjectNames(ASchemaType, AList);
  123. end;
  124. function TSQLDBDDEngine.ImportFields(Table: TDDTableDef): Integer;
  125. Const
  126. SQL = 'SELECT * FROM %s WHERE (1=0)';
  127. Var
  128. Q : TSQLQuery;
  129. begin
  130. Q:=CreateSQLQuery(Nil);
  131. try
  132. Q.Sql.Text:=Format(SQL,[Table.TableName]);
  133. Q.Open;
  134. try
  135. Result:=Table.ImportFromDataset(Q);
  136. finally
  137. Q.CLose;
  138. end;
  139. finally
  140. Q.Free;
  141. end;
  142. end;
  143. function TSQLDBDDEngine.ImportIndexes(Table: TDDTableDef): Integer;
  144. begin
  145. end;
  146. function TSQLDBDDEngine.ViewTable(const TableName: String;
  147. DatasetOwner: TComponent): TDataset;
  148. Var
  149. Q : TSQLQuery;
  150. begin
  151. Q:=CreateSQLQuery(DatasetOwner);
  152. Q.SQL.Text:='SELECT * FROM '+TableName;
  153. Result:=Q;
  154. end;
  155. function TSQLDBDDEngine.RunQuery(SQL: String): Integer;
  156. begin
  157. Result:=RunQuery(SQL,Nil)
  158. end;
  159. function TSQLDBDDEngine.RunQuery(SQL: String; Params: TParams): Integer;
  160. Var
  161. Q : TSQLQuery;
  162. begin
  163. Q:=CreateSQLQuery(Nil);
  164. Try
  165. Q.SQL.Text:=SQL;
  166. ApplyParams(Q,Params);
  167. Q.ExecSQL;
  168. Result:=0;
  169. Finally
  170. Q.Free;
  171. end;
  172. end;
  173. procedure TSQLDBDDEngine.ApplyParams(DS: TDataset; Params: TParams);
  174. begin
  175. if DS is TSQLQuery then
  176. TSQLQuery(DS).Params.Assign(Params);
  177. end;
  178. function TSQLDBDDEngine.CreateQuery(SQL: String; DatasetOwner: TComponent
  179. ): TDataset;
  180. Var
  181. Q : TSQLQuery;
  182. begin
  183. Q:=CreateSQLQuery(Nil);
  184. Result:=Q;
  185. Q.SQL.Text:=SQL;
  186. Q.Open;
  187. end;
  188. procedure TSQLDBDDEngine.SetQueryStatement(SQL: String; AQuery: TDataset);
  189. begin
  190. If Not (AQuery is TSQLQuery) then
  191. Raise EDataDict.CreateFmt(SErrQueryNotSQLQuery,[AQuery.ClassName]);
  192. (AQuery as TSQLQuery).SQL.Text:=SQL;
  193. end;
  194. function TSQLDBDDEngine.GetTableIndexDefs(ATableName: String; Defs: TDDIndexDefs
  195. ): integer;
  196. Var
  197. Q : TSQLQuery;
  198. begin
  199. Q:=TSQLQuery.Create(Self);
  200. Try
  201. Q.Database:=FConn;
  202. Q.Transaction:=FConn.Transaction;
  203. Q.SQL.text:=Format('SELECT * FROM %s WHERE (1=2)',[ATableName]);
  204. Q.ReadOnly:=False;
  205. Q.Prepare;
  206. Q.ServerIndexDefs.Update;
  207. IndexDefsToDDIndexDefs(Q.ServerIndexDefs,Defs);
  208. Result:=Defs.Count;
  209. finally
  210. Q.Free;
  211. end;
  212. end;
  213. class function TSQLDBDDEngine.EngineCapabilities: TFPDDEngineCapabilities;
  214. begin
  215. Result:=[ecImport, ecViewTable, ecRunQuery, ecTableIndexes, ecRowsAffected];
  216. end;
  217. end.