-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBase.Service.pas
More file actions
172 lines (131 loc) · 3.83 KB
/
Base.Service.pas
File metadata and controls
172 lines (131 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
unit Base.Service;
{$WARN IMPLICIT_STRING_CAST OFF}
{$WARN IMPLICIT_STRING_CAST_LOSS OFF}
interface
uses
System.SysUtils,
WinApi.Windows,
SynCommons,
SynTable,
SynCrypto,
SynLog,
mORMot,
mORMotHTTPServer,
mORMotService,
Base.RestServer,
Base.SQLConnectionProp;
type
TBaseWinService = class(TServiceSingle)
private
fLogFolder: TFileName;
protected
function GetLogFolder: TFileName;
public
procedure DoStart(Sender: TService); virtual;
procedure DoStop(Sender: TService); virtual;
constructor Create(const aServiceName, aDisplayName: String); reintroduce;
constructor CreateAsConsole; reintroduce;
destructor Destroy; override;
class procedure WriteHelpContent;
property LogFolder: TFileName read GetLogFolder;
end;
TBaseWinHttpService = class(TBaseWinService)
private
public
HttpServer: TSQLHttpServer;
procedure DoStart(Sender: TService); override;
procedure DoStop(Sender: TService); override;
end;
TBaseWinHttpSQLService = class(TBaseWinHttpService)
public
SQLClient: TSQLDBConnectionProp;
procedure DoStop(Sender: TService); override;
end;
TBaseWinHttpJWTRestService = class(TBaseWinHttpSQLService)
public
RestServer: TBaseJWTRestServer;
end;
implementation
{ TBaseWinService }
constructor TBaseWinService.Create(const aServiceName, aDisplayName: String);
begin
inherited Create(aServiceName, aDisplayName);
OnStart := {$ifdef FPC}@{$endif}DoStart;
OnStop := {$ifdef FPC}@{$endif}DoStop;
OnResume := {$ifdef FPC}@{$endif}DoStart; // trivial Pause/Resume actions
OnPause := {$ifdef FPC}@{$endif}DoStop;
end;
constructor TBaseWinService.CreateAsConsole;
begin
// manual switch to console mode
AllocConsole;
end;
destructor TBaseWinService.Destroy;
begin
inherited Destroy;
end;
procedure TBaseWinService.DoStart(Sender: TService);
const
LogLevel: TSynLogInfos =
{$ifdef DEBUG} [sllDebug, sllTrace, sllError, sllLastError, sllException, sllExceptionOS, sllMemory, sllStackTrace, sllFail, sllClient, sllServer, sllServiceCall, sllServiceReturn, sllDDDError]
{$else} [sllError, sllLastError, sllException, sllExceptionOS, sllFail, sllDDDError]
{$endif};
begin
ServiceLog := TSQLLog; // explicitely enable logging
ServiceLog.Family.Level := LogLevel;
// define the log level
with TSQLLog.Family do begin
DestinationPath := LogFolder;
Level := LogLevel;
PerThreadLog := ptIdentifiedInOnFile;
end;
if Sender = nil then
TSQLLog.Family.EchoToConsole := LOG_STACKTRACE;
TSQLLog.Enter(self);
end;
procedure TBaseWinService.DoStop(Sender: TService);
begin
TSQLLog.Add.Log(sllInfo,'Service stopped.')
end;
function TBaseWinService.GetLogFolder: TFileName;
begin
if fLogFolder = '' then begin
fLogFolder := ExeVersion.ProgramFilePath + 'logs\' + ExeVersion.ProgramName;
fLogFolder := IncludeTrailingPathDelimiter(fLogFolder);
ForceDirectories(fLogFolder);
end;
Result := fLogFolder;
end;
class procedure TBaseWinService.WriteHelpContent;
begin
WriteLn('To install your service please type /install');
WriteLn('To uninstall your service please type /uninstall');
WriteLn('To start your service please type /start');
WriteLn('To stop your service please type /stop');
WriteLn('');
WriteLn('For help please type /? or /h');
end;
{ TBaseWinHttpService }
procedure TBaseWinHttpService.DoStart(Sender: TService);
begin
inherited;
if HttpServer <> nil then DoStop(nil); // should never happen
end;
procedure TBaseWinHttpService.DoStop(Sender: TService);
begin
if HttpServer = nil then Exit;
inherited;
end;
{ TBaseWinHttpSQLService }
procedure TBaseWinHttpSQLService.DoStop(Sender: TService);
begin
if Assigned(SQLClient) then
try
if SQLClient.Connected then
SQLClient.Disconnect;
finally
FreeAndNil(SQLClient);
end;
inherited;
end;
end.