From 3a746b76facec4064537f142ccbcdd9e400c45ad Mon Sep 17 00:00:00 2001 From: michael Date: Thu, 25 Jun 2015 17:32:53 +0000 Subject: [PATCH] * Example to demonstrate how to create sql git-svn-id: trunk@31154 - --- .gitattributes | 2 + packages/fcl-db/examples/createsql.lpi | 63 ++++++++ packages/fcl-db/examples/createsql.pas | 203 +++++++++++++++++++++++++ 3 files changed, 268 insertions(+) create mode 100644 packages/fcl-db/examples/createsql.lpi create mode 100644 packages/fcl-db/examples/createsql.pas diff --git a/.gitattributes b/.gitattributes index cff1a24600..2214bc2b60 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2057,6 +2057,8 @@ packages/fcl-base/texts/fptemplate.txt svneol=native#text/plain packages/fcl-db/Makefile svneol=native#text/plain packages/fcl-db/Makefile.fpc svneol=native#text/plain packages/fcl-db/Makefile.fpc.fpcmake svneol=native#text/plain +packages/fcl-db/examples/createsql.lpi svneol=native#text/plain +packages/fcl-db/examples/createsql.pas svneol=native#text/plain packages/fcl-db/examples/dbftool.lpi svneol=native#text/plain packages/fcl-db/examples/dbftool.lpr svneol=native#text/plain packages/fcl-db/examples/fbadmindemo.pp svneol=native#text/plain diff --git a/packages/fcl-db/examples/createsql.lpi b/packages/fcl-db/examples/createsql.lpi new file mode 100644 index 0000000000..aefb4b1178 --- /dev/null +++ b/packages/fcl-db/examples/createsql.lpi @@ -0,0 +1,63 @@ + + + + + + + + + + + + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <i18n> + <EnableI18N LFM="False"/> + </i18n> + <VersionInfo> + <StringTable ProductVersion=""/> + </VersionInfo> + <BuildModes Count="1"> + <Item1 Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + </PublishOptions> + <RunParams> + <local> + <FormatVersion Value="1"/> + </local> + </RunParams> + <Units Count="1"> + <Unit0> + <Filename Value="createsql.pas"/> + <IsPartOfProject Value="True"/> + </Unit0> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <UseAnsiStrings Value="False"/> + </SyntaxOptions> + </Parsing> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/packages/fcl-db/examples/createsql.pas b/packages/fcl-db/examples/createsql.pas new file mode 100644 index 0000000000..bb6592c58e --- /dev/null +++ b/packages/fcl-db/examples/createsql.pas @@ -0,0 +1,203 @@ +program createsql; + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX}{$IFDEF UseCThreads} + cthreads, + {$ENDIF}{$ENDIF} + typinfo, Classes, SysUtils, CustApp, db, sqldb, fpdatadict, + fpddfb,fpddpq,fpddOracle,fpddsqlite3,fpddmysql40,fpddmysql41,fpddmysql50, fpddodbc, + strutils; + + +type + + { TGenSQLApplication } + + TGenSQLApplication = class(TCustomApplication) + private + function CreateSQLEngine(AType: String): TFPDDSQLEngine; + procedure ConnectToDatabase(const AType, ADatabaseName,AUserName,APassword: String); + procedure DoConvertQuery(const S, T, KF: String; ST: TSTatementType); + protected + FConn : TSQLConnector; + FDD : TFPDataDictionary; + FENG : TFPDDSQLEngine; + procedure DoRun; override; + public + constructor Create(TheOwner: TComponent); override; + destructor Destroy; override; + procedure WriteHelp(Const AMsg : string); virtual; + end; + +{ TGenSQLApplication } + +procedure TGenSQLApplication.ConnectToDatabase(Const AType,ADatabaseName,AUSerName,APassword : String); +begin + FConn:=TSQLConnector.Create(Self); + FConn.ConnectorType:=AType; + FConn.DatabaseName:=ADatabaseName; + FConn.UserName:=AUserName; + FConn.Password:=APassword; + FConn.Transaction:=TSQLTransaction.Create(Self); + FConn.Connected:=True; + FDD:=TFPDataDictionary.Create; + FENG:=CreateSQLEngine(AType); +end; + +Function TGenSQLApplication.CreateSQLEngine(AType : String): TFPDDSQLEngine; + +begin + Case lowercase(AType) of + 'firebird' : Result:=TFPDDFBSQLEngine.Create; + else + Result:=TFPDDSQLEngine.Create; + end; +end; + +procedure TGenSQLApplication.DoConvertQuery(Const S,T,KF : String; ST : TSTatementType); + +Var + Q : TSQLQuery; + TD : TDDTableDef; + Fields,KeyFields : TFPDDFieldList; + I : Integer; + F : TDDFieldDef; + FN,SQL : String; + +begin + TD:=FDD.Tables.AddTable(T); + Q:=TSQLQuery.Create(Self); + try + Q.Database:=FConn; + Q.Transaction:=FConn.Transaction; + Q.SQL.Text:=S; + Q.Open; + TD.ImportFromDataset(Q); + finally + Q.Free; + end; + if (KF<>'') then + begin + KeyFields:=TFPDDFieldList.Create(False); + For I:=1 to WordCount(KF,[',']) do + begin + FN:=ExtractWord(I,KF,[',']); + F:=TD.Fields.FieldByName(FN); + if (F=nil) then + Writeln('Warning: Field ',FN,' does not exist.') + else + KeyFields.Add(F); + end; + end; + Fields:=TFPDDFieldList.CreateFromTableDef(TD); + try + FEng.TableDef:=TD; + Case ST of + stDDL : SQL:=FEng.CreateCreateSQL(KeyFields); + stSelect : SQL:=FEng.CreateSelectSQL(Fields,KeyFields); + stInsert : SQL:=FEng.CreateInsertSQL(Fields); + stUpdate : SQL:=FEng.CreateUpdateSQL(Fields,KeyFields); + stDelete : SQL:=FEng.CreateDeleteSQL(KeyFields); + end; + Writeln(SQL); + finally + KeyFields.Free; + end; +end; +procedure TGenSQLApplication.DoRun; + +var + ErrorMsg: String; + S,T,KF : String; + I : Integer; + ST : TStatementType; + +begin + + // quick check parameters + ErrorMsg:=CheckOptions('hc:d:s:t:y:k:u:p:', 'help connection-type: database: sql: table: type: keyfields: user: password:'); + if ErrorMsg<>'' then + WriteHelp(ErrorMsg); + if HasOption('h', 'help') then + WriteHelp(''); + S:=GetOptionValue('c','connection-type'); + T:=GetOptionValue('d','database'); + if (S='') or (t='') then + Writehelp('Need database and connectiontype'); + ConnectToDatabase(S,T,GetOptionValue('u','user'),GetOptionValue('p','password')); + S:=GetOptionValue('s','sql'); + T:=GetOptionValue('t','table'); + if (t='') then + Writehelp('Need table name'); + i:=GetEnumValue(TypeInfo(TStatementType),'st'+GetOptionValue('y','type')); + if I=-1 then + Writehelp(Format('Unknown statement type : %s',[GetOptionValue('y','type')])); + ST:=TStatementType(i); + KF:=GetOptionValue('k','keyfields'); + if (KF='') and (st in [stselect, stupdate, stdelete]) then + Writehelp('Need key fields for delete, select and update'); + if (S='') then + S:='SELECT * FROM '+T+' WHERE 0=1'; + DoConvertQuery(S,T,KF,ST); + // stop program loop + Terminate; +end; + +constructor TGenSQLApplication.Create(TheOwner: TComponent); +begin + inherited Create(TheOwner); + StopOnException:=True; +end; + +destructor TGenSQLApplication.Destroy; +begin + FreeAndNil(FConn); + FreeAndNil(FDD); + FreeAndNil(FENG); + inherited Destroy; +end; + +procedure TGenSQLApplication.WriteHelp(Const AMsg : string); + +Var + S : String; + L : TStrings; +begin + if AMsg<>'' then + Writeln('Error : ',AMsg); + Writeln('Usage: ', ExeName, ' [options]'); + Writeln('Where options is one or more of:'); + Writeln('-h --help this help message'); + Writeln('-c --connection-type=ctype Set connection type (required)' ); + Writeln('-d --database=db database connection name (required)'); + Writeln('-s --sql=sql SQL to execute (optional)'); + Writeln('-t --table=tablename tablename to use for statement (required)'); + Writeln('-y --type=stype Statement type (required) one of ddl, select, insert, update, delete)'); + Writeln('-k --keyfields=fields Comma-separated list of key fields (required for delete, update, optional for select,ddl)'); + Writeln('-u --user=username User name to connect to database'); + Writeln('-p --password=password Password of user to connect to database with'); + Writeln('Where ctype is one of : '); + L:=TStringList.Create; + try + GetConnectionList(L); + for S in L do + Writeln(' ',lowercase(S)); + + finally + L.Free; + end; + + Halt(Ord(AMsg<>'')); +end; + +var + Application: TGenSQLApplication; +begin + Application:=TGenSQLApplication.Create(nil); + Application.Title:='Generate SQL Demo'; + Application.Run; + Application.Free; +end. +