
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5438 8e941d3f-bd1b-0410-a28a-d453659cc2b4
233 lines
6.1 KiB
ObjectPascal
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.
|