X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXLogPrint.pm;h=ad0b1970017d639ae60f8e7c2e5aba1e10e2947a;hb=2b58ccdf81685a1167a43c38705a0d84b9d8d661;hp=9c5633e1fbf2d3bb085d8eeec62c4bf267ebd3b5;hpb=f3adc82a0299652d929b73c718127fa38571eec5;p=spider.git diff --git a/perl/DXLogPrint.pm b/perl/DXLogPrint.pm index 9c5633e1..ad0b1970 100644 --- a/perl/DXLogPrint.pm +++ b/perl/DXLogPrint.pm @@ -8,16 +8,21 @@ package DXLog; -use FileHandle; +use IO::File; use DXVars; -use DXDebug (); +#use DXDebug (); use DXUtil; use DXLog; use Julian; -use Carp; use strict; +use vars qw($VERSION $BRANCH); +$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ ); +$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0; +$main::build += $VERSION; +$main::branch += $BRANCH; + # # print some items from the log backwards in time # @@ -25,55 +30,64 @@ 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 || 20; + my $count; + 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 = '1' unless $pattern || $who; - $search = "\$ref->[1] =~ /$pattern/" if $pattern; - $search .= ' && ' if $pattern && $who; - $search .= "(\$ref->[2] =~ /$who/ || \$ref->[3] =~ /$who/)" if $who; + if ($pattern) { + $hint = "m{\\Q$pattern\\E}i"; + } + if ($who) { + if ($hint) { + $hint .= ' && '; + } + $hint .= 'm{\\Q$who\\E}i'; + } + $hint = "next unless $hint" if $hint; + $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 if \$count >= \$to; # stop after n - } - } - ); + \@in = (); + while (<\$fh>) { + $hint; + chomp; + push \@in, \$_; + shift \@in, if \@in > $tot; + } + ); - $self->close; # close any open files + $fcb->close; # close any open files - my $fh = $self->open(@date); - for ($count = 0; $count < $to; ) { - my @spots = (); + my $fh = $fcb->open($jdate); + L1: for ($count = 0; $count < $to; ) { + my $ref; if ($fh) { - while (<$fh>) { - chomp; - push @in, [ split '\^' ]; - } eval $eval; # do the search on this file - last if $count >= $to; # stop after n return ("Log search error", $@) if $@; + my @tmp; + while (@in) { + last L1 if $count >= $to; + my $ref = [ split /\^/, shift @in ]; + next if defined $pattern && $ref->[1] ne $pattern; + push @tmp, print_item($ref); + $count++; + } + @out = (@tmp, @out); } - $fh = $self->openprev(); # get the next file + $fh = $fcb->openprev(); # get the next file last if !$fh; } - return @out if defined @out; + return @out; } #