From b301ab79187f189dc69c31c9e7b0cd6199663431 Mon Sep 17 00:00:00 2001 From: miker Date: Sun, 16 Dec 2007 01:47:04 +0000 Subject: [PATCH] multi-target Z39.50 searches -- just supply an array for all of username, password and service git-svn-id: svn://svn.open-ils.org/ILS/trunk@8221 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- .../OpenILS/Application/Search/Z3950.pm | 40 +++++++++++++------ .../src/perlmods/OpenILS/Utils/ZClient.pm | 31 +++++++------- 2 files changed, 41 insertions(+), 30 deletions(-) diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Search/Z3950.pm b/Open-ILS/src/perlmods/OpenILS/Application/Search/Z3950.pm index 23e220d6d5..fb26e4fe7f 100755 --- a/Open-ILS/src/perlmods/OpenILS/Application/Search/Z3950.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Search/Z3950.pm @@ -27,6 +27,7 @@ my $default_service; __PACKAGE__->register_method( method => 'do_class_search', api_name => 'open-ils.search.z3950.search_class', + stream => 1, signature => q/ Performs a class based Z search. The classes available are defined by the 'attr' fields in the config for the @@ -117,27 +118,40 @@ sub do_class_search { $$args{async} = 1; - $$args{query} = - compile_query('and', $$args{service}, $$args{search}); - + my @connections; my @results; for (my $i = 0; $i < @{$$args{service}}; $i++) { my %tmp_args = %$args; $tmp_args{service} = $$args{service}[$i]; $tmp_args{username} = $$args{username}[$i]; $tmp_args{password} = $$args{password}[$i]; - $results[$i] = $self->do_service_search( $conn, $auth, \%tmp_args ); + + $logger->debug("z3950: service: $tmp_args{service}, async: $tmp_args{async}"); + + $tmp_args{query} = compile_query('and', $tmp_args{service}, $tmp_args{search}); + + my $res = $self->do_service_search( $conn, $auth, \%tmp_args ); + + push @results, $res->{result}; + push @connections, $res->{connection}; + + $logger->debug("z3950: Result object: $results[$i], Connection object: $connections[$i]"); } + $logger->debug("z3950: Connections created"); + my @records; - while ((my $index = OpenILS::Utils::ZClient::event( \@results )) != 0) { - my $ev = $results[$index - 1]->last_event(); - if ($ev == OpenILS::Utils::ZClient::Event::END()) { - my $munged = process_results( $results[$index - 1], ($$args{limit} || 10), ($$args{offset} || 0) ); - $$munged{service} = $$args{service}[$index]; + while ((my $index = OpenILS::Utils::ZClient::event( \@connections )) != 0) { + my $ev = $connections[$index - 1]->last_event(); + $logger->debug("z3950: Received event $ev"); + if ($ev == OpenILS::Utils::ZClient::EVENT_END()) { + my $munged = process_results( $results[$index - 1], $$args{limit}, $$args{offset} ); + $$munged{service} = $$args{service}[$index - 1]; $conn->respond($munged); } } + + $logger->debug("z3950: Search Complete"); } @@ -193,8 +207,8 @@ sub do_search { $host, $port, databaseName => $db, user => $username, - async => $async, password => $password, + async => $async, preferredRecordSyntax => $output, ); @@ -222,7 +236,7 @@ sub do_search { $logger->info("z3950: search [$query] took ".(time - $start)." seconds"); - return $results if ($async); + return {result => $results, connection => $connection} if ($async); my $munged = process_results($results, $limit, $offset); $munged->{query} = $query; @@ -237,8 +251,8 @@ sub do_search { # ------------------------------------------------------------------- sub process_results { my $results = shift; - my $limit = shift; - my $offset = shift; + my $limit = shift || 10; + my $offset = shift || 0; $results->option(elementSetName => "FI"); # full records with no holdings diff --git a/Open-ILS/src/perlmods/OpenILS/Utils/ZClient.pm b/Open-ILS/src/perlmods/OpenILS/Utils/ZClient.pm index 54e4930ff4..6fa48a5cd5 100644 --- a/Open-ILS/src/perlmods/OpenILS/Utils/ZClient.pm +++ b/Open-ILS/src/perlmods/OpenILS/Utils/ZClient.pm @@ -3,6 +3,18 @@ use UNIVERSAL::require; use overload 'bool' => sub { return $_[0]->{connection} ? 1 : 0 }; +sub EVENT_NONE { 0 } +sub EVENT_CONNECT { 1 } +sub EVENT_SEND_DATA { 2 } +sub EVENT_RECV_DATA { 3 } +sub EVENT_TIMEOUT { 4 } +sub EVENT_UNKNOWN { 5 } +sub EVENT_SEND_APDU { 6 } +sub EVENT_RECV_APDU { 7 } +sub EVENT_RECV_RECORD { 8 } +sub EVENT_RECV_SEARCH { 9 } +sub EVENT_END { 10 } + our $conn_class = 'ZOOM::Connection'; our $imp_class = 'ZOOM'; our $AUTOLOAD; @@ -56,7 +68,7 @@ sub event { } } - return ZOOM::event([map { ($_->{result}) } @$list]); + return ZOOM::event([map { ($_->{connection}) } @$list]); } *{__PACKAGE__ . '::search_pqf'} = \&search; @@ -100,7 +112,7 @@ sub record { sub last_event { my $self = shift; - return OpenILS::Utils::ZClient::Event::EVENT_END if ($imp_class eq 'Net::Z3950'); + return OpenILS::Utils::ZClient::EVENT_END() if ($imp_class eq 'Net::Z3950'); $self->{result}->last_event(); } @@ -149,20 +161,5 @@ sub AUTOLOAD { return $self->{record}->$method( @_ ); } -#------------------------------------------------------------------------------- -package OpenILS::Utils::ZClient::Event; - -sub NONE { 0 } -sub CONNECT { 1 } -sub SEND_DATA { 2 } -sub RECV_DATA { 3 } -sub TIMEOUT { 4 } -sub UNKNOWN { 5 } -sub SEND_APDU { 6 } -sub RECV_APDU { 7 } -sub RECV_RECORD { 8 } -sub RECV_SEARCH { 9 } -sub END { 10 } - 1; -- 2.43.2