mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-05 11:18:18 +02:00
201 lines
5.1 KiB
ObjectPascal
201 lines
5.1 KiB
ObjectPascal
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.
|
|
|