123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2007 by Michael Van Canneyt, member of the
- Free Pascal development team
- SQLDB Data Dictionary Engine common Implementation.
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- unit FPDDSQLDB;
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, SysUtils, DB, sqltypes, sqldb, fpdatadict;
- Type
- { TSQLDBDDEngine }
- TSQLDBDDEngine = Class(TFPDDEngine)
- Private
- FConn: TSQLConnection;
- Protected
- Function SQLDataTypeToFieldType(const SQLDataType: string) : TFieldType; virtual;
- Function CreateConnection(AConnectString : String) : TSQLConnection; virtual; abstract;
- Function CreateSQLQuery(ADatasetOwner: TComponent) : TSQLQuery;
- Property Connection : TSQLConnection Read FConn;
- Public
- Procedure Disconnect ; override;
- Function HostSupported: Boolean; virtual;
- Function Connect(const AConnectString : String) : Boolean; override;
- Function GetTableList(List : TStrings) : Integer; override;
- Function GetObjectList(ASchemaType: TSchemaType; AList : TSqlObjectIdentifierList): Integer; override;
- Function ImportFields(Table : TDDTableDef) : Integer; override;
- Function ImportIndexes(Table : TDDTableDef) : Integer; override;
- Function ViewTable(Const TableName: String; DatasetOwner : TComponent) : TDataset; override;
- Function RunQuery(SQL : String) : Integer; override; overload;
- Function RunQuery(SQL : String; Params : TParams) : Integer; override; overload;
- Procedure ApplyParams(DS : TDataset; Params : TParams); virtual;
- Function CreateQuery(SQL : String; DatasetOwner : TComponent) : TDataset; override;
- Procedure SetQueryStatement(SQL : String; AQuery : TDataset); override;
- Function GetTableIndexDefs(ATableName : String; Defs : TDDIndexDefs) : integer ; override;
- Class function EngineCapabilities : TFPDDEngineCapabilities; override;
- end;
- Const
- // used in connectionstring
- KeyHostName = 'Host';
- KeyDatabaseName = 'Database';
- KeyUserName = 'User';
- KeyPassword = 'Password';
- KeyEncode = 'Trivial';
- KeyCharset = 'Charset';
- implementation
- uses strutils;
- Resourcestring
- SErrQueryNotSQLQuery = 'Query object "%s" is not a SQL Query';
-
- { TSQLDBDDEngine }
- function TSQLDBDDEngine.HostSupported: Boolean;
- begin
- Result:=True;
- end;
- function TSQLDBDDEngine.SQLDataTypeToFieldType(const SQLDataType: string
- ): TFieldType;
- begin
- // ANSI standard types
- case SQLDataType of
- 'char' : Result := ftFixedChar;
- 'varchar' : Result := ftString;
- 'smallint': Result := ftSmallint;
- 'int',
- 'integer' : Result := ftInteger;
- 'bigint' : Result := ftLargeInt;
- 'float' : Result := ftFloat;
- 'date' : Result := ftDate;
- 'time' : Result := ftTime;
- 'datetime': Result := ftDateTime;
- else Result := ftUnknown;
- end;
- end;
- function TSQLDBDDEngine.CreateSQLQuery(ADatasetOwner: TComponent): TSQLQuery;
- begin
- Result:=TSQLQuery.Create(ADatasetOwner);
- Result.DataBase:=FConn;
- Result.Transaction:=FConn.TRansaction;
- end;
- procedure TSQLDBDDEngine.Disconnect;
- begin
- FreeAndNil(FConn);
- FConnectString:='';
- FConnected:=False;
- end;
- function TSQLDBDDEngine.Connect(const AConnectString: String): Boolean;
- Var
- L : TStringList;
-
- begin
- FConn:=CreateConnection(AConnectString);
- FConn.Transaction:=TSQLTransaction.Create(FConn);
- L:=TStringList.Create;
- Try
- L.CommaText:=AConnectString;
- If HostSupported then
- FConn.HostName:=L.Values[KeyHostName];
- FConn.DatabaseName:=L.Values[KeyDatabaseName];
- FConn.UserName:=L.Values[KeyUserName];
- FConn.Password:=XorDecode(KeyEncode,L.Values[KeyPassword]);
- FConn.LoginPrompt:=False;
- FConn.Connected:=True;
- FConn.CharSet:=L.Values[KeyCharset];
- FConnected:=True;
- FConnectString:=AConnectString;
- Result:=True;
- Finally
- L.Free;
- end;
- end;
- function TSQLDBDDEngine.GetTableList(List: TStrings): Integer;
- begin
- FConn.GetTableNames(List,False);
- result := list.count;
- end;
- Function TSQLDBDDEngine.GetObjectList(ASchemaType: TSchemaType; AList : TSqlObjectIdentifierList): Integer;
- begin
- Result := FConn.GetObjectNames(ASchemaType, AList);
- end;
- function TSQLDBDDEngine.ImportFields(Table: TDDTableDef): Integer;
- Const
- SQL = 'SELECT * FROM %s WHERE (1=0)';
- Var
- Q : TSQLQuery;
- begin
- Q:=CreateSQLQuery(Nil);
- try
- Q.Sql.Text:=Format(SQL,[Table.TableName]);
- Q.Open;
- try
- Result:=Table.ImportFromDataset(Q);
- finally
- Q.CLose;
- end;
- finally
- Q.Free;
- end;
- end;
- function TSQLDBDDEngine.ImportIndexes(Table: TDDTableDef): Integer;
- begin
- end;
- function TSQLDBDDEngine.ViewTable(const TableName: String;
- DatasetOwner: TComponent): TDataset;
-
- Var
- Q : TSQLQuery;
-
- begin
- Q:=CreateSQLQuery(DatasetOwner);
- Q.SQL.Text:='SELECT * FROM '+TableName;
- Result:=Q;
- end;
- function TSQLDBDDEngine.RunQuery(SQL: String): Integer;
- begin
- Result:=RunQuery(SQL,Nil)
- end;
- function TSQLDBDDEngine.RunQuery(SQL: String; Params: TParams): Integer;
- Var
- Q : TSQLQuery;
- begin
- Q:=CreateSQLQuery(Nil);
- Try
- Q.SQL.Text:=SQL;
- ApplyParams(Q,Params);
- Q.ExecSQL;
- Result:=0;
- Finally
- Q.Free;
- end;
- end;
- procedure TSQLDBDDEngine.ApplyParams(DS: TDataset; Params: TParams);
- begin
- if DS is TSQLQuery then
- TSQLQuery(DS).Params.Assign(Params);
- end;
- function TSQLDBDDEngine.CreateQuery(SQL: String; DatasetOwner: TComponent
- ): TDataset;
- Var
- Q : TSQLQuery;
- begin
- Q:=CreateSQLQuery(Nil);
- Result:=Q;
- Q.SQL.Text:=SQL;
- Q.Open;
- end;
- procedure TSQLDBDDEngine.SetQueryStatement(SQL: String; AQuery: TDataset);
- begin
- If Not (AQuery is TSQLQuery) then
- Raise EDataDict.CreateFmt(SErrQueryNotSQLQuery,[AQuery.ClassName]);
- (AQuery as TSQLQuery).SQL.Text:=SQL;
- end;
- function TSQLDBDDEngine.GetTableIndexDefs(ATableName: String; Defs: TDDIndexDefs
- ): integer;
-
- Var
- Q : TSQLQuery;
-
- begin
- Q:=TSQLQuery.Create(Self);
- Try
- Q.Database:=FConn;
- Q.Transaction:=FConn.Transaction;
- Q.SQL.text:=Format('SELECT * FROM %s WHERE (1=2)',[ATableName]);
- Q.ReadOnly:=False;
- Q.Prepare;
- Q.ServerIndexDefs.Update;
- IndexDefsToDDIndexDefs(Q.ServerIndexDefs,Defs);
- Result:=Defs.Count;
- finally
- Q.Free;
- end;
- end;
- class function TSQLDBDDEngine.EngineCapabilities: TFPDDEngineCapabilities;
- begin
- Result:=[ecImport, ecViewTable, ecRunQuery, ecTableIndexes, ecRowsAffected];
- end;
- end.
|