LMS-2_ReportAPI/cgi_daemon.pas
2025-07-02 12:34:35 +03:00

140 lines
3.0 KiB
ObjectPascal

unit cgi_daemon;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, DaemonApp, ConnectionsDmUnit,eventlog;
type
TLMSReportCGI=class;
{ TDaemonThread }
TDaemonThread=class(TThread)
fOwner: TLMSReportCGI;
fData: TConnectionsDM;
fLogger: TEventLog;
procedure Execute;override;
function sleepMin(n: integer): boolean;
constructor Create(AOwner: TLMSReportCGI);
function CheckTerminated(Sender: TObject): boolean;
end;
{ TLMSReportCGI }
TLMSReportCGI = class(TDaemon)
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
procedure DataModuleStart(Sender: TCustomDaemon; var OK: Boolean);
procedure DataModuleStop(Sender: TCustomDaemon; var OK: Boolean);
private
workThread: TDaemonThread;
public
end;
var
LMSReportCGI: TLMSReportCGI;
implementation
uses
LazLogger, extTypes;
procedure RegisterDaemon;
begin
RegisterDaemonClass(TLMSReportCGI)
end;
{$R *.lfm}
{ TLMSReportCGI }
procedure TLMSReportCGI.DataModuleCreate(Sender: TObject);
begin
self.Logger.Active:=false;
{$IFDEF WINDOWS}
self.Logger.AppendContent:=true;
self.Logger.LogType := ltFile;
self.Logger.FileName := format('%s/server.log',[extractfilepath(paramstr(0))]);
{$ELSE}
self.Logger.LogType := ltSystem;
{$ENDIF}
self.logger.Identification:='LMS-Report-Service';
self.Logger.Active:=true;
if Definition<>nil then
try
self.logger.Info(format('Daemon(%d) %s/%s {%s} (%s)',[Definition.ID, Definition.Name,Definition.DisplayName,Definition.Description,Definition.RunArguments]));
except on e: Exception do
self.logger.Error('DataModuleCreate '+e.Message);
end;
workThread := TDaemonThread.create(self);
end;
procedure TLMSReportCGI.DataModuleDestroy(Sender: TObject);
begin
workthread.free;
end;
procedure TLMSReportCGI.DataModuleStart(Sender: TCustomDaemon; var OK: Boolean);
begin
logger.Info('Запуск сервиса '+version);
workThread.Start;
OK := true;
end;
procedure TLMSReportCGI.DataModuleStop(Sender: TCustomDaemon; var OK: Boolean);
begin
logger.Info('Останов сервиса '+version);
workThread.Terminate;
workThread.WaitFor;
end;
{ TDaemonThread }
procedure TDaemonThread.Execute;
begin
fData := TConnectionsDM.CreateWithLog(fLogger);
try
flogger.Debug('TDaemonThread.Execute.1');
fData.Start(@CheckTerminated);
flogger.Debug('TDaemonThread.Execute.Started');
while not terminated do
begin
if sleepMin(5) then
fData.Idle(self);
end;
fData.Stop;
finally
fData.free;
end;
end;
function TDaemonThread.sleepMin(n: integer): boolean;
var
i: integer;
begin
for i := 1 to n*60 do
begin
if terminated then break
else sleep(1000);
end;
result := not terminated;
end;
constructor TDaemonThread.Create(AOwner: TLMSReportCGI);
begin
inherited Create(true);
fOwner:=AOwner;
fLogger:=AOwner.Logger;
end;
function TDaemonThread.CheckTerminated(Sender: TObject): boolean;
begin
result := terminated;
end;
initialization
RegisterDaemon;
end.