X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=lib%2FZOOM.pm;h=eff867d86b091acc3d34d902e582c907ee45180d;hb=68859e27fa593b57bd69b688b24b3d68b045f783;hp=2baf1d377fdaeb920696ef1c97d3c41a06e06c46;hpb=49627cbe42d2482ab40f2ffa2fc0b2920adf0f41;p=ZOOM-Perl-moved-to-github.git diff --git a/lib/ZOOM.pm b/lib/ZOOM.pm index 2baf1d3..eff867d 100644 --- a/lib/ZOOM.pm +++ b/lib/ZOOM.pm @@ -1,4 +1,4 @@ -# $Id: ZOOM.pm,v 1.18 2005-11-16 14:49:30 mike Exp $ +# $Id: ZOOM.pm,v 1.23 2005-12-19 17:46:09 mike Exp $ use strict; use warnings; @@ -47,6 +47,7 @@ sub QUERY_PQF { 20003 } sub SORTBY { 20004 } sub CLONE { 20005 } sub PACKAGE { 20006 } +sub SCANTERM { 20007 } # The "Event" package contains constants returned by last_event() package ZOOM::Event; @@ -81,16 +82,17 @@ sub diag_str { return "can't clone record"; } elsif ($code == ZOOM::Error::PACKAGE) { return "can't create package"; + } elsif ($code == ZOOM::Error::SCANTERM) { + return "can't retrieve term from scan-set"; } return Net::Z3950::ZOOM::diag_str($code); } -### More of the ZOOM::Exception instantiations should use this sub _oops { - my($code, $addinfo) = @_; + my($code, $addinfo, $diagset) = @_; - die new ZOOM::Exception($code, diag_str($code), $addinfo); + die new ZOOM::Exception($code, diag_str($code), $addinfo, $diagset); } # ---------------------------------------------------------------------------- @@ -99,13 +101,13 @@ package ZOOM::Exception; sub new { my $class = shift(); - my($code, $message, $addinfo) = @_; - ### support diag-set, too + my($code, $message, $addinfo, $diagset) = @_; return bless { code => $code, message => $message, addinfo => $addinfo, + diagset => $diagset || "ZOOM", }, $class; } @@ -124,6 +126,11 @@ sub addinfo { return $this->{addinfo}; } +sub diagset { + my $this = shift(); + return $this->{diagset}; +} + sub render { my $this = shift(); my $res = "ZOOM error " . $this->code() . ' "' . $this->message() . '"'; @@ -265,15 +272,34 @@ sub new { my($host, $port) = @_; my $_conn = Net::Z3950::ZOOM::connection_new($host, $port || 0); - my($errcode, $errmsg, $addinfo) = (undef, "dummy", "dummy"); - $errcode = Net::Z3950::ZOOM::connection_error($_conn, $errmsg, $addinfo); - die new ZOOM::Exception($errcode, $errmsg, $addinfo) if $errcode; - - return bless { + my $conn = bless { host => $host, port => $port, _conn => $_conn, }; + $conn->_check(); + return $conn; +} + +# PRIVATE to this class +sub _conn { + my $this = shift(); + + my $_conn = $this->{_conn}; + die "{_conn} undefined: has this Connection been destroy()ed?" + if !defined $_conn; + + return $_conn; +} + +sub _check { + my $this = shift(); + + my($errcode, $errmsg, $addinfo, $diagset) = (undef, "x", "x", "x"); + $errcode = Net::Z3950::ZOOM::connection_error_x($this->_conn(), $errmsg, + $addinfo, $diagset); + die new ZOOM::Exception($errcode, $errmsg, $addinfo, $diagset) + if $errcode; } sub create { @@ -288,17 +314,6 @@ sub create { }; } -# PRIVATE to this class -sub _conn { - my $this = shift(); - - my $_conn = $this->{_conn}; - die "{_conn} undefined: has this Connection been destroy()ed?" - if !defined $_conn; - - return $_conn; -} - sub error_x { my $this = shift(); @@ -323,15 +338,17 @@ sub addinfo { return Net::Z3950::ZOOM::connection_addinfo($this->_conn()); } +sub diagset { + my $this = shift(); + return Net::Z3950::ZOOM::connection_diagset($this->_conn()); +} + sub connect { my $this = shift(); my($host, $port) = @_; Net::Z3950::ZOOM::connection_connect($this->_conn(), $host, $port); - my($errcode, $errmsg, $addinfo) = (undef, "dummy", "dummy"); - $errcode = Net::Z3950::ZOOM::connection_error($this->_conn(), - $errmsg, $addinfo); - die new ZOOM::Exception($errcode, $errmsg, $addinfo) if $errcode; + $this->_check(); # No return value } @@ -366,11 +383,7 @@ sub search { my $_rs = Net::Z3950::ZOOM::connection_search($this->_conn(), $query->_query()); - my($errcode, $errmsg, $addinfo) = (undef, "dummy", "dummy"); - $errcode = Net::Z3950::ZOOM::connection_error($this->_conn(), - $errmsg, $addinfo); - die new ZOOM::Exception($errcode, $errmsg, $addinfo) if $errcode; - + $this->_check(); return _new ZOOM::ResultSet($this, $query, $_rs); } @@ -379,27 +392,29 @@ sub search_pqf { my($pqf) = @_; my $_rs = Net::Z3950::ZOOM::connection_search_pqf($this->_conn(), $pqf); - my($errcode, $errmsg, $addinfo) = (undef, "dummy", "dummy"); - $errcode = Net::Z3950::ZOOM::connection_error($this->_conn(), - $errmsg, $addinfo); - die new ZOOM::Exception($errcode, $errmsg, $addinfo) if $errcode; - + $this->_check(); return _new ZOOM::ResultSet($this, $pqf, $_rs); } -sub scan { +sub scan_pqf { my $this = shift(); my($startterm) = @_; my $_ss = Net::Z3950::ZOOM::connection_scan($this->_conn(), $startterm); - my($errcode, $errmsg, $addinfo) = (undef, "dummy", "dummy"); - $errcode = Net::Z3950::ZOOM::connection_error($this->_conn(), - $errmsg, $addinfo); - die new ZOOM::Exception($errcode, $errmsg, $addinfo) if $errcode; - + $this->_check(); return _new ZOOM::ScanSet($this, $startterm, $_ss); } +sub scan { + my $this = shift(); + my($query) = @_; + + my $_ss = Net::Z3950::ZOOM::connection_scan1($this->_conn(), + $query->_query()); + $this->_check(); + return _new ZOOM::ScanSet($this, $query, $_ss); +} + sub package { my $this = shift(); my($options) = @_; @@ -551,7 +566,12 @@ sub record { my($which) = @_; my $_rec = Net::Z3950::ZOOM::resultset_record($this->_rs(), $which); - ### Check for error -- but how? + $this->{conn}->_check(); + + # Even if no error has occurred, I think record() might + # legitimately return undef if we're running in asynchronous mode + # and the record just hasn't been retrieved yet. This goes double + # for record_immediate(). return undef if !defined $_rec; # For some reason, I have to use the explicit "->" syntax in order @@ -566,7 +586,8 @@ sub record_immediate { my $_rec = Net::Z3950::ZOOM::resultset_record_immediate($this->_rs(), $which); - ### Check for error -- but how? + $this->{conn}->_check(); + # The record might legitimately not be there yet return undef if !defined $_rec; return ZOOM::Record->_new($this, $which, $_rec); @@ -584,7 +605,7 @@ sub records { my $raw = Net::Z3950::ZOOM::resultset_records($this->_rs(), $start, $count, $return_records); - ### Why don't we throw an exception if $raw is undefined? + # By design, $raw may be undefined (if $return_records is true) return undef if !defined $raw; # We need to package up the returned records in ZOOM::Record objects @@ -708,7 +729,12 @@ sub _new { return bless { conn => $conn, - startterm => $startterm, + startterm => $startterm,# This is not currently used, which is + # just as well since it could be + # either a string (when the SS is + # created with scan()) or a + # ZOOM::Query object (when it's + # created with scan1()) _ss => $_ss, }, $class; } @@ -747,9 +773,9 @@ sub term { my($occ, $len) = (0, 0); my $term = Net::Z3950::ZOOM::scanset_term($this->_ss(), $which, - $occ, $len); - ### Throw exception? - return undef if !defined $term; + $occ, $len) + or ZOOM::_oops(ZOOM::Error::SCANTERM); + die "length of term '$term' differs from returned len=$len" if length($term) != $len; @@ -762,9 +788,9 @@ sub display_term { my($occ, $len) = (0, 0); my $term = Net::Z3950::ZOOM::scanset_display_term($this->_ss(), $which, - $occ, $len); - ### Throw exception? - return undef if !defined $term; + $occ, $len) + or ZOOM::_oops(ZOOM::Error::SCANTERM); + die "length of display term '$term' differs from returned len=$len" if length($term) != $len; @@ -827,10 +853,7 @@ sub send { my($type) = @_; Net::Z3950::ZOOM::package_send($this->_p(), $type); - my($errcode, $errmsg, $addinfo) = (undef, "dummy", "dummy"); - $errcode = Net::Z3950::ZOOM::connection_error($this->{conn}->_conn(), - $errmsg, $addinfo); - die new ZOOM::Exception($errcode, $errmsg, $addinfo) if $errcode; + $this->{conn}->_check(); } sub destroy {