#!/usr/bin/perl -w
# $Id: multiplex.pl,v 1.6 2005/01/05 16:24:53 mike Exp $
use Net::Z3950;
use strict;
# Feel free to modify @servers and @searches
my @servers = (
['Z3950cat.bl.uk', 9909, "BLAC"],
['bagel.indexdata.dk', 210, "gils"],
['z3950.loc.gov', 7090, "Voyager"],
);
my @searches = ('computer', 'data', 'survey', 'mineral');
my %conn2si; # Indicates, for each connection, how
# far through @searches it has got.
my $mgr = new Net::Z3950::Manager(async => 1,
preferredRecordSyntax => "usmarc");
my @conn;
foreach my $spec (@servers) {
my($host, $port, $dbname) = @$spec;
my $conn = new Net::Z3950::Connection($mgr, $host, $port, \&done_init,
databaseName => $dbname)
or die "can't connect to $host:$port: $!";
#print "> got $conn, added it to $mgr\n";
}
#$Event::DebugLevel = 5;
$mgr->wait();
print "Finished.\n";
use Errno qw(ECONNREFUSED);
if ($! == ECONNREFUSED) {
### At present, a single connection failing to connect makes the
# whole concurrent session end. Need to consider the interface.
print "(Possible premature exit due to $!)\n";
}
sub done_init {
my($conn, $apdu) = @_;
print $conn->name(), " - done init\n";
$conn2si{$conn} = 0;
$conn->startSearch($searches[0], \&done_search);
}
sub done_search {
my($conn, $apdu) = @_;
my $si = $conn2si{$conn};
my $rs = $conn->resultSet();
if (!defined $rs) {
print $conn->name(), " - search failed: ", $conn->errmsg(), "\n";
} else {
print $conn->name(), " - search ", $si+1,
" found ", $rs->size(), " records\n";
}
my $search = $searches[++$conn2si{$conn}];
if (defined $search) {
$conn->startSearch($search, \&done_search);
} else {
print $conn->name(), " finished!\n";
$conn->close();
}
}