__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
$$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");
}
$host, $port,
databaseName => $db,
user => $username,
- async => $async,
password => $password,
+ async => $async,
preferredRecordSyntax => $output,
);
$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;
# -------------------------------------------------------------------
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
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;
}
}
- return ZOOM::event([map { ($_->{result}) } @$list]);
+ return ZOOM::event([map { ($_->{connection}) } @$list]);
}
*{__PACKAGE__ . '::search_pqf'} = \&search;
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();
}
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;