X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fgdx.pl;fp=perl%2Fgdx.pl;h=c3e22364f79062fff340640990aefe5347c5b350;hb=8f37c2e3e59d7224783b0843de41362b2056675b;hp=759af1352353668cb1ab282fb8c1c183b89a246d;hpb=c5a10d832b209422912b116d0cd87e29238d0843;p=spider.git diff --git a/perl/gdx.pl b/perl/gdx.pl index 759af135..c3e22364 100755 --- a/perl/gdx.pl +++ b/perl/gdx.pl @@ -3,27 +3,29 @@ # grep for expressions in various fields of the dx file # -use IO::File; +# search local then perl directories +BEGIN { + # root of directory tree for this system + $root = "/spider"; + $root = $ENV{'DXSPIDER_ROOT'} if $ENV{'DXSPIDER_ROOT'}; + + unshift @INC, "$root/perl"; # this IS the right way round! + unshift @INC, "$root/local"; +} + +use IO::Handle; use DXUtil; -use DXDebug; use Spot; -# initialise spots file -STDOUT->autoflush(1); - -#print "reading in spot data .."; -#$t = time; -#$count = Spot->init(); -#$t = time - $t; -#print "done ($t secs)\n"; - -dbgadd('spot'); +$dxdir = "/spider/cmd/show"; +$dxcmd = "dx.pl"; +$s = readfilestr($dxdir, $dxcmd); +$dxproc = eval "sub { $s }"; +die $@ if $@; -$field = $ARGV[0]; -$expr = $ARGV[1]; -$time = time; +STDOUT->autoflush(1); +Spot::init(); -#loada(); for (;;) { print "expr: "; $expr = ; @@ -31,106 +33,8 @@ for (;;) { chomp $expr; - print "doing field $field with /$expr/\n"; - -#a(); - b(); -} - -sub b -{ - my @spots; - my @dx; - my $ref; - my $count; - my $i; - - my $t = time; - @spots = Spot::search($expr); - if ($spots[0] eq "error") { - print $spots[1]; - return; - } - foreach $ref (@spots) { - @dx = @$ref; - my $t = ztime($dx[2]); - my $d = cldate($dx[2]); - print "$dx[0] $dx[1] $d $t $dx[4] <$dx[3]>\n"; - ++$count; - } - $t = time - $t; - print "$count records found, $t secs\n"; -} - -sub search -{ - my ($expr, $from, $to) = @_; - my $eval; - my @out; - my @spots; - my $ref; - my $i; - - - $expr =~ s/\$f(\d)/zzzref->[$1]/g; # swap the letter n for the correct field name - $expr =~ s/[\@\$\%\{\}]//g; # remove any other funny characters - $expr =~ s/\&\w+\(//g; # remove subroutine calls - $expr =~ s/eval//g; # remove eval words - $expr =~ s/zzzref/\$ref/g; # put back the $ref - - print "expr = $expr\n"; - - # build up eval to execute - $eval = qq(my \$c; - for (\$c = \$#spots; \$c >= 0; \$c--) { - \$ref = \$spots[\$c]; - if ($expr) { - push(\@out, \$ref); - } - }); - - my @today = Julian::unixtoj(time); - for ($i = 0; $i < 60; ++$i) { - my @now = Julian::sub(@today, $i); - my @spots; - my $fp = Spot->open(@now); - if ($fp) { - my $fh = $fp->{fh}; - my $in; - foreach $in (<$fh>) { - chomp $in; - push @spots, [ split('\^', $in) ]; - } - my $ref; - eval $eval; - return ("error", $@) if $@; - } - } - # execute it - return @out; -} - - -sub loada -{ - while () { - chomp; - my @dx = split /\^/; - next if $time - $dx[2] > (84600 * 60); - unshift @spots, [ @dx ]; - ++$count; - } -} - -sub a -{ - foreach $ref (@spots) { - if ($$ref[$field] =~ /$expr/i) { - my @dx = @$ref; - my $t = ztime($dx[2]); - my $d = cldate($dx[2]); - print "$dx[0] $dx[1] $d $t $dx[4] <$dx[3]>\n"; - } - } + my @out = map {"$_\n"} &$dxproc({priv=>0,call=>'GDX'}, $expr); + shift @out; # remove return code + print @out; }