← Index
NYTProf Performance Profile   « block view • line view • sub view »
For /usr/share/koha/opac/cgi-bin/opac/opac-search.pl
  Run on Tue Oct 15 17:10:45 2013
Reported on Tue Oct 15 17:11:22 2013

Filename/usr/lib/perl5/ZOOM.pm
StatementsExecuted 6822 statements in 132ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
200215.23ms45.4msZOOM::ResultSet::::record ZOOM::ResultSet::record
202313.30ms5.27msZOOM::Connection::::_check ZOOM::Connection::_check
200212.28ms17.1msZOOM::Record::::get ZOOM::Record::get
200112.01ms2.01msZOOM::Record::::_new ZOOM::Record::_new
1112.01ms2.39msZOOM::Exception::::BEGIN@194 ZOOM::Exception::BEGIN@194
1111.84ms5.45msC4::Context::::BEGIN@4 C4::Context::BEGIN@4
175111.18ms14.8msZOOM::Record::::render ZOOM::Record::render
202311.15ms1.15msZOOM::ResultSet::::_rs ZOOM::ResultSet::_rs
23281915µs915µsZOOM::Connection::::_conn ZOOM::Connection::_conn
20011769µs769µsZOOM::Record::::_rec ZOOM::Record::_rec
111490µs490µsZOOM::Query::CCL2RPN::::CORE:readlineZOOM::Query::CCL2RPN::CORE:readline (opcode)
111364µs2.59msZOOM::Query::CCL2RPN::::newZOOM::Query::CCL2RPN::new
1211190µs67.7msZOOM::::event ZOOM::event
2511190µs3.69msZOOM::Record::::raw ZOOM::Record::raw
881139µs278µsZOOM::Options::::option ZOOM::Options::option
1111136µs202µsZOOM::Connection::::last_event ZOOM::Connection::last_event
11163µs426µsC4::Context::::BEGIN@3 C4::Context::BEGIN@3
33254µs92µsZOOM::Connection::::option ZOOM::Connection::option
173154µs54µsZOOM::Options::::_opts ZOOM::Options::_opts
11147µs151µsZOOM::Connection::::search ZOOM::Connection::search
11145µs56µsC4::Context::::BEGIN@1 C4::Context::BEGIN@1
111145µs61µsZOOM::Event::::ZEND ZOOM::Event::ZEND
11140µs108µsZOOM::Options::::new ZOOM::Options::new
11137µs71µsZOOM::ResultSet::::size ZOOM::ResultSet::size
31137µs37µsC4::Context::::CORE:ftsize C4::Context::CORE:ftsize (opcode)
31130µs30µsC4::Context::::CORE:subst C4::Context::CORE:subst (opcode)
11128µs82µsZOOM::Connection::::create ZOOM::Connection::create
11127µs64µsC4::Context::::BEGIN@2 C4::Context::BEGIN@2
11122µs79µsZOOM::Connection::::connect ZOOM::Connection::connect
11121µs77µsZOOM::ResultSet::::destroy ZOOM::ResultSet::destroy
11117µs17µsC4::Context::::CORE:ftdir C4::Context::CORE:ftdir (opcode)
11117µs67µsZOOM::Log::::mask_str ZOOM::Log::mask_str
11115µs15µsZOOM::ResultSet::::_new ZOOM::ResultSet::_new
11113µs20µsZOOM::Connection::::errcode ZOOM::Connection::errcode
11112µs79µsZOOM::Log::::BEGIN@1107 ZOOM::Log::BEGIN@1107
1114µs4µsZOOM::Query::::_query ZOOM::Query::_query
0000s0sZOOM::CCL::Error::::BAD_RELATION ZOOM::CCL::Error::BAD_RELATION
0000s0sZOOM::CCL::Error::::BAD_RP ZOOM::CCL::Error::BAD_RP
0000s0sZOOM::CCL::Error::::DOUBLE_QUAL ZOOM::CCL::Error::DOUBLE_QUAL
0000s0sZOOM::CCL::Error::::EQ_EXPECTED ZOOM::CCL::Error::EQ_EXPECTED
0000s0sZOOM::CCL::Error::::OK ZOOM::CCL::Error::OK
0000s0sZOOM::CCL::Error::::OP_EXPECTED ZOOM::CCL::Error::OP_EXPECTED
0000s0sZOOM::CCL::Error::::RP_EXPECTED ZOOM::CCL::Error::RP_EXPECTED
0000s0sZOOM::CCL::Error::::SETNAME_EXPECTED ZOOM::CCL::Error::SETNAME_EXPECTED
0000s0sZOOM::CCL::Error::::TERM_EXPECTED ZOOM::CCL::Error::TERM_EXPECTED
0000s0sZOOM::CCL::Error::::TRUNC_NOT_BOTH ZOOM::CCL::Error::TRUNC_NOT_BOTH
0000s0sZOOM::CCL::Error::::TRUNC_NOT_LEFT ZOOM::CCL::Error::TRUNC_NOT_LEFT
0000s0sZOOM::CCL::Error::::TRUNC_NOT_RIGHT ZOOM::CCL::Error::TRUNC_NOT_RIGHT
0000s0sZOOM::CCL::Error::::UNKNOWN_QUAL ZOOM::CCL::Error::UNKNOWN_QUAL
0000s0sZOOM::Connection::::addinfo ZOOM::Connection::addinfo
0000s0sZOOM::Connection::::check ZOOM::Connection::check
0000s0sZOOM::Connection::::destroy ZOOM::Connection::destroy
0000s0sZOOM::Connection::::diagset ZOOM::Connection::diagset
0000s0sZOOM::Connection::::errmsg ZOOM::Connection::errmsg
0000s0sZOOM::Connection::::error_x ZOOM::Connection::error_x
0000s0sZOOM::Connection::::exception ZOOM::Connection::exception
0000s0sZOOM::Connection::::is_idle ZOOM::Connection::is_idle
0000s0sZOOM::Connection::::new ZOOM::Connection::new
0000s0sZOOM::Connection::::option_binary ZOOM::Connection::option_binary
0000s0sZOOM::Connection::::package ZOOM::Connection::package
0000s0sZOOM::Connection::::peek_event ZOOM::Connection::peek_event
0000s0sZOOM::Connection::::scan ZOOM::Connection::scan
0000s0sZOOM::Connection::::scan_pqf ZOOM::Connection::scan_pqf
0000s0sZOOM::Connection::::search_pqf ZOOM::Connection::search_pqf
0000s0sZOOM::Error::::CCL_CONFIG ZOOM::Error::CCL_CONFIG
0000s0sZOOM::Error::::CCL_PARSE ZOOM::Error::CCL_PARSE
0000s0sZOOM::Error::::CLONE ZOOM::Error::CLONE
0000s0sZOOM::Error::::CONNECT ZOOM::Error::CONNECT
0000s0sZOOM::Error::::CONNECTION_LOST ZOOM::Error::CONNECTION_LOST
0000s0sZOOM::Error::::CQL_PARSE ZOOM::Error::CQL_PARSE
0000s0sZOOM::Error::::CQL_TRANSFORM ZOOM::Error::CQL_TRANSFORM
0000s0sZOOM::Error::::CREATE_QUERY ZOOM::Error::CREATE_QUERY
0000s0sZOOM::Error::::DECODE ZOOM::Error::DECODE
0000s0sZOOM::Error::::ENCODE ZOOM::Error::ENCODE
0000s0sZOOM::Error::::INTERNAL ZOOM::Error::INTERNAL
0000s0sZOOM::Error::::INVALID_QUERY ZOOM::Error::INVALID_QUERY
0000s0sZOOM::Error::::LOGLEVEL ZOOM::Error::LOGLEVEL
0000s0sZOOM::Error::::MEMORY ZOOM::Error::MEMORY
0000s0sZOOM::Error::::NONE ZOOM::Error::NONE
0000s0sZOOM::Error::::PACKAGE ZOOM::Error::PACKAGE
0000s0sZOOM::Error::::QUERY_CQL ZOOM::Error::QUERY_CQL
0000s0sZOOM::Error::::QUERY_PQF ZOOM::Error::QUERY_PQF
0000s0sZOOM::Error::::SCANTERM ZOOM::Error::SCANTERM
0000s0sZOOM::Error::::SORTBY ZOOM::Error::SORTBY
0000s0sZOOM::Error::::TIMEOUT ZOOM::Error::TIMEOUT
0000s0sZOOM::Error::::UNSUPPORTED_PROTOCOL ZOOM::Error::UNSUPPORTED_PROTOCOL
0000s0sZOOM::Error::::UNSUPPORTED_QUERY ZOOM::Error::UNSUPPORTED_QUERY
0000s0sZOOM::Error::::ZINIT ZOOM::Error::ZINIT
0000s0sZOOM::Event::::CONNECT ZOOM::Event::CONNECT
0000s0sZOOM::Event::::NONE ZOOM::Event::NONE
0000s0sZOOM::Event::::RECV_APDU ZOOM::Event::RECV_APDU
0000s0sZOOM::Event::::RECV_DATA ZOOM::Event::RECV_DATA
0000s0sZOOM::Event::::RECV_RECORD ZOOM::Event::RECV_RECORD
0000s0sZOOM::Event::::RECV_SEARCH ZOOM::Event::RECV_SEARCH
0000s0sZOOM::Event::::SEND_APDU ZOOM::Event::SEND_APDU
0000s0sZOOM::Event::::SEND_DATA ZOOM::Event::SEND_DATA
0000s0sZOOM::Event::::TIMEOUT ZOOM::Event::TIMEOUT
0000s0sZOOM::Event::::UNKNOWN ZOOM::Event::UNKNOWN
0000s0sZOOM::Exception::::addinfo ZOOM::Exception::addinfo
0000s0sZOOM::Exception::::code ZOOM::Exception::code
0000s0sZOOM::Exception::::diagset ZOOM::Exception::diagset
0000s0sZOOM::Exception::::message ZOOM::Exception::message
0000s0sZOOM::Exception::::new ZOOM::Exception::new
0000s0sZOOM::Exception::::render ZOOM::Exception::render
0000s0sZOOM::Log::::init ZOOM::Log::init
0000s0sZOOM::Log::::init_file ZOOM::Log::init_file
0000s0sZOOM::Log::::init_level ZOOM::Log::init_level
0000s0sZOOM::Log::::init_max_size ZOOM::Log::init_max_size
0000s0sZOOM::Log::::init_prefix ZOOM::Log::init_prefix
0000s0sZOOM::Log::::log ZOOM::Log::log
0000s0sZOOM::Log::::module_level ZOOM::Log::module_level
0000s0sZOOM::Log::::time_format ZOOM::Log::time_format
0000s0sZOOM::Options::::bool ZOOM::Options::bool
0000s0sZOOM::Options::::destroy ZOOM::Options::destroy
0000s0sZOOM::Options::::int ZOOM::Options::int
0000s0sZOOM::Options::::option_binary ZOOM::Options::option_binary
0000s0sZOOM::Options::::set_callback ZOOM::Options::set_callback
0000s0sZOOM::Options::::set_int ZOOM::Options::set_int
0000s0sZOOM::Package::::_new ZOOM::Package::_new
0000s0sZOOM::Package::::_p ZOOM::Package::_p
0000s0sZOOM::Package::::destroy ZOOM::Package::destroy
0000s0sZOOM::Package::::new ZOOM::Package::new
0000s0sZOOM::Package::::option ZOOM::Package::option
0000s0sZOOM::Package::::send ZOOM::Package::send
0000s0sZOOM::Query::CQL2RPN::::newZOOM::Query::CQL2RPN::new
0000s0sZOOM::Query::CQL::::new ZOOM::Query::CQL::new
0000s0sZOOM::Query::PQF::::new ZOOM::Query::PQF::new
0000s0sZOOM::Query::::destroy ZOOM::Query::destroy
0000s0sZOOM::Query::::new ZOOM::Query::new
0000s0sZOOM::Query::::sortby ZOOM::Query::sortby
0000s0sZOOM::Record::::clone ZOOM::Record::clone
0000s0sZOOM::Record::::destroy ZOOM::Record::destroy
0000s0sZOOM::Record::::error ZOOM::Record::error
0000s0sZOOM::Record::::exception ZOOM::Record::exception
0000s0sZOOM::Record::::new ZOOM::Record::new
0000s0sZOOM::ResultSet::::cache_reset ZOOM::ResultSet::cache_reset
0000s0sZOOM::ResultSet::::new ZOOM::ResultSet::new
0000s0sZOOM::ResultSet::::option ZOOM::ResultSet::option
0000s0sZOOM::ResultSet::::record_immediate ZOOM::ResultSet::record_immediate
0000s0sZOOM::ResultSet::::records ZOOM::ResultSet::records
0000s0sZOOM::ResultSet::::sort ZOOM::ResultSet::sort
0000s0sZOOM::ScanSet::::_new ZOOM::ScanSet::_new
0000s0sZOOM::ScanSet::::_ss ZOOM::ScanSet::_ss
0000s0sZOOM::ScanSet::::destroy ZOOM::ScanSet::destroy
0000s0sZOOM::ScanSet::::display_term ZOOM::ScanSet::display_term
0000s0sZOOM::ScanSet::::new ZOOM::ScanSet::new
0000s0sZOOM::ScanSet::::option ZOOM::ScanSet::option
0000s0sZOOM::ScanSet::::size ZOOM::ScanSet::size
0000s0sZOOM::ScanSet::::term ZOOM::ScanSet::term
0000s0sZOOM::::_oops ZOOM::_oops
0000s0sZOOM::::diag_srw_str ZOOM::diag_srw_str
0000s0sZOOM::::diag_str ZOOM::diag_str
0000s0sZOOM::::event_str ZOOM::event_str
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1364µs266µs
# spent 56µs (45+11) within C4::Context::BEGIN@1 which was called: # once (45µs+11µs) by C4::Context::BEGIN@102 at line 1
use strict;
# spent 56µs making 1 call to C4::Context::BEGIN@1 # spent 11µs making 1 call to strict::import
2394µs2102µs
# spent 64µs (27+38) within C4::Context::BEGIN@2 which was called: # once (27µs+38µs) by C4::Context::BEGIN@102 at line 2
use warnings;
# spent 64µs making 1 call to C4::Context::BEGIN@2 # spent 38µs making 1 call to warnings::import
3370µs2789µs
# spent 426µs (63+363) within C4::Context::BEGIN@3 which was called: # once (63µs+363µs) by C4::Context::BEGIN@102 at line 3
use IO::File;
# spent 426µs making 1 call to C4::Context::BEGIN@3 # spent 363µs making 1 call to Exporter::import
432.44ms15.45ms
# spent 5.45ms (1.84+3.60) within C4::Context::BEGIN@4 which was called: # once (1.84ms+3.60ms) by C4::Context::BEGIN@102 at line 4
use Net::Z3950::ZOOM;
# spent 5.45ms making 1 call to C4::Context::BEGIN@4
5
6
7package ZOOM;
8
9# Member naming convention: hash-element names which begin with an
10# underscore represent underlying ZOOM-C object descriptors; those
11# which lack them represent Perl's ZOOM objects. (The same convention
12# is used in naming local variables where appropriate.)
13#
14# So, for example, the ZOOM::Connection class has an {_conn} element,
15# which is a pointer to the ZOOM-C Connection object; but the
16# ZOOM::ResultSet class has a {conn} element, which is a reference to
17# the Perl-level Connection object by which it was created. (It may
18# be that we find we have no need for these references, but for now
19# they are retained.)
20#
21# To get at the underlying ZOOM-C connection object of a result-set
22# (if you ever needed to do such a thing, which you probably don't)
23# you'd use $rs->{conn}->_conn().
24
25# ----------------------------------------------------------------------------
26
27# The "Error" package contains constants returned as error-codes.
28package ZOOM::Error;
29sub NONE { Net::Z3950::ZOOM::ERROR_NONE }
30sub CONNECT { Net::Z3950::ZOOM::ERROR_CONNECT }
31sub MEMORY { Net::Z3950::ZOOM::ERROR_MEMORY }
32sub ENCODE { Net::Z3950::ZOOM::ERROR_ENCODE }
33sub DECODE { Net::Z3950::ZOOM::ERROR_DECODE }
34sub CONNECTION_LOST { Net::Z3950::ZOOM::ERROR_CONNECTION_LOST }
35sub ZINIT { Net::Z3950::ZOOM::ERROR_INIT }
36sub INTERNAL { Net::Z3950::ZOOM::ERROR_INTERNAL }
37sub TIMEOUT { Net::Z3950::ZOOM::ERROR_TIMEOUT }
38sub UNSUPPORTED_PROTOCOL { Net::Z3950::ZOOM::ERROR_UNSUPPORTED_PROTOCOL }
39sub UNSUPPORTED_QUERY { Net::Z3950::ZOOM::ERROR_UNSUPPORTED_QUERY }
40sub INVALID_QUERY { Net::Z3950::ZOOM::ERROR_INVALID_QUERY }
41sub CQL_PARSE { Net::Z3950::ZOOM::ERROR_CQL_PARSE }
42sub CQL_TRANSFORM { Net::Z3950::ZOOM::ERROR_CQL_TRANSFORM }
43sub CCL_CONFIG { Net::Z3950::ZOOM::ERROR_CCL_CONFIG }
44sub CCL_PARSE { Net::Z3950::ZOOM::ERROR_CCL_PARSE }
45# The following are added specifically for this OO interface
46sub CREATE_QUERY { 20001 }
47sub QUERY_CQL { 20002 }
48sub QUERY_PQF { 20003 }
49sub SORTBY { 20004 }
50sub CLONE { 20005 }
51sub PACKAGE { 20006 }
52sub SCANTERM { 20007 }
53sub LOGLEVEL { 20008 }
54
55# Separate space for CCL errors. Great.
56package ZOOM::CCL::Error;
57sub OK { Net::Z3950::ZOOM::CCL_ERR_OK }
58sub TERM_EXPECTED { Net::Z3950::ZOOM::CCL_ERR_TERM_EXPECTED }
59sub RP_EXPECTED { Net::Z3950::ZOOM::CCL_ERR_RP_EXPECTED }
60sub SETNAME_EXPECTED { Net::Z3950::ZOOM::CCL_ERR_SETNAME_EXPECTED }
61sub OP_EXPECTED { Net::Z3950::ZOOM::CCL_ERR_OP_EXPECTED }
62sub BAD_RP { Net::Z3950::ZOOM::CCL_ERR_BAD_RP }
63sub UNKNOWN_QUAL { Net::Z3950::ZOOM::CCL_ERR_UNKNOWN_QUAL }
64sub DOUBLE_QUAL { Net::Z3950::ZOOM::CCL_ERR_DOUBLE_QUAL }
65sub EQ_EXPECTED { Net::Z3950::ZOOM::CCL_ERR_EQ_EXPECTED }
66sub BAD_RELATION { Net::Z3950::ZOOM::CCL_ERR_BAD_RELATION }
67sub TRUNC_NOT_LEFT { Net::Z3950::ZOOM::CCL_ERR_TRUNC_NOT_LEFT }
68sub TRUNC_NOT_BOTH { Net::Z3950::ZOOM::CCL_ERR_TRUNC_NOT_BOTH }
69sub TRUNC_NOT_RIGHT { Net::Z3950::ZOOM::CCL_ERR_TRUNC_NOT_RIGHT }
70
71# The "Event" package contains constants returned by last_event()
72package ZOOM::Event;
73sub NONE { Net::Z3950::ZOOM::EVENT_NONE }
74sub CONNECT { Net::Z3950::ZOOM::EVENT_CONNECT }
75sub SEND_DATA { Net::Z3950::ZOOM::EVENT_SEND_DATA }
76sub RECV_DATA { Net::Z3950::ZOOM::EVENT_RECV_DATA }
77sub TIMEOUT { Net::Z3950::ZOOM::EVENT_TIMEOUT }
78sub UNKNOWN { Net::Z3950::ZOOM::EVENT_UNKNOWN }
79sub SEND_APDU { Net::Z3950::ZOOM::EVENT_SEND_APDU }
80sub RECV_APDU { Net::Z3950::ZOOM::EVENT_RECV_APDU }
81sub RECV_RECORD { Net::Z3950::ZOOM::EVENT_RECV_RECORD }
82sub RECV_SEARCH { Net::Z3950::ZOOM::EVENT_RECV_SEARCH }
831138µs1116µs
# spent 61µs (45+16) within ZOOM::Event::ZEND which was called 11 times, avg 6µs/call: # 11 times (45µs+16µs) by C4::Search::_ZOOM_event_loop at line 2349 of /usr/share/koha/lib/C4/Search.pm, avg 6µs/call
sub ZEND { Net::Z3950::ZOOM::EVENT_END }
# spent 16µs making 11 calls to Net::Z3950::ZOOM::EVENT_END, avg 1µs/call
84
85# ----------------------------------------------------------------------------
86
87package ZOOM;
88
89sub diag_str {
90 my($code) = @_;
91
92 # Special cases for error specific to the OO layer
93 if ($code == ZOOM::Error::CREATE_QUERY) {
94 return "can't create query object";
95 } elsif ($code == ZOOM::Error::QUERY_CQL) {
96 return "can't set CQL query";
97 } elsif ($code == ZOOM::Error::QUERY_PQF) {
98 return "can't set prefix query";
99 } elsif ($code == ZOOM::Error::SORTBY) {
100 return "can't set sort-specification";
101 } elsif ($code == ZOOM::Error::CLONE) {
102 return "can't clone record";
103 } elsif ($code == ZOOM::Error::PACKAGE) {
104 return "can't create package";
105 } elsif ($code == ZOOM::Error::SCANTERM) {
106 return "can't retrieve term from scan-set";
107 } elsif ($code == ZOOM::Error::LOGLEVEL) {
108 return "unregistered log-level";
109 }
110
111 return Net::Z3950::ZOOM::diag_str($code);
112}
113
114sub diag_srw_str {
115 my($code) = @_;
116
117 return Net::Z3950::ZOOM::diag_srw_str($code);
118}
119
120sub event_str {
121 return Net::Z3950::ZOOM::event_str(@_);
122}
123
124
# spent 67.7ms (190µs+67.5) within ZOOM::event which was called 12 times, avg 5.64ms/call: # 12 times (190µs+67.5ms) by C4::Search::_ZOOM_event_loop at line 2347 of /usr/share/koha/lib/C4/Search.pm, avg 5.64ms/call
sub event {
1254867.7ms my($connsref) = @_;
126
1271239µs my @_connsref = map { $_->_conn() } @$connsref;
# spent 39µs making 12 calls to ZOOM::Connection::_conn, avg 3µs/call
1281267.5ms return Net::Z3950::ZOOM::event(\@_connsref);
# spent 67.5ms making 12 calls to Net::Z3950::ZOOM::event, avg 5.62ms/call
129}
130
131sub _oops {
132 my($code, $addinfo, $diagset) = @_;
133
134 die new ZOOM::Exception($code, undef, $addinfo, $diagset);
135}
136
137# ----------------------------------------------------------------------------
138
139package ZOOM::Exception;
140
141sub new {
142 my $class = shift();
143 my($code, $message, $addinfo, $diagset) = @_;
144
145 $diagset ||= "ZOOM";
146 if (uc($diagset) eq "ZOOM" || uc($diagset) eq "BIB-1") {
147 $message ||= ZOOM::diag_str($code);
148 } elsif (lc($diagset) eq "info:srw/diagnostic/1") {
149 $message ||= ZOOM::diag_srw_str($code);
150 } else {
151 # Should fill in messages for any other known diagsets.
152 $message ||= "(unknown error)";
153 }
154
155 return bless {
156 code => $code,
157 message => $message,
158 addinfo => $addinfo,
159 diagset => $diagset,
160 }, $class;
161}
162
163sub code {
164 my $this = shift();
165 return $this->{code};
166}
167
168sub message {
169 my $this = shift();
170 return $this->{message};
171}
172
173sub addinfo {
174 my $this = shift();
175 return $this->{addinfo};
176}
177
178sub diagset {
179 my $this = shift();
180 return $this->{diagset};
181}
182
183sub render {
184 my $this = shift();
185
186 my $res = "ZOOM error " . $this->code();
187 $res .= ' "' . $this->message() . '"' if $this->message();
188 $res .= ' (addinfo: "' . $this->addinfo() . '")' if $this->addinfo();
189 $res .= " from diag-set '" . $this->diagset() . "'" if $this->diagset();
190 return $res;
191}
192
193# This means that untrapped exceptions render nicely.
19438.25ms22.54ms
# spent 2.39ms (2.01+381µs) within ZOOM::Exception::BEGIN@194 which was called: # once (2.01ms+381µs) by C4::Context::BEGIN@102 at line 194
use overload '""' => \&render;
# spent 2.39ms making 1 call to ZOOM::Exception::BEGIN@194 # spent 154µs making 1 call to overload::import
195
196# ----------------------------------------------------------------------------
197
198package ZOOM::Options;
199
200
# spent 108µs (40+68) within ZOOM::Options::new which was called: # once (40µs+68µs) by C4::Context::_new_Zconn at line 738 of /usr/share/koha/lib/C4/Context.pm
sub new {
2015113µs my $class = shift();
202 my($p1, $p2) = @_;
203
204 my $opts;
205168µs if (@_ == 0) {
# spent 68µs making 1 call to Net::Z3950::ZOOM::options_create
206 $opts = Net::Z3950::ZOOM::options_create();
207 } elsif (@_ == 1) {
208 $opts = Net::Z3950::ZOOM::options_create_with_parent($p1->_opts());
209 } elsif (@_ == 2) {
210 $opts = Net::Z3950::ZOOM::options_create_with_parent2($p1->_opts(),
211 $p2->_opts());
212 } else {
213 die "can't make $class object with more than 2 parents";
214 }
215
216 return bless {
217 _opts => $opts,
218 }, $class;
219}
220
221# PRIVATE to this class and ZOOM::Connection::create() and
222# ZOOM::Connection::package()
223#
224
# spent 54µs within ZOOM::Options::_opts which was called 17 times, avg 3µs/call: # 8 times (28µs+0s) by ZOOM::Options::option at line 238, avg 4µs/call # 8 times (23µs+0s) by ZOOM::Options::option at line 239, avg 3µs/call # once (2µs+0s) by ZOOM::Connection::create at line 382
sub _opts {
2256880µs my $this = shift();
226
227 my $_opts = $this->{_opts};
228 die "{_opts} undefined: has this Options block been destroy()ed?"
229 if !defined $_opts;
230
231 return $_opts;
232}
233
234
# spent 278µs (139+139) within ZOOM::Options::option which was called 8 times, avg 35µs/call: # once (41µs+41µs) by C4::Context::_new_Zconn at line 739 of /usr/share/koha/lib/C4/Context.pm # once (26µs+23µs) by C4::Context::_new_Zconn at line 741 of /usr/share/koha/lib/C4/Context.pm # once (11µs+29µs) by C4::Context::_new_Zconn at line 746 of /usr/share/koha/lib/C4/Context.pm # once (20µs+13µs) by C4::Context::_new_Zconn at line 743 of /usr/share/koha/lib/C4/Context.pm # once (14µs+13µs) by C4::Context::_new_Zconn at line 740 of /usr/share/koha/lib/C4/Context.pm # once (10µs+7µs) by C4::Context::_new_Zconn at line 744 of /usr/share/koha/lib/C4/Context.pm # once (9µs+7µs) by C4::Context::_new_Zconn at line 747 of /usr/share/koha/lib/C4/Context.pm # once (9µs+6µs) by C4::Context::_new_Zconn at line 745 of /usr/share/koha/lib/C4/Context.pm
sub option {
23540222µs my $this = shift();
236 my($key, $value) = @_;
237
2381682µs my $oldval = Net::Z3950::ZOOM::options_get($this->_opts(), $key);
# spent 53µs making 8 calls to Net::Z3950::ZOOM::options_get, avg 7µs/call # spent 28µs making 8 calls to ZOOM::Options::_opts, avg 4µs/call
2391657µs Net::Z3950::ZOOM::options_set($this->_opts(), $key, $value)
# spent 34µs making 8 calls to Net::Z3950::ZOOM::options_set, avg 4µs/call # spent 23µs making 8 calls to ZOOM::Options::_opts, avg 3µs/call
240 if defined $value;
241
242 return $oldval;
243}
244
245sub option_binary {
246 my $this = shift();
247 my($key, $value) = @_;
248
249 my $dummylen = 0;
250 my $oldval = Net::Z3950::ZOOM::options_getl($this->_opts(),
251 $key, $dummylen);
252 Net::Z3950::ZOOM::options_setl($this->_opts(), $key,
253 $value, length($value))
254 if defined $value;
255
256 return $oldval;
257}
258
259# This is a bit stupid, since the scalar values that Perl returns from
260# option() can be used as a boolean; but it's just possible that some
261# applications will rely on ZOOM_options_get_bool()'s idiosyncratic
262# interpretation of what constitutes truth.
263#
264sub bool {
265 my $this = shift();
266 my($key, $default) = @_;
267
268 return Net::Z3950::ZOOM::options_get_bool($this->_opts(), $key, $default);
269}
270
271# .. and the next two are even more stupid
272sub int {
273 my $this = shift();
274 my($key, $default) = @_;
275
276 return Net::Z3950::ZOOM::options_get_int($this->_opts(), $key, $default);
277}
278
279sub set_int {
280 my $this = shift();
281 my($key, $value) = @_;
282
283 Net::Z3950::ZOOM::options_set_int($this->_opts(), $key, $value);
284}
285
286# ### Feel guilty. Feel very, very guilty. I've not been able to
287# get the callback memory-management right in "ZOOM.xs", with
288# the result that the values of $function and $udata passed into
289# this function, which are on the stack, have sometimes been
290# freed by the time they're used by __ZOOM_option_callback(),
291# with hilarious results. To avoid this, I copy the values into
292# module-scoped globals, and pass _those_ into the extension
293# function. To avoid overwriting those globals by subsequent
294# calls, I keep all the old ones, pushed onto the @_function and
295# @_udata arrays, which means that THIS FUNCTION LEAKS MEMORY
296# LIKE IT'S GOING OUT OF FASHION. Not nice. One day, I should
297# fix this, but for now there's more important fish to fry.
298#
29911µsmy(@_function, @_udata);
300sub set_callback {
301 my $o1 = shift();
302 my($function, $udata) = @_;
303
304 push @_function, $function;
305 push @_udata, $udata;
306 Net::Z3950::ZOOM::options_set_callback($o1->_opts(),
307 $_function[-1], $_udata[-1]);
308}
309
310sub destroy {
311 my $this = shift();
312
313 Net::Z3950::ZOOM::options_destroy($this->_opts());
314 $this->{_opts} = undef;
315}
316
317
318# ----------------------------------------------------------------------------
319
320package ZOOM::Connection;
321
322sub new {
323 my $class = shift();
324 my($host, $port, @options) = @_;
325
326 my $conn = $class->create(@options);
327 $conn->{host} = $host;
328 $conn->{port} = $port;
329
330 Net::Z3950::ZOOM::connection_connect($conn->_conn(), $host, $port || 0);
331 $conn->_check();
332
333 return $conn;
334}
335
336# PRIVATE to this class, to ZOOM::event() and to ZOOM::Query::CQL2RPN::new()
337
# spent 915µs within ZOOM::Connection::_conn which was called 232 times, avg 4µs/call: # 202 times (817µs+0s) by ZOOM::Connection::_check at line 352, avg 4µs/call # 12 times (39µs+0s) by ZOOM::event at line 127, avg 3µs/call # 11 times (36µs+0s) by ZOOM::Connection::last_event at line 530, avg 3µs/call # 3 times (11µs+0s) by ZOOM::Connection::option at line 456, avg 4µs/call # once (5µs+0s) by ZOOM::Connection::option at line 457 # once (4µs+0s) by ZOOM::Connection::connect at line 447 # once (3µs+0s) by ZOOM::Connection::search at line 481 # once (2µs+0s) by ZOOM::Connection::errcode at line 424
sub _conn {
3389281.50ms my $this = shift();
339
340 my $_conn = $this->{_conn};
341 die "{_conn} undefined: has this Connection been destroy()ed?"
342 if !defined $_conn;
343
344 return $_conn;
345}
346
347
# spent 5.27ms (3.30+1.97) within ZOOM::Connection::_check which was called 202 times, avg 26µs/call: # 200 times (3.27ms+1.95ms) by ZOOM::ResultSet::record at line 740, avg 26µs/call # once (17µs+14µs) by ZOOM::Connection::connect at line 448 # once (11µs+7µs) by ZOOM::Connection::search at line 483
sub _check {
34810103.91ms my $this = shift();
349 my($always_die_on_error) = @_;
350
351 my($errcode, $errmsg, $addinfo, $diagset) = (undef, "x", "x", "x");
3524041.97ms $errcode = Net::Z3950::ZOOM::connection_error_x($this->_conn(), $errmsg,
# spent 1.15ms making 202 calls to Net::Z3950::ZOOM::connection_error_x, avg 6µs/call # spent 817µs making 202 calls to ZOOM::Connection::_conn, avg 4µs/call
353 $addinfo, $diagset);
354 if ($errcode) {
355 my $exception = new ZOOM::Exception($errcode, $errmsg, $addinfo,
356 $diagset);
357 if (!$this->option("async") || $always_die_on_error) {
358 ZOOM::Log::log("zoom_check", "throwing error $exception");
359 die $exception;
360 } else {
361 ZOOM::Log::log("zoom_check", "not reporting error $exception");
362 }
363 }
364}
365
366# This wrapper for _check() is called only from outside the ZOOM
367# module, and therefore only in situations where an asynchronous
368# application is actively asking for an exception to be thrown if an
369# error has been detected. So it passed always_die_on_error=1 to the
370# underlying _check() method.
371#
372sub check {
373 my $this = shift();
374 return $this->_check(1);
375}
376
377
# spent 82µs (28+54) within ZOOM::Connection::create which was called: # once (28µs+54µs) by C4::Context::_new_Zconn at line 750 of /usr/share/koha/lib/C4/Context.pm
sub create {
378781µs my $class = shift();
379 my(@options) = @_;
380
381 my $_opts;
38212µs if (@_ == 1) {
# spent 2µs making 1 call to ZOOM::Options::_opts
383 $_opts = $_[0]->_opts();
384 } else {
385 $_opts = Net::Z3950::ZOOM::options_create();
386 while (@options >= 2) {
387 my $key = shift(@options);
388 my $val = shift(@options);
389 Net::Z3950::ZOOM::options_set($_opts, $key, $val);
390 }
391
392 die "Odd number of options specified"
393 if @options;
394 }
395
396152µs my $_conn = Net::Z3950::ZOOM::connection_create($_opts);
# spent 52µs making 1 call to Net::Z3950::ZOOM::connection_create
397 my $conn = bless {
398 host => undef,
399 port => undef,
400 _conn => $_conn,
401 }, $class;
402 return $conn;
403}
404
405sub error_x {
406 my $this = shift();
407
408 my($errcode, $errmsg, $addinfo, $diagset) = (undef, "dummy", "dummy", "d");
409 $errcode = Net::Z3950::ZOOM::connection_error_x($this->_conn(), $errmsg,
410 $addinfo, $diagset);
411 return wantarray() ? ($errcode, $errmsg, $addinfo, $diagset) : $errcode;
412}
413
414sub exception {
415 my $this = shift();
416
417 my($errcode, $errmsg, $addinfo, $diagset) = $this->error_x();
418 return undef if $errcode == 0;
419 return new ZOOM::Exception($errcode, $errmsg, $addinfo, $diagset);
420}
421
422
# spent 20µs (13+8) within ZOOM::Connection::errcode which was called: # once (13µs+8µs) by C4::Context::_new_Zconn at line 756 of /usr/share/koha/lib/C4/Context.pm
sub errcode {
423218µs my $this = shift();
42428µs return Net::Z3950::ZOOM::connection_errcode($this->_conn());
# spent 6µs making 1 call to Net::Z3950::ZOOM::connection_errcode # spent 2µs making 1 call to ZOOM::Connection::_conn
425}
426
427sub errmsg {
428 my $this = shift();
429 return Net::Z3950::ZOOM::connection_errmsg($this->_conn());
430}
431
432sub addinfo {
433 my $this = shift();
434 return Net::Z3950::ZOOM::connection_addinfo($this->_conn());
435}
436
437sub diagset {
438 my $this = shift();
439 return Net::Z3950::ZOOM::connection_diagset($this->_conn());
440}
441
442
# spent 79µs (22+57) within ZOOM::Connection::connect which was called: # once (22µs+57µs) by C4::Context::_new_Zconn at line 753 of /usr/share/koha/lib/C4/Context.pm
sub connect {
443542µs my $this = shift();
444 my($host, $port) = @_;
445
446 $port = 0 if !defined $port;
447226µs Net::Z3950::ZOOM::connection_connect($this->_conn(), $host, $port);
# spent 22µs making 1 call to Net::Z3950::ZOOM::connection_connect # spent 4µs making 1 call to ZOOM::Connection::_conn
448131µs $this->_check();
# spent 31µs making 1 call to ZOOM::Connection::_check
449 # No return value
450}
451
452
# spent 92µs (54+38) within ZOOM::Connection::option which was called 3 times, avg 31µs/call: # once (36µs+24µs) by C4::Context::Zconn at line 702 of /usr/share/koha/lib/C4/Context.pm # once (12µs+11µs) by ZOOM::Query::CCL2RPN::new at line 637 # once (6µs+4µs) by ZOOM::Query::CCL2RPN::new at line 639
sub option {
4531573µs my $this = shift();
454 my($key, $value) = @_;
455
456621µs my $oldval = Net::Z3950::ZOOM::connection_option_get($this->_conn(), $key);
# spent 11µs making 3 calls to Net::Z3950::ZOOM::connection_option_get, avg 4µs/call # spent 11µs making 3 calls to ZOOM::Connection::_conn, avg 4µs/call
457217µs Net::Z3950::ZOOM::connection_option_set($this->_conn(), $key, $value)
# spent 12µs making 1 call to Net::Z3950::ZOOM::connection_option_set # spent 5µs making 1 call to ZOOM::Connection::_conn
458 if defined $value;
459
460 return $oldval;
461}
462
463sub option_binary {
464 my $this = shift();
465 my($key, $value) = @_;
466
467 my $dummylen = 0;
468 my $oldval = Net::Z3950::ZOOM::connection_option_getl($this->_conn(),
469 $key, $dummylen);
470 Net::Z3950::ZOOM::connection_option_setl($this->_conn(), $key,
471 $value, length($value))
472 if defined $value;
473
474 return $oldval;
475}
476
477
# spent 151µs (47+104) within ZOOM::Connection::search which was called: # once (47µs+104µs) by C4::Search::getRecords at line 374 of /usr/share/koha/lib/C4/Search.pm
sub search {
4785104µs my $this = shift();
479 my($query) = @_;
480
481371µs my $_rs = Net::Z3950::ZOOM::connection_search($this->_conn(),
# spent 64µs making 1 call to Net::Z3950::ZOOM::connection_search # spent 4µs making 1 call to ZOOM::Query::_query # spent 3µs making 1 call to ZOOM::Connection::_conn
482 $query->_query());
483118µs $this->_check();
# spent 18µs making 1 call to ZOOM::Connection::_check
484115µs return _new ZOOM::ResultSet($this, $query, $_rs);
# spent 15µs making 1 call to ZOOM::ResultSet::_new
485}
486
487sub search_pqf {
488 my $this = shift();
489 my($pqf) = @_;
490
491 my $_rs = Net::Z3950::ZOOM::connection_search_pqf($this->_conn(), $pqf);
492 $this->_check();
493 return _new ZOOM::ResultSet($this, $pqf, $_rs);
494}
495
496sub scan_pqf {
497 my $this = shift();
498 my($startterm) = @_;
499
500 my $_ss = Net::Z3950::ZOOM::connection_scan($this->_conn(), $startterm);
501 $this->_check();
502 return _new ZOOM::ScanSet($this, $startterm, $_ss);
503}
504
505sub scan {
506 my $this = shift();
507 my($query) = @_;
508
509 my $_ss = Net::Z3950::ZOOM::connection_scan1($this->_conn(),
510 $query->_query());
511 $this->_check();
512 return _new ZOOM::ScanSet($this, $query, $_ss);
513}
514
515sub package {
516 my $this = shift();
517 my($options) = @_;
518
519 my $_o = defined $options ? $options->_opts() :
520 Net::Z3950::ZOOM::options_create();
521 my $_p = Net::Z3950::ZOOM::connection_package($this->_conn(), $_o)
522 or ZOOM::_oops(ZOOM::Error::PACKAGE);
523
524 return _new ZOOM::Package($this, $options, $_p);
525}
526
527
# spent 202µs (136+67) within ZOOM::Connection::last_event which was called 11 times, avg 18µs/call: # 11 times (136µs+67µs) by C4::Search::_ZOOM_event_loop at line 2348 of /usr/share/koha/lib/C4/Search.pm, avg 18µs/call
sub last_event {
52822148µs my $this = shift();
529
5302267µs return Net::Z3950::ZOOM::connection_last_event($this->_conn());
# spent 36µs making 11 calls to ZOOM::Connection::_conn, avg 3µs/call # spent 31µs making 11 calls to Net::Z3950::ZOOM::connection_last_event, avg 3µs/call
531}
532
533sub is_idle {
534 my $this = shift();
535
536 return Net::Z3950::ZOOM::connection_is_idle($this->_conn());
537}
538
539sub peek_event {
540 my $this = shift();
541
542 return Net::Z3950::ZOOM::connection_peek_event($this->_conn());
543}
544
545sub destroy {
546 my $this = shift();
547
548 Net::Z3950::ZOOM::connection_destroy($this->_conn());
549 $this->{_conn} = undef;
550}
551
552
553# ----------------------------------------------------------------------------
554
555package ZOOM::Query;
556
557sub new {
558 my $class = shift();
559 die "You can't create $class objects: it's a virtual base class";
560}
561
562# PRIVATE to this class and ZOOM::Connection::search()
563
# spent 4µs within ZOOM::Query::_query which was called: # once (4µs+0s) by ZOOM::Connection::search at line 481
sub _query {
56446µs my $this = shift();
565
566 my $_query = $this->{_query};
567 die "{_query} undefined: has this Query been destroy()ed?"
568 if !defined $_query;
569
570 return $_query;
571}
572
573sub sortby {
574 my $this = shift();
575 my($sortby) = @_;
576
577 Net::Z3950::ZOOM::query_sortby($this->_query(), $sortby) == 0
578 or ZOOM::_oops(ZOOM::Error::SORTBY, $sortby);
579}
580
581sub destroy {
582 my $this = shift();
583
584 Net::Z3950::ZOOM::query_destroy($this->_query());
585 $this->{_query} = undef;
586}
587
588
589package ZOOM::Query::CQL;
590114µsour @ISA = qw(ZOOM::Query);
591
592sub new {
593 my $class = shift();
594 my($string) = @_;
595
596 my $q = Net::Z3950::ZOOM::query_create()
597 or ZOOM::_oops(ZOOM::Error::CREATE_QUERY);
598 Net::Z3950::ZOOM::query_cql($q, $string) == 0
599 or ZOOM::_oops(ZOOM::Error::QUERY_CQL, $string);
600
601 return bless {
602 _query => $q,
603 }, $class;
604}
605
606
607package ZOOM::Query::CQL2RPN;
60815µsour @ISA = qw(ZOOM::Query);
609
610sub new {
611 my $class = shift();
612 my($string, $conn) = @_;
613
614 my $q = Net::Z3950::ZOOM::query_create()
615 or ZOOM::_oops(ZOOM::Error::CREATE_QUERY);
616 # check() throws the exception we want; but we only want it on failure!
617 Net::Z3950::ZOOM::query_cql2rpn($q, $string, $conn->_conn()) == 0
618 or $conn->_check();
619
620 return bless {
621 _query => $q,
622 }, $class;
623}
624
625
626# We have to work around the retarded ZOOM_query_ccl2rpn() API
627package ZOOM::Query::CCL2RPN;
628130µsour @ISA = qw(ZOOM::Query);
629
630
# spent 2.59ms (364µs+2.23) within ZOOM::Query::CCL2RPN::new which was called: # once (364µs+2.23ms) by C4::Search::getRecords at line 374 of /usr/share/koha/lib/C4/Search.pm
sub new {
631122.32ms my $class = shift();
632 my($string, $conn) = @_;
633
634134µs my $q = Net::Z3950::ZOOM::query_create()
# spent 34µs making 1 call to Net::Z3950::ZOOM::query_create
635 or ZOOM::_oops(ZOOM::Error::CREATE_QUERY);
636
637122µs my $config = $conn->option("cclqual");
# spent 22µs making 1 call to ZOOM::Connection::option
638 if (!defined $config) {
639110µs my $cclfile = $conn->option("cclfile")
# spent 10µs making 1 call to ZOOM::Connection::option
640 or ZOOM::_oops(ZOOM::Error::CCL_CONFIG,
641 "no 'cclqual' or 'cclfile' specified");
6421222µs my $fh = new IO::File("<$cclfile")
# spent 222µs making 1 call to IO::File::new
643 or ZOOM::_oops(ZOOM::Error::CCL_CONFIG,
644 "can't open cclfile '$cclfile': $!");
6451490µs $config = join("", <$fh>);
# spent 490µs making 1 call to ZOOM::Query::CCL2RPN::CORE:readline
646130µs $fh->close();
# spent 30µs making 1 call to IO::Handle::close
647 }
648
649 my($ccl_errcode, $ccl_errstr, $ccl_errpos) = (0, "", 0);
65011.42ms if (Net::Z3950::ZOOM::query_ccl2rpn($q, $string, $config,
# spent 1.42ms making 1 call to Net::Z3950::ZOOM::query_ccl2rpn
651 $ccl_errcode, $ccl_errstr,
652 $ccl_errpos) < 0) {
653 # We have no use for $ccl_errcode or $ccl_errpos
654 ZOOM::_oops(ZOOM::Error::CCL_PARSE, $ccl_errstr);
655 }
656
657 return bless {
658 _query => $q,
659 }, $class;
660}
661
662
663package ZOOM::Query::PQF;
66414µsour @ISA = qw(ZOOM::Query);
665
666sub new {
667 my $class = shift();
668 my($string) = @_;
669
670 my $q = Net::Z3950::ZOOM::query_create()
671 or ZOOM::_oops(ZOOM::Error::CREATE_QUERY);
672 Net::Z3950::ZOOM::query_prefix($q, $string) == 0
673 or ZOOM::_oops(ZOOM::Error::QUERY_PQF, $string);
674
675 return bless {
676 _query => $q,
677 }, $class;
678}
679
680
681# ----------------------------------------------------------------------------
682
683package ZOOM::ResultSet;
684
685sub new {
686 my $class = shift();
687 die "You can't create $class objects directly";
688}
689
690# PRIVATE to ZOOM::Connection::search() and ZOOM::Connection::search_pqf()
691
# spent 15µs within ZOOM::ResultSet::_new which was called: # once (15µs+0s) by ZOOM::Connection::search at line 484
sub _new {
692317µs my $class = shift();
693 my($conn, $query, $_rs) = @_;
694
695 return bless {
696 conn => $conn,
697 query => $query, # This is not currently used, which is
698 # just as well since it could be
699 # either a string (when the RS is
700 # created with search_pqf()) or a
701 # ZOOM::Query object (when it's
702 # created with search())
703 _rs => $_rs,
704 }, $class;
705}
706
707# PRIVATE to this class
708
# spent 1.15ms within ZOOM::ResultSet::_rs which was called 202 times, avg 6µs/call: # 200 times (1.14ms+0s) by ZOOM::ResultSet::record at line 739, avg 6µs/call # once (12µs+0s) by ZOOM::ResultSet::size at line 732 # once (5µs+0s) by ZOOM::ResultSet::destroy at line 823
sub _rs {
7098081.73ms my $this = shift();
710
711 my $_rs = $this->{_rs};
712 die "{_rs} undefined: has this ResultSet been destroy()ed?"
713 if !defined $_rs;
714
715 return $_rs;
716}
717
718sub option {
719 my $this = shift();
720 my($key, $value) = @_;
721
722 my $oldval = Net::Z3950::ZOOM::resultset_option_get($this->_rs(), $key);
723 Net::Z3950::ZOOM::resultset_option_set($this->_rs(), $key, $value)
724 if defined $value;
725
726 return $oldval;
727}
728
729
# spent 71µs (37+34) within ZOOM::ResultSet::size which was called: # once (37µs+34µs) by C4::Search::_ZOOM_event_loop at line 2351 of /usr/share/koha/lib/C4/Search.pm
sub size {
730253µs my $this = shift();
731
732234µs return Net::Z3950::ZOOM::resultset_size($this->_rs());
# spent 23µs making 1 call to Net::Z3950::ZOOM::resultset_size # spent 12µs making 1 call to ZOOM::ResultSet::_rs
733}
734
735
# spent 45.4ms (5.23+40.2) within ZOOM::ResultSet::record which was called 200 times, avg 227µs/call: # 175 times (4.21ms+8.43ms) by C4::Search::__ANON__[/usr/share/koha/lib/C4/Search.pm:670] at line 506 of /usr/share/koha/lib/C4/Search.pm, avg 72µs/call # 25 times (1.02ms+31.8ms) by C4::Search::__ANON__[/usr/share/koha/lib/C4/Search.pm:670] at line 490 of /usr/share/koha/lib/C4/Search.pm, avg 1.31ms/call
sub record {
736120036.3ms my $this = shift();
737 my($which) = @_;
738
73940033.0ms my $_rec = Net::Z3950::ZOOM::resultset_record($this->_rs(), $which);
# spent 31.8ms making 200 calls to Net::Z3950::ZOOM::resultset_record, avg 159µs/call # spent 1.14ms making 200 calls to ZOOM::ResultSet::_rs, avg 6µs/call
7402005.23ms $this->{conn}->_check();
# spent 5.23ms making 200 calls to ZOOM::Connection::_check, avg 26µs/call
741
742 # Even if no error has occurred, I think record() might
743 # legitimately return undef if we're running in asynchronous mode
744 # and the record just hasn't been retrieved yet. This goes double
745 # for record_immediate().
746 return undef if !defined $_rec;
747
748 # For some reason, I have to use the explicit "->" syntax in order
749 # to invoke the ZOOM::Record constructor here, even though I don't
750 # have to do the same for _new ZOOM::ResultSet above. Weird.
7512002.01ms return ZOOM::Record->_new($this, $which, $_rec);
# spent 2.01ms making 200 calls to ZOOM::Record::_new, avg 10µs/call
752}
753
754sub record_immediate {
755 my $this = shift();
756 my($which) = @_;
757
758 my $_rec = Net::Z3950::ZOOM::resultset_record_immediate($this->_rs(),
759 $which);
760 $this->{conn}->_check();
761 # The record might legitimately not be there yet
762 return undef if !defined $_rec;
763
764 return ZOOM::Record->_new($this, $which, $_rec);
765}
766
767sub cache_reset {
768 my $this = shift();
769
770 Net::Z3950::ZOOM::resultset_cache_reset($this->_rs());
771}
772
773sub records {
774 my $this = shift();
775 my($start, $count, $return_records) = @_;
776
777 # If the request is out of range, ZOOM-C will currently (as of YAZ
778 # 2.1.38) no-op: it understandably refuses to build and send a
779 # known-bad APDU, but it doesn't set a diagnostic as it ought. So
780 # for now, we do it here. It would be more polite to stash the
781 # error-code in the ZOOM-C connection object for subsequent
782 # discovery (which is what ZOOM-C will presumably do itself when
783 # it's fixed) but since there is no API that allows us to do that,
784 # we just have to throw the exception right now. That's probably
785 # OK for synchronous applications, but not really for
786 # multiplexers.
787 my $size = $this->size();
788 if ($start + $count-1 >= $size) {
789 # BIB-1 diagnostic 13 is "Present request out-of-range"
790 ZOOM::_oops(13, undef, "BIB-1");
791 }
792
793 my $raw = Net::Z3950::ZOOM::resultset_records($this->_rs(), $start, $count,
794 $return_records);
795 # By design, $raw may be undefined (if $return_records is true)
796 return undef if !defined $raw;
797
798 # We need to package up the returned records in ZOOM::Record objects
799 my @res = ();
800 for my $i (0 .. @$raw-1) {
801 my $_rec = $raw->[$i];
802 if (!defined $_rec) {
803 push @res, undef;
804 } else {
805 push @res, ZOOM::Record->_new($this, $start+$i, $_rec);
806 }
807 }
808
809 return \@res;
810}
811
812sub sort {
813 my $this = shift();
814 my($sort_type, $sort_spec) = @_;
815
816 return Net::Z3950::ZOOM::resultset_sort1($this->_rs(),
817 $sort_type, $sort_spec);
818}
819
820
# spent 77µs (21+56) within ZOOM::ResultSet::destroy which was called: # once (21µs+56µs) by C4::Search::_ZOOM_event_loop at line 2359 of /usr/share/koha/lib/C4/Search.pm
sub destroy {
821371µs my $this = shift();
822
823256µs Net::Z3950::ZOOM::resultset_destroy($this->_rs());
# spent 51µs making 1 call to Net::Z3950::ZOOM::resultset_destroy # spent 5µs making 1 call to ZOOM::ResultSet::_rs
824 $this->{_rs} = undef;
825}
826
827
828# ----------------------------------------------------------------------------
829
830package ZOOM::Record;
831
832sub new {
833 my $class = shift();
834 die "You can't create $class objects directly";
835}
836
837# PRIVATE to ZOOM::ResultSet::record(),
838# ZOOM::ResultSet::record_immediate(), ZOOM::ResultSet::records() and
839# ZOOM::Record::clone()
840#
841
# spent 2.01ms within ZOOM::Record::_new which was called 200 times, avg 10µs/call: # 200 times (2.01ms+0s) by ZOOM::ResultSet::record at line 751, avg 10µs/call
sub _new {
8426002.34ms my $class = shift();
843 my($rs, $which, $_rec) = @_;
844
845 return bless {
846 rs => $rs,
847 which => $which,
848 _rec => $_rec,
849 }, $class;
850}
851
852# PRIVATE to this class
853
# spent 769µs within ZOOM::Record::_rec which was called 200 times, avg 4µs/call: # 200 times (769µs+0s) by ZOOM::Record::get at line 899, avg 4µs/call
sub _rec {
8548001.22ms my $this = shift();
855
856 my $_rec = $this->{_rec};
857 die "{_rec} undefined: has this Record been destroy()ed?"
858 if !defined $_rec;
859
860 return $_rec;
861}
862
863sub error {
864 my $this = shift();
865
866 my($errcode, $errmsg, $addinfo, $diagset) = (undef, "dummy", "dummy", "d");
867 $errcode = Net::Z3950::ZOOM::record_error($this->_rec(), $errmsg,
868 $addinfo, $diagset);
869
870 return wantarray() ? ($errcode, $errmsg, $addinfo, $diagset) : $errcode;
871}
872
873sub exception {
874 my $this = shift();
875
876 my($errcode, $errmsg, $addinfo, $diagset) = $this->error();
877 return undef if $errcode == 0;
878 return new ZOOM::Exception($errcode, $errmsg, $addinfo, $diagset);
879}
880
881
882
# spent 14.8ms (1.18+13.6) within ZOOM::Record::render which was called 175 times, avg 84µs/call: # 175 times (1.18ms+13.6ms) by C4::Search::__ANON__[/usr/share/koha/lib/C4/Search.pm:670] at line 506 of /usr/share/koha/lib/C4/Search.pm, avg 84µs/call
sub render {
883350980µs my $this = shift();
884
88517513.6ms return $this->get("render", @_);
# spent 13.6ms making 175 calls to ZOOM::Record::get, avg 78µs/call
886}
887
888
# spent 3.69ms (190µs+3.50) within ZOOM::Record::raw which was called 25 times, avg 147µs/call: # 25 times (190µs+3.50ms) by C4::Search::__ANON__[/usr/share/koha/lib/C4/Search.pm:670] at line 490 of /usr/share/koha/lib/C4/Search.pm, avg 147µs/call
sub raw {
88950181µs my $this = shift();
890
891253.50ms return $this->get("raw", @_);
# spent 3.50ms making 25 calls to ZOOM::Record::get, avg 140µs/call
892}
893
894
# spent 17.1ms (2.28+14.8) within ZOOM::Record::get which was called 200 times, avg 85µs/call: # 175 times (1.85ms+11.7ms) by ZOOM::Record::render at line 885, avg 78µs/call # 25 times (439µs+3.06ms) by ZOOM::Record::raw at line 891, avg 140µs/call
sub get {
8958001.73ms my $this = shift();
896 my($type, $args) = @_;
897
898 $type = "$type;$args" if defined $args;
89940014.8ms return Net::Z3950::ZOOM::record_get($this->_rec(), $type);
# spent 14.0ms making 200 calls to Net::Z3950::ZOOM::record_get, avg 70µs/call # spent 769µs making 200 calls to ZOOM::Record::_rec, avg 4µs/call
900}
901
902sub clone {
903 my $this = shift();
904
905 my $raw = Net::Z3950::ZOOM::record_clone($this->_rec())
906 or ZOOM::_oops(ZOOM::Error::CLONE);
907
908 # Arg 1 (rs) is undefined as the new record doesn't belong to an RS
909 return _new ZOOM::Record(undef, undef, $raw);
910}
911
912sub destroy {
913 my $this = shift();
914
915 Net::Z3950::ZOOM::record_destroy($this->_rec());
916 $this->{_rec} = undef;
917}
918
919
920# ----------------------------------------------------------------------------
921
922package ZOOM::ScanSet;
923
924sub new {
925 my $class = shift();
926 die "You can't create $class objects directly";
927}
928
929# PRIVATE to ZOOM::Connection::scan(),
930sub _new {
931 my $class = shift();
932 my($conn, $startterm, $_ss) = @_;
933
934 return bless {
935 conn => $conn,
936 startterm => $startterm,# This is not currently used, which is
937 # just as well since it could be
938 # either a string (when the SS is
939 # created with scan()) or a
940 # ZOOM::Query object (when it's
941 # created with scan1())
942 _ss => $_ss,
943 }, $class;
944}
945
946# PRIVATE to this class
947sub _ss {
948 my $this = shift();
949
950 my $_ss = $this->{_ss};
951 die "{_ss} undefined: has this ScanSet been destroy()ed?"
952 if !defined $_ss;
953
954 return $_ss;
955}
956
957sub option {
958 my $this = shift();
959 my($key, $value) = @_;
960
961 my $oldval = Net::Z3950::ZOOM::scanset_option_get($this->_ss(), $key);
962 Net::Z3950::ZOOM::scanset_option_set($this->_ss(), $key, $value)
963 if defined $value;
964
965 return $oldval;
966}
967
968sub size {
969 my $this = shift();
970
971 return Net::Z3950::ZOOM::scanset_size($this->_ss());
972}
973
974sub term {
975 my $this = shift();
976 my($which) = @_;
977
978 my($occ, $len) = (0, 0);
979 my $term = Net::Z3950::ZOOM::scanset_term($this->_ss(), $which,
980 $occ, $len)
981 or ZOOM::_oops(ZOOM::Error::SCANTERM);
982
983 die "length of term '$term' differs from returned len=$len"
984 if length($term) != $len;
985
986 return ($term, $occ);
987}
988
989sub display_term {
990 my $this = shift();
991 my($which) = @_;
992
993 my($occ, $len) = (0, 0);
994 my $term = Net::Z3950::ZOOM::scanset_display_term($this->_ss(), $which,
995 $occ, $len)
996 or ZOOM::_oops(ZOOM::Error::SCANTERM);
997
998 die "length of display term '$term' differs from returned len=$len"
999 if length($term) != $len;
1000
1001 return ($term, $occ);
1002}
1003
1004sub destroy {
1005 my $this = shift();
1006
1007 Net::Z3950::ZOOM::scanset_destroy($this->_ss());
1008 $this->{_ss} = undef;
1009}
1010
1011
1012# ----------------------------------------------------------------------------
1013
1014package ZOOM::Package;
1015
1016sub new {
1017 my $class = shift();
1018 die "You can't create $class objects directly";
1019}
1020
1021# PRIVATE to ZOOM::Connection::package(),
1022sub _new {
1023 my $class = shift();
1024 my($conn, $options, $_p) = @_;
1025
1026 return bless {
1027 conn => $conn,
1028 options => $options,
1029 _p => $_p,
1030 }, $class;
1031}
1032
1033# PRIVATE to this class
1034sub _p {
1035 my $this = shift();
1036
1037 my $_p = $this->{_p};
1038 die "{_p} undefined: has this Package been destroy()ed?"
1039 if !defined $_p;
1040
1041 return $_p;
1042}
1043
1044sub option {
1045 my $this = shift();
1046 my($key, $value) = @_;
1047
1048 my $oldval = Net::Z3950::ZOOM::package_option_get($this->_p(), $key);
1049 Net::Z3950::ZOOM::package_option_set($this->_p(), $key, $value)
1050 if defined $value;
1051
1052 return $oldval;
1053}
1054
1055sub send {
1056 my $this = shift();
1057 my($type) = @_;
1058
1059 Net::Z3950::ZOOM::package_send($this->_p(), $type);
1060 $this->{conn}->_check();
1061}
1062
1063sub destroy {
1064 my $this = shift();
1065
1066 Net::Z3950::ZOOM::package_destroy($this->_p());
1067 $this->{_p} = undef;
1068}
1069
1070
1071# There follows trivial support for YAZ logging. This is wired out
1072# into the Net::Z3950::ZOOM package, and we here provide wrapper
1073# functions -- nothing more than aliases, really -- in the ZOOM::Log
1074# package. There really is no point in inventing an OO interface.
1075#
1076# Passing @_ directly to the underlying Net::Z3950::ZOOM::* functions
1077# doesn't work, for reasons that I can't begin to fathom, and that
1078# don't particularly interest me. Unpacking into scalars and passing
1079# those _does_ work, so that's what we do.
1080
1081package ZOOM::Log;
1082
1083268µs150µs
# spent 67µs (17+50) within ZOOM::Log::mask_str which was called: # once (17µs+50µs) by ZOOM::Log::BEGIN@1107 at line 1107
sub mask_str { my($a) = @_; Net::Z3950::ZOOM::yaz_log_mask_str($a); }
# spent 50µs making 1 call to Net::Z3950::ZOOM::yaz_log_mask_str
1084sub module_level { my($a) = @_; Net::Z3950::ZOOM::yaz_log_module_level($a); }
1085sub init { my($a, $b, $c) = @_;
1086 Net::Z3950::ZOOM::yaz_log_init($a, $b, $c) }
1087sub init_file { my($a) = @_; Net::Z3950::ZOOM::yaz_log_init_file($a) }
1088sub init_level { my($a) = @_; Net::Z3950::ZOOM::yaz_log_init_level($a) }
1089sub init_prefix { my($a) = @_; Net::Z3950::ZOOM::yaz_log_init_prefix($a) }
1090sub time_format { my($a) = @_; Net::Z3950::ZOOM::yaz_log_time_format($a) }
1091sub init_max_size { my($a) = @_; Net::Z3950::ZOOM::yaz_log_init_max_size($a) }
1092
1093sub log {
1094 my($level, @message) = @_;
1095
1096 if ($level !~ /^(0x)?\d+$/) {
1097 # Assuming its log-level name, we look it up.
1098 my $num = module_level($level);
1099 ZOOM::_oops(ZOOM::Error::LOGLEVEL, $level)
1100 if $num == 0;
1101 $level = $num;
1102 }
1103
1104 Net::Z3950::ZOOM::yaz_log($level, join("", @message));
1105}
1106
1107158µs2145µs
# spent 79µs (12+67) within ZOOM::Log::BEGIN@1107 which was called: # once (12µs+67µs) by C4::Context::BEGIN@102 at line 1107
BEGIN { ZOOM::Log::mask_str("zoom_check"); }
# spent 79µs making 1 call to ZOOM::Log::BEGIN@1107 # spent 67µs making 1 call to ZOOM::Log::mask_str
1108
110918µs1;
 
# spent 17µs within C4::Context::CORE:ftdir which was called: # once (17µs+0s) by C4::Context::KOHAVERSION at line 217 of /usr/share/koha/lib/C4/Context.pm
sub C4::Context::CORE:ftdir; # opcode
# spent 37µs within C4::Context::CORE:ftsize which was called 3 times, avg 12µs/call: # 3 times (37µs+0s) by C4::Context::new at line 364 of /usr/share/koha/lib/C4/Context.pm, avg 12µs/call
sub C4::Context::CORE:ftsize; # opcode
# spent 30µs within C4::Context::CORE:subst which was called 3 times, avg 10µs/call: # 3 times (30µs+0s) by C4::Context::AUTOLOAD at line 658 of /usr/share/koha/lib/C4/Context.pm, avg 10µs/call
sub C4::Context::CORE:subst; # opcode
# spent 490µs within ZOOM::Query::CCL2RPN::CORE:readline which was called: # once (490µs+0s) by ZOOM::Query::CCL2RPN::new at line 645
sub ZOOM::Query::CCL2RPN::CORE:readline; # opcode