lazarus-ccr/components/flashfiler/sourcelaz/ffsrstat.pas
2016-12-07 13:31:59 +00:00

233 lines
6.1 KiB
ObjectPascal

{*********************************************************}
{* FlashFiler: Server Rebuild status *}
{*********************************************************}
(* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is TurboPower FlashFiler
*
* The Initial Developer of the Original Code is
* TurboPower Software
*
* Portions created by the Initial Developer are Copyright (C) 1996-2002
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* ***** END LICENSE BLOCK ***** *)
{$I ffdefine.inc}
unit ffsrstat;
interface
uses
Windows,
SysUtils,
Classes,
ffconst,
ffllbase,
ffsrbase;
type
TffSrRebuildStatus = class(TffSelfListItem)
protected {private}
rsPadlock : TffPadlock;
rsStatus : TffRebuildStatus;
rsClientID: longint;
protected
public
constructor Create(aClientID : longint; aTotalRecords : longint);
destructor Destroy; override;
procedure GetLastSnapshot(var aRebuildStatus : TffRebuildStatus);
procedure MakeSnapshot(aRecsRead : longint; aRecsWritten : longint; aErrorCode : TffResult);
procedure MarkFinished;
property ClientID : longint read rsClientID;
property RebuildID : longint read KeyAsInt;
end;
TffSrRebuildStatusList = class(TffObject)
protected {private}
FList : TffList;
rslPadlock : TffPadlock;
public
constructor Create;
destructor Destroy; override;
function AddRebuildStatus(aClientID : longint; aTotalRecs : longint) : TffSrRebuildStatus;
procedure DeleteAllForClient(aClientID : longint);
function GetRebuildStatus(aRebuildID : longint;
var aStatus : TffRebuildStatus) : boolean;
procedure MarkRebuildStatusFinished(aRebuildID : longint);
end;
implementation
{===TffSrRebuildStatus===============================================}
constructor TffSrRebuildStatus.Create(aClientID : longint; aTotalRecords : longint);
begin
inherited Create;
rsPadlock := TffPadlock.Create;
rsStatus.rsTotalRecs := aTotalRecords;
rsStatus.rsStartTime := GetTickCount;
rsClientID := aClientID;
end;
{--------}
destructor TffSrRebuildStatus.Destroy;
begin
rsPadlock.Free;
inherited Destroy;
end;
{--------}
procedure TffSrRebuildStatus.GetLastSnapshot(var aRebuildStatus : TffRebuildStatus);
begin
rsPadlock.Lock;
try
aRebuildStatus := rsStatus;
finally
rsPadlock.Unlock;
end;{try..finally}
end;
{--------}
procedure TffSrRebuildStatus.MakeSnapshot(aRecsRead : longint;
aRecsWritten : longint;
aErrorCode : TffResult);
var
Dividend: LongInt;
Divisor: LongInt;
begin
rsPadlock.Lock;
try
with rsStatus do begin
rsRecsRead := aRecsRead;
rsRecsWritten := aRecsWritten;
rsErrorCode := aErrorCode;
rsSnapshotTime := GetTickCount;
if (rsRecsRead >= $1000000) then begin
Dividend := (rsRecsRead shr 7) * 100;
Divisor := rsTotalRecs shr 7;
end
else begin
Dividend := rsRecsRead * 100;
Divisor := rsTotalRecs;
end;
if Divisor <> 0 then
rsPercentDone := Dividend div Divisor;
end;
finally
rsPadlock.Unlock;
end;{try..finally}
end;
{--------}
procedure TffSrRebuildStatus.MarkFinished;
begin
rsStatus.rsFinished := true;
end;
{====================================================================}
{===TffSrRebuildStatusList===========================================}
constructor TffSrRebuildStatusList.Create;
begin
inherited Create;
FList := TffList.Create;
rslPadlock := TffPadlock.Create;
end;
{--------}
destructor TffSrRebuildStatusList.Destroy;
begin
rslPadlock.Free;
FList.Free;
inherited Destroy;
end;
{--------}
function TffSrRebuildStatusList.AddRebuildStatus(aClientID : longint;
aTotalRecs : longint) : TffSrRebuildStatus;
begin
rslPadlock.Lock;
try
Result := TffSrRebuildStatus.Create(aClientID, aTotalRecs);
try
FList.Insert(Result);
except
Result.Free;
raise;
end;{try..except}
finally
rslPadlock.Unlock;
end;{try..finally}
end;
{--------}
procedure TffSrRebuildStatusList.DeleteAllForClient(aClientID : longint);
var
Inx : integer;
TempStat : TffSrRebuildStatus;
begin
rslPadlock.Lock;
try
for Inx := pred(FList.Count) downto 0 do begin
TempStat := TffSrRebuildStatus(FList[Inx]);
if (TempStat.ClientID = aClientID) then
FList.DeleteAt(Inx);
end;
finally
rslPadlock.Unlock;
end;{try..finally}
end;
{--------}
function TffSrRebuildStatusList.GetRebuildStatus(aRebuildID : longint;
var aStatus : TffRebuildStatus) : boolean;
var
Inx : integer;
TempStat : TffSrRebuildStatus;
begin
rslPadlock.Lock;
try
Inx := FLIst.Index(aRebuildID);
if (Inx = -1) then
Result := false
else begin
Result := true;
TempStat := TffSrRebuildStatus(FList[Inx]);
TempStat.GetLastSnapshot(aStatus);
if (aStatus.rsFinished = true) then
FList.DeleteAt(Inx);
end;
finally
rslPadlock.Unlock;
end;{try..finally}
end;
{--------}
procedure TffSrRebuildStatusList.MarkRebuildStatusFinished(aRebuildID : longint);
var
Inx : integer;
TempStat : TffSrRebuildStatus;
begin
rslPadlock.Lock;
try
Inx := FLIst.Index(aRebuildID);
if (Inx <> -1) then begin
TempStat := TffSrRebuildStatus(FList[Inx]);
TempStat.MarkFinished;
end;
finally
rslPadlock.Unlock;
end;{try..finally}
end;
{====================================================================}
end.