X-Git-Url: http://git.indexdata.com/?p=irspy-moved-to-github.git;a=blobdiff_plain;f=lib%2FZOOM%2FPod.pm;h=a428619199a62ea8339ad687fdfe1a14916b5bd4;hp=8844ce700e6152e7b0d5fc1fc1abde956fc8ea1a;hb=4ef60552e7fdc908b71ed74a7a484958a748cbfe;hpb=2febd2313b62a31b2720240ab8a430476e213748 diff --git a/lib/ZOOM/Pod.pm b/lib/ZOOM/Pod.pm index 8844ce7..a428619 100644 --- a/lib/ZOOM/Pod.pm +++ b/lib/ZOOM/Pod.pm @@ -1,4 +1,4 @@ -# $Id: Pod.pm,v 1.2 2006-05-09 12:03:37 mike Exp $ +# $Id: Pod.pm,v 1.5 2006-05-10 16:01:04 mike Exp $ package ZOOM::Pod; @@ -7,39 +7,83 @@ use warnings; use ZOOM; +BEGIN { + # Just register the name + ZOOM::Log::mask_str("pod"); + ZOOM::Log::mask_str("pod_unhandled"); +} + +=head1 NAME + +ZOOM::Pod - Perl extension for handling pods of concurrent ZOOM connections + =head1 SYNOPSIS - $conn1 = new ZOOM::Connection("bagel.indexdata.com/gils"); - $conn2 = new ZOOM::Connection("z3950.loc.gov:7090/Voyager"); - $pod = new ZOOM::Pod($conn1, $conn2); - $pod->callback(ZOOM::Event::RECV_SEARCH, \&show_result); - $pod->search_pqf("mineral"); - $pod->wait(); + use ZOOM::Pod; + + $pod = new ZOOM::Pod("bagel.indexdata.com/gils", + "bagel.indexdata.com/marc"); + $pod->callback(ZOOM::Event::RECV_SEARCH, \&completed_search); + $pod->callback(ZOOM::Event::RECV_RECORD, \&got_record); + $pod->search_pqf("the"); + $err = $pod->wait(); + die "$pod->wait() failed with error $err" if $err; + + sub completed_search { + ($conn, undef, $rs) = @_; + print $conn->option("host"), ": found ", $rs->size(), " records\n"; + $rs->records(0, 1, 0); # Queues a request for the record + return 0; + } - sub show_result { - ($conn, $rs, $event) = @_; - print "$conn: found ", $rs->size(), " records\n"; + sub got_record { + ($conn, undef, $rs) = @_; + $rec = $rs->record(0); + print $conn->option("host"), ": got $rec = '", $rec->render(), "'\n"; + return 0; } +=head1 DESCRIPTION + +I<###> + +=head1 METHODS + =cut sub new { my $class = shift(); my(@conn) = @_; + die "$class with no connections" if @conn == 0; + my @state; # Hashrefs with application state associated with connections foreach my $conn (@conn) { if (!ref $conn) { $conn = new ZOOM::Connection($conn, 0, async => 1); + # The $conn object is always made, even if no there's no + # server. Such errors are caught later, by the _check() + # call in wait(). } + push @state, {}; } return bless { conn => \@conn, + state => \@state, rs => [], callback => {}, }, $class; } +sub option { + my $this = shift(); + my($key, $value) = @_; + + foreach my $conn (@{ $this->{conn} }) { + $conn->option($key, $value); + } +} + sub callback { my $this = shift(); my($event, $sub) = @_; @@ -67,11 +111,27 @@ sub wait { while ((my $i = ZOOM::event($this->{conn})) != 0) { my $conn = $this->{conn}->[$i-1]; my $ev = $conn->last_event(); - print("connection ", $i-1, ": ", ZOOM::event_str($ev), "\n"); + my $evstr = ZOOM::event_str($ev); + ZOOM::Log::log("pod", "connection ", $i-1, ": $evstr"); + + eval { + $conn->_check(); + }; if ($@) { + my $sub = $this->{callback}->{exception}; + die $@ if !defined $sub; + $res = &$sub($conn, $this->{state}->[$i-1], + $this->{rs}->[$i-1], $@); + last if $res != 0; + next; + } + my $sub = $this->{callback}->{$ev}; if (defined $sub) { - $res = &$sub($conn, $this->{rs}->[$i-1], $ev); + $res = &$sub($conn, $this->{state}->[$i-1], + $this->{rs}->[$i-1], $ev); last if $res != 0; + } else { + ZOOM::Log::log("pod_unhandled", "unhandled event $ev ($evstr)"); } } @@ -79,4 +139,27 @@ sub wait { } +=head1 SEE ALSO + +The underlying +C +module (part of the +C +distribution). + +=head1 AUTHOR + +Mike Taylor, Emike@indexdata.comE + +=head1 COPYRIGHT AND LICENCE + +Copyright (C) 2006 by Index Data. + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.4 or, +at your option, any later version of Perl 5 you may have available. + +=cut + + 1;