-# $Id: ZOOM.pm,v 1.43 2006-12-01 14:13:41 mike Exp $
+# $Id: ZOOM.pm,v 1.48 2007-05-09 12:03:52 mike Exp $
use strict;
use warnings;
sub _check {
my $this = shift();
+ my($always_die_on_error) = @_;
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;
+ if ($errcode) {
+ my $exception = new ZOOM::Exception($errcode, $errmsg, $addinfo,
+ $diagset);
+ if (!$this->option("async") || $always_die_on_error) {
+ ZOOM::Log::log("zoom_check", "throwing error $exception");
+ die $exception;
+ } else {
+ ZOOM::Log::log("zoom_check", "not reporting error $exception");
+ }
+ }
+}
+
+# This wrapper for _check() is called only from outside the ZOOM
+# module, and therefore only in situations where an asynchronous
+# application is actively asking for an exception to be thrown if an
+# error has been detected. So it passed always_die_on_error=1 to the
+# underlying _check() method.
+#
+sub check {
+ my $this = shift();
+ return $this->_check(1);
}
sub create {
return wantarray() ? ($errcode, $errmsg, $addinfo, $diagset) : $errcode;
}
+sub exception {
+ my $this = shift();
+
+ my($errcode, $errmsg, $addinfo, $diagset) = $this->error_x();
+ return undef if $errcode == 0;
+ return new ZOOM::Exception($errcode, $errmsg, $addinfo, $diagset);
+}
+
sub errcode {
my $this = shift();
return Net::Z3950::ZOOM::connection_errcode($this->_conn());
return Net::Z3950::ZOOM::connection_is_idle($this->_conn());
}
+sub peek_event {
+ my $this = shift();
+
+ return Net::Z3950::ZOOM::connection_peek_event($this->_conn());
+}
+
sub destroy {
my $this = shift();
Net::Z3950::ZOOM::yaz_log($level, join("", @message));
}
+BEGIN { ZOOM::Log::mask_str("zoom_check"); }
1;