From 4f6f85dd8b0a2b2a9123408d78d346dfb039cecd Mon Sep 17 00:00:00 2001 From: Mike Taylor Date: Tue, 9 May 2006 16:21:37 +0000 Subject: [PATCH] Super-groovy asynchronicity, baby! --- test-pod.pl | 59 +++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/test-pod.pl b/test-pod.pl index 5270aa5..3eb8535 100644 --- a/test-pod.pl +++ b/test-pod.pl @@ -1,9 +1,9 @@ #!/usr/bin/perl -w -# $Id: test-pod.pl,v 1.2 2006-05-09 12:09:44 mike Exp $ +# $Id: test-pod.pl,v 1.3 2006-05-09 16:21:37 mike Exp $ # # Run like this: -# ZOOM_RECORD_NO_FORCE_SYNC=1 perl -I lib test-pod.pl +# ZOOM_RECORD_NO_FORCE_SYNC=1 YAZ_LOG=pod perl -I lib test-pod.pl # (at least until the default sync. behaviour of ZOOM-C changes.) use strict; @@ -12,28 +12,59 @@ use warnings; use ZOOM::Pod; my $pod = new ZOOM::Pod("bagel.indexdata.com/gils", - "z3950.loc.gov:7090/Voyager", - "localhost:9999", + "bagel.indexdata.com/marc", + #"z3950.loc.gov:7090/Voyager", + #"localhost:9999", ); +$pod->option(elementSetName => "b"); $pod->callback(ZOOM::Event::RECV_SEARCH, \&completed_search); $pod->callback(ZOOM::Event::RECV_RECORD, \&got_record); -$pod->search_pqf("mineral"); +$pod->search_pqf("the"); my $err = $pod->wait(); -print "failed with error $err" if $err; +die "$pod->wait() failed with error $err" if $err; sub completed_search { - my($conn, $rs, $event) = @_; + my($conn, $state, $rs, $event) = @_; print $conn->option("host"), ": found ", $rs->size(), " records\n"; - my $rec = $rs->record(0); - print($conn->option("host"), ": rec(0) is ", - defined $rec ? ("$rec = '", $rec->render(), "'") : "undefined", - "\n"); + $state->{next_to_fetch} = 0; + $state->{next_to_show} = 0; + request_record($conn, $rs, $state); return 0; } sub got_record { - my($conn, $rs, $event) = @_; - my $rec = $rs->record(0); - print $conn->option("host"), ": got 0: $rec = '", $rec->render(), "'\n"; + my($conn, $state, $rs, $event) = @_; + + { + # Sanity-checking assertions. These should be impossible + my $ns = $state->{next_to_show}; + my $nf = $state->{next_to_fetch}; + if ($ns > $nf) { + die "next_to_show > next_to_fetch ($ns > $nf)"; + } elsif ($ns == $nf) { + die "next_to_show == next_to_fetch ($ns)"; + } + } + + my $i = $state->{next_to_show}++; + my $rec = $rs->record($i); + print $conn->option("host"), ": record $i is ", render_record($rec), "\n"; + request_record($conn, $rs, $state); return 0; } + +sub request_record { + my($conn, $rs, $state) = @_; + + my $i = $state->{next_to_fetch}++; + my $rec = $rs->record($i); + print($conn->option("host"), ": pre-fetch: record $i is ", + render_record($rec), "\n"); +} + +sub render_record { + my($rec) = @_; + + return "undefined" if !defined $rec; + return "'" . $rec->render() . "'"; +} -- 1.7.10.4