# $Id: ScanSet.pm,v 1.1 2004/05/07 16:57:48 mike Exp $ package Net::Z3950::ScanSet; use strict; use warnings; =head1 NAME Net::Z3950::ScanSet - set of terms received in response to a Z39.50 scan =head1 SYNOPSIS $ss = $conn->scan('@attr 1=4 fish'); die $conn->errmsg() if !defined $ss; $size = $ss->size(); for ($i = 0; $i < $size; $i++) { $term = $ss->term($i); $count = $ss->field($i, "freq"); $displayTerm = $ss->field($i, "display"); print "$displayTerm ($count) [$term]\n"; } =head1 DESCRIPTION A ScanSet object represents the set of terms found by a Z39.50 scan. There is no public constructor for this class. ScanSet objects are always created by the Net::Z3950 module itself, and are returned to the caller via the C class's C or C method. =head1 METHODS =cut # PRIVATE to the Net::Z3950::Connection class's _dispatch() method sub _new { my $class = shift(); my($conn, $scanResponse) = @_; if ($scanResponse->scanStatus() == Net::Z3950::ScanStatus::Failure) { my $diag = $scanResponse->diag(); $conn->{errcode} = $diag->condition(); $conn->{addinfo} = $diag->addinfo(); return undef; } return bless { conn => $conn, scanResponse => $scanResponse, }, $class; } sub status { shift()->{scanResponse}->scanStatus() } sub position { shift()->{scanResponse}->positionOfTerm() } sub stepSize { shift()->{scanResponse}->stepSize() } sub size { shift()->{scanResponse}->numberOfEntriesReturned() } sub term { my $this = shift(); my($i) = @_; if ($i < 0 || $i >= $this->size()) { # There is no BIB-1 error for "scan-set index out of range" $this->{errcode} = 100; $this->{addinfo} = "scan-set index $i out of range 0-" . $this->size(); return undef; } my $entry = $this->{scanResponse}->entries()->[$i]; die "Oops! No entry $i in scanSet $this" if !defined $entry; my $info = $entry->termInfo(); if (!defined $info) { # Must be a surrogate diagnostic my $diag = $entry->surrogateDiagnostic(); # This is a diagRec which might be defaultFormat or EXTERNAL. ref $diag eq 'Net::Z3950::APDU::DefaultDiagFormat' or die "non-default diagnostic format"; ### $diag->diagnosticSetId() is not used $this->{errcode} = $diag->condition(); $this->{addinfo} = $diag->addinfo(); return undef; } ### We wrongly assume that the term will always be of type general return($info->term()->general(), $info->globalOccurrences); } sub field { my $this = shift(); my($i, $what) = @_; die "$this: field() not yet implemented"; } =head2 errcode(), addinfo(), errmsg() if (!defined $ss->term($i)) { print "error ", $ss->errcode(), " (", $ss->errmsg(), ")\n"; print "additional info: ", $ss->addinfo(), "\n"; } When the C or method returns an undefined value, indicating an error, it also sets into the scan-set the BIB-1 error code and additional information returned by the server. They can be retrieved via the C and C methods. As a convenience, C<$ss->errmsg()> is equivalent to Cerrcode())>. =cut sub errcode { my $this = shift(); return $this->{errcode}; } sub addinfo { my $this = shift(); return $this->{addinfo}; } sub errmsg { my $this = shift(); return Net::Z3950::errstr($this->errcode()); } =head1 AUTHOR Mike Taylor Emike@indexdata.comE First version Friday 7th May 2004. =cut 1;