From 4457bdf5f89bb8dc9618a0c779a45c86cd2c4bb3 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sun, 27 Mar 2011 09:50:08 +0000 Subject: [PATCH] * updated timezone database to version 1.2011b from current Lightning snapshot - automatic import of updated timezone database calendar/setup/timezones.sqlite, so in future commting new timezones is all it needs --- calendar/inc/class.calendar_timezones.inc.php | 30 +++++++++++++++--- calendar/setup/default_records.inc.php | 12 ++++++- calendar/setup/timezones.sqlite | Bin 160768 -> 262144 bytes 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/calendar/inc/class.calendar_timezones.inc.php b/calendar/inc/class.calendar_timezones.inc.php index ea01657882..05adf98781 100644 --- a/calendar/inc/class.calendar_timezones.inc.php +++ b/calendar/inc/class.calendar_timezones.inc.php @@ -144,9 +144,9 @@ class calendar_timezones } /** - * Init static variables for session + * Init static variables for session and check for updated timezone information * - * As we use the returned reference, we do NOT need to care about storing the information in the session + * As we use returned references from the session, we do NOT need to care about storing the information explicitly */ public static function init_static() { @@ -162,18 +162,35 @@ class calendar_timezones )); self::$tz2id = array('UTC' => -1); } + + // check for updated timezones once per session + if (!egw_cache::getSession(__CLASS__, 'tzs_checked')) + { + try + { + $msg = self::import_sqlite($updated); + if ($updated) error_log($msg); // log that timezones have been updated + } + catch (Exception $e) + { + _egw_log_exception($e); // log the exception to error_log, but do not stall program execution + } + egw_cache::setSession(__CLASS__, 'tzs_checked', true); + } } /** * Import timezones from sqlite file * + * @param boolean $updated=null on return true if update was neccessary, false if tz's were already up to date * @param string $file='calendar/setup/timezones.sqlite' filename relative to EGW_SERVER_ROOT * @param boolean $check_version=true true: check version and only act, if it's different * @return string message about update * @throws egw_exception_wrong_parameter if $file is not readable or wrong format/version * @throws egw_exception_assertion_failed if no PDO sqlite support + * @throws egw_exception_wrong_userinput for broken sqlite extension */ - public static function import_sqlite($file='calendar/setup/timezones.sqlite',$check_version=true) + public static function import_sqlite(&$updated=null,$file='calendar/setup/timezones.sqlite',$check_version=true) { $path = EGW_SERVER_ROOT.'/'.$file; @@ -190,9 +207,10 @@ class calendar_timezones // not much we can do, but give an good error message, with a download link to the MySQL dump if (!($rs = $pdo->query('SELECT version FROM tz_schema_version'))) { - return lang('Your PHP extension pdo_sqlite is broken!').'
'.lang('It can NOT read timezones from sqlite database %1!',$path).'
'. + throw new egw_exception_wrong_userinput( + lang('Your PHP extension pdo_sqlite is broken!').'
'.lang('It can NOT read timezones from sqlite database %1!',$path).'
'. lang('As an alternative you can %1download a MySQL dump%2 and import it manually into egw_cal_timezones table.', - '',''); + '','')); } if ($rs->fetchColumn() != 1) { @@ -203,6 +221,7 @@ class calendar_timezones //echo "

tz_version($path)=$tz_version, tz_db_version=$tz_db_version

\n"; if ($tz_version === $tz_db_version) { + $updated = false; return lang('Nothing to update, version is already %1.',$tz_db_version); // we already have the right } $tz2id = array(); @@ -235,6 +254,7 @@ class calendar_timezones ),__LINE__,__FILE__,'phpgwapi'); //_debug_array($tz2id); + $updated = true; return lang('Timezones updated to version %1 (%2 records updated).',$tz_version,count($tz2id)); } diff --git a/calendar/setup/default_records.inc.php b/calendar/setup/default_records.inc.php index 1969821ab2..aba5bae909 100644 --- a/calendar/setup/default_records.inc.php +++ b/calendar/setup/default_records.inc.php @@ -24,4 +24,14 @@ foreach(array( } // import timezone data from sqlite database -calendar_timezones::import_sqlite(); \ No newline at end of file +try +{ + calendar_timezones::import_sqlite(); +} +// catch broken sqlite extension exception and output message, as user can't do anything about it +// all other exceptions are fatal, to get user to fix them! +catch (egw_exception_wrong_userinput $e) // all other exceptions are fatal +{ + _egw_log_exception($e); + echo '

'.$e->getMessage()."

\n"; +} \ No newline at end of file diff --git a/calendar/setup/timezones.sqlite b/calendar/setup/timezones.sqlite index 521e863ef04cae0aee87b35a633d3bc0607389c0..4f39cfa670a8349ae58ee0be75eaf9a7e6e14a4c 100644 GIT binary patch delta 6099 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 N{DnpA_+QY{{{lj`RXP9w delta 9420 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 NE3uKRO|SC&{ugm)1O)&9