1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-05-27 17:49:27 +02:00

[feature/new-tz-handling] Started on database updater changes.

The changes are tricky since we need to drop user_dst column from
users table, but we need it during the data migration process to
properly calculate effective timezones for all users.

The change here converts user_timezone to vchar and computes
timezone identifiers from the offsets. It uses database-specific
functions for building SQL conditionals and concatenations which
need to be implemented, probably in a separate ticket. As a result
the current code is not functional.

PHPBB3-9558
This commit is contained in:
Oleg Pudeyev 2011-04-26 22:11:45 -04:00
parent e8e5d2b2c0
commit b672fc7ae1

View File

@ -1090,6 +1090,9 @@ function database_update_info()
GROUPS_TABLE => array(
'group_legend' => array('UINT', 0),
),
USERS_TABLE => array(
'user_timezone' => array('VCHAR:100', ''),
),
),
'drop_columns' => array(
STYLES_TABLE => array(
@ -2352,6 +2355,25 @@ function change_database_data(&$no_updates, $version)
set_config('teampage_memberships', '1');
}
// Update timezones
// user_dst is 0 if not in dst and 1 if in dst;
// this happens to be exactly the correction that should be added to the timezone offset
// to obtain dst offset.
// Parenthesize here because we operate on this value later.
$active_offset = '(user_timezone + user_dst)';
// Now we have a tricky problem of forcing the plus sign into the expression.
// Build it via a conditional since there cannot be a portable printf equivalent in databases.
// Note that active offset is not an absolute value here - it is an expression that will
// be evaluated by the database during query execution.
// We don't print - here because it will come from active offset.
$sign = $db->conditional_sql("$active_offset < 0", '', '+');
// Use database-specific escaping because strings are quoted differently by different databases.
$new_value = $db->concatenate_sql($db->sql_escape('GMT'), $sign, $active_offset);
$sql = 'UPDATE ' . USERS_TABLE . '
SET user_timezone = ' . $new_value;
_sql($sql, $errored, $error_ary);
// After we have calculated the timezones we can delete user_dst column from user table.
$no_updates = false;
break;
}