Hello,
I want to log in a file in a Delphi application all the sql events (queries and executions).
How can I do this without modifying hundreds of query objects?
Downloading the MySql query log is not an option.
Thank you!
Var
MyLocalQuery : TMyQuery;
begin
...
MyLocalQuery := TMyQuery.Create(nil);
MyLocalQuery.Connection := MyConnection;
MyLocalQuery.Sql.text := MyParameter;
and here
either MyLocalQuery.Execute; or MyLocalQuery.Open; depending if it's a DDL or query
unit Unit2;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils;
type
TBaseQueryExecutor = class abstract
private
_query: TMyQuery;
_connection: TMyConnection;
public
constructor Create(query: TMyQuery);
protected
procedure Execute;
end;
implementation
constructor TBaseQueryExecutor.Create(query: TMyQuery)
begin
_connection := TMyConnection.Create();
_query := query; // get the query from child class
_query.Connection = _connection;
end;
procedure TBaseQueryExecutor.Execute()
begin
// log _query.Sql.Text to a file or whatever
// query execution logic here
end;
end.
unit Unit3;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils;
type
TCustomQuery = class(TBaseQueryExecutor)
public
constructor Create();
end;
implementation
constructor TCustomQuery.Create()
var
_query: TMyQuery;
begin
_query := TMyQuery.Create(nil);
// set up all parameters needed
inherited(_query);
end;
end.
MyLocalQuery := TMyQuery.Create(nil); MyLocalQuery.Connection := MyConnection; MyLocalQuery.Sql.text := MyParameter;
MyLocalQuery.Open;
MyLocalQuery := TCustomQuery .Create(nil);
MyLocalQuery.Connection := MyConnection;
MyLocalQuery.Sql.text := MyParameter;
MyLocalQuery.Open;
Thank you!
Var
MyLocalQuery : TMyQuery
After having developed your TBaseQueryExecutor and TCustomQuery classes at my site, how should I change the existing TMyQuery declarations? Those different units they "wouldn't even know" of the existence of TCustomQuery class.
Edit: You could perhaps use the template method pattern in this situation which will be the base class for any query and will execute the query, inside the execution method you could write to a log the sql query that is being carried.