unit bdeclientdataset;
interface
uses windows, sysutils, variants, classes, db, dbcommon, midas,
sqltimst, dbclient, dblocal, provider, dbtables;
type
{ tbdequery }
tbdequery = class(tquery)
private
fkeyfields: string;
protected
function psgetdefaultorder: tindexdef; override;
end;
{ tbdeclientdataset }
tbdeclientdataset = class(tcustomcacheddataset)
private
fcommandtext: string;
fcurrentcommand: string;
fdataset: tbdequery;
fdatabase: tdatabase;
flocalparams: tparams;
fstreamedactive: boolean;
procedure checkmastersourceactive(mastersource: tdatasource);
procedure setdetailsactive(value: boolean);
function getconnection: tdatabase;
function getdataset: tdataset;
function getmastersource: tdatasource;
function getmasterfields: string;
procedure setconnection(value: tdatabase);
procedure setdatasource(value: tdatasource);
procedure setlocalparams;
procedure setmasterfields(const value: string);
procedure setparamsfromsql(const value: string);
procedure setsql(const value: string);
protected
function getcommandtext: string; override;
procedure loaded; override;
procedure notification(acomponent: tcomponent; operation: toperation); override;
procedure setactive(value: boolean); override;
procedure setcommandtext(value: string); override;
public
constructor create(aowner: tcomponent); override;
destructor destroy; override;
procedure clonecursor(source: tcustomclientdataset; reset: boolean;
keepsettings: boolean = false); override;
procedure getfieldnames(list: tstrings); override;
function getquotechar: string;
property dataset: tdataset read getdataset;
published
property active;
property commandtext: string read getcommandtext write setcommandtext;
property dbconnection: tdatabase read getconnection write setconnection;
property masterfields read getmasterfields write setmasterfields;
property mastersource: tdatasource read getmastersource write setdatasource;
end;
procedure register;
implementation
uses bdeconst, midconst;
type
{ tbdecdsparams }
tbdecdsparams = class(tparams)
private
ffieldname: tstrings;
protected
procedure parseselect(sql: string);
public
constructor create(owner: tpersistent);
destructor destroy; override;
end;
constructor tbdecdsparams.create(owner: tpersistent);
begin
inherited;
ffieldname := tstringlist.create;
end;
destructor tbdecdsparams.destroy;
begin
freeandnil(ffieldname);
inherited;
end;
procedure tbdecdsparams.parseselect(sql: string);
const
sselect = 'select';
var
fwherefound: boolean;
start: pchar;
fname, value: string;
sqltoken, cursection, lasttoken: tsqltoken;
params: integer;
begin
if pos(' ' + sselect + ' ', lowercase(string(pchar(sql)+8))) > 1 then exit; // can't parse sub queries
start := pchar(parsesql(pchar(sql), true));
cursection := stunknown;
lasttoken := stunknown;
fwherefound := false;
params := 0;
repeat
repeat
sqltoken := nextsqltoken(start, fname, cursection);
if sqltoken in [stwhere] then
begin
fwherefound := true;
lasttoken := stwhere;
end else if sqltoken in [sttablename] then
begin
{ check for owner qualified table name }
if start^ = '.' then
nextsqltoken(start, fname, cursection);
end else