← 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 11:58:52 2013
Reported on Tue Oct 15 12:01:01 2013

Filename/usr/share/koha/lib/C4/Context.pm
StatementsExecuted 10554 statements in 1.63s
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
1482301336.5ms1.49sC4::Context::::dbhC4::Context::dbh
13551021316.3ms394msC4::Context::::preferenceC4::Context::preference
11115.0ms29.4msC4::Context::::BEGIN@101C4::Context::BEGIN@101
11113.8ms14.8msC4::Context::::BEGIN@103C4::Context::BEGIN@103
11110.5ms30.3msC4::Context::::BEGIN@102C4::Context::BEGIN@102
1113.53ms18.2msC4::Context::::BEGIN@107C4::Context::BEGIN@107
1112.17ms15.1msC4::Context::::BEGIN@108C4::Context::BEGIN@108
1112.16ms5.87msC4::Context::::_new_marcfromkohafieldC4::Context::_new_marcfromkohafield
1111.38ms6.39msC4::Context::::BEGIN@106C4::Context::BEGIN@106
111714µs5.25msC4::Context::::BEGIN@104C4::Context::BEGIN@104
111712µs1.52msC4::Context::::BEGIN@21C4::Context::BEGIN@21
111689µs1.25msC4::Context::::BEGIN@105C4::Context::BEGIN@105
4511532µs532µsC4::Context::::_common_configC4::Context::_common_config
9321496µs6.36msC4::Context::::marcfromkohafieldC4::Context::marcfromkohafield
4154486µs486µsC4::Context::::userenvC4::Context::userenv
45188468µs1000µsC4::Context::::configC4::Context::config
111356µs517µsC4::Context::::KOHAVERSIONC4::Context::KOHAVERSION
111256µs54.6msC4::Context::::_new_dbhC4::Context::_new_dbh
333201µs189msC4::Context::::newC4::Context::new
414141156µs106msC4::Context::::importC4::Context::import
111131µs800µsC4::Context::::_new_ZconnC4::Context::_new_Zconn
33279µs175µsC4::Context::::AUTOLOADC4::Context::AUTOLOAD
31153µs188msC4::Context::::read_config_fileC4::Context::read_config_file
11136µs889µsC4::Context::::ZconnC4::Context::Zconn
11133µs71µsC4::Context::::BEGIN@1203C4::Context::BEGIN@1203
11124µs30µsC4::Context::::BEGIN@19C4::Context::BEGIN@19
11120µs39µsC4::Context::::BEGIN@20C4::Context::BEGIN@20
22214µs14µsC4::Context::::ismemcachedC4::Context::ismemcached
11113µs72µsC4::Context::::BEGIN@191C4::Context::BEGIN@191
11113µs13µsC4::Context::::BEGIN@23C4::Context::BEGIN@23
11112µs12µsC4::Context::::_new_userenvC4::Context::_new_userenv
11111µs11µsXML::Simple::::BEGIN@1023XML::Simple::BEGIN@1023
1116µs6µsC4::Context::::set_contextC4::Context::set_context
1115µs5µsC4::Context::::db_scheme2dbiC4::Context::db_scheme2dbi
0000s0sC4::Context::::ModZebrationsC4::Context::ModZebrations
0000s0sC4::Context::::_new_queryparserC4::Context::_new_queryparser
0000s0sC4::Context::::_new_stopwordsC4::Context::_new_stopwords
0000s0sC4::Context::::_unset_userenvC4::Context::_unset_userenv
0000s0sC4::Context::::boolean_preferenceC4::Context::boolean_preference
0000s0sC4::Context::::clear_syspref_cacheC4::Context::clear_syspref_cache
0000s0sC4::Context::::disable_syspref_cacheC4::Context::disable_syspref_cache
0000s0sC4::Context::::enable_syspref_cacheC4::Context::enable_syspref_cache
0000s0sC4::Context::::final_linear_versionC4::Context::final_linear_version
0000s0sC4::Context::::get_shelves_userenvC4::Context::get_shelves_userenv
0000s0sC4::Context::::get_versionsC4::Context::get_versions
0000s0sC4::Context::::handle_errorsC4::Context::handle_errors
0000s0sC4::Context::::memcachedC4::Context::memcached
0000s0sC4::Context::::new_dbhC4::Context::new_dbh
0000s0sC4::Context::::queryparserC4::Context::queryparser
0000s0sC4::Context::::restore_contextC4::Context::restore_context
0000s0sC4::Context::::restore_dbhC4::Context::restore_dbh
0000s0sC4::Context::::set_dbhC4::Context::set_dbh
0000s0sC4::Context::::set_preferenceC4::Context::set_preference
0000s0sC4::Context::::set_shelves_userenvC4::Context::set_shelves_userenv
0000s0sC4::Context::::set_userenvC4::Context::set_userenv
0000s0sC4::Context::::stopwordsC4::Context::stopwords
0000s0sC4::Context::::tzC4::Context::tz
0000s0sC4::Context::::zebraconfigC4::Context::zebraconfig
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package C4::Context;
2# Copyright 2002 Katipo Communications
3#
4# This file is part of Koha.
5#
6# Koha is free software; you can redistribute it and/or modify it under the
7# terms of the GNU General Public License as published by the Free Software
8# Foundation; either version 2 of the License, or (at your option) any later
9# version.
10#
11# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
12# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License along
16# with Koha; if not, write to the Free Software Foundation, Inc.,
17# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
19344µs236µs
# spent 30µs (24+6) within C4::Context::BEGIN@19 which was called: # once (24µs+6µs) by main::BEGIN@31 at line 19
use strict;
# spent 30µs making 1 call to C4::Context::BEGIN@19 # spent 6µs making 1 call to strict::import
20353µs258µs
# spent 39µs (20+19) within C4::Context::BEGIN@20 which was called: # once (20µs+19µs) by main::BEGIN@31 at line 20
use warnings;
# spent 39µs making 1 call to C4::Context::BEGIN@20 # spent 19µs making 1 call to warnings::import
213727µs21.71ms
# spent 1.52ms (712µs+808µs) within C4::Context::BEGIN@21 which was called: # once (712µs+808µs) by main::BEGIN@31 at line 21
use vars qw($VERSION $AUTOLOAD $context @context_stack $servers $memcached $ismemcached);
# spent 1.52ms making 1 call to C4::Context::BEGIN@21 # spent 193µs making 1 call to vars::import
22
23
# spent 13µs within C4::Context::BEGIN@23 which was called: # once (13µs+0s) by main::BEGIN@31 at line 99
BEGIN {
24412µs if ($ENV{'HTTP_USER_AGENT'}) {
25 require CGI::Carp;
26 # FIXME for future reference, CGI::Carp doc says
27 # "Note that fatalsToBrowser does not work with mod_perl version 2.0 and higher."
28 import CGI::Carp qw(fatalsToBrowser);
29 sub handle_errors {
30 my $msg = shift;
31118µs111µs my $debug_level;
# spent 11µs making 1 call to XML::Simple::BEGIN@1023
32 eval {C4::Context->dbh();};
33 if ($@){
34 $debug_level = 1;
35 }
36 else {
37 $debug_level = C4::Context->preference("DebugLevel");
38 }
39
40 print q(<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
41 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
42 <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
43 <head><title>Koha Error</title></head>
44 <body>
45 );
46 if ($debug_level eq "2"){
47 # debug 2 , print extra info too.
48 my %versions = get_versions();
49
50 # a little example table with various version info";
51 print "
52 <h1>Koha error</h1>
53 <p>The following fatal error has occurred:</p>
54 <pre><code>$msg</code></pre>
55 <table>
56 <tr><th>Apache</th><td> $versions{apacheVersion}</td></tr>
57 <tr><th>Koha</th><td> $versions{kohaVersion}</td></tr>
58 <tr><th>Koha DB</th><td> $versions{kohaDbVersion}</td></tr>
59 <tr><th>MySQL</th><td> $versions{mysqlVersion}</td></tr>
60 <tr><th>OS</th><td> $versions{osVersion}</td></tr>
61 <tr><th>Perl</th><td> $versions{perlVersion}</td></tr>
62 </table>";
63
64 } elsif ($debug_level eq "1"){
65 print "
66 <h1>Koha error</h1>
67 <p>The following fatal error has occurred:</p>
68 <pre><code>$msg</code></pre>";
69 } else {
70 print "<p>production mode - trapped fatal error</p>";
71 }
72 print "</body></html>";
73 }
74 #CGI::Carp::set_message(\&handle_errors);
75 ## give a stack backtrace if KOHA_BACKTRACES is set
76 ## can't rely on DebugLevel for this, as we're not yet connected
77 if ($ENV{KOHA_BACKTRACES}) {
78 $main::SIG{__DIE__} = \&CGI::Carp::confess;
79 }
80 } # else there is no browser to send fatals to!
81
82 # Check if there are memcached servers set
83 $servers = $ENV{'MEMCACHED_SERVERS'};
84 if ($servers) {
85 # Load required libraries and create the memcached object
86 require Cache::Memcached;
87 $memcached = Cache::Memcached->new({
88 servers => [ $servers ],
89 debug => 0,
90 compress_threshold => 10_000,
91 expire_time => 600,
92 namespace => $ENV{'MEMCACHED_NAMESPACE'} || 'koha'
93 });
94 # Verify memcached available (set a variable and test the output)
95 $ismemcached = $memcached->set('ismemcached','1');
96 }
97
98 $VERSION = '3.07.00.049';
99144µs113µs}
# spent 13µs making 1 call to C4::Context::BEGIN@23
100
1013211µs229.4ms
# spent 29.4ms (15.0+14.4) within C4::Context::BEGIN@101 which was called: # once (15.0ms+14.4ms) by main::BEGIN@31 at line 101
use DBI;
# spent 29.4ms making 1 call to C4::Context::BEGIN@101 # spent 63µs making 1 call to Exporter::import
1023277µs130.3ms
# spent 30.3ms (10.5+19.8) within C4::Context::BEGIN@102 which was called: # once (10.5ms+19.8ms) by main::BEGIN@31 at line 102
use ZOOM;
# spent 30.3ms making 1 call to C4::Context::BEGIN@102
1033252µs214.9ms
# spent 14.8ms (13.8+977µs) within C4::Context::BEGIN@103 which was called: # once (13.8ms+977µs) by main::BEGIN@31 at line 103
use XML::Simple;
# spent 14.8ms making 1 call to C4::Context::BEGIN@103 # spent 42µs making 1 call to XML::Simple::import
1043218µs25.32ms
# spent 5.25ms (714µs+4.54) within C4::Context::BEGIN@104 which was called: # once (714µs+4.54ms) by main::BEGIN@31 at line 104
use C4::Boolean;
# spent 5.25ms making 1 call to C4::Context::BEGIN@104 # spent 61µs making 1 call to Exporter::import
1053199µs21.45ms
# spent 1.25ms (689µs+560µs) within C4::Context::BEGIN@105 which was called: # once (689µs+560µs) by main::BEGIN@31 at line 105
use C4::Debug;
# spent 1.25ms making 1 call to C4::Context::BEGIN@105 # spent 204µs making 1 call to Exporter::import
1063192µs16.39ms
# spent 6.39ms (1.38+5.01) within C4::Context::BEGIN@106 which was called: # once (1.38ms+5.01ms) by main::BEGIN@31 at line 106
use POSIX ();
# spent 6.39ms making 1 call to C4::Context::BEGIN@106
1073211µs118.2ms
# spent 18.2ms (3.53+14.7) within C4::Context::BEGIN@107 which was called: # once (3.53ms+14.7ms) by main::BEGIN@31 at line 107
use DateTime::TimeZone;
# spent 18.2ms making 1 call to C4::Context::BEGIN@107
1083226µs215.1ms
# spent 15.1ms (2.17+12.9) within C4::Context::BEGIN@108 which was called: # once (2.17ms+12.9ms) by main::BEGIN@31 at line 108
use Module::Load::Conditional qw(can_load);
# spent 15.1ms making 1 call to C4::Context::BEGIN@108 # spent 79µs making 1 call to Exporter::import
109
110=head1 NAME
111
- -
161#'
162# In addition to what is said in the POD above, a Context object is a
163# reference-to-hash with the following fields:
164#
165# config
166# A reference-to-hash whose keys and values are the
167# configuration variables and values specified in the config
168# file (/etc/koha/koha-conf.xml).
169# dbh
170# A handle to the appropriate database for this context.
171# dbh_stack
172# Used by &set_dbh and &restore_dbh to hold other database
173# handles for this context.
174# Zconn
175# A connection object for the Zebra server
176
177# Koha's main configuration file koha-conf.xml
178# is searched for according to this priority list:
179#
180# 1. Path supplied via use C4::Context '/path/to/koha-conf.xml'
181# 2. Path supplied in KOHA_CONF environment variable.
182# 3. Path supplied in INSTALLED_CONFIG_FNAME, as long
183# as value has changed from its default of
184# '/etc/koha/koha-conf.xml', as happens
185# when Koha is installed in 'standard' or 'single'
186# mode.
187# 4. Path supplied in CONFIG_FNAME.
188#
189# The first entry that refers to a readable file is used.
190
19132.94ms2130µs
# spent 72µs (13+59) within C4::Context::BEGIN@191 which was called: # once (13µs+59µs) by main::BEGIN@31 at line 191
use constant CONFIG_FNAME => "/etc/koha/koha-conf.xml";
# spent 72µs making 1 call to C4::Context::BEGIN@191 # spent 59µs making 1 call to constant::import
192 # Default config file, if none is specified
193
19411µsmy $INSTALLED_CONFIG_FNAME = '/etc/koha/koha-conf.xml';
195 # path to config file set by installer
196 # /etc/koha is set by rewrite-confg.PL
197 # when Koha is installed in 'standard' or 'single'
198 # mode. If Koha was installed in 'dev' mode,
199 # /etc/koha is *not* rewritten; instead
200 # developers should set the KOHA_CONF environment variable
201
2021600ns$context = undef; # Initially, no context is set
20312µs@context_stack = (); # Initially, no saved contexts
204
205
206=head2 KOHAVERSION
207
- -
212
# spent 517µs (356+161) within C4::Context::KOHAVERSION which was called: # once (356µs+161µs) by C4::Auth::_version_check at line 571 of /usr/share/koha/lib/C4/Auth.pm
sub KOHAVERSION {
2134258µs189µs my $cgidir = C4::Context->intranetdir;
# spent 89µs making 1 call to C4::Context::AUTOLOAD
214
215 # Apparently the GIT code does not run out of a CGI-BIN subdirectory
216 # but distribution code does? (Stan, 1jan08)
217124µs if(-d $cgidir . "/cgi-bin"){
# spent 24µs making 1 call to C4::Context::CORE:ftdir
218 my $cgidir .= "/cgi-bin";
219 }
220
221 do $cgidir."/kohaversion.pl" || die "NO $cgidir/kohaversion.pl";
22215µs return kohaversion();
# spent 5µs making 1 call to C4::Context::kohaversion
223}
224
225=head2 final_linear_version
226
- -
232sub final_linear_version {
233 return KOHAVERSION;
234}
235
236=head2 read_config_file
237
- -
261
# spent 188ms (53µs+188) within C4::Context::read_config_file which was called 3 times, avg 62.8ms/call: # 3 times (53µs+188ms) by C4::Context::new at line 387, avg 62.8ms/call
sub read_config_file { # Pass argument naming config file to read
262959µs3188ms my $koha = XMLin(shift, keyattr => ['id'], forcearray => ['listen', 'server', 'serverinfo'], suppressempty => '');
# spent 188ms making 3 calls to XML::Simple::XMLin, avg 62.7ms/call
263
264 if ($ismemcached) {
265 $memcached->set('kohaconf',$koha);
266 }
267
268 return $koha; # Return value: ref-to-hash holding the configuration
269}
270
271=head2 ismemcached
272
- -
277
# spent 14µs within C4::Context::ismemcached which was called 2 times, avg 7µs/call: # once (9µs+0s) by C4::Reserves::BEGIN@27 at line 144 of /usr/share/koha/lib/C4/Biblio.pm # once (4µs+0s) by C4::Templates::BEGIN@35 at line 29 of /usr/share/koha/lib/C4/Languages.pm
sub ismemcached {
278232µs return $ismemcached;
279}
280
281=head2 memcached
282
- -
288sub memcached {
289 if ($ismemcached) {
290 return $memcached;
291 } else {
292 return;
293 }
294}
295
296# db_scheme2dbi
297# Translates the full text name of a database into de appropiate dbi name
298#
299
# spent 5µs within C4::Context::db_scheme2dbi which was called: # once (5µs+0s) by C4::Context::_new_dbh at line 792
sub db_scheme2dbi {
30025µs my $name = shift;
301 # for instance, we support only mysql, so don't care checking
302 return "mysql";
303 for ($name) {
304# FIXME - Should have other databases.
305 if (/mysql/) { return("mysql"); }
306 if (/Postgres|Pg|PostgresSQL/) { return("Pg"); }
307 if (/oracle/) { return("Oracle"); }
308 }
309 return; # Just in case
310}
311
312
# spent 106ms (156µs+105) within C4::Context::import which was called 41 times, avg 2.57ms/call: # once (15µs+105ms) by main::BEGIN@31 at line 31 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (7µs+0s) by C4::Accounts::BEGIN@23 at line 23 of /usr/share/koha/lib/C4/Accounts.pm # once (6µs+0s) by C4::Items::BEGIN@25 at line 25 of /usr/share/koha/lib/C4/Items.pm # once (6µs+0s) by C4::Tags::BEGIN@26 at line 26 of /usr/share/koha/lib/C4/Tags.pm # once (5µs+0s) by C4::XSLT::BEGIN@26 at line 26 of /usr/share/koha/lib/C4/XSLT.pm # once (5µs+0s) by Koha::Calendar::BEGIN@9 at line 9 of /usr/share/koha/lib/Koha/Calendar.pm # once (5µs+0s) by C4::Members::Attributes::BEGIN@24 at line 24 of /usr/share/koha/lib/C4/Members/Attributes.pm # once (5µs+0s) by C4::Budgets::BEGIN@22 at line 22 of /usr/share/koha/lib/C4/Budgets.pm # once (4µs+0s) by C4::Auth::BEGIN@28 at line 28 of /usr/share/koha/lib/C4/Auth.pm # once (4µs+0s) by C4::Overdues::BEGIN@27 at line 27 of /usr/share/koha/lib/C4/Overdues.pm # once (4µs+0s) by C4::ItemCirculationAlertPreference::BEGIN@22 at line 22 of /usr/share/koha/lib/C4/ItemCirculationAlertPreference.pm # once (4µs+0s) by C4::Circulation::BEGIN@25 at line 25 of /usr/share/koha/lib/C4/Circulation.pm # once (4µs+0s) by C4::ClassSource::BEGIN@24 at line 24 of /usr/share/koha/lib/C4/ClassSource.pm # once (4µs+0s) by C4::VirtualShelves::BEGIN@24 at line 24 of /usr/share/koha/lib/C4/VirtualShelves.pm # once (4µs+0s) by C4::Search::BEGIN@21 at line 21 of /usr/share/koha/lib/C4/Search.pm # once (4µs+0s) by C4::Branch::BEGIN@22 at line 22 of /usr/share/koha/lib/C4/Branch.pm # once (4µs+0s) by C4::Auth_with_cas::BEGIN@24 at line 24 of /usr/share/koha/lib/C4/Auth_with_cas.pm # once (4µs+0s) by C4::Koha::BEGIN@26 at line 26 of /usr/share/koha/lib/C4/Koha.pm # once (4µs+0s) by C4::SocialData::BEGIN@20 at line 20 of /usr/share/koha/lib/C4/SocialData.pm # once (4µs+0s) by C4::Linker::BEGIN@48 at line 48 of /usr/share/koha/lib/C4/Linker.pm # once (4µs+0s) by C4::Languages::BEGIN@25 at line 25 of /usr/share/koha/lib/C4/Languages.pm # once (3µs+0s) by Koha::DateUtils::BEGIN@24 at line 24 of /usr/share/koha/lib/Koha/DateUtils.pm # once (3µs+0s) by C4::Auth_with_ldap::BEGIN@25 at line 25 of /usr/share/koha/lib/C4/Auth_with_ldap.pm # once (3µs+0s) by C4::Output::BEGIN@33 at line 33 of /usr/share/koha/lib/C4/Output.pm # once (3µs+0s) by C4::Templates::BEGIN@37 at line 37 of /usr/share/koha/lib/C4/Templates.pm # once (3µs+0s) by C4::NewsChannels::BEGIN@23 at line 23 of /usr/share/koha/lib/C4/NewsChannels.pm # once (3µs+0s) by C4::Log::BEGIN@27 at line 27 of /usr/share/koha/lib/C4/Log.pm # once (2µs+0s) by C4::Ratings::BEGIN@27 at line 27 of /usr/share/koha/lib/C4/Ratings.pm # once (2µs+0s) by C4::SMS::BEGIN@38 at line 38 of /usr/share/koha/lib/C4/SMS.pm # once (2µs+0s) by C4::Members::Messaging::BEGIN@22 at line 22 of /usr/share/koha/lib/C4/Members/Messaging.pm # once (2µs+0s) by C4::Message::BEGIN@24 at line 24 of /usr/share/koha/lib/C4/Message.pm # once (2µs+0s) by C4::ItemType::BEGIN@23 at line 23 of /usr/share/koha/lib/C4/ItemType.pm # once (2µs+0s) by C4::OAI::Sets::BEGIN@33 at line 33 of /usr/share/koha/lib/C4/OAI/Sets.pm # once (2µs+0s) by C4::Reserves::BEGIN@26 at line 26 of /usr/share/koha/lib/C4/Reserves.pm # once (2µs+0s) by C4::Category::BEGIN@23 at line 23 of /usr/share/koha/lib/C4/Category.pm # once (2µs+0s) by C4::ClassSortRoutine::BEGIN@25 at line 25 of /usr/share/koha/lib/C4/ClassSortRoutine.pm # once (2µs+0s) by C4::SQLHelper::BEGIN@24 at line 24 of /usr/share/koha/lib/C4/SQLHelper.pm # once (2µs+0s) by C4::Stats::BEGIN@24 at line 24 of /usr/share/koha/lib/C4/Stats.pm # once (2µs+0s) by C4::Dates::BEGIN@25 at line 25 of /usr/share/koha/lib/C4/Dates.pm # once (2µs+0s) by C4::Members::BEGIN@25 at line 25 of /usr/share/koha/lib/C4/Members.pm # once (2µs+0s) by C4::Members::AttributeTypes::BEGIN@22 at line 22 of /usr/share/koha/lib/C4/Members/AttributeTypes.pm
sub import {
313 # Create the default context ($C4::Context::Context)
314 # the first time the module is called
315 # (a config file can be optionaly passed)
316
317 # default context allready exists?
31846279µs return if $context;
319
320 # no ? so load it!
321 my ($pkg,$config_file) = @_ ;
3221105ms my $new_ctx = __PACKAGE__->new($config_file);
# spent 105ms making 1 call to C4::Context::new
323 return unless $new_ctx;
324
325 # if successfully loaded, use it by default
32616µs $new_ctx->set_context;
# spent 6µs making 1 call to C4::Context::set_context
327 1;
328}
329
330=head2 new
331
- -
348#'
349# Revision History:
350# 2004-08-10 A. Tarallo: Added check if the conf file is not empty
351
# spent 189ms (201µs+188) within C4::Context::new which was called 3 times, avg 62.8ms/call: # once (53µs+105ms) by C4::Context::import at line 322 # once (74µs+43.2ms) by C4::Auth::BEGIN@39 at line 40 of /usr/share/koha/lib/C4/Auth_with_cas.pm # once (74µs+39.7ms) by C4::Auth::BEGIN@39 at line 55 of /usr/share/koha/lib/C4/Auth_with_ldap.pm
sub new {
35263243µs my $class = shift;
353 my $conf_fname = shift; # Config file to load
354 my $self = {};
355
356 # check that the specified config file exists and is not empty
357 undef $conf_fname unless
358 (defined $conf_fname && -s $conf_fname);
359 # Figure out a good config file to load if none was specified.
360 if (!defined($conf_fname))
361 {
362 # If the $KOHA_CONF environment variable is set, use
363 # that. Otherwise, use the built-in default.
364342µs if (exists $ENV{"KOHA_CONF"} and $ENV{'KOHA_CONF'} and -s $ENV{"KOHA_CONF"}) {
# spent 42µs making 3 calls to C4::Context::CORE:ftsize, avg 14µs/call
365 $conf_fname = $ENV{"KOHA_CONF"};
366 } elsif ($INSTALLED_CONFIG_FNAME !~ /__KOHA_CONF_DIR/ and -s $INSTALLED_CONFIG_FNAME) {
367 # NOTE: be careful -- don't change __KOHA_CONF_DIR in the above
368 # regex to anything else -- don't want installer to rewrite it
369 $conf_fname = $INSTALLED_CONFIG_FNAME;
370 } elsif (-s CONFIG_FNAME) {
371 $conf_fname = CONFIG_FNAME;
372 } else {
373 warn "unable to locate Koha configuration file koha-conf.xml";
374 return;
375 }
376 }
377
378 if ($ismemcached) {
379 # retreive from memcached
380 $self = $memcached->get('kohaconf');
381 if (not defined $self) {
382 # not in memcached yet
383 $self = read_config_file($conf_fname);
384 }
385 } else {
386 # non-memcached env, read from file
3873188ms $self = read_config_file($conf_fname);
# spent 188ms making 3 calls to C4::Context::read_config_file, avg 62.8ms/call
388 }
389
390 $self->{"config_file"} = $conf_fname;
391 warn "read_config_file($conf_fname) returned undef" if !defined($self->{"config"});
392 return if !defined($self->{"config"});
393
394 $self->{"dbh"} = undef; # Database handle
395 $self->{"Zconn"} = undef; # Zebra Connections
396 $self->{"stopwords"} = undef; # stopwords list
397 $self->{"marcfromkohafield"} = undef; # the hash with relations between koha table fields and MARC field/subfield
398 $self->{"userenv"} = undef; # User env
399 $self->{"activeuser"} = undef; # current active user
400 $self->{"shelves"} = undef;
401 $self->{tz} = undef; # local timezone object
402
403 bless $self, $class;
404 return $self;
405}
406
407=head2 set_context
408
- -
424#'
425sub set_context
426
# spent 6µs within C4::Context::set_context which was called: # once (6µs+0s) by C4::Context::import at line 326
{
42768µs my $self = shift;
428 my $new_context; # The context to set
429
430 # Figure out whether this is a class or instance method call.
431 #
432 # We're going to make the assumption that control got here
433 # through valid means, i.e., that the caller used an instance
434 # or class method call, and that control got here through the
435 # usual inheritance mechanisms. The caller can, of course,
436 # break this assumption by playing silly buggers, but that's
437 # harder to do than doing it properly, and harder to check
438 # for.
439 if (ref($self) eq "")
440 {
441 # Class method. The new context is the next argument.
442 $new_context = shift;
443 } else {
444 # Instance method. The new context is $self.
445 $new_context = $self;
446 }
447
448 # Save the old context, if any, on the stack
449 push @context_stack, $context if defined($context);
450
451 # Set the new context
452 $context = $new_context;
453}
454
455=head2 restore_context
456
- -
463#'
464sub restore_context
465{
466 my $self = shift;
467
468 if ($#context_stack < 0)
469 {
470 # Stack underflow.
471 die "Context stack underflow";
472 }
473
474 # Pop the old context and set it.
475 $context = pop @context_stack;
476
477 # FIXME - Should this return something, like maybe the context
478 # that was current when this was called?
479}
480
481=head2 config
482
- -
496
# spent 532µs within C4::Context::_common_config which was called 45 times, avg 12µs/call: # 45 times (532µs+0s) by C4::Context::config at line 510, avg 12µs/call
sub _common_config {
497180728µs my $var = shift;
498 my $term = shift;
499 return if !defined($context->{$term});
500 # Presumably $self->{$term} might be
501 # undefined if the config file given to &new
502 # didn't exist, and the caller didn't bother
503 # to check the return value.
504
505 # Return the value of the requested config variable
506 return $context->{$term}->{$var};
507}
508
509
# spent 1000µs (468+532) within C4::Context::config which was called 45 times, avg 22µs/call: # 25 times (317µs+388µs) by C4::XSLT::XSLTParse4Display at line 183 of /usr/share/koha/lib/C4/XSLT.pm, avg 28µs/call # 3 times (38µs+29µs) by C4::Context::AUTOLOAD at line 660, avg 22µs/call # 2 times (7µs+7µs) by C4::Templates::new at line 62 of /usr/share/koha/lib/C4/Templates.pm, avg 7µs/call # once (15µs+18µs) by C4::Languages::getTranslatedLanguages at line 127 of /usr/share/koha/lib/C4/Languages.pm # once (14µs+9µs) by main::BEGIN@45 at line 72 of /usr/share/koha/lib/C4/Output.pm # once (11µs+11µs) by C4::Auth::BEGIN@39 at line 53 of /usr/share/koha/lib/C4/Auth.pm # once (11µs+11µs) by C4::Budgets::BEGIN@24 at line 31 of /usr/share/koha/lib/C4/SQLHelper.pm # once (9µs+10µs) by C4::Templates::_get_template_file at line 217 of /usr/share/koha/lib/C4/Templates.pm # once (11µs+9µs) by C4::Auth::BEGIN@39 at line 56 of /usr/share/koha/lib/C4/Auth_with_ldap.pm # once (8µs+11µs) by C4::Output::BEGIN@36 at line 208 of /usr/share/koha/lib/C4/Templates.pm # once (5µs+9µs) by C4::Templates::new at line 50 of /usr/share/koha/lib/C4/Templates.pm # once (3µs+3µs) by C4::Context::_new_dbh at line 791 # once (3µs+3µs) by C4::Context::_new_dbh at line 798 # once (3µs+3µs) by C4::Context::_new_dbh at line 797 # once (3µs+3µs) by C4::Context::_new_dbh at line 792 # once (3µs+3µs) by C4::Context::_new_dbh at line 800 # once (3µs+3µs) by C4::Context::_new_dbh at line 799 # once (3µs+3µs) by C4::Context::_new_dbh at line 801
sub config {
51045378µs45532µs return _common_config($_[1],'config');
# spent 532µs making 45 calls to C4::Context::_common_config, avg 12µs/call
511}
512sub zebraconfig {
513 return _common_config($_[1],'server');
514}
515sub ModZebrations {
516 return _common_config($_[1],'serverinfo');
517}
518
519=head2 preference
520
- -
535# FIXME: running this under mod_perl will require a means of
536# flushing the caching mechanism.
537
5381400nsmy %sysprefs;
5391300nsmy $use_syspref_cache = 1;
540
541
# spent 394ms (16.3+378) within C4::Context::preference which was called 1355 times, avg 291µs/call: # 550 times (3.17ms+38.7ms) by C4::XSLT::XSLTParse4Display at line 212 of /usr/share/koha/lib/C4/XSLT.pm, avg 76µs/call # 80 times (956µs+0s) by C4::Koha::getitemtypeimagesrc at line 474 of /usr/share/koha/lib/C4/Koha.pm, avg 12µs/call # 69 times (3.11ms+129ms) by C4::Auth::get_template_and_user at line 381 of /usr/share/koha/lib/C4/Auth.pm, avg 1.92ms/call # 57 times (622µs+2.01ms) by C4::Koha::getitemtypeimagesrc at line 471 of /usr/share/koha/lib/C4/Koha.pm, avg 46µs/call # 32 times (317µs+2.16ms) by C4::Items::GetHiddenItemnumbers at line 1640 of /usr/share/koha/lib/C4/Items.pm, avg 77µs/call # 32 times (412µs+2.05ms) by C4::Search::searchResults at line 1859 of /usr/share/koha/lib/C4/Search.pm, avg 77µs/call # 32 times (104µs+0s) by C4::Search::searchResults at line 1860 of /usr/share/koha/lib/C4/Search.pm, avg 3µs/call # 25 times (220µs+2.58ms) by main::RUNTIME at line 590 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl, avg 112µs/call # 25 times (236µs+1.93ms) by C4::Search::searchResults at line 1829 of /usr/share/koha/lib/C4/Search.pm, avg 87µs/call # 25 times (343µs+0s) by C4::XSLT::XSLTParse4Display at line 200 of /usr/share/koha/lib/C4/XSLT.pm, avg 14µs/call # 25 times (338µs+0s) by C4::Search::searchResults at line 2014 of /usr/share/koha/lib/C4/Search.pm, avg 14µs/call # 25 times (262µs+0s) by C4::Items::GetItemsInfo at line 1206 of /usr/share/koha/lib/C4/Items.pm, avg 10µs/call # 25 times (232µs+0s) by C4::Biblio::GetCOinSBiblio at line 1371 of /usr/share/koha/lib/C4/Biblio.pm, avg 9µs/call # 25 times (225µs+0s) by C4::Search::searchResults at line 2020 of /usr/share/koha/lib/C4/Search.pm, avg 9µs/call # 25 times (213µs+0s) by C4::Biblio::GetMarcBiblio at line 1259 of /usr/share/koha/lib/C4/Biblio.pm, avg 9µs/call # 25 times (200µs+0s) by C4::Search::searchResults at line 1778 of /usr/share/koha/lib/C4/Search.pm, avg 8µs/call # 25 times (135µs+0s) by C4::XSLT::XSLTParse4Display at line 184 of /usr/share/koha/lib/C4/XSLT.pm, avg 5µs/call # 25 times (134µs+0s) by C4::Search::searchResults at line 1716 of /usr/share/koha/lib/C4/Search.pm, avg 5µs/call # 25 times (128µs+0s) by C4::XSLT::XSLTParse4Display at line 185 of /usr/share/koha/lib/C4/XSLT.pm, avg 5µs/call # 25 times (118µs+0s) by C4::Search::searchResults at line 2044 of /usr/share/koha/lib/C4/Search.pm, avg 5µs/call # 25 times (102µs+0s) by C4::Biblio::GetMarcBiblio at line 1263 of /usr/share/koha/lib/C4/Biblio.pm, avg 4µs/call # 25 times (76µs+0s) by C4::XSLT::XSLTParse4Display at line 161 of /usr/share/koha/lib/C4/XSLT.pm, avg 3µs/call # 23 times (206µs+2.18ms) by C4::Search::__ANON__[/usr/share/koha/lib/C4/Search.pm:670] at line 582 of /usr/share/koha/lib/C4/Search.pm, avg 104µs/call # 15 times (701µs+32.3ms) by C4::Auth::get_template_and_user at line 303 of /usr/share/koha/lib/C4/Auth.pm, avg 2.20ms/call # 4 times (129µs+4.31ms) by main::RUNTIME at line 353 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl, avg 1.11ms/call # 3 times (48µs+2.08ms) by C4::Templates::getlanguage at line 326 of /usr/share/koha/lib/C4/Templates.pm, avg 708µs/call # 3 times (83µs+2.01ms) by C4::Auth::get_session at line 1520 of /usr/share/koha/lib/C4/Auth.pm, avg 698µs/call # 2 times (95µs+3.11ms) by main::RUNTIME at line 165 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl, avg 1.60ms/call # 2 times (38µs+2.10ms) by C4::Templates::themelanguage at line 289 of /usr/share/koha/lib/C4/Templates.pm, avg 1.07ms/call # 2 times (73µs+1.97ms) by C4::Auth::get_template_and_user at line 297 of /usr/share/koha/lib/C4/Auth.pm, avg 1.02ms/call # 2 times (11µs+0s) by main::RUNTIME at line 576 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl, avg 6µs/call # 2 times (7µs+0s) by main::RUNTIME at line 141 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl, avg 3µs/call # once (57µs+55.7ms) by C4::Auth::BEGIN@39 at line 54 of /usr/share/koha/lib/C4/Auth.pm # once (63µs+3.29ms) by C4::Search::parseQuery at line 1178 of /usr/share/koha/lib/C4/Search.pm # once (80µs+2.59ms) by main::RUNTIME at line 885 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (114µs+2.47ms) by main::RUNTIME at line 888 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (139µs+2.29ms) by main::RUNTIME at line 751 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (45µs+2.30ms) by main::RUNTIME at line 210 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (37µs+2.30ms) by C4::Auth::BEGIN@39 at line 55 of /usr/share/koha/lib/C4/Auth.pm # once (92µs+2.24ms) by main::RUNTIME at line 857 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (58µs+2.26ms) by C4::Auth::get_template_and_user at line 373 of /usr/share/koha/lib/C4/Auth.pm # once (60µs+2.26ms) by C4::Auth::checkauth at line 818 of /usr/share/koha/lib/C4/Auth.pm # once (73µs+2.18ms) by C4::Auth::checkauth at line 625 of /usr/share/koha/lib/C4/Auth.pm # once (63µs+2.19ms) by C4::Auth::get_template_and_user at line 290 of /usr/share/koha/lib/C4/Auth.pm # once (45µs+2.18ms) by main::RUNTIME at line 438 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (64µs+2.16ms) by C4::Search::buildQuery at line 1262 of /usr/share/koha/lib/C4/Search.pm # once (36µs+2.18ms) by main::RUNTIME at line 116 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (57µs+2.11ms) by main::RUNTIME at line 479 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (36µs+2.13ms) by C4::Templates::gettemplate at line 233 of /usr/share/koha/lib/C4/Templates.pm # once (234µs+1.91ms) by main::RUNTIME at line 895 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (48µs+2.04ms) by main::RUNTIME at line 439 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (53µs+2.00ms) by main::RUNTIME at line 33 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (43µs+2.01ms) by C4::Auth::BEGIN@39 at line 53 of /usr/share/koha/lib/C4/Auth_with_cas.pm # once (46µs+1.99ms) by C4::Search::buildQuery at line 1264 of /usr/share/koha/lib/C4/Search.pm # once (40µs+1.98ms) by main::RUNTIME at line 101 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (46µs+1.96ms) by C4::Search::buildQuery at line 1263 of /usr/share/koha/lib/C4/Search.pm # once (47µs+1.94ms) by C4::Auth::_version_check at line 556 of /usr/share/koha/lib/C4/Auth.pm # once (52µs+1.93ms) by main::RUNTIME at line 148 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (93µs+1.88ms) by main::RUNTIME at line 718 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (54µs+1.91ms) by C4::Auth::_timeout_syspref at line 596 of /usr/share/koha/lib/C4/Auth.pm # once (42µs+1.91ms) by C4::Auth::get_template_and_user at line 361 of /usr/share/koha/lib/C4/Auth.pm # once (64µs+1.86ms) by main::RUNTIME at line 890 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (33µs+1.87ms) by main::RUNTIME at line 61 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (70µs+1.83ms) by main::RUNTIME at line 893 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (44µs+1.83ms) by C4::Search::buildQuery at line 1265 of /usr/share/koha/lib/C4/Search.pm # once (84µs+1.79ms) by main::RUNTIME at line 757 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (57µs+1.81ms) by C4::Auth::get_template_and_user at line 365 of /usr/share/koha/lib/C4/Auth.pm # once (45µs+1.81ms) by main::BEGIN@85 at line 86 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (77µs+1.78ms) by C4::Templates::output at line 103 of /usr/share/koha/lib/C4/Templates.pm # once (40µs+1.81ms) by main::RUNTIME at line 481 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (83µs+1.76ms) by main::RUNTIME at line 894 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (39µs+1.79ms) by C4::Auth::_version_check at line 551 of /usr/share/koha/lib/C4/Auth.pm # once (71µs+1.72ms) by main::RUNTIME at line 123 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (56µs+1.73ms) by main::RUNTIME at line 494 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (137µs+1.64ms) by main::RUNTIME at line 150 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (48µs+1.72ms) by C4::Branch::onlymine at line 146 of /usr/share/koha/lib/C4/Branch.pm # once (48µs+1.70ms) by C4::Tags::BEGIN@35 at line 54 of /usr/share/koha/lib/C4/Tags.pm # once (35µs+1.65ms) by C4::Search::getRecords at line 343 of /usr/share/koha/lib/C4/Search.pm # once (50µs+1.63ms) by C4::Search::buildQuery at line 1266 of /usr/share/koha/lib/C4/Search.pm # once (43µs+1.63ms) by main::RUNTIME at line 147 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (69µs+0s) by main::RUNTIME at line 586 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (14µs+0s) by main::RUNTIME at line 712 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (11µs+0s) by C4::Search::searchResults at line 1638 of /usr/share/koha/lib/C4/Search.pm # once (11µs+0s) by main::RUNTIME at line 207 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (11µs+0s) by C4::Auth::get_template_and_user at line 461 of /usr/share/koha/lib/C4/Auth.pm # once (11µs+0s) by C4::Search::searchResults at line 1695 of /usr/share/koha/lib/C4/Search.pm # once (10µs+0s) by main::RUNTIME at line 755 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (9µs+0s) by main::RUNTIME at line 153 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (9µs+0s) by C4::Languages::getTranslatedLanguages at line 126 of /usr/share/koha/lib/C4/Languages.pm # once (8µs+0s) by main::RUNTIME at line 608 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (8µs+0s) by main::RUNTIME at line 624 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (8µs+0s) by C4::Search::__ANON__[/usr/share/koha/lib/C4/Search.pm:670] at line 650 of /usr/share/koha/lib/C4/Search.pm # once (7µs+0s) by C4::Templates::output at line 110 of /usr/share/koha/lib/C4/Templates.pm # once (6µs+0s) by C4::Koha::getFacets at line 689 of /usr/share/koha/lib/C4/Koha.pm # once (6µs+0s) by C4::Search::_build_weighted_query at line 847 of /usr/share/koha/lib/C4/Search.pm # once (6µs+0s) by main::RUNTIME at line 162 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (5µs+0s) by C4::Context::Zconn at line 702 # once (3µs+0s) by C4::Koha::getFacets at line 786 of /usr/share/koha/lib/C4/Koha.pm # once (3µs+0s) by C4::Templates::output at line 112 of /usr/share/koha/lib/C4/Templates.pm # once (3µs+0s) by C4::Templates::output at line 113 of /usr/share/koha/lib/C4/Templates.pm # once (3µs+0s) by C4::Search::_build_weighted_query at line 848 of /usr/share/koha/lib/C4/Search.pm # once (2µs+0s) by C4::Search::_build_weighted_query at line 849 of /usr/share/koha/lib/C4/Search.pm
sub preference {
542470915.6ms my $self = shift;
543 my $var = lc(shift); # The system preference to return
544
545 if ($use_syspref_cache && exists $sysprefs{$var}) {
546 return $sysprefs{$var};
547 }
548
549161206ms my $dbh = C4::Context->dbh or return 0;
# spent 206ms making 161 calls to C4::Context::dbh, avg 1.28ms/call
550
551 # Look up systempreferences.variable==$var
552 my $sql = <<'END_SQL';
553 SELECT value
554 FROM systempreferences
555 WHERE variable=?
556 LIMIT 1
557END_SQL
5581161ms483198ms $sysprefs{$var} = $dbh->selectrow_array( $sql, {}, $var );
# spent 170ms making 161 calls to DBI::db::selectrow_array, avg 1.06ms/call # spent 14.6ms making 161 calls to DBI::db::prepare, avg 91µs/call # spent 13.1ms making 161 calls to DBD::mysql::db::prepare, avg 82µs/call
5594832.33ms return $sysprefs{$var};
# spent 1.81ms making 322 calls to DBI::common::DESTROY, avg 6µs/call # spent 516µs making 161 calls to DBD::_mem::common::DESTROY, avg 3µs/call
560}
561
562sub boolean_preference {
563 my $self = shift;
564 my $var = shift; # The system preference to return
565 my $it = preference($self, $var);
566 return defined($it)? C4::Boolean::true_p($it): undef;
567}
568
569=head2 enable_syspref_cache
570
- -
578sub enable_syspref_cache {
579 my ($self) = @_;
580 $use_syspref_cache = 1;
581}
582
583=head2 disable_syspref_cache
584
- -
592sub disable_syspref_cache {
593 my ($self) = @_;
594 $use_syspref_cache = 0;
595 $self->clear_syspref_cache();
596}
597
598=head2 clear_syspref_cache
599
- -
608sub clear_syspref_cache {
609 %sysprefs = ();
610}
611
612=head2 set_preference
613
- -
621sub set_preference {
622 my $self = shift;
623 my $var = lc(shift);
624 my $value = shift;
625
626 my $dbh = C4::Context->dbh or return 0;
627
628 my $type = $dbh->selectrow_array( "SELECT type FROM systempreferences WHERE variable = ?", {}, $var );
629
630 $value = 0 if ( $type && $type eq 'YesNo' && $value eq '' );
631
632 my $sth = $dbh->prepare( "
633 INSERT INTO systempreferences
634 ( variable, value )
635 VALUES( ?, ? )
636 ON DUPLICATE KEY UPDATE value = VALUES(value)
637 " );
638
639 if($sth->execute( $var, $value )) {
640 $sysprefs{$var} = $value;
641 }
642 $sth->finish;
643}
644
645# AUTOLOAD
646# This implements C4::Config->foo, and simply returns
647# C4::Context->config("foo"), as described in the documentation for
648# &config, above.
649
650# FIXME - Perhaps this should be extended to check &config first, and
651# then &preference if that fails. OTOH, AUTOLOAD could lead to crappy
652# code, so it'd probably be best to delete it altogether so as not to
653# encourage people to use it.
654sub AUTOLOAD
655
# spent 175µs (79+96) within C4::Context::AUTOLOAD which was called 3 times, avg 58µs/call: # once (43µs+46µs) by C4::Context::KOHAVERSION at line 213 # once (17µs+27µs) by C4::Auth::BEGIN@39 at line 56 of /usr/share/koha/lib/C4/Auth.pm # once (19µs+23µs) by C4::Auth::BEGIN@39 at line 58 of /usr/share/koha/lib/C4/Auth.pm
{
6569100µs my $self = shift;
657
658329µs $AUTOLOAD =~ s/.*:://; # Chop off the package name,
# spent 29µs making 3 calls to C4::Context::CORE:subst, avg 10µs/call
659 # leaving only the function name.
660367µs return $self->config($AUTOLOAD);
# spent 67µs making 3 calls to C4::Context::config, avg 22µs/call
661}
662
663=head2 Zconn
664
- -
682
# spent 889µs (36+854) within C4::Context::Zconn which was called: # once (36µs+854µs) by C4::Search::getRecords at line 349 of /usr/share/koha/lib/C4/Search.pm
sub Zconn {
6831127µs my $self=shift;
684 my $server=shift;
685 my $async=shift;
686 my $auth=shift;
687 my $piggyback=shift;
688 my $syntax=shift;
689 if ( defined($context->{"Zconn"}->{$server}) && (0 == $context->{"Zconn"}->{$server}->errcode()) ) {
690 return $context->{"Zconn"}->{$server};
691 # No connection object or it died. Create one.
692 }else {
693 # release resources if we're closing a connection and making a new one
694 # FIXME: this needs to be smarter -- an error due to a malformed query or
695 # a missing index does not necessarily require us to close the connection
696 # and make a new one, particularly for a batch job. However, at
697 # first glance it does not look like there's a way to easily check
698 # the basic health of a ZOOM::Connection
699 $context->{"Zconn"}->{$server}->destroy() if defined($context->{"Zconn"}->{$server});
700
7011800µs $context->{"Zconn"}->{$server} = &_new_Zconn($server,$async,$auth,$piggyback,$syntax);
# spent 800µs making 1 call to C4::Context::_new_Zconn
702254µs $context->{ Zconn }->{ $server }->option(
# spent 50µs making 1 call to ZOOM::Connection::option # spent 5µs making 1 call to C4::Context::preference
703 preferredRecordSyntax => C4::Context->preference("marcflavour") );
704 return $context->{"Zconn"}->{$server};
705 }
706}
707
708=head2 _new_Zconn
709
- -
722
# spent 800µs (131+669) within C4::Context::_new_Zconn which was called: # once (131µs+669µs) by C4::Context::Zconn at line 701
sub _new_Zconn {
7232595µs my ($server,$async,$auth,$piggyback,$syntax) = @_;
724
725 my $tried=0; # first attempt
726 my $Zconn; # connection object
727 $server = "biblioserver" unless $server;
728 $syntax = "usmarc" unless $syntax;
729
730 my $host = $context->{'listen'}->{$server}->{'content'};
731 my $servername = $context->{"config"}->{$server};
732 my $user = $context->{"serverinfo"}->{$server}->{"user"};
733 my $password = $context->{"serverinfo"}->{$server}->{"password"};
734 $auth = 1 if($user && $password);
735 retry:
736 eval {
737 # set options
7381165µs my $o = new ZOOM::Options();
# spent 165µs making 1 call to ZOOM::Options::new
739185µs $o->option(user=>$user) if $auth;
# spent 85µs making 1 call to ZOOM::Options::option
740124µs $o->option(password=>$password) if $auth;
# spent 24µs making 1 call to ZOOM::Options::option
741126µs $o->option(async => 1) if $async;
# spent 26µs making 1 call to ZOOM::Options::option
742 $o->option(count => $piggyback) if $piggyback;
743138µs $o->option(cqlfile=> $context->{"server"}->{$server}->{"cql2rpn"});
# spent 38µs making 1 call to ZOOM::Options::option
744118µs $o->option(cclfile=> $context->{"serverinfo"}->{$server}->{"ccl2rpn"});
# spent 18µs making 1 call to ZOOM::Options::option
745121µs $o->option(preferredRecordSyntax => $syntax);
# spent 21µs making 1 call to ZOOM::Options::option
746117µs $o->option(elementSetName => "F"); # F for 'full' as opposed to B for 'brief'
# spent 17µs making 1 call to ZOOM::Options::option
747116µs $o->option(databaseName => ($servername?$servername:"biblios"));
# spent 16µs making 1 call to ZOOM::Options::option
748
749 # create a new connection object
7501134µs $Zconn= create ZOOM::Connection($o);
# spent 134µs making 1 call to ZOOM::Connection::create
751
752 # forge to server
7531106µs $Zconn->connect($host, 0);
# spent 106µs making 1 call to ZOOM::Connection::connect
754
755 # check for errors and warn
756121µs if ($Zconn->errcode() !=0) {
# spent 21µs making 1 call to ZOOM::Connection::errcode
757 warn "something wrong with the connection: ". $Zconn->errmsg();
758 }
759
760 };
761# if ($@) {
762# # Koha manages the Zebra server -- this doesn't work currently for me because of permissions issues
763# # Also, I'm skeptical about whether it's the best approach
764# warn "problem with Zebra";
765# if ( C4::Context->preference("ManageZebra") ) {
766# if ($@->code==10000 && $tried==0) { ##No connection try restarting Zebra
767# $tried=1;
768# warn "trying to restart Zebra";
769# my $res=system("zebrasrv -f $ENV{'KOHA_CONF'} >/koha/log/zebra-error.log");
770# goto "retry";
771# } else {
772# warn "Error ", $@->code(), ": ", $@->message(), "\n";
773# $Zconn="error";
774# return $Zconn;
775# }
776# }
777# }
778 return $Zconn;
779}
780
781# _new_dbh
782# Internal helper function (not a method!). This creates a new
783# database connection from the data given in the current context, and
784# returns it.
785sub _new_dbh
786
# spent 54.6ms (256µs+54.3) within C4::Context::_new_dbh which was called: # once (256µs+54.3ms) by C4::Context::dbh at line 861
{
787
788 ## $context
789 ## correct name for db_schme
790202.13ms my $db_driver;
79116µs if ($context->config("db_scheme")){
# spent 6µs making 1 call to C4::Context::config
792211µs $db_driver=db_scheme2dbi($context->config("db_scheme"));
# spent 6µs making 1 call to C4::Context::config # spent 5µs making 1 call to C4::Context::db_scheme2dbi
793 }else{
794 $db_driver="mysql";
795 }
796
79716µs my $db_name = $context->config("database");
# spent 6µs making 1 call to C4::Context::config
79816µs my $db_host = $context->config("hostname");
# spent 6µs making 1 call to C4::Context::config
79916µs my $db_port = $context->config("port") || '';
# spent 6µs making 1 call to C4::Context::config
80016µs my $db_user = $context->config("user");
# spent 6µs making 1 call to C4::Context::config
80116µs my $db_passwd = $context->config("pass");
# spent 6µs making 1 call to C4::Context::config
802 # MJR added or die here, as we can't work without dbh
803152.4ms my $dbh = DBI->connect("DBI:$db_driver:dbname=$db_name;host=$db_host;port=$db_port",
# spent 52.4ms making 1 call to DBI::connect
804 $db_user, $db_passwd, {'RaiseError' => $ENV{DEBUG}?1:0 }) or die $DBI::errstr;
805
806 # Check for the existence of a systempreference table; if we don't have this, we don't
807 # have a valid database and should not set RaiseError in order to allow the installer
808 # to run; installer will not run otherwise since we raise all db errors
809
810211µs eval {
# spent 11µs making 2 calls to DBI::common::STORE, avg 6µs/call
811326µs local $dbh->{PrintError} = 0;
# spent 18µs making 1 call to DBI::common::FETCH # spent 8µs making 2 calls to DBI::common::STORE, avg 4µs/call
812313µs local $dbh->{RaiseError} = 1;
# spent 7µs making 2 calls to DBI::common::STORE, avg 4µs/call # spent 6µs making 1 call to DBI::common::FETCH
8131852µs $dbh->do(qq{SELECT * FROM systempreferences WHERE 1 = 0 });
# spent 852µs making 1 call to DBI::db::do
814 };
815
816 if ($@) {
817 $dbh->{RaiseError} = 0;
818 }
819
820 my $tz = $ENV{TZ};
821 if ( $db_driver eq 'mysql' ) {
822 # Koha 3.0 is utf-8, so force utf8 communication between mySQL and koha, whatever the mysql default config.
823 # this is better than modifying my.cnf (and forcing all communications to be in utf8)
82413µs $dbh->{'mysql_enable_utf8'}=1; #enable
# spent 3µs making 1 call to DBI::common::STORE
8251979µs $dbh->do("set NAMES 'utf8'");
# spent 979µs making 1 call to DBI::db::do
826 ($tz) and $dbh->do(qq(SET time_zone = "$tz"));
827 }
828 elsif ( $db_driver eq 'Pg' ) {
829 $dbh->do( "set client_encoding = 'UTF8';" );
830 ($tz) and $dbh->do(qq(SET TIME ZONE = "$tz"));
831 }
832 return $dbh;
833}
834
835=head2 dbh
836
- -
850#'
851sub dbh
852
# spent 1.49s (36.5ms+1.45) within C4::Context::dbh which was called 1482 times, avg 1.00ms/call: # 295 times (7.29ms+282ms) by C4::Biblio::GetAuthorisedValueDesc at line 1573 of /usr/share/koha/lib/C4/Biblio.pm, avg 980µs/call # 161 times (3.48ms+202ms) by C4::Context::preference at line 549, avg 1.28ms/call # 148 times (3.49ms+136ms) by C4::Koha::GetAuthValCode at line 998 of /usr/share/koha/lib/C4/Koha.pm, avg 944µs/call # 143 times (3.37ms+131ms) by C4::Koha::GetKohaAuthorisedValueLib at line 1245 of /usr/share/koha/lib/C4/Koha.pm, avg 937µs/call # 100 times (3.09ms+97.5ms) by C4::Biblio::GetFrameworkCode at line 2084 of /usr/share/koha/lib/C4/Biblio.pm, avg 1.01ms/call # 75 times (1.90ms+71.1ms) by C4::Biblio::GetRecordValue at line 676 of /usr/share/koha/lib/C4/Biblio.pm, avg 974µs/call # 64 times (1.41ms+61.6ms) by C4::Reserves::GetReserveStatus at line 750 of /usr/share/koha/lib/C4/Reserves.pm, avg 984µs/call # 64 times (1.52ms+61.2ms) by C4::Circulation::GetTransfers at line 2775 of /usr/share/koha/lib/C4/Circulation.pm, avg 980µs/call # 64 times (1.39ms+59.3ms) by C4::Branch::GetBranchName at line 180 of /usr/share/koha/lib/C4/Branch.pm, avg 948µs/call # 57 times (1.29ms+52.7ms) by C4::Koha::getitemtypeinfo at line 440 of /usr/share/koha/lib/C4/Koha.pm, avg 947µs/call # 51 times (1.16ms+47.0ms) by C4::Koha::GetKohaAuthorisedValues at line 1168 of /usr/share/koha/lib/C4/Koha.pm, avg 943µs/call # 33 times (781µs+28.3ms) by C4::Languages::language_get_description at line 350 of /usr/share/koha/lib/C4/Languages.pm, avg 880µs/call # 32 times (1.19ms+34.0ms) by C4::Items::GetHiddenItemnumbers at line 1650 of /usr/share/koha/lib/C4/Items.pm, avg 1.10ms/call # 27 times (697µs+24.3ms) by C4::Branch::GetBranches at line 108 of /usr/share/koha/lib/C4/Branch.pm, avg 925µs/call # 26 times (886µs+24.0ms) by C4::Koha::GetItemTypes at line 248 of /usr/share/koha/lib/C4/Koha.pm, avg 956µs/call # 25 times (615µs+26.5ms) by C4::Biblio::GetMarcBiblio at line 1254 of /usr/share/koha/lib/C4/Biblio.pm, avg 1.08ms/call # 25 times (680µs+25.7ms) by C4::Tags::get_tags at line 283 of /usr/share/koha/lib/C4/Tags.pm, avg 1.05ms/call # 25 times (502µs+24.8ms) by C4::Biblio::CountItemsIssued at line 2624 of /usr/share/koha/lib/C4/Biblio.pm, avg 1.01ms/call # 25 times (606µs+23.8ms) by C4::Items::GetItemsInfo at line 1204 of /usr/share/koha/lib/C4/Items.pm, avg 978µs/call # 25 times (699µs+23.5ms) by C4::Biblio::GetMarcStructure at line 1082 of /usr/share/koha/lib/C4/Biblio.pm, avg 968µs/call # 3 times (105µs+3.25ms) by C4::XSLT::getAuthorisedValues4MARCSubfields at line 121 of /usr/share/koha/lib/C4/XSLT.pm, avg 1.12ms/call # 3 times (98µs+3.04ms) by C4::Auth::get_session at line 1521 of /usr/share/koha/lib/C4/Auth.pm, avg 1.05ms/call # 2 times (74µs+1.94ms) by C4::VirtualShelves::GetSomeShelfNames at line 187 of /usr/share/koha/lib/C4/VirtualShelves.pm, avg 1.01ms/call # 2 times (33µs+1.81ms) by C4::Koha::GetAuthorisedValues at line 1046 of /usr/share/koha/lib/C4/Koha.pm, avg 920µs/call # 2 times (49µs+1.51ms) by C4::Branch::GetBranchCategories at line 342 of /usr/share/koha/lib/C4/Branch.pm, avg 778µs/call # once (38µs+981µs) by C4::Search::searchResults at line 1630 of /usr/share/koha/lib/C4/Search.pm # once (26µs+858µs) by C4::Context::_new_marcfromkohafield at line 1020 # once (18µs+787µs) by C4::Auth::checkauth at line 614 of /usr/share/koha/lib/C4/Auth.pm # once (16µs+723µs) by C4::Branch::GetBranchesCount at line 602 of /usr/share/koha/lib/C4/Branch.pm # once (14µs+581µs) by C4::Languages::getAllLanguages at line 186 of /usr/share/koha/lib/C4/Languages.pm
{
85344481.44s my $self = shift;
854 my $sth;
855
85614811.40s if (defined($context->{"dbh"}) && $context->{"dbh"}->ping()) {
# spent 1.40s making 1481 calls to DBI::db::ping, avg 943µs/call
857 return $context->{"dbh"};
858 }
859
860 # No database handle or it died . Create one.
861154.6ms $context->{"dbh"} = &_new_dbh();
# spent 54.6ms making 1 call to C4::Context::_new_dbh
862
863 return $context->{"dbh"};
864}
865
866=head2 new_dbh
867
- -
879#'
880sub new_dbh
881{
882 my $self = shift;
883
884 return &_new_dbh();
885}
886
887=head2 set_dbh
888
- -
904#'
905sub set_dbh
906{
907 my $self = shift;
908 my $new_dbh = shift;
909
910 # Save the current database handle on the handle stack.
911 # We assume that $new_dbh is all good: if the caller wants to
912 # screw himself by passing an invalid handle, that's fine by
913 # us.
914 push @{$context->{"dbh_stack"}}, $context->{"dbh"};
915 $context->{"dbh"} = $new_dbh;
916}
917
918=head2 restore_dbh
919
- -
927#'
928sub restore_dbh
929{
930 my $self = shift;
931
932 if ($#{$context->{"dbh_stack"}} < 0)
933 {
934 # Stack underflow
935 die "DBH stack underflow";
936 }
937
938 # Pop the old database handle and set it.
939 $context->{"dbh"} = pop @{$context->{"dbh_stack"}};
940
941 # FIXME - If it is determined that restore_context should
942 # return something, then this function should, too.
943}
944
945=head2 queryparser
946
- -
953sub queryparser {
954 my $self = shift;
955 unless (defined $context->{"queryparser"}) {
956 $context->{"queryparser"} = &_new_queryparser();
957 }
958
959 return
960 defined( $context->{"queryparser"} )
961 ? $context->{"queryparser"}->new
962 : undef;
963}
964
965=head2 _new_queryparser
966
- -
973sub _new_queryparser {
974 my $qpmodules = {
975 'OpenILS::QueryParser' => undef,
976 'Koha::QueryParser::Driver::PQF' => undef
977 };
978 if ( can_load( 'modules' => $qpmodules ) ) {
979 my $QParser = Koha::QueryParser::Driver::PQF->new();
980 my $config_file = $context->config('queryparser_config');
981 $config_file ||= '/etc/koha/searchengine/queryparser.yaml';
982 if ( $QParser->load_config($config_file) ) {
983 # TODO: allow indexes to be configured in the database
984 return $QParser;
985 }
986 }
987 return;
988}
989
990=head2 marcfromkohafield
991
- -
1001#'
1002sub marcfromkohafield
1003
# spent 6.36ms (496µs+5.87) within C4::Context::marcfromkohafield which was called 93 times, avg 68µs/call: # 92 times (484µs+5.87ms) by C4::Biblio::GetMarcFromKohaField at line 1201 of /usr/share/koha/lib/C4/Biblio.pm, avg 69µs/call # once (12µs+0s) by C4::Biblio::_get_inverted_marc_field_map at line 2578 of /usr/share/koha/lib/C4/Biblio.pm
{
1004188659µs my $retval = {};
1005
1006 # If the hash already exists, return it.
1007 return $context->{"marcfromkohafield"} if defined($context->{"marcfromkohafield"});
1008
1009 # No hash. Create one.
101045.89ms $context->{"marcfromkohafield"} = &_new_marcfromkohafield();
# spent 5.87ms making 1 call to C4::Context::_new_marcfromkohafield # spent 17µs making 2 calls to DBI::common::DESTROY, avg 8µs/call # spent 5µs making 1 call to DBD::_mem::common::DESTROY
1011
1012 return $context->{"marcfromkohafield"};
1013}
1014
1015# _new_marcfromkohafield
1016# Internal helper function (not a method!). This creates a new
1017# hash with stopwords
1018sub _new_marcfromkohafield
1019
# spent 5.87ms (2.16+3.70) within C4::Context::_new_marcfromkohafield which was called: # once (2.16ms+3.70ms) by C4::Context::marcfromkohafield at line 1010
{
10206124.91ms1884µs my $dbh = C4::Context->dbh;
# spent 884µs making 1 call to C4::Context::dbh
1021 my $marcfromkohafield;
102216µs2144µs my $sth = $dbh->prepare("select frameworkcode,kohafield,tagfield,tagsubfield from marc_subfield_structure where kohafield > ''");
# spent 78µs making 1 call to DBI::db::prepare # spent 66µs making 1 call to DBD::mysql::db::prepare
102311.35ms
# spent 11µs within XML::Simple::BEGIN@1023 which was called: # once (11µs+0s) by XML::Simple::CORE:match at line 31
$sth->execute;
# spent 1.35ms making 1 call to DBI::st::execute
10243041.37ms while (my ($frameworkcode,$kohafield,$tagfield,$tagsubfield) = $sth->fetchrow) {
# spent 1.37ms making 304 calls to DBI::st::fetchrow, avg 4µs/call
1025 my $retval = {};
1026 $marcfromkohafield->{$frameworkcode}->{$kohafield} = [$tagfield,$tagsubfield];
1027 }
1028 return $marcfromkohafield;
1029}
1030
1031=head2 stopwords
1032
- -
1042#'
1043sub stopwords
1044{
1045 my $retval = {};
1046
1047 # If the hash already exists, return it.
1048 return $context->{"stopwords"} if defined($context->{"stopwords"});
1049
1050 # No hash. Create one.
1051 $context->{"stopwords"} = &_new_stopwords();
1052
1053 return $context->{"stopwords"};
1054}
1055
1056# _new_stopwords
1057# Internal helper function (not a method!). This creates a new
1058# hash with stopwords
1059sub _new_stopwords
1060{
1061 my $dbh = C4::Context->dbh;
1062 my $stopwordlist;
1063 my $sth = $dbh->prepare("select word from stopwords");
1064 $sth->execute;
1065 while (my $stopword = $sth->fetchrow_array) {
1066 $stopwordlist->{$stopword} = uc($stopword);
1067 }
1068 $stopwordlist->{A} = "A" unless $stopwordlist;
1069 return $stopwordlist;
1070}
1071
1072=head2 userenv
1073
- -
1083#'
1084
# spent 486µs within C4::Context::userenv which was called 41 times, avg 12µs/call: # 32 times (368µs+0s) by C4::Search::searchResults at line 1872 of /usr/share/koha/lib/C4/Search.pm, avg 11µs/call # 5 times (31µs+0s) by C4::Auth::get_template_and_user at line 303 of /usr/share/koha/lib/C4/Auth.pm, avg 6µs/call # 2 times (66µs+0s) by C4::Koha::GetAuthorisedValues at line 1044 of /usr/share/koha/lib/C4/Koha.pm, avg 33µs/call # once (14µs+0s) by main::RUNTIME at line 715 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl # once (8µs+0s) by C4::Auth::get_template_and_user at line 381 of /usr/share/koha/lib/C4/Auth.pm
sub userenv {
1085123551µs my $var = $context->{"activeuser"};
1086 if (defined $var and defined $context->{"userenv"}->{$var}) {
1087 return $context->{"userenv"}->{$var};
1088 } else {
1089 return;
1090 }
1091}
1092
1093=head2 set_userenv
1094
- -
1105#'
1106sub set_userenv {
1107 my ($usernum, $userid, $usercnum, $userfirstname, $usersurname, $userbranch, $branchname, $userflags, $emailaddress, $branchprinter, $persona)= @_;
1108 my $var=$context->{"activeuser"} || '';
1109 my $cell = {
1110 "number" => $usernum,
1111 "id" => $userid,
1112 "cardnumber" => $usercnum,
1113 "firstname" => $userfirstname,
1114 "surname" => $usersurname,
1115 #possibly a law problem
1116 "branch" => $userbranch,
1117 "branchname" => $branchname,
1118 "flags" => $userflags,
1119 "emailaddress" => $emailaddress,
1120 "branchprinter" => $branchprinter,
1121 "persona" => $persona,
1122 };
1123 $context->{userenv}->{$var} = $cell;
1124 return $cell;
1125}
1126
1127sub set_shelves_userenv {
1128 my ($type, $shelves) = @_ or return;
1129 my $activeuser = $context->{activeuser} or return;
1130 $context->{userenv}->{$activeuser}->{barshelves} = $shelves if $type eq 'bar';
1131 $context->{userenv}->{$activeuser}->{pubshelves} = $shelves if $type eq 'pub';
1132 $context->{userenv}->{$activeuser}->{totshelves} = $shelves if $type eq 'tot';
1133}
1134
1135sub get_shelves_userenv {
1136 my $active;
1137 unless ($active = $context->{userenv}->{$context->{activeuser}}) {
1138 $debug and warn "get_shelves_userenv cannot retrieve context->{userenv}->{context->{activeuser}}";
1139 return;
1140 }
1141 my $totshelves = $active->{totshelves} or undef;
1142 my $pubshelves = $active->{pubshelves} or undef;
1143 my $barshelves = $active->{barshelves} or undef;
1144 return ($totshelves, $pubshelves, $barshelves);
1145}
1146
1147=head2 _new_userenv
1148
- -
1160#'
1161sub _new_userenv
1162
# spent 12µs within C4::Context::_new_userenv which was called: # once (12µs+0s) by C4::Auth::checkauth at line 811 of /usr/share/koha/lib/C4/Auth.pm
{
1163315µs shift; # Useless except it compensates for bad calling style
1164 my ($sessionID)= @_;
1165 $context->{"activeuser"}=$sessionID;
1166}
1167
1168=head2 _unset_userenv
1169
- -
1176#'
1177
1178sub _unset_userenv
1179{
1180 my ($sessionID)= @_;
1181 undef $context->{"activeuser"} if ($context->{"activeuser"} eq $sessionID);
1182}
1183
1184
1185=head2 get_versions
1186
- -
1193#'
1194
1195# A little example sub to show more debugging info for CGI::Carp
1196sub get_versions {
1197 my %versions;
1198 $versions{kohaVersion} = KOHAVERSION();
1199 $versions{kohaDbVersion} = C4::Context->preference('version');
1200 $versions{osVersion} = join(" ", POSIX::uname());
1201 $versions{perlVersion} = $];
1202 {
12033185µs2110µs
# spent 71µs (33+38) within C4::Context::BEGIN@1203 which was called: # once (33µs+38µs) by main::BEGIN@31 at line 1203
no warnings qw(exec); # suppress warnings if unable to find a program in $PATH
# spent 71µs making 1 call to C4::Context::BEGIN@1203 # spent 38µs making 1 call to warnings::unimport
1204 $versions{mysqlVersion} = `mysql -V`;
1205 $versions{apacheVersion} = `httpd -v`;
1206 $versions{apacheVersion} = `httpd2 -v` unless $versions{apacheVersion} ;
1207 $versions{apacheVersion} = `apache2 -v` unless $versions{apacheVersion} ;
1208 $versions{apacheVersion} = `/usr/sbin/apache2 -v` unless $versions{apacheVersion} ;
1209 }
1210 return %versions;
1211}
1212
1213
1214=head2 tz
1215
- -
1222sub tz {
1223 my $self = shift;
1224 if (!defined $context->{tz}) {
1225 $context->{tz} = DateTime::TimeZone->new(name => 'local');
1226 }
1227 return $context->{tz};
1228}
1229
- -
1232110µs1;
1233__END__