2 # Copyright 2002 Katipo Communications
4 # This file is part of Koha.
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
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.
15 # You should have received a copy of the GNU General Public License along with
16 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
17 # Suite 330, Boston, MA 02111-1307 USA
27 use vars qw($VERSION $AUTOLOAD),
31 $VERSION = do { my @v = '$Revision$' =~ /\d+/g;
32 shift(@v) . "." . join("_", map {sprintf "%03d", $_ } @v); };
36 C4::Context - Maintain and manipulate the context of a Koha script
42 use C4::Context("/path/to/koha.xml");
44 $config_value = C4::Context->config("config_variable");
46 $koha_preference = C4::Context->preference("preference");
48 $db_handle = C4::Context->dbh;
50 $Zconn = C4::Context->Zconn;
52 $stopwordhash = C4::Context->stopwords;
56 When a Koha script runs, it makes use of a certain number of things:
57 configuration settings in F</etc/koha.xml>, a connection to the Koha
58 databases, and so forth. These things make up the I<context> in which
61 This module takes care of setting up the context for a script:
62 figuring out which configuration file to load, and loading it, opening
63 a connection to the right database, and so forth.
65 Most scripts will only use one context. They can simply have
71 Other scripts may need to use several contexts. For instance, if a
72 library has two databases, one for a certain collection, and the other
73 for everything else, it might be necessary for a script to use two
74 different contexts to search both databases. Such scripts should use
75 the C<&set_context> and C<&restore_context> functions, below.
77 By default, C4::Context reads the configuration from
78 F</etc/koha.xml>. This may be overridden by setting the C<$KOHA_CONF>
79 environment variable to the pathname of a configuration file to use.
88 # In addition to what is said in the POD above, a Context object is a
89 # reference-to-hash with the following fields:
92 # A reference-to-hash whose keys and values are the
93 # configuration variables and values specified in the config
94 # file (/etc/koha.xml).
96 # A handle to the appropriate database for this context.
98 # Used by &set_dbh and &restore_dbh to hold other database
99 # handles for this context.
101 # A connection object for the Zebra server
103 use constant CONFIG_FNAME => "/etc/koha.xml";
104 # Default config file, if none is specified
106 $context = undef; # Initially, no context is set
107 @context_stack = (); # Initially, no saved contexts
109 =item read_config_file
113 Reads the specified Koha config file.
115 Returns an object containing the configuration variables. The object's
116 structure is a bit complex to the uninitiated ... take a look at the
117 koha.xml file as well as the XML::Simple documentation for details. Or,
118 here are a few examples that may give you what you need:
120 The simple elements nested within the <config> element:
122 my $pass = $koha->{'config'}->{'pass'};
124 The <listen> elements:
126 my $listen = $koha->{'listen'}->{'biblioserver'}->{'content'};
128 The elements nested within the <server> element:
130 my $ccl2rpn = $koha->{'server'}->{'biblioserver'}->{'cql2rpn'};
132 Returns undef in case of error.
138 sub read_config_file {
139 my $fname = shift; # Config file to read
140 my $retval = {}; # Return value: ref-to-hash holding the configuration
141 my $koha = XMLin($fname, keyattr => ['id'],forcearray => ['listen']);
146 # Translates the full text name of a database into de appropiate dbi name
152 # FIXME - Should have other databases.
153 if (/mysql/i) { return("mysql"); }
154 if (/Postgres|Pg|PostgresSQL/) { return("Pg"); }
155 if (/oracle/i) { return("Oracle"); }
157 return undef; # Just in case
162 my $conf_fname = shift; # Config file name
165 # Create a new context from the given config file name, if
166 # any, then set it as the current context.
167 $context = new C4::Context($conf_fname);
168 return undef if !defined($context);
169 $context->set_context;
174 $context = new C4::Context;
175 $context = new C4::Context("/path/to/koha.xml");
177 Allocates a new context. Initializes the context from the specified
178 file, which defaults to either the file given by the C<$KOHA_CONF>
179 environment variable, or F</etc/koha.xml>.
181 C<&new> does not set this context as the new default context; for
182 that, use C<&set_context>.
188 # 2004-08-10 A. Tarallo: Added check if the conf file is not empty
191 my $conf_fname = shift; # Config file to load
194 # check that the specified config file exists and is not empty
195 undef $conf_fname unless
196 (defined $conf_fname && -e $conf_fname && -s $conf_fname);
197 # Figure out a good config file to load if none was specified.
198 if (!defined($conf_fname))
200 # If the $KOHA_CONF environment variable is set, use
201 # that. Otherwise, use the built-in default.
202 $conf_fname = $ENV{"KOHA_CONF"} || CONFIG_FNAME;
204 # Load the desired config file.
205 $self = read_config_file($conf_fname);
206 $self->{"config_file"} = $conf_fname;
208 warn "read_config_file($conf_fname) returned undef" if !defined($self->{"config"});
209 return undef if !defined($self->{"config"});
211 $self->{"dbh"} = undef; # Database handle
212 $self->{"Zconn"} = undef; # Zebra Connections
213 $self->{"stopwords"} = undef; # stopwords list
214 $self->{"marcfromkohafield"} = undef; # the hash with relations between koha table fields and MARC field/subfield
215 $self->{"userenv"} = undef; # User env
216 $self->{"activeuser"} = undef; # current active user
224 $context = new C4::Context;
225 $context->set_context();
227 set_context C4::Context $context;
230 restore_context C4::Context;
232 In some cases, it might be necessary for a script to use multiple
233 contexts. C<&set_context> saves the current context on a stack, then
234 sets the context to C<$context>, which will be used in future
235 operations. To restore the previous context, use C<&restore_context>.
243 my $new_context; # The context to set
245 # Figure out whether this is a class or instance method call.
247 # We're going to make the assumption that control got here
248 # through valid means, i.e., that the caller used an instance
249 # or class method call, and that control got here through the
250 # usual inheritance mechanisms. The caller can, of course,
251 # break this assumption by playing silly buggers, but that's
252 # harder to do than doing it properly, and harder to check
254 if (ref($self) eq "")
256 # Class method. The new context is the next argument.
257 $new_context = shift;
259 # Instance method. The new context is $self.
260 $new_context = $self;
263 # Save the old context, if any, on the stack
264 push @context_stack, $context if defined($context);
266 # Set the new context
267 $context = $new_context;
270 =item restore_context
274 Restores the context set by C<&set_context>.
283 if ($#context_stack < 0)
286 die "Context stack underflow";
289 # Pop the old context and set it.
290 $context = pop @context_stack;
292 # FIXME - Should this return something, like maybe the context
293 # that was current when this was called?
298 $value = C4::Context->config("config_variable");
300 $value = C4::Context->config_variable;
302 Returns the value of a variable specified in the configuration file
303 from which the current context was created.
305 The second form is more compact, but of course may conflict with
306 method names. If there is a configuration variable called "new", then
307 C<C4::Config-E<gt>new> will not return it.
315 my $var = shift; # The config variable to return
317 return undef if !defined($context->{"config"});
318 # Presumably $self->{config} might be
319 # undefined if the config file given to &new
320 # didn't exist, and the caller didn't bother
321 # to check the return value.
323 # Return the value of the requested config variable
324 return $context->{"config"}->{$var};
330 my $var = shift; # The config variable to return
332 return undef if !defined($context->{"server"});
333 # Presumably $self->{config} might be
334 # undefined if the config file given to &new
335 # didn't exist, and the caller didn't bother
336 # to check the return value.
338 # Return the value of the requested config variable
339 return $context->{"server"}->{$var};
344 my $var = shift; # The config variable to return
346 return undef if !defined($context->{"serverinfo"});
347 # Presumably $self->{config} might be
348 # undefined if the config file given to &new
349 # didn't exist, and the caller didn't bother
350 # to check the return value.
352 # Return the value of the requested config variable
353 return $context->{"serverinfo"}->{$var};
357 $sys_preference = C4::Context->preference("some_variable");
359 Looks up the value of the given system preference in the
360 systempreferences table of the Koha database, and returns it. If the
361 variable is not set, or in case of error, returns the undefined value.
366 # FIXME - The preferences aren't likely to change over the lifetime of
367 # the script (and things might break if they did change), so perhaps
368 # this function should cache the results it finds.
372 my $var = shift; # The system preference to return
373 my $retval; # Return value
374 my $dbh = C4::Context->dbh; # Database handle
376 my $sth; # Database query handle
378 # Look up systempreferences.variable==$var
379 $retval = $dbh->selectrow_array(<<EOT);
381 FROM systempreferences
382 WHERE variable='$var'
391 sub boolean_preference ($) {
393 my $var = shift; # The system preference to return
394 my $it = preference($self, $var);
395 return defined($it)? C4::Boolean::true_p($it): undef;
399 # This implements C4::Config->foo, and simply returns
400 # C4::Context->config("foo"), as described in the documentation for
403 # FIXME - Perhaps this should be extended to check &config first, and
404 # then &preference if that fails. OTOH, AUTOLOAD could lead to crappy
405 # code, so it'd probably be best to delete it altogether so as not to
406 # encourage people to use it.
411 $AUTOLOAD =~ s/.*:://; # Chop off the package name,
412 # leaving only the function name.
413 return $self->config($AUTOLOAD);
418 $Zconn = C4::Context->Zconn
420 Returns a connection to the Zebra database for the current
421 context. If no connection has yet been made, this method
422 creates one and connects.
426 C<$server> one of the servers defined in the koha.xml file
428 C<$async> whether this is a asynchronous connection
430 C<$auth> whether this connection has rw access (1) or just r access (0 or NULL)
442 if ( defined($context->{"Zconn"}->{$server}) ) {
443 return $context->{"Zconn"}->{$server};
445 # No connection object or it died. Create one.
447 $context->{"Zconn"}->{$server} = &_new_Zconn($server,$async,$auth,$piggyback,$syntax);
448 return $context->{"Zconn"}->{$server};
454 $context->{"Zconn"} = &_new_Zconn($server,$async);
456 Internal function. Creates a new database connection from the data given in the current context and returns it.
458 C<$server> one of the servers defined in the koha.xml file
460 C<$async> whether this is a asynchronous connection
462 C<$auth> whether this connection has rw access (1) or just r access (0 or NULL)
467 my ($server,$async,$auth,$piggyback,$syntax) = @_;
469 my $tried=0; # first attempt
470 my $Zconn; # connection object
471 $server = "biblioserver" unless $server;
472 $syntax = "usmarc" unless $syntax;
474 my $host = $context->{'listen'}->{$server}->{'content'};
475 my $user = $context->{"serverinfo"}->{$server}->{"user"};
476 my $servername = $context->{"config"}->{$server};
477 my $password = $context->{"serverinfo"}->{$server}->{"password"};
478 warn "server:$server servername :$servername host:$host";
482 my $o = new ZOOM::Options();
483 $o->option(async => 1) if $async;
484 $o->option(count => $piggyback) if $piggyback;
485 $o->option(cqlfile=> $context->{"server"}->{$server}->{"cql2rpn"});
486 $o->option(cclfile=> $context->{"serverinfo"}->{$server}->{"ccl2rpn"});
487 $o->option(preferredRecordSyntax => $syntax);
488 $o->option(elementSetName => "F"); # F for 'full' as opposed to B for 'brief'
489 $o->option(user=>$user) if $auth;
490 $o->option(password=>$password) if $auth;
491 $o->option(databaseName => ($servername?$servername:"biblios"));
493 # create a new connection object
494 $Zconn= create ZOOM::Connection($o);
497 $Zconn->connect($host, 0);
499 # check for errors and warn
500 if ($Zconn->errcode() !=0) {
501 warn "something wrong with the connection: ". $Zconn->errmsg();
506 # # Koha manages the Zebra server -- this doesn't work currently for me because of permissions issues
507 # # Also, I'm skeptical about whether it's the best approach
508 # warn "problem with Zebra";
509 # if ( C4::Context->preference("ManageZebra") ) {
510 # if ($@->code==10000 && $tried==0) { ##No connection try restarting Zebra
512 # warn "trying to restart Zebra";
513 # my $res=system("zebrasrv -f $ENV{'KOHA_CONF'} >/koha/log/zebra-error.log");
516 # warn "Error ", $@->code(), ": ", $@->message(), "\n";
526 # Internal helper function (not a method!). This creates a new
527 # database connection from the data given in the current context, and
531 ##correct name for db_schme
533 if ($context->config("db_scheme")){
534 $db_driver=db_scheme2dbi($context->config("db_scheme"));
539 my $db_name = $context->config("database");
540 my $db_host = $context->config("hostname");
541 my $db_user = $context->config("user");
542 my $db_passwd = $context->config("pass");
543 my $dbh= DBI->connect("DBI:$db_driver:$db_name:$db_host",
544 $db_user, $db_passwd);
545 # Koha 3.0 is utf-8, so force utf8 communication between mySQL and koha, whatever the mysql default config.
546 # this is better than modifying my.cnf (and forcing all communications to be in utf8)
547 $dbh->do("set NAMES 'utf8'") if ($dbh);
553 $dbh = C4::Context->dbh;
555 Returns a database handle connected to the Koha database for the
556 current context. If no connection has yet been made, this method
557 creates one, and connects to the database.
559 This database handle is cached for future use: if you call
560 C<C4::Context-E<gt>dbh> twice, you will get the same handle both
561 times. If you need a second database handle, use C<&new_dbh> and
562 possibly C<&set_dbh>.
572 if (defined($context->{"dbh"})) {
573 $sth=$context->{"dbh"}->prepare("select 1");
574 return $context->{"dbh"} if (defined($sth->execute));
577 # No database handle or it died . Create one.
578 $context->{"dbh"} = &_new_dbh();
580 return $context->{"dbh"};
585 $dbh = C4::Context->new_dbh;
587 Creates a new connection to the Koha database for the current context,
588 and returns the database handle (a C<DBI::db> object).
590 The handle is not saved anywhere: this method is strictly a
591 convenience function; the point is that it knows which database to
592 connect to so that the caller doesn't have to know.
606 $my_dbh = C4::Connect->new_dbh;
607 C4::Connect->set_dbh($my_dbh);
609 C4::Connect->restore_dbh;
611 C<&set_dbh> and C<&restore_dbh> work in a manner analogous to
612 C<&set_context> and C<&restore_context>.
614 C<&set_dbh> saves the current database handle on a stack, then sets
615 the current database handle to C<$my_dbh>.
617 C<$my_dbh> is assumed to be a good database handle.
627 # Save the current database handle on the handle stack.
628 # We assume that $new_dbh is all good: if the caller wants to
629 # screw himself by passing an invalid handle, that's fine by
631 push @{$context->{"dbh_stack"}}, $context->{"dbh"};
632 $context->{"dbh"} = $new_dbh;
637 C4::Context->restore_dbh;
639 Restores the database handle saved by an earlier call to
640 C<C4::Context-E<gt>set_dbh>.
649 if ($#{$context->{"dbh_stack"}} < 0)
652 die "DBH stack underflow";
655 # Pop the old database handle and set it.
656 $context->{"dbh"} = pop @{$context->{"dbh_stack"}};
658 # FIXME - If it is determined that restore_context should
659 # return something, then this function should, too.
662 =item marcfromkohafield
664 $dbh = C4::Context->marcfromkohafield;
666 Returns a hash with marcfromkohafield.
668 This hash is cached for future use: if you call
669 C<C4::Context-E<gt>marcfromkohafield> twice, you will get the same hash without real DB access
674 sub marcfromkohafield
678 # If the hash already exists, return it.
679 return $context->{"marcfromkohafield"} if defined($context->{"marcfromkohafield"});
681 # No hash. Create one.
682 $context->{"marcfromkohafield"} = &_new_marcfromkohafield();
684 return $context->{"marcfromkohafield"};
687 # _new_marcfromkohafield
688 # Internal helper function (not a method!). This creates a new
689 # hash with stopwords
690 sub _new_marcfromkohafield
692 my $dbh = C4::Context->dbh;
693 my $marcfromkohafield;
694 my $sth = $dbh->prepare("select frameworkcode,kohafield,tagfield,tagsubfield from marc_subfield_structure where kohafield > ''");
696 while (my ($frameworkcode,$kohafield,$tagfield,$tagsubfield) = $sth->fetchrow) {
698 $marcfromkohafield->{$frameworkcode}->{$kohafield} = [$tagfield,$tagsubfield];
700 return $marcfromkohafield;
705 $dbh = C4::Context->stopwords;
707 Returns a hash with stopwords.
709 This hash is cached for future use: if you call
710 C<C4::Context-E<gt>stopwords> twice, you will get the same hash without real DB access
719 # If the hash already exists, return it.
720 return $context->{"stopwords"} if defined($context->{"stopwords"});
722 # No hash. Create one.
723 $context->{"stopwords"} = &_new_stopwords();
725 return $context->{"stopwords"};
729 # Internal helper function (not a method!). This creates a new
730 # hash with stopwords
733 my $dbh = C4::Context->dbh;
735 my $sth = $dbh->prepare("select word from stopwords");
737 while (my $stopword = $sth->fetchrow_array) {
739 $stopwordlist->{$stopword} = uc($stopword);
741 $stopwordlist->{A} = "A" unless $stopwordlist;
742 return $stopwordlist;
747 C4::Context->userenv;
749 Builds a hash for user environment variables.
751 This hash shall be cached for future use: if you call
752 C<C4::Context-E<gt>userenv> twice, you will get the same hash without real DB access
754 set_userenv is called in Auth.pm
761 my $var = $context->{"activeuser"};
762 return $context->{"userenv"}->{$var} if (defined $context->{"userenv"}->{$var});
763 # insecure=1 management
764 if ($context->{"dbh"} && $context->preference('insecure')) {
766 $insecure{flags} = '16382';
767 $insecure{branchname} ='Insecure',
768 $insecure{number} ='0';
769 $insecure{cardnumber} ='0';
770 $insecure{id} = 'insecure';
771 $insecure{branch} = 'INS';
772 $insecure{emailaddress} = 'test@mode.insecure.com';
781 C4::Context->set_userenv($usernum, $userid, $usercnum, $userfirstname, $usersurname, $userbranch, $userflags, $emailaddress);
783 Informs a hash for user environment variables.
785 This hash shall be cached for future use: if you call
786 C<C4::Context-E<gt>userenv> twice, you will get the same hash without real DB access
788 set_userenv is called in Auth.pm
794 my ($usernum, $userid, $usercnum, $userfirstname, $usersurname, $userbranch, $branchname, $userflags, $emailaddress)= @_;
795 my $var=$context->{"activeuser"};
797 "number" => $usernum,
799 "cardnumber" => $usercnum,
800 "firstname" => $userfirstname,
801 "surname" => $usersurname,
802 #possibly a law problem
803 "branch" => $userbranch,
804 "branchname" => $branchname,
805 "flags" => $userflags,
806 "emailaddress" => $emailaddress,
808 $context->{userenv}->{$var} = $cell;
814 C4::Context->_new_userenv($session);
816 Builds a hash for user environment variables.
818 This hash shall be cached for future use: if you call
819 C<C4::Context-E<gt>userenv> twice, you will get the same hash without real DB access
821 _new_userenv is called in Auth.pm
830 $context->{"activeuser"}=$sessionID;
835 C4::Context->_unset_userenv;
837 Destroys the hash for activeuser user environment variables.
846 undef $context->{"activeuser"} if ($context->{"activeuser"} eq $sessionID);
862 Specifies the configuration file to read.
870 Andrew Arensburger <arensb at ooblick dot com>
872 Joshua Ferraro <jmf at liblime dot com>
877 # Revision 1.51 2007/03/09 14:31:47 tipaul
878 # rel_3_0 moved to HEAD
880 # Revision 1.43.2.10 2007/02/09 17:17:56 hdl
881 # Managing a little better database absence.
882 # (preventing from BIG 550)
884 # Revision 1.43.2.9 2006/12/20 16:50:48 tipaul
885 # improving "insecure" management
888 # you told me that you had some libraries with insecure=ON (behind a firewall).
889 # In this commit, I created a "fake" user when insecure=ON. It has a fake branch. You may find better to have the 1st branch in branch table instead of a fake one.
891 # Revision 1.43.2.8 2006/12/19 16:48:16 alaurin
892 # reident programs, and adding branchcode value in reserves2
894 # Revision 1.43.2.7 2006/12/06 21:55:38 hdl
895 # Adding zebraoptions for servers to get serverinfos in Context.pm
896 # Using this function in rebuild_zebra.pl
898 # Revision 1.43.2.6 2006/11/24 21:18:31 kados
899 # very minor changes, no functional ones, just comments, etc.
901 # Revision 1.43.2.5 2006/10/30 13:24:16 toins
902 # fix some minor POD error.
904 # Revision 1.43.2.4 2006/10/12 21:42:49 hdl
905 # Managing multiple zebra connections
907 # Revision 1.43.2.3 2006/10/11 14:27:26 tipaul
910 # Revision 1.43.2.2 2006/10/10 15:28:16 hdl
911 # BUG FIXING : using database name in Zconn if defined and not hard coded value
913 # Revision 1.43.2.1 2006/10/06 13:47:28 toins
914 # Synch with dev_week.
915 # /!\ WARNING :: Please now use the new version of koha.xml.
917 # Revision 1.18.2.5.2.14 2006/09/24 15:24:06 kados
918 # remove Zebraauth routine, fold the functionality into Zconn
919 # Zconn can now take several arguments ... this will probably
920 # change soon as I'm not completely happy with the readability
921 # of the current format ... see the POD for details.
923 # cleaning up Biblio.pm, removing unnecessary routines.
925 # DeleteBiblio - used to delete a biblio from zebra and koha tables
926 # -- checks to make sure there are no existing issues
927 # -- saves backups of biblio,biblioitems,items in deleted* tables
928 # -- does commit operation
930 # getRecord - used to retrieve one record from zebra in piggyback mode using biblionumber
931 # brought back z3950_extended_services routine
933 # Lots of modifications to Context.pm, you can now store user and pass info for
934 # multiple servers (for federated searching) using the <serverinfo> element.
935 # I'll commit my koha.xml to demonstrate this or you can refer to the POD in
936 # Context.pm (which I also expanded on).
938 # Revision 1.18.2.5.2.13 2006/08/10 02:10:21 kados
939 # Turned warnings on, and running a search turned up lots of warnings.
940 # Cleaned up those ...
942 # removed getitemtypes from Koha.pm (one in Search.pm looks newer)
943 # removed itemcount from Biblio.pm
945 # made some local subs local with a _ prefix (as they were redefined
948 # Add two new search subs to Search.pm the start of a new search API
949 # that's a bit more scalable
951 # Revision 1.18.2.5.2.10 2006/07/21 17:50:51 kados
952 # moving the *.properties files to intranetdir/etc dir
954 # Revision 1.18.2.5.2.9 2006/07/17 08:05:20 tipaul
955 # there was a hardcoded link to /koha/etc/ I replaced it with intranetdir config value
957 # Revision 1.18.2.5.2.8 2006/07/11 12:20:37 kados
958 # adding ccl and cql files ... Tumer, if you want to fit these into the
959 # config file by all means do.
961 # Revision 1.18.2.5.2.7 2006/06/04 22:50:33 tgarip1957
962 # We do not hard code cql2rpn conversion file in context.pm our koha.xml configuration file already describes the path for this file.
963 # At cql searching we use method CQL not CQL2RPN as the cql2rpn conversion file is defined at server level
965 # Revision 1.18.2.5.2.6 2006/06/02 23:11:24 kados
966 # Committing my working dev_week. It's been tested only with
967 # searching, and there's quite a lot of config stuff to set up
968 # beforehand. As things get closer to a release, we'll be making
969 # some scripts to do it for us
971 # Revision 1.18.2.5.2.5 2006/05/28 18:49:12 tgarip1957
972 # This is an unusual commit. The main purpose is a working model of Zebra on a modified rel2_2.
973 # Any questions regarding these commits should be asked to Joshua Ferraro unless you are Joshua whom I'll report to
975 # Revision 1.36 2006/05/09 13:28:08 tipaul
976 # adding the branchname and the librarian name in every page :
977 # - modified userenv to add branchname
978 # - modifier menus.inc to have the librarian name & userenv displayed on every page. they are in a librarian_information div.
980 # Revision 1.35 2006/04/13 08:40:11 plg
981 # bug fixed: typo on Zconnauth name
983 # Revision 1.34 2006/04/10 21:40:23 tgarip1957
984 # A new handler defined for zebra Zconnauth with read/write permission. Zconnauth should only be called in biblio.pm where write operations are. Use of this handler will break things unless koha.conf contains new variables:
986 # zebraport=<your port>
987 # zebrauser=<username>
988 # zebrapass=<password>
990 # The zebra.cfg file should read:
993 # passw.c:<yourpasswordfile>
995 # Password file should be prepared with Apaches htpasswd utility in encrypted mode and should exist in a folder zebra.cfg can read
997 # Revision 1.33 2006/03/15 11:21:56 plg
998 # bug fixed: utf-8 data where not displayed correctly in screens. Supposing
999 # your data are truely utf-8 encoded in your database, they should be
1000 # correctly displayed. "set names 'UTF8'" on mysql connection (C4/Context.pm)
1001 # is mandatory and "binmode" to utf8 (C4/Interface/CGI/Output.pm) seemed to
1002 # converted data twice, so it was removed.
1004 # Revision 1.32 2006/03/03 17:25:01 hdl
1005 # Bug fixing : a line missed a comment sign.
1007 # Revision 1.31 2006/03/03 16:45:36 kados
1008 # Remove the search that tests the Zconn -- warning, still no fault
1011 # Revision 1.30 2006/02/22 00:56:59 kados
1012 # First go at a connection object for Zebra. You can now get a
1013 # connection object by doing:
1015 # my $Zconn = C4::Context->Zconn;
1017 # My initial tests indicate that as soon as your funcion ends
1018 # (ie, when you're done doing something) the connection will be
1019 # closed automatically. There may be some other way to make the
1020 # connection more stateful, I'm not sure...