Added initial support for polling
This commit is contained in:
parent
1aaf0beb2b
commit
1cfe8ec420
92
UApp.pas
92
UApp.pas
|
@ -109,7 +109,10 @@ begin
|
||||||
if HasOption('html') then
|
if HasOption('html') then
|
||||||
FWriter.Add(THTMLWriter.Create(GetOptionValue('html')));
|
FWriter.Add(THTMLWriter.Create(GetOptionValue('html')));
|
||||||
|
|
||||||
DumpFile(FLogFileName);
|
if HasOption('poll') then
|
||||||
|
PollFile(FLogFileName)
|
||||||
|
else
|
||||||
|
DumpFile(FLogFileName);
|
||||||
|
|
||||||
// One run is enough.
|
// One run is enough.
|
||||||
Terminate;
|
Terminate;
|
||||||
|
@ -243,8 +246,95 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TLogFilterApplication.PollFile(AFileName: String);
|
procedure TLogFilterApplication.PollFile(AFileName: String);
|
||||||
|
const
|
||||||
|
BUFSIZE = 8192;
|
||||||
|
var
|
||||||
|
f: File of char;
|
||||||
|
b: array[0..BUFSIZE-1] of Char;
|
||||||
|
lastSize, currentSize: Int64;
|
||||||
|
bufPos, bufMax, read, checkStart: Word;
|
||||||
|
breakPos, breakLen: Word;
|
||||||
|
pos: Int64;
|
||||||
|
s: String;
|
||||||
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
|
AssignFile(f, AFileName);
|
||||||
|
Reset(f);
|
||||||
|
bufPos := 0;
|
||||||
|
bufMax := 0;
|
||||||
|
lastSize := 0;
|
||||||
|
while true do
|
||||||
|
begin
|
||||||
|
currentSize := FileSize(f);
|
||||||
|
if currentSize > lastSize then
|
||||||
|
begin
|
||||||
|
pos := FilePos(f);
|
||||||
|
breakPos := 0;
|
||||||
|
while (pos < currentSize) or (breakPos > 0) do
|
||||||
|
begin
|
||||||
|
breakPos := 0;
|
||||||
|
breakLen := 0;
|
||||||
|
|
||||||
|
BlockRead(f, b[bufMax], Min(BUFSIZE-bufMax, currentSize-pos), read);
|
||||||
|
Inc(pos, read);
|
||||||
|
Inc(bufMax, read);
|
||||||
|
|
||||||
|
if bufMax = 0 then
|
||||||
|
Continue;
|
||||||
|
|
||||||
|
if bufPos > 0 then
|
||||||
|
checkStart := bufPos - 1 //we could miss a #13 in a #13#10
|
||||||
|
else
|
||||||
|
checkStart := bufPos;
|
||||||
|
|
||||||
|
for i := checkStart to bufMax do
|
||||||
|
begin
|
||||||
|
if b[i] = #10 then
|
||||||
|
begin
|
||||||
|
breakPos := i + 1;
|
||||||
|
breakLen := 1;
|
||||||
|
end
|
||||||
|
else if (b[i] = #13) and (i < bufMax) and (b[i+1] = #10) then
|
||||||
|
begin
|
||||||
|
breakPos := i + 2;
|
||||||
|
breakLen := 2;
|
||||||
|
end
|
||||||
|
else if b[i] = #13 then
|
||||||
|
begin
|
||||||
|
breakPos := i + 1;
|
||||||
|
breakLen := 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if breakPos > 0 then
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if breakPos > 0 then
|
||||||
|
begin
|
||||||
|
SetLength(s, breakPos - breakLen); //We don't want the actual line break
|
||||||
|
Move(b[0], s[1], breakPos - breakLen);
|
||||||
|
FilterLine(s);
|
||||||
|
Move(b[breakPos], b[0], bufMax - breakPos);
|
||||||
|
bufPos := 0;
|
||||||
|
Dec(bufMax, breakPos);
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
bufPos := bufMax;
|
||||||
|
if bufPos = BUFSIZE then // Nothing we can do here; we need to dump
|
||||||
|
begin
|
||||||
|
SetLength(s, BUFSIZE);
|
||||||
|
Move(b[0], s[1], BUFSIZE);
|
||||||
|
FilterLine(s);
|
||||||
|
bufPos := 0;
|
||||||
|
bufMax := 0;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
lastSize := currentSize;
|
||||||
|
end;
|
||||||
|
Sleep(100);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TLogFilterApplication.Create(TheOwner: TComponent);
|
constructor TLogFilterApplication.Create(TheOwner: TComponent);
|
||||||
|
|
Loading…
Reference in New Issue