multi-target Z39.50 searches -- just supply an array for all of username, password...
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Sun, 16 Dec 2007 01:47:04 +0000 (01:47 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Sun, 16 Dec 2007 01:47:04 +0000 (01:47 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@8221 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/perlmods/OpenILS/Application/Search/Z3950.pm
Open-ILS/src/perlmods/OpenILS/Utils/ZClient.pm

index 23e220d..fb26e4f 100755 (executable)
@@ -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
 
index 54e4930..6fa48a5 100644 (file)
@@ -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;