X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXLogPrint.pm;h=326d564e9d2207c524aa2a02522801c185edda91;hb=b9dffeff7239952814342dad19db3a51def6fab7;hp=54cfc516b2173a2ea850ff3b585d4976df25eaaf;hpb=b0f75ae15722922dc8f341a2de79106326ff7575;p=spider.git diff --git a/perl/DXLogPrint.pm b/perl/DXLogPrint.pm index 54cfc516..326d564e 100644 --- a/perl/DXLogPrint.pm +++ b/perl/DXLogPrint.pm @@ -8,16 +8,19 @@ package DXLog; -use FileHandle; +use IO::File; use DXVars; -use DXDebug (); +use DXDebug qw(dbg isdbg); use DXUtil; use DXLog; use Julian; -use Carp; +use RingBuf; use strict; +use vars qw($maxmonths); +$maxmonths = 36; + # # print some items from the log backwards in time # @@ -25,53 +28,75 @@ use strict; # sub print { - my $self = $DXLog::log; - my $from = shift; - my $to = shift; - my @date = $self->unixtoj(shift); + my $fcb = $DXLog::log; + my $from = shift || 0; + my $to = shift || 10; + my $jdate = $fcb->unixtoj(shift); my $pattern = shift; + my $who = uc shift; my $search; my @in; - my @out; + my @out = (); my $eval; - my $count; + my $tot = $from + $to; + my $hint = ""; - $search = $pattern ? "\$ref->[1] =~ /$pattern/" : '1' ; - $eval = qq( - my \$c; - my \$ref; - for (\$c = \$#in; \$c >= 0; \$c--) { - \$ref = \$in[\$c]; - if ($search) { - \$count++; - next if \$count < $from; - push \@out, print_item(\$ref); - last LOOP if \$count >= \$to; # stop after n - } - } - ); + if ($pattern) { + $hint = "m{\\Q$pattern\\E}i"; + } else { + $hint = "!m{\\^(?:ann|rcmd|talk|chat)\\^}"; + } + if ($who) { + $hint .= ' && ' if $hint; + $hint .= 'm{\\Q$who\\E}i'; + } + $hint = "next unless $hint" if $hint; + $hint .= ";next unless /^\\d+\\^$pattern\\^/" if $pattern; + $hint ||= ""; + + $eval = qq(while (<\$fh>) { + $hint; + chomp; + \$ring->write(\$_); + } ); - $self->close; # close any open files + if (isdbg('search')) { + dbg("sh/log hint: $hint"); + dbg("sh/log eval: $eval"); + } + + $fcb->close; # close any open files + + my $months; + my $fh = $fcb->open($jdate); + L1: for ($months = 0; $months < $maxmonths && @in < $tot; $months++) { + my $ref; + my $ring = RingBuf->new($tot); - my $fh = $self->open(@date); -LOOP: - while ($count < $to) { - my @spots = (); if ($fh) { - while (<$fh>) { - chomp; - push @in, [ split '\^' ]; - } + my @tmp; eval $eval; # do the search on this file - return ("Spot search error", $@) if $@; + return ("Log search error", $@) if $@; + + @in = ($ring->readall, @in); + last L1 if @in >= $tot; } - $fh = $self->openprev(); # get the next file + + $fh = $fcb->openprev(); # get the next file last if !$fh; } - + + @in = splice @in, -$tot, $tot if @in > $tot; + + for (@in) { + my @line = split /\^/ ; + push @out, print_item(\@line); + + } return @out; } + # # the standard log printing interpreting routine. # @@ -85,22 +110,27 @@ LOOP: sub print_item { my $r = shift; - my @ref = @$r; - my $d = atime($ref[0]); + my $d = atime($r->[0]); my $s = 'undef'; - if ($ref[1] eq 'rcmd') { - if ($ref[2] eq 'in') { - $s = "$ref[4] (priv: $ref[3]) rcmd: $ref[5]"; + if ($r->[1] eq 'rcmd') { + if ($r->[2] eq 'in') { + $r->[5] ||= ""; + $s = "$r->[4] (priv: $r->[3]) rcmd: $r->[5]"; } else { - $s = "$ref[3] reply: $ref[4]"; + $r->[4] ||= ""; + $s = "$r->[3] reply: $r->[4]"; } - } elsif ($ref[1] eq 'talk') { - $s = "$ref[3] -> $ref[2] ($ref[4]) $ref[5]"; - } elsif ($ref[1] eq 'ann') { - $s = "$ref[3] -> $ref[2] $ref[4]"; + } elsif ($r->[1] eq 'talk') { + $r->[5] ||= ""; + $s = "$r->[3] -> $r->[2] ($r->[4]) $r->[5]"; + } elsif ($r->[1] eq 'ann' || $r->[1] eq 'chat') { + $r->[4] ||= ""; + $r->[4] =~ s/^\#\d+ //; + $s = "$r->[3] -> $r->[2] $r->[4]"; } else { - $s = "$ref[2]"; + $r->[2] ||= ""; + $s = "$r->[2]"; } return "$d $s"; }