From: mike Date: Fri, 7 Apr 2006 12:29:12 +0000 (+0000) Subject: New X-Git-Tag: cpan_1_22~206 X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=commitdiff_plain;h=eceb5689d643589b7c833c5cf018cebec556e810;hp=32187e3628d827500ba3e433d78282b366f7566f;p=ZOOM-Perl-moved-to-github.git New --- diff --git a/samples/net-z3950-zoom/async.pl b/samples/net-z3950-zoom/async.pl new file mode 100644 index 0000000..b9b8516 --- /dev/null +++ b/samples/net-z3950-zoom/async.pl @@ -0,0 +1,97 @@ +# $Id: async.pl,v 1.1 2006-04-07 12:29:12 mike Exp $ +# +# See ../README for a description of this program. +# perl -I../../blib/lib -I../../blib/arch zoomtst3.pl [...] + +use strict; +use warnings; +use Net::Z3950::ZOOM; + +if (@ARGV < 2) { + print STDERR "Usage: $0 target1 target2 ... targetN query\n"; + print STDERR " eg. $0 bagel.indexdata.dk/gils localhost:9999 fish\n"; + exit 1; +} + +my $n = @ARGV-1; +my(@z, @r); # connections, result sets +my $o = Net::Z3950::ZOOM::options_create(); +Net::Z3950::ZOOM::options_set($o, async => 1); + +# Get first 10 records of result set (using piggyback) +Net::Z3950::ZOOM::options_set($o, count => 10); + +# Preferred record syntax +Net::Z3950::ZOOM::options_set($o, preferredRecordSyntax => "usmarc"); +Net::Z3950::ZOOM::options_set($o, elementSetName => "B"); + +# Connect to all targets: options are the same for all of them +for (my $i = 0; $i < $n; $i++) { + $z[$i] = Net::Z3950::ZOOM::connection_create($o); + Net::Z3950::ZOOM::connection_connect($z[$i], $ARGV[$i], 0); +} + +# Search all +for (my $i = 0; $i < $n; $i++) { + $r[$i] = Net::Z3950::ZOOM::connection_search_pqf($z[$i], $ARGV[-1]); +} + +# Network I/O. Pass number of connections and array of connections +my $nremaining = $n; +AGAIN: +my $i; +while (($i = Net::Z3950::ZOOM::event(\@z)) != 0) { + my $ev = Net::Z3950::ZOOM::connection_last_event($z[$i-1]); + print("connection ", $i-1, ": event $ev (", + Net::Z3950::ZOOM::event_str($ev), ")\n"); + last if $ev == Net::Z3950::ZOOM::EVENT_END; +} + +if ($i != 0) { + # Not the end of the whole loop; one server is ready to display + $i--; + my($error, $errmsg, $addinfo) = (undef, "dummy", "dummy"); + my $tname = $ARGV[$i]; + + # Display errors if any + $error = Net::Z3950::ZOOM::connection_error($z[$i], $errmsg, $addinfo); + if ($error) { + print STDERR "$tname error: $errmsg ($error) $addinfo\n"; + goto MAYBE_AGAIN; + } + + # OK, no major errors. Look at the result count + my $size = Net::Z3950::ZOOM::resultset_size($r[$i]); + print "$tname: $size hits\n"; + + # Go through all records at target + $size = 10 if $size > 10; + for (my $pos = 0; $pos < $size; $pos++) { + my $len = 0; # length of buffer rec + print "$tname: fetching ", $pos+1, " of $size\n"; + my $tmp = Net::Z3950::ZOOM::resultset_record($r[$i], $pos); + if (!defined $tmp) { + print "$tname: can't get record ", $pos+1, "\n"; + next; + } + my $rec = Net::Z3950::ZOOM::record_get($tmp, "render", $len); + if (!defined $rec) { + print "$tname: can't render record ", $pos+1, "\n"; + next; + } + print $pos+1, "\n", $rec, "\n"; + } +} + +MAYBE_AGAIN: +if (--$nremaining > 0) { + goto AGAIN; +} + +# Housekeeping +for (my $i = 0; $i < $n; $i++) { + Net::Z3950::ZOOM::resultset_destroy($r[$i]); + Net::Z3950::ZOOM::connection_destroy($z[$i]); +} + +Net::Z3950::ZOOM::options_destroy($o);