The ZOOM::Exception constructor now fills in missing $message for
[ZOOM-Perl-moved-to-github.git] / lib / ZOOM.pm
index 0e3e583..9b12e86 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: ZOOM.pm,v 1.36 2006-10-04 17:15:03 mike Exp $
+# $Id: ZOOM.pm,v 1.40 2006-11-02 17:56:33 mike Exp $
 
 use strict;
 use warnings;
@@ -139,7 +139,7 @@ sub new {
     my($code, $message, $addinfo, $diagset) = @_;
 
     $diagset ||= "ZOOM";
-    if ($diagset eq "ZOOM") {
+    if (uc($diagset) eq "ZOOM" || uc($diagset) eq "BIB-1") {
        $message ||= ZOOM::diag_str($code);
     } else {
        # Should fill in messages for other diagsets, too.
@@ -314,25 +314,13 @@ sub new {
     my $class = shift();
     my($host, $port, @options) = @_;
 
-    my $_opts = Net::Z3950::ZOOM::options_create();
-    while (@options >= 2) {
-       my $key = shift(@options);
-       my $val = shift(@options);
-       Net::Z3950::ZOOM::options_set($_opts, $key, $val);
-    }
-
-    die "Odd number of options specified"
-       if @options;
-
-    my $_conn = Net::Z3950::ZOOM::connection_create($_opts);
-    Net::Z3950::ZOOM::connection_connect($_conn, $host, $port || 0);
-    my $conn = bless {
-       host => $host,
-       port => $port,
-       _conn => $_conn,
-    };
+    my $conn = $class->create(@options);
+    $conn->{host} = $host;
+    $conn->{port} = $port;
 
+    Net::Z3950::ZOOM::connection_connect($conn->_conn(), $host, $port || 0);
     $conn->_check();
+
     return $conn;
 }
 
@@ -359,14 +347,30 @@ sub _check {
 
 sub create {
     my $class = shift();
-    my($options) = @_;
+    my(@options) = @_;
 
-    my $_conn = Net::Z3950::ZOOM::connection_create($options->_opts());
-    return bless {
+    my $_opts;
+    if (@_ == 1) {
+       $_opts = $_[0]->_opts();
+    } else {
+       $_opts = Net::Z3950::ZOOM::options_create();
+       while (@options >= 2) {
+           my $key = shift(@options);
+           my $val = shift(@options);
+           Net::Z3950::ZOOM::options_set($_opts, $key, $val);
+       }
+
+       die "Odd number of options specified"
+           if @options;
+    }
+
+    my $_conn = Net::Z3950::ZOOM::connection_create($_opts);
+    my $conn = bless {
        host => undef,
        port => undef,
        _conn => $_conn,
-    };
+    }, $class;
+    return $conn;
 }
 
 sub error_x {
@@ -727,6 +731,16 @@ sub records {
     my $this = shift();
     my($start, $count, $return_records) = @_;
 
+    # If the request is out of range, ZOOM-C will currently (as of YAZ
+    # 2.1.38) no-op: it understandably refuses to build and send a
+    # known-bad APDU, but it doesn't set a diagnostic as it ought.  So
+    # for now, we do it here.
+    my $size = $this->size();
+    if ($start + $count-1 >= $size) {
+       # BIB-1 diagnostic 13 is "Present request out-of-range"
+       ZOOM::_oops(13, undef, "BIB-1");
+    }
+
     my $raw = Net::Z3950::ZOOM::resultset_records($this->_rs(), $start, $count,
                                                  $return_records);
     # By design, $raw may be undefined (if $return_records is true)