unit SVReplikationUnit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
DB, ADODB, ExtCtrls, Registry, StrUtils;
type
TReplikator =
class(TService)
tm: TSpecialTimer;
acABC: TADOConnection;
acBN: TADOConnection;
qryBN: TADOQuery;
qryABC: TADOQuery;
qryBNMaxUhrzeit: TADOQuery;
qryABCMaxUhrzeit: TADOQuery;
procedure ServiceCreate(Sender: TObject);
procedure ServiceExecute(Sender: TService);
procedure tmTimer(Sender: TObject);
procedure ServiceStart(Sender: TService;
var Started: Boolean);
procedure ServicePause(Sender: TService;
var Paused: Boolean);
procedure ServiceStop(Sender: TService;
var Stopped: Boolean);
procedure ServiceContinue(Sender: TService;
var Continued: Boolean);
procedure ServiceShutdown(Sender: TService);
procedure ServiceBeforeInstall(Sender: TService);
procedure ServiceAfterUninstall(Sender: TService);
private
{ Private-Deklarationen }
public
function GetServiceController: TServiceController;
override;
{ Public-Deklarationen }
bShutDownOrStopOrPause : Boolean;
end;
var
TReplikatorReplikator: TReplikator;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord);
stdcall;
begin
TReplikatorReplikator.Controller(CtrlCode);
end;
function TReplikator.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TReplikator.ServiceCreate(Sender: TObject);
begin
// ShortDateFormat := 'yyyy-mm-dd'; // Darf nicht gesetzt werden, da auch die Datenbankinhalte übersetzt werden.
ThousandSeparator := '
,';
// Muss gesetzt werden, da die Datenbank Komma erwartet.
DecimalSeparator := '
.';
// Muss gesetzt werden, da die Datenbank Punkt erwartet.
bShutDownOrStopOrPause := False;
end;
procedure TReplikator.ServiceExecute(Sender: TService);
begin
while not Terminated
do ServiceThread.ProcessRequests(True);
end;
procedure TReplikator.tmTimer(Sender: TObject);
Var
i : Integer;
begin
tm.Enabled := False;
// Hier passiert so allerhand, was auch 'ne Weile dauern kann.
For i := 0
to MaxInt
do begin
// Ist der Abbruchschalter gesetzt, dann aufhören.
// if i Mod 100 = 0 then // wenn nicht bei jedem Schleifendurchlauf geprüft werden soll.
if bShutDownOrStopOrPause
then Break;
end;
tm.Enabled := True;
end;
procedure TReplikator.ServiceStart(Sender: TService;
var Started: Boolean);
Var
iOffset : Integer;
begin
tm.Enabled := True;
bShutDownOrStopOrPause := False;
end;
procedure TReplikator.ServicePause(Sender: TService;
var Paused: Boolean);
begin
tm.Enabled := False;
bShutDownOrStopOrPause := True;
end;
procedure TReplikator.ServiceStop(Sender: TService;
var Stopped: Boolean);
begin
tm.Enabled := False;
bShutDownOrStopOrPause := True;
end;
procedure TReplikator.ServiceContinue(Sender: TService;
var Continued: Boolean);
Var
iOffset : Integer;
begin
tm.Enabled := True;
bShutDownOrStopOrPause := False;
end;
procedure TReplikator.ServiceShutdown(Sender: TService);
begin
tm.Enabled := False;
bShutDownOrStopOrPause := True;
end;
// Messagefile registrieren
procedure TReplikator.ServiceBeforeInstall(Sender: TService);
Var
Reg : TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
Reg.OpenKey('
system\CurrentControlSet\Services\EventLog\Application\' + Self.
Name,True);
Reg.WriteString('
EventMessageFile',ParamStr(0));
Reg.WriteInteger('
TypesSupported',7);
Reg.CloseKey;
Reg.OpenKey('
system\CurrentControlSet\Services\TReplikator\' + Self.
Name,True);
Reg.WriteString('
Description','
Repliziert die Daten zwischen den Datenbanken ABC und BN');
Reg.CloseKey;
Reg.Free;
end;
// Messagefile aus Registrierung entfernen
procedure TReplikator.ServiceAfterUninstall(Sender: TService);
Var
Reg : TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
Reg.DeleteKey('
system\CurrentControlSet\Services\EventLog\Application\' + Self.
Name);
Reg.DeleteKey('
system\CurrentControlSet\Services\TReplikatorReplikator\' + Self.
Name);
Reg.CloseKey;
Reg.Free;
end;
end.