[Koha-patches] [PATCH] TZ - multiple timezone support

Joe Atzberger joe.atzberger at liblime.com
Thu Jul 24 23:11:17 CEST 2008


Support multiple timezones via Apache SetEnv.  See the perldoc for
admin/env_tz_test.pl on how to configure and test.  Minimal changes
to Context itself.
---
 C4/Context.pm        |    6 ++-
 admin/env_tz_test.pl |  128 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 132 insertions(+), 2 deletions(-)
 create mode 100755 admin/env_tz_test.pl

diff --git a/C4/Context.pm b/C4/Context.pm
index 20e5794..6c9035b 100644
--- a/C4/Context.pm
+++ b/C4/Context.pm
@@ -627,21 +627,23 @@ sub _new_dbh
 
     my $db_name   = $context->config("database");
     my $db_host   = $context->config("hostname");
-    my $db_port   = $context->config("port");
-    $db_port = "" unless defined $db_port;
+    my $db_port   = $context->config("port") || '';
     my $db_user   = $context->config("user");
     my $db_passwd = $context->config("pass");
     # MJR added or die here, as we can't work without dbh
     my $dbh= DBI->connect("DBI:$db_driver:dbname=$db_name;host=$db_host;port=$db_port",
 	$db_user, $db_passwd) or die $DBI::errstr;
+	my $tz = $ENV{TZ};
     if ( $db_driver eq 'mysql' ) { 
         # Koha 3.0 is utf-8, so force utf8 communication between mySQL and koha, whatever the mysql default config.
         # this is better than modifying my.cnf (and forcing all communications to be in utf8)
         $dbh->{'mysql_enable_utf8'}=1; #enable
         $dbh->do("set NAMES 'utf8'");
+        ($tz) and $dbh->do(qq(SET time_zone = "$tz"));
     }
     elsif ( $db_driver eq 'Pg' ) {
 	    $dbh->do( "set client_encoding = 'UTF8';" );
+        ($tz) and $dbh->do(qq(SET TIME ZONE = "$tz"));
     }
     return $dbh;
 }
diff --git a/admin/env_tz_test.pl b/admin/env_tz_test.pl
new file mode 100755
index 0000000..ae70a1a
--- /dev/null
+++ b/admin/env_tz_test.pl
@@ -0,0 +1,128 @@
+#!/usr/bin/perl 
+
+use CGI;
+# use Data::Dumper;
+
+use C4::Context;
+use C4::Auth;
+
+my $q = CGI->new();
+my ($template, $loggedinuser, $cookie) = get_template_and_user({
+	   template_name => "admin/admin-home.tmpl",	# whatever, we don't really use the template anyway.
+			   query => $q,
+			 	type => "intranet",
+	 authnotrequired => 0,
+ 	   flagsrequired => {parameters => 1},
+		       debug => 1,
+});
+
+my $dbh = C4::Context->dbh;
+my  $tz_sth = $dbh->prepare("SHOW VARIABLES LIKE 'time_zone'");
+$tz_sth->execute();
+my $now_sth = $dbh->prepare("SELECT now()");
+$now_sth->execute();
+
+print $q->header(), 
+	$q->html(
+	$q->body(
+	$q->p("This is a test for debugging purposes.  It isn't supposed to look pretty.")
+	.
+	$q->h1("Dumping ENV:") 
+	.
+	join("\n<br\>", map {"$_ = $ENV{$_}"} sort keys %ENV)
+	.
+	$q->h1("Checking different TIME elements in the system:") 
+	. "\n" . $q->p("perl localime: " . localtime)
+	. "\n" . $q->p( "system(date): " . `date`)
+	. "\n" . $q->p( "mysql dbh (Context) time_zone : " .  $tz_sth->fetchrow)
+	. "\n" . $q->p( "mysql dbh (Context) now() : "     . $now_sth->fetchrow)
+	)), "\n";
+
+__END__
+
+=pod
+
+=head1 MULTIPLE TIME ZONE SUPPORT
+
+Koha supports running multiple instances on the same server, even if they need to be homed
+in different timezones.  However, your database must have the timezones installed (see below).
+
+If you are only running one installation of Koha, and want to change the timezone of the server,
+please do NOT use this feature at all, and instead set your system timezone via the OS.  If you 
+are running multiple Kohas, all in the same timezone, do the same. 
+
+Only use this feature if
+you are running multiple Kohas on the same server, and they are not in the same timezone.  
+
+=head2 Perl
+
+For the most part, in execution perl will respect the environmental
+variable TZ, if it is set.  This affects calls to localtime() and other similar functions.
+Remember that the environment will be different for different users, and for cron jobs.  
+See the example below.
+
+=head2 Apache2
+
+We affect the running perl code of Koha with the Apache directive:
+
+SetEnv TZ "US/Central"
+
+This should be added inside the VirtualHost definition for the intended Koha instance.  In 
+almost ALL cases, be sure to set it for both INTRANET and OPAC VirtualHosts.  Remember this
+does not affect the command line environment for any terminal sessions, or your cron jobs.
+
+=head2 Database (mysql)
+
+Your MySQL installation must be configured with appropriate time zones.  This extends beyond
+Koha and affects mysql itself.  On debian, for example, you can use:
+
+	mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
+
+See http://dev.mysql.com/doc/refman/5.0/en/time-zone-support.html
+
+=head2 cron/crontab
+
+Current versions of cron in debian allow ENV variables to be set in the lines preceeding 
+scheduled commands.  They will be exported to the environment of the scheduled job.  This is 
+an example for crontab:
+
+	TZ="US/Central"
+	# m h  dom mon dow   command
+	0  1 * * *  /home/liblime/kohaclone/misc/cronjobs/overdue_notices.pl
+	15 * * * *  /home/liblime/kohaclone/misc/cronjobs/process_message_queue.pl
+	*/10 * * * *   /home/liblime/kohaclone/misc/migration_tools/rebuild_zebra.pl -b -z >/dev/null
+
+=head1 EXAMPLE
+
+Try these on a command line to confirm Context is setting time_zone based on TZ:
+
+perl -MC4::Context -e 'my $dbh=C4::Context->dbh; my $tz_sth=$dbh->prepare(q(SHOW VARIABLES LIKE "time_zone"));
+ 	$tz_sth->execute(); print "mysql dbh (Context) time_zone : " .  $tz_sth->fetchrow, "\n";'
+
+export TZ="US/Central";  # or any TZ other than the current one.
+
+perl -MC4::Context -e 'my $dbh=C4::Context->dbh; my $tz_sth=$dbh->prepare(q(SHOW VARIABLES LIKE "time_zone"));
+ 	$tz_sth->execute(); print "mysql dbh (Context) time_zone : " .  $tz_sth->fetchrow, "\n";'
+
+Then update your VirtualHosts to do, for example:
+
+	SetEnv TZ "US/Central"
+
+Reset Apache, then on your intranet check out the debug page:
+
+	cgi-bin/koha/admin/env_tz_test.pl
+
+The TZ that Koha has in effect and the TZ from the database should be displayed at the bottom.
+Hopefully they match what you set.
+
+=head1 BUGS
+
+WARNING: Multiple timezones may or may not work under mod_perl and mod_perl2.  
+
+=head1 AUTHOR
+
+	Joe Atzberger
+	atz at liblime.com
+
+=cut
+
-- 
1.5.5.GIT



More information about the Koha-patches mailing list