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 = '3.00.00.002';
35 C4::Context - Maintain and manipulate the context of a Koha script
41 use C4::Context("/path/to/koha.xml");
43 $config_value = C4::Context->config("config_variable");
45 $koha_preference = C4::Context->preference("preference");
47 $db_handle = C4::Context->dbh;
49 $Zconn = C4::Context->Zconn;
51 $stopwordhash = C4::Context->stopwords;
55 When a Koha script runs, it makes use of a certain number of things:
56 configuration settings in F</etc/koha.xml>, a connection to the Koha
57 databases, and so forth. These things make up the I<context> in which
60 This module takes care of setting up the context for a script:
61 figuring out which configuration file to load, and loading it, opening
62 a connection to the right database, and so forth.
64 Most scripts will only use one context. They can simply have
70 Other scripts may need to use several contexts. For instance, if a
71 library has two databases, one for a certain collection, and the other
72 for everything else, it might be necessary for a script to use two
73 different contexts to search both databases. Such scripts should use
74 the C<&set_context> and C<&restore_context> functions, below.
76 By default, C4::Context reads the configuration from
77 F</etc/koha.xml>. This may be overridden by setting the C<$KOHA_CONF>
78 environment variable to the pathname of a configuration file to use.
87 # In addition to what is said in the POD above, a Context object is a
88 # reference-to-hash with the following fields:
91 # A reference-to-hash whose keys and values are the
92 # configuration variables and values specified in the config
93 # file (/etc/koha.xml).
95 # A handle to the appropriate database for this context.
97 # Used by &set_dbh and &restore_dbh to hold other database
98 # handles for this context.
100 # A connection object for the Zebra server
102 use constant CONFIG_FNAME => "/etc/koha.xml";
103 # Default config file, if none is specified
105 $context = undef; # Initially, no context is set
106 @context_stack = (); # Initially, no saved contexts
110 returns the kohaversion stored in kohaversion.pl file
114 my $cgidir = C4::Context->intranetdir ."/cgi-bin";
115 unless (opendir(DIR, "$cgidir/cataloguing/value_builder")) {
116 $cgidir = C4::Context->intranetdir;
118 do $cgidir."/kohaversion.pl" || die "NO $cgidir/kohaversion.pl";
119 return kohaversion();
121 =item read_config_file
125 Reads the specified Koha config file.
127 Returns an object containing the configuration variables. The object's
128 structure is a bit complex to the uninitiated ... take a look at the
129 koha.xml file as well as the XML::Simple documentation for details. Or,
130 here are a few examples that may give you what you need:
132 The simple elements nested within the <config> element:
134 my $pass = $koha->{'config'}->{'pass'};
136 The <listen> elements:
138 my $listen = $koha->{'listen'}->{'biblioserver'}->{'content'};
140 The elements nested within the <server> element:
142 my $ccl2rpn = $koha->{'server'}->{'biblioserver'}->{'cql2rpn'};
144 Returns undef in case of error.
150 sub read_config_file {
151 my $fname = shift; # Config file to read
152 my $retval = {}; # Return value: ref-to-hash holding the configuration
153 my $koha = XMLin($fname, keyattr => ['id'],forcearray => ['listen', 'server', 'serverinfo']);
158 # Translates the full text name of a database into de appropiate dbi name
164 # FIXME - Should have other databases.
165 if (/mysql/i) { return("mysql"); }
166 if (/Postgres|Pg|PostgresSQL/) { return("Pg"); }
167 if (/oracle/i) { return("Oracle"); }
169 return undef; # Just in case
174 my $conf_fname = shift; # Config file name
177 # Create a new context from the given config file name, if
178 # any, then set it as the current context.
179 $context = new C4::Context($conf_fname);
180 return undef if !defined($context);
181 $context->set_context;
186 $context = new C4::Context;
187 $context = new C4::Context("/path/to/koha.xml");
189 Allocates a new context. Initializes the context from the specified
190 file, which defaults to either the file given by the C<$KOHA_CONF>
191 environment variable, or F</etc/koha.xml>.
193 C<&new> does not set this context as the new default context; for
194 that, use C<&set_context>.
200 # 2004-08-10 A. Tarallo: Added check if the conf file is not empty
203 my $conf_fname = shift; # Config file to load
206 # check that the specified config file exists and is not empty
207 undef $conf_fname unless
208 (defined $conf_fname && -e $conf_fname && -s $conf_fname);
209 # Figure out a good config file to load if none was specified.
210 if (!defined($conf_fname))
212 # If the $KOHA_CONF environment variable is set, use
213 # that. Otherwise, use the built-in default.
214 $conf_fname = $ENV{"KOHA_CONF"} || CONFIG_FNAME;
216 # Load the desired config file.
217 $self = read_config_file($conf_fname);
218 $self->{"config_file"} = $conf_fname;
220 warn "read_config_file($conf_fname) returned undef" if !defined($self->{"config"});
221 return undef if !defined($self->{"config"});
223 $self->{"dbh"} = undef; # Database handle
224 $self->{"Zconn"} = undef; # Zebra Connections
225 $self->{"stopwords"} = undef; # stopwords list
226 $self->{"marcfromkohafield"} = undef; # the hash with relations between koha table fields and MARC field/subfield
227 $self->{"userenv"} = undef; # User env
228 $self->{"activeuser"} = undef; # current active user
236 $context = new C4::Context;
237 $context->set_context();
239 set_context C4::Context $context;
242 restore_context C4::Context;
244 In some cases, it might be necessary for a script to use multiple
245 contexts. C<&set_context> saves the current context on a stack, then
246 sets the context to C<$context>, which will be used in future
247 operations. To restore the previous context, use C<&restore_context>.
255 my $new_context; # The context to set
257 # Figure out whether this is a class or instance method call.
259 # We're going to make the assumption that control got here
260 # through valid means, i.e., that the caller used an instance
261 # or class method call, and that control got here through the
262 # usual inheritance mechanisms. The caller can, of course,
263 # break this assumption by playing silly buggers, but that's
264 # harder to do than doing it properly, and harder to check
266 if (ref($self) eq "")
268 # Class method. The new context is the next argument.
269 $new_context = shift;
271 # Instance method. The new context is $self.
272 $new_context = $self;
275 # Save the old context, if any, on the stack
276 push @context_stack, $context if defined($context);
278 # Set the new context
279 $context = $new_context;
282 =item restore_context
286 Restores the context set by C<&set_context>.
295 if ($#context_stack < 0)
298 die "Context stack underflow";
301 # Pop the old context and set it.
302 $context = pop @context_stack;
304 # FIXME - Should this return something, like maybe the context
305 # that was current when this was called?
310 $value = C4::Context->config("config_variable");
312 $value = C4::Context->config_variable;
314 Returns the value of a variable specified in the configuration file
315 from which the current context was created.
317 The second form is more compact, but of course may conflict with
318 method names. If there is a configuration variable called "new", then
319 C<C4::Config-E<gt>new> will not return it.
327 my $var = shift; # The config variable to return
329 return undef if !defined($context->{"config"});
330 # Presumably $self->{config} might be
331 # undefined if the config file given to &new
332 # didn't exist, and the caller didn't bother
333 # to check the return value.
335 # Return the value of the requested config variable
336 return $context->{"config"}->{$var};
342 my $var = shift; # The config variable to return
344 return undef if !defined($context->{"server"});
345 # Presumably $self->{config} might be
346 # undefined if the config file given to &new
347 # didn't exist, and the caller didn't bother
348 # to check the return value.
350 # Return the value of the requested config variable
351 return $context->{"server"}->{$var};
356 my $var = shift; # The config variable to return
358 return undef if !defined($context->{"serverinfo"});
359 # Presumably $self->{config} might be
360 # undefined if the config file given to &new
361 # didn't exist, and the caller didn't bother
362 # to check the return value.
364 # Return the value of the requested config variable
365 return $context->{"serverinfo"}->{$var};
369 $sys_preference = C4::Context->preference("some_variable");
371 Looks up the value of the given system preference in the
372 systempreferences table of the Koha database, and returns it. If the
373 variable is not set, or in case of error, returns the undefined value.
378 # FIXME - The preferences aren't likely to change over the lifetime of
379 # the script (and things might break if they did change), so perhaps
380 # this function should cache the results it finds.
384 my $var = shift; # The system preference to return
385 my $retval; # Return value
386 my $dbh = C4::Context->dbh; # Database handle
388 my $sth; # Database query handle
390 # Look up systempreferences.variable==$var
391 $retval = $dbh->selectrow_array(<<EOT);
393 FROM systempreferences
394 WHERE variable='$var'
403 sub boolean_preference ($) {
405 my $var = shift; # The system preference to return
406 my $it = preference($self, $var);
407 return defined($it)? C4::Boolean::true_p($it): undef;
411 # This implements C4::Config->foo, and simply returns
412 # C4::Context->config("foo"), as described in the documentation for
415 # FIXME - Perhaps this should be extended to check &config first, and
416 # then &preference if that fails. OTOH, AUTOLOAD could lead to crappy
417 # code, so it'd probably be best to delete it altogether so as not to
418 # encourage people to use it.
423 $AUTOLOAD =~ s/.*:://; # Chop off the package name,
424 # leaving only the function name.
425 return $self->config($AUTOLOAD);
430 $Zconn = C4::Context->Zconn
432 Returns a connection to the Zebra database for the current
433 context. If no connection has yet been made, this method
434 creates one and connects.
438 C<$server> one of the servers defined in the koha.xml file
440 C<$async> whether this is a asynchronous connection
442 C<$auth> whether this connection has rw access (1) or just r access (0 or NULL)
454 if ( defined($context->{"Zconn"}->{$server}) ) {
455 return $context->{"Zconn"}->{$server};
457 # No connection object or it died. Create one.
459 $context->{"Zconn"}->{$server} = &_new_Zconn($server,$async,$auth,$piggyback,$syntax);
460 return $context->{"Zconn"}->{$server};
466 $context->{"Zconn"} = &_new_Zconn($server,$async);
468 Internal function. Creates a new database connection from the data given in the current context and returns it.
470 C<$server> one of the servers defined in the koha.xml file
472 C<$async> whether this is a asynchronous connection
474 C<$auth> whether this connection has rw access (1) or just r access (0 or NULL)
479 my ($server,$async,$auth,$piggyback,$syntax) = @_;
481 my $tried=0; # first attempt
482 my $Zconn; # connection object
483 $server = "biblioserver" unless $server;
484 $syntax = "usmarc" unless $syntax;
486 my $host = $context->{'listen'}->{$server}->{'content'};
487 my $user = $context->{"serverinfo"}->{$server}->{"user"};
488 my $servername = $context->{"config"}->{$server};
489 my $password = $context->{"serverinfo"}->{$server}->{"password"};
493 my $o = new ZOOM::Options();
494 $o->option(async => 1) if $async;
495 $o->option(count => $piggyback) if $piggyback;
496 $o->option(cqlfile=> $context->{"server"}->{$server}->{"cql2rpn"});
497 $o->option(cclfile=> $context->{"serverinfo"}->{$server}->{"ccl2rpn"});
498 $o->option(preferredRecordSyntax => $syntax);
499 $o->option(elementSetName => "F"); # F for 'full' as opposed to B for 'brief'
500 $o->option(user=>$user) if $auth;
501 $o->option(password=>$password) if $auth;
502 $o->option(databaseName => ($servername?$servername:"biblios"));
504 # create a new connection object
505 $Zconn= create ZOOM::Connection($o);
508 $Zconn->connect($host, 0);
510 # check for errors and warn
511 if ($Zconn->errcode() !=0) {
512 warn "something wrong with the connection: ". $Zconn->errmsg();
517 # # Koha manages the Zebra server -- this doesn't work currently for me because of permissions issues
518 # # Also, I'm skeptical about whether it's the best approach
519 # warn "problem with Zebra";
520 # if ( C4::Context->preference("ManageZebra") ) {
521 # if ($@->code==10000 && $tried==0) { ##No connection try restarting Zebra
523 # warn "trying to restart Zebra";
524 # my $res=system("zebrasrv -f $ENV{'KOHA_CONF'} >/koha/log/zebra-error.log");
527 # warn "Error ", $@->code(), ": ", $@->message(), "\n";
537 # Internal helper function (not a method!). This creates a new
538 # database connection from the data given in the current context, and
542 ##correct name for db_schme
544 if ($context->config("db_scheme")){
545 $db_driver=db_scheme2dbi($context->config("db_scheme"));
550 my $db_name = $context->config("database");
551 my $db_host = $context->config("hostname");
552 my $db_user = $context->config("user");
553 my $db_passwd = $context->config("pass");
554 my $dbh= DBI->connect("DBI:$db_driver:$db_name:$db_host",
555 $db_user, $db_passwd);
556 # Koha 3.0 is utf-8, so force utf8 communication between mySQL and koha, whatever the mysql default config.
557 # this is better than modifying my.cnf (and forcing all communications to be in utf8)
558 $dbh->do("set NAMES 'utf8'") if ($dbh);
559 $dbh->{'mysql_enable_utf8'}=1; #enable
565 $dbh = C4::Context->dbh;
567 Returns a database handle connected to the Koha database for the
568 current context. If no connection has yet been made, this method
569 creates one, and connects to the database.
571 This database handle is cached for future use: if you call
572 C<C4::Context-E<gt>dbh> twice, you will get the same handle both
573 times. If you need a second database handle, use C<&new_dbh> and
574 possibly C<&set_dbh>.
584 if (defined($context->{"dbh"})) {
585 $sth=$context->{"dbh"}->prepare("select 1");
586 return $context->{"dbh"} if (defined($sth->execute));
589 # No database handle or it died . Create one.
590 $context->{"dbh"} = &_new_dbh();
592 return $context->{"dbh"};
597 $dbh = C4::Context->new_dbh;
599 Creates a new connection to the Koha database for the current context,
600 and returns the database handle (a C<DBI::db> object).
602 The handle is not saved anywhere: this method is strictly a
603 convenience function; the point is that it knows which database to
604 connect to so that the caller doesn't have to know.
618 $my_dbh = C4::Connect->new_dbh;
619 C4::Connect->set_dbh($my_dbh);
621 C4::Connect->restore_dbh;
623 C<&set_dbh> and C<&restore_dbh> work in a manner analogous to
624 C<&set_context> and C<&restore_context>.
626 C<&set_dbh> saves the current database handle on a stack, then sets
627 the current database handle to C<$my_dbh>.
629 C<$my_dbh> is assumed to be a good database handle.
639 # Save the current database handle on the handle stack.
640 # We assume that $new_dbh is all good: if the caller wants to
641 # screw himself by passing an invalid handle, that's fine by
643 push @{$context->{"dbh_stack"}}, $context->{"dbh"};
644 $context->{"dbh"} = $new_dbh;
649 C4::Context->restore_dbh;
651 Restores the database handle saved by an earlier call to
652 C<C4::Context-E<gt>set_dbh>.
661 if ($#{$context->{"dbh_stack"}} < 0)
664 die "DBH stack underflow";
667 # Pop the old database handle and set it.
668 $context->{"dbh"} = pop @{$context->{"dbh_stack"}};
670 # FIXME - If it is determined that restore_context should
671 # return something, then this function should, too.
674 =item marcfromkohafield
676 $dbh = C4::Context->marcfromkohafield;
678 Returns a hash with marcfromkohafield.
680 This hash is cached for future use: if you call
681 C<C4::Context-E<gt>marcfromkohafield> twice, you will get the same hash without real DB access
686 sub marcfromkohafield
690 # If the hash already exists, return it.
691 return $context->{"marcfromkohafield"} if defined($context->{"marcfromkohafield"});
693 # No hash. Create one.
694 $context->{"marcfromkohafield"} = &_new_marcfromkohafield();
696 return $context->{"marcfromkohafield"};
699 # _new_marcfromkohafield
700 # Internal helper function (not a method!). This creates a new
701 # hash with stopwords
702 sub _new_marcfromkohafield
704 my $dbh = C4::Context->dbh;
705 my $marcfromkohafield;
706 my $sth = $dbh->prepare("select frameworkcode,kohafield,tagfield,tagsubfield from marc_subfield_structure where kohafield > ''");
708 while (my ($frameworkcode,$kohafield,$tagfield,$tagsubfield) = $sth->fetchrow) {
710 $marcfromkohafield->{$frameworkcode}->{$kohafield} = [$tagfield,$tagsubfield];
712 return $marcfromkohafield;
717 $dbh = C4::Context->stopwords;
719 Returns a hash with stopwords.
721 This hash is cached for future use: if you call
722 C<C4::Context-E<gt>stopwords> twice, you will get the same hash without real DB access
731 # If the hash already exists, return it.
732 return $context->{"stopwords"} if defined($context->{"stopwords"});
734 # No hash. Create one.
735 $context->{"stopwords"} = &_new_stopwords();
737 return $context->{"stopwords"};
741 # Internal helper function (not a method!). This creates a new
742 # hash with stopwords
745 my $dbh = C4::Context->dbh;
747 my $sth = $dbh->prepare("select word from stopwords");
749 while (my $stopword = $sth->fetchrow_array) {
751 $stopwordlist->{$stopword} = uc($stopword);
753 $stopwordlist->{A} = "A" unless $stopwordlist;
754 return $stopwordlist;
759 C4::Context->userenv;
761 Builds a hash for user environment variables.
763 This hash shall be cached for future use: if you call
764 C<C4::Context-E<gt>userenv> twice, you will get the same hash without real DB access
766 set_userenv is called in Auth.pm
773 my $var = $context->{"activeuser"};
774 return $context->{"userenv"}->{$var} if (defined $context->{"userenv"}->{$var});
775 # insecure=1 management
776 if ($context->{"dbh"} && $context->preference('insecure')) {
778 $insecure{flags} = '16382';
779 $insecure{branchname} ='Insecure',
780 $insecure{number} ='0';
781 $insecure{cardnumber} ='0';
782 $insecure{id} = 'insecure';
783 $insecure{branch} = 'INS';
784 $insecure{emailaddress} = 'test@mode.insecure.com';
793 C4::Context->set_userenv($usernum, $userid, $usercnum, $userfirstname, $usersurname, $userbranch, $userflags, $emailaddress);
795 Informs a hash for user environment variables.
797 This hash shall be cached for future use: if you call
798 C<C4::Context-E<gt>userenv> twice, you will get the same hash without real DB access
800 set_userenv is called in Auth.pm
806 my ($usernum, $userid, $usercnum, $userfirstname, $usersurname, $userbranch, $branchname, $userflags, $emailaddress, $branchprinter)= @_;
807 my $var=$context->{"activeuser"};
809 "number" => $usernum,
811 "cardnumber" => $usercnum,
812 "firstname" => $userfirstname,
813 "surname" => $usersurname,
814 #possibly a law problem
815 "branch" => $userbranch,
816 "branchname" => $branchname,
817 "flags" => $userflags,
818 "emailaddress" => $emailaddress,
819 "branchprinter" => $branchprinter
821 $context->{userenv}->{$var} = $cell;
827 C4::Context->_new_userenv($session);
829 Builds a hash for user environment variables.
831 This hash shall be cached for future use: if you call
832 C<C4::Context-E<gt>userenv> twice, you will get the same hash without real DB access
834 _new_userenv is called in Auth.pm
843 $context->{"activeuser"}=$sessionID;
848 C4::Context->_unset_userenv;
850 Destroys the hash for activeuser user environment variables.
859 undef $context->{"activeuser"} if ($context->{"activeuser"} eq $sessionID);
875 Specifies the configuration file to read.
883 Andrew Arensburger <arensb at ooblick dot com>
885 Joshua Ferraro <jmf at liblime dot com>
890 # Revision 1.57 2007/05/22 09:13:55 tipaul
891 # Bugfixes & improvements (various and minor) :
892 # - updating templates to have tmpl_process3.pl running without any errors
893 # - adding a drupal-like css for prog templates (with 3 small images)
894 # - fixing some bugs in circulation & other scripts
895 # - updating french translation
896 # - fixing some typos in templates
898 # Revision 1.56 2007/04/23 15:21:17 tipaul
899 # renaming currenttransfers to transferstoreceive
901 # Revision 1.55 2007/04/17 08:48:00 tipaul
902 # circulation cleaning continued: bufixing
904 # Revision 1.54 2007/03/29 16:45:53 tipaul
905 # Code cleaning of Biblio.pm (continued)
907 # All subs have be cleaned :
910 # - reordering Biblio.pm completly
911 # - using only naming conventions
913 # Seems to have broken nothing, but it still has to be heavily tested.
914 # Note that Biblio.pm is now much more efficient than previously & probably more reliable as well.
916 # Revision 1.53 2007/03/29 13:30:31 tipaul
918 # == Biblio.pm cleaning (useless) ==
919 # * some sub declaration dropped
920 # * removed modbiblio sub
921 # * removed moditem sub
922 # * removed newitems. It was used only in finishrecieve. Replaced by a TransformKohaToMarc+AddItem, that is better.
923 # * removed MARCkoha2marcItem
924 # * removed MARCdelsubfield declaration
925 # * removed MARCkoha2marcBiblio
927 # == Biblio.pm cleaning (naming conventions) ==
928 # * MARCgettagslib renamed to GetMarcStructure
929 # * MARCgetitems renamed to GetMarcItem
930 # * MARCfind_frameworkcode renamed to GetFrameworkCode
931 # * MARCmarc2koha renamed to TransformMarcToKoha
932 # * MARChtml2marc renamed to TransformHtmlToMarc
933 # * MARChtml2xml renamed to TranformeHtmlToXml
934 # * zebraop renamed to ModZebra
937 # * removing MARC=OFF related scripts (in cataloguing directory)
938 # * removed checkitems (function related to MARC=off feature, that is completly broken in head. If someone want to reintroduce it, hard work coming...)
939 # * removed getitemsbybiblioitem (used only by MARC=OFF scripts, that is removed as well)
941 # Revision 1.52 2007/03/16 01:25:08 kados
942 # Using my precrash CVS copy I did the following:
944 # cvs -z3 -d:ext:kados@cvs.savannah.nongnu.org:/sources/koha co -P koha
945 # find koha.precrash -type d -name "CVS" -exec rm -v {} \;
946 # cp -r koha.precrash/* koha/
950 # This should in theory put us right back where we were before the crash
952 # Revision 1.52 2007/03/12 21:17:05 rych
953 # add server, serverinfo as arrays from config
955 # Revision 1.51 2007/03/09 14:31:47 tipaul
956 # rel_3_0 moved to HEAD
958 # Revision 1.43.2.10 2007/02/09 17:17:56 hdl
959 # Managing a little better database absence.
960 # (preventing from BIG 550)
962 # Revision 1.43.2.9 2006/12/20 16:50:48 tipaul
963 # improving "insecure" management
966 # you told me that you had some libraries with insecure=ON (behind a firewall).
967 # 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.
969 # Revision 1.43.2.8 2006/12/19 16:48:16 alaurin
970 # reident programs, and adding branchcode value in reserves
972 # Revision 1.43.2.7 2006/12/06 21:55:38 hdl
973 # Adding ModZebrations for servers to get serverinfos in Context.pm
974 # Using this function in rebuild_zebra.pl
976 # Revision 1.43.2.6 2006/11/24 21:18:31 kados
977 # very minor changes, no functional ones, just comments, etc.
979 # Revision 1.43.2.5 2006/10/30 13:24:16 toins
980 # fix some minor POD error.
982 # Revision 1.43.2.4 2006/10/12 21:42:49 hdl
983 # Managing multiple zebra connections
985 # Revision 1.43.2.3 2006/10/11 14:27:26 tipaul
988 # Revision 1.43.2.2 2006/10/10 15:28:16 hdl
989 # BUG FIXING : using database name in Zconn if defined and not hard coded value
991 # Revision 1.43.2.1 2006/10/06 13:47:28 toins
992 # Synch with dev_week.
993 # /!\ WARNING :: Please now use the new version of koha.xml.
995 # Revision 1.18.2.5.2.14 2006/09/24 15:24:06 kados
996 # remove Zebraauth routine, fold the functionality into Zconn
997 # Zconn can now take several arguments ... this will probably
998 # change soon as I'm not completely happy with the readability
999 # of the current format ... see the POD for details.
1001 # cleaning up Biblio.pm, removing unnecessary routines.
1003 # DeleteBiblio - used to delete a biblio from zebra and koha tables
1004 # -- checks to make sure there are no existing issues
1005 # -- saves backups of biblio,biblioitems,items in deleted* tables
1006 # -- does commit operation
1008 # getRecord - used to retrieve one record from zebra in piggyback mode using biblionumber
1009 # brought back z3950_extended_services routine
1011 # Lots of modifications to Context.pm, you can now store user and pass info for
1012 # multiple servers (for federated searching) using the <serverinfo> element.
1013 # I'll commit my koha.xml to demonstrate this or you can refer to the POD in
1014 # Context.pm (which I also expanded on).
1016 # Revision 1.18.2.5.2.13 2006/08/10 02:10:21 kados
1017 # Turned warnings on, and running a search turned up lots of warnings.
1018 # Cleaned up those ...
1020 # removed getitemtypes from Koha.pm (one in Search.pm looks newer)
1021 # removed itemcount from Biblio.pm
1023 # made some local subs local with a _ prefix (as they were redefined
1026 # Add two new search subs to Search.pm the start of a new search API
1027 # that's a bit more scalable
1029 # Revision 1.18.2.5.2.10 2006/07/21 17:50:51 kados
1030 # moving the *.properties files to intranetdir/etc dir
1032 # Revision 1.18.2.5.2.9 2006/07/17 08:05:20 tipaul
1033 # there was a hardcoded link to /koha/etc/ I replaced it with intranetdir config value
1035 # Revision 1.18.2.5.2.8 2006/07/11 12:20:37 kados
1036 # adding ccl and cql files ... Tumer, if you want to fit these into the
1037 # config file by all means do.
1039 # Revision 1.18.2.5.2.7 2006/06/04 22:50:33 tgarip1957
1040 # We do not hard code cql2rpn conversion file in context.pm our koha.xml configuration file already describes the path for this file.
1041 # At cql searching we use method CQL not CQL2RPN as the cql2rpn conversion file is defined at server level
1043 # Revision 1.18.2.5.2.6 2006/06/02 23:11:24 kados
1044 # Committing my working dev_week. It's been tested only with
1045 # searching, and there's quite a lot of config stuff to set up
1046 # beforehand. As things get closer to a release, we'll be making
1047 # some scripts to do it for us
1049 # Revision 1.18.2.5.2.5 2006/05/28 18:49:12 tgarip1957
1050 # This is an unusual commit. The main purpose is a working model of Zebra on a modified rel2_2.
1051 # Any questions regarding these commits should be asked to Joshua Ferraro unless you are Joshua whom I'll report to
1053 # Revision 1.36 2006/05/09 13:28:08 tipaul
1054 # adding the branchname and the librarian name in every page :
1055 # - modified userenv to add branchname
1056 # - modifier menus.inc to have the librarian name & userenv displayed on every page. they are in a librarian_information div.
1058 # Revision 1.35 2006/04/13 08:40:11 plg
1059 # bug fixed: typo on Zconnauth name
1061 # Revision 1.34 2006/04/10 21:40:23 tgarip1957
1062 # 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:
1064 # zebraport=<your port>
1065 # zebrauser=<username>
1066 # zebrapass=<password>
1068 # The zebra.cfg file should read:
1071 # passw.c:<yourpasswordfile>
1073 # Password file should be prepared with Apaches htpasswd utility in encrypted mode and should exist in a folder zebra.cfg can read
1075 # Revision 1.33 2006/03/15 11:21:56 plg
1076 # bug fixed: utf-8 data where not displayed correctly in screens. Supposing
1077 # your data are truely utf-8 encoded in your database, they should be
1078 # correctly displayed. "set names 'UTF8'" on mysql connection (C4/Context.pm)
1079 # is mandatory and "binmode" to utf8 (C4/Interface/CGI/Output.pm) seemed to
1080 # converted data twice, so it was removed.
1082 # Revision 1.32 2006/03/03 17:25:01 hdl
1083 # Bug fixing : a line missed a comment sign.
1085 # Revision 1.31 2006/03/03 16:45:36 kados
1086 # Remove the search that tests the Zconn -- warning, still no fault
1089 # Revision 1.30 2006/02/22 00:56:59 kados
1090 # First go at a connection object for Zebra. You can now get a
1091 # connection object by doing:
1093 # my $Zconn = C4::Context->Zconn;
1095 # My initial tests indicate that as soon as your funcion ends
1096 # (ie, when you're done doing something) the connection will be
1097 # closed automatically. There may be some other way to make the
1098 # connection more stateful, I'm not sure...