X-Git-Url: http://git.indexdata.com/?p=irspy-moved-to-github.git;a=blobdiff_plain;f=lib%2FZOOM%2FIRSpy.pm;h=d2a1ad0f9b18bad2a18acb6492cabf24af63408a;hp=5cbd307ba36cea8ae303e80149674ceb669a8231;hb=0ca7a8e129f95070581059266f665e80214ad7ce;hpb=4a195e85272b7b1038d78323f4589f9d91069b78 diff --git a/lib/ZOOM/IRSpy.pm b/lib/ZOOM/IRSpy.pm index 5cbd307..d2a1ad0 100644 --- a/lib/ZOOM/IRSpy.pm +++ b/lib/ZOOM/IRSpy.pm @@ -1,4 +1,4 @@ -# $Id: IRSpy.pm,v 1.47 2006-11-02 13:16:49 mike Exp $ +# $Id: IRSpy.pm,v 1.56 2006-12-21 16:35:11 mike Exp $ package ZOOM::IRSpy; @@ -16,7 +16,8 @@ use Net::Z3950::ZOOM 1.13; # For the ZOOM version-check only use ZOOM::IRSpy::Node; use ZOOM::IRSpy::Connection; use ZOOM::IRSpy::Record; -use ZOOM::IRSpy::Utils; +use ZOOM::IRSpy::Stats; +use ZOOM::IRSpy::Utils qw(cql_target); our @ISA = qw(); our $VERSION = '0.02'; @@ -29,6 +30,7 @@ sub OK { 29 } # No problems, task is still progressing sub TASK_DONE { 18 } # Task is complete, next task should begin sub TEST_GOOD { 8 } # Whole test is complete, and succeeded sub TEST_BAD { 31 } # Whole test is complete, and failed +sub TEST_SKIPPED { 12 } # Test couldn't be run package ZOOM::IRSpy; @@ -40,7 +42,9 @@ ZOOM::IRSpy - Perl extension for discovering and analysing IR services use ZOOM::IRSpy; $spy = new ZOOM::IRSpy("target/string/for/irspy/database"); - print $spy->report_status(); + $spy->targets(@targets); + $spy->initialise(); + $res = $spy->check("Main"); =head1 DESCRIPTION @@ -71,6 +75,10 @@ sub new { or die "$0: can't connection to IRSpy database 'dbname'"; my $xslt = new XML::LibXSLT; + + $xslt->register_function($ZOOM::IRSpy::Utils::IRSPY_NS, 'strcmp', + \&ZOOM::IRSpy::Utils::xslt_strcmp); + my $libxml = new XML::LibXML; my $xsl_doc = $libxml->parse_file($irspy_to_zeerex_xsl); my $irspy_to_zeerex_style = $xslt->parse_stylesheet($xsl_doc); @@ -116,7 +124,7 @@ sub targets { $this->log("irspy_debug", "rewriting '$target' to '$newtarget'"); $target = $newtarget; # This is written through the ref } - push @qlist, (qq[(host="$host" and port="$port" and path="$db")]); + push @qlist, cql_target($host, $port, $db); } $this->{targets} = \@targets; @@ -240,8 +248,22 @@ sub _render_record { sub _irspy_to_zeerex { my ($this, $conn) = @_; my $irspy_doc = $conn->record()->{zeerex}->ownerDocument; + my $save_xml = 0; + + if ($save_xml) { + unlink('/tmp/irspy_orig.xml'); + open FH, '>/tmp/irspy_orig.xml'; + print FH $irspy_doc->toString(); + close FH; + } my %params = (); my $result = $this->{irspy_to_zeerex_style}->transform($irspy_doc, %params); + if ($save_xml) { + unlink('/tmp/irspy_transformed.xml'); + open FH, '>/tmp/irspy_transformed.xml'; + print FH $result->toString(); + close FH; + } return $result->documentElement(); } @@ -319,6 +341,8 @@ sub check { my @conn = @{ $this->{connections} }; + my $nruns = 0; + ROUND_AND_ROUND_WE_GO: while (1) { my @copy_conn = @conn; # avoid alias problems after splice() my $nconn = scalar(@copy_conn); @@ -447,6 +471,13 @@ sub check { $nskipped += $n; } } + + } elsif ($res == ZOOM::IRSpy::Status::TEST_SKIPPED) { + $conn->log("irspy_test", "test skipped during task $task"); + $conn->current_task(0); + $conn->next_task(0); + # I think that's all we need to do + } else { die "unknown callback return-value '$res'"; } @@ -454,26 +485,52 @@ sub check { $this->log("irspy", "exiting main loop"); # Sanity checks: none of the following should ever happen + my $finished = 1; foreach my $conn (@{ $this->{connections} }) { my $test = $conn->option("current_test_address"); my $next = $this->_next_test($test); if (defined $next) { - warn "$conn (in test '$test') has queued test '$next'"; + $this->log("irspy", "$conn (in test '$test') has queued test '$next'"); + $finished = 0; } if (my $task = $conn->current_task()) { - warn "$conn still has an active task $task"; + $this->log("irspy", "$conn still has an active task $task"); + $finished = 0; } if (my $task = $conn->next_task()) { - warn "$conn still has a queued task $task"; + $this->log("irspy", "$conn still has a queued task $task"); + $finished = 0; } if (!$conn->is_idle()) { - warn "$conn is not idle (still has ZOOM-C level tasks queued)"; + $this->log("irspy", "$conn still has ZOOM-C level tasks queued: see below"); + $finished = 0; } if (!$conn->option("rewrote_record")) { - warn "$conn did not rewrite its ZeeRex record"; + $this->log("irspy", "$conn did not rewrite its ZeeRex record"); + $finished = 0; } } + # This really shouldn't be necessary, but it's belt and braces + if (!$finished) { + if (++$nruns < 10) { + $this->log("irspy", "back into main loop, ${nruns}th time"); + goto ROUND_AND_ROUND_WE_GO; + } else { + $this->log("irspy", "bailing after $nruns main-loop runs"); + } + } + + # This shouldn't happen emit anything either: + @conn = @{ $this->{connections} }; + while (my $i1 = ZOOM::event(\@conn)) { + my $conn = $conn[$i1-1]; + my $ev = $conn->last_event(); + my $evstr = ZOOM::event_str($ev); + warn "$conn still has ZOOM-C level task queued: $ev ($evstr)" + if $ev != ZOOM::Event::ZEND; + } + return $nskipped; } @@ -548,8 +605,8 @@ sub _last_sibling_test { my $maybe = $this->_next_sibling_test($address); last if !defined $maybe; $nskipped++; - $this->log("irspy", "skipping $nskipped tests to '$address'"); $address = $maybe; + $this->log("irspy", "skipping $nskipped tests to '$address'"); } return ($address, $nskipped);