program dbadd; {$mode objfpc} {$H+} {$modeswitch typehelpers} uses Classes, SysUtils, CustApp, tsdb, tsutils, inifiles; type TValueType = (vtCategory,vtCPU,vtOS,vtVersion); { TDigestValueApplication } TDigestValueApplication = class(TCustomApplication) private procedure ConnectToDB; function ProcessParams: boolean; protected FDB : TTestSQL; FDatabaseName : String; FHostName : String; FUserName : string; FPassword : string; FPort : Word; FType : TValueType; FValue : String; FDate : TDateTime; procedure DoRun; override; function ReadConfig(const aFileName: String): boolean; public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; procedure Usage(const aMsg : String); end; const ValueNames : Array[TValueType] of string = ('Category','CPU','OS','Version'); { TDigestValueApplication } function TDigestValueApplication.ProcessParams : boolean; function GetDate(S : String) : TDateTime; var Y,M,d : Integer; begin if (s='') then exit(Date); Y:=StrToIntDef(Copy(S,1,4),0); M:=StrToIntDef(Copy(S,5,2),0); D:=StrToIntDef(Copy(S,7,2),0); if (Y>0) and (M>0) and (D>0) then if not TryEncodeDate(Y,M,D,Result) then Result:=0 end; begin if not ReadConfig(GetOptionValue('c','config')) then Exit(False); Case LowerCase(GetOptionValue('t','type')) of 'category' : FType:=vtCategory; 'cpu' : FType:=vtCPU; 'os' : FType:=vtOS; 'version' : FType:=vtVersion; else Usage('Unknown value type : '+GetOptionValue('t','type')); Exit(False); end; FValue:=GetOptionValue('v','value'); FDate:=GetDate(GetOptionValue('d','date')); if FDate=0 then begin Usage('Invalid date : '+GetOptionValue('d','date')); Exit(False); end; if FValue='' then begin Usage('Empty value is not allowed'); Exit(False); end; Result:=True; end; procedure TDigestValueApplication.ConnectToDB; begin FDB:=TTestSQL.create(FDatabaseName,FHostName,FUserName,FPassword,FPort); if not FDB.ConnectToDatabase then Writeln('Failed to connect to database'); end; procedure TDigestValueApplication.DoRun; var ErrorMsg: String; lID : Integer; begin Terminate; // quick check parameters ErrorMsg:=CheckOptions('hc:t:v:d:', ['help','type:','value:','date:','config:']); if (ErrorMsg<>'') or HasOption('h', 'help') then begin Usage(ErrorMsg); Exit; end; if not ProcessParams then exit; ConnectToDB; Case FType of vtCPU : lID:=FDB.AddCPU(FValue); vtOS : lID:=FDB.AddOS(FValue); vtCategory : lID:=FDB.AddCategory(FValue); vtVersion: lID:=FDB.AddVersion(FValue,FDate); end; Writeln('Inserted ',ValueNames[FType],' "',FValue,'" with ID: ',lID); end; function TDigestValueApplication.ReadConfig(const aFileName: String) : boolean; var lFileName : string; Ini : TCustomIniFile; begin lFilename:=aFileName; if lFileName='' then lFileName:='/etc/dbdigest.ini'; Ini:=TMemIniFile.Create(lFileName); With Ini do try FDatabaseName:=ReadString(SSection,KeyName,'testsuite'); FHostName:=ReadString(SSection,KeyHost,'localhost'); FUserName:=ReadString(SSection,KeyUser,''); FPassword:=ReadString(SSection,KeyPassword,''); FPort:=ReadInteger(SSection,KeyPort,0); finally Free; end; Result:=False; if FDatabaseName='' then Usage('Database name not set') else if (FHostName='') then Usage('Database hostname not set') else if (FUserName='') then Usage('Database username not set') else if (FPassword='') then Usage('Database user password not set') else Result:=True; end; constructor TDigestValueApplication.Create(TheOwner: TComponent); begin inherited Create(TheOwner); StopOnException:=True; end; destructor TDigestValueApplication.Destroy; begin FreeAndNil(FDB); inherited Destroy; end; procedure TDigestValueApplication.Usage(const aMsg: String); begin if aMsg<>'' then Writeln('Error: ',aMsg); writeln('Usage: ', ExeName, '[options]'); Writeln('Where options is one or more of:'); Writeln('-d --date=YYYYMMDD Date for version. If omitted, today is used'); Writeln('-c --config=FILE Config file with database connection info (.ini file).'); Writeln('-h --help This message'); Writeln('-t --type=ATYPE Type of value to insert in db. This is one of:'); Writeln(' category'); Writeln(' cpu'); Writeln(' os'); Writeln(' version'); Writeln('-v --value=VALUE Value to insert in database'); Writeln(''); Writeln('If -h is not specified, options -c -t -v are required.'); Writeln('Config file is an .ini file with the following keys:'); Writeln('[Database]'); Writeln('Name=name'); Writeln('Host=hostname'); Writeln('UserName=user'); Writeln('Password=pwd'); Writeln('Port=1234'); ExitCode:=Ord(aMsg<>''); end; var Application: TDigestValueApplication; begin Application:=TDigestValueApplication.Create(nil); Application.Title:='Digest add value Application'; Application.Run; Application.Free; end.