diff options
Diffstat (limited to 'phpBB/includes')
-rw-r--r-- | phpBB/includes/functions_convert.php | 58 | ||||
-rw-r--r-- | phpBB/includes/functions_install.php | 455 | ||||
-rw-r--r-- | phpBB/includes/mcp/mcp_post.php | 2 |
3 files changed, 504 insertions, 11 deletions
diff --git a/phpBB/includes/functions_convert.php b/phpBB/includes/functions_convert.php index 6df29fc0f4..4244645af8 100644 --- a/phpBB/includes/functions_convert.php +++ b/phpBB/includes/functions_convert.php @@ -558,7 +558,7 @@ function _import_check($config_var, $source, $use_target) 'relative_path' => (empty($convert->convertor['source_path_absolute'])) ? true : false, ); - $target = $config[$config_var] . '/' . basename(($use_target === false) ? $source : $use_target); + $target = '../' . $config[$config_var] . '/' . basename(($use_target === false) ? $source : $use_target); if (!empty($convert->convertor[$config_var]) && strpos($source, $convert->convertor[$config_var]) !== 0) { @@ -1068,7 +1068,7 @@ function add_user_group($group_id, $user_id, $group_leader=false) */ function user_group_auth($group, $select_query) { - global $convert, $phpbb_root_path, $config, $user, $db; + global $convert, $phpbb_root_path, $config, $user, $db, $src_db, $same_db; if (!in_array($group, array('guests', 'registered', 'registered_coppa', 'global_moderators', 'administrators', 'bots'))) { @@ -1089,9 +1089,33 @@ function user_group_auth($group, $select_query) return; } - $sql = 'INSERT INTO ' . USER_GROUP_TABLE . ' (user_id, group_id, user_pending) - ' . str_replace('{' . strtoupper($group) . '}', $group_id . ', 0', $select_query); - $db->sql_query($sql); + if ($same_db) + { + $sql = 'INSERT INTO ' . USER_GROUP_TABLE . ' (user_id, group_id, user_pending) + ' . str_replace('{' . strtoupper($group) . '}', $group_id . ', 0', $select_query); + $db->sql_query($sql); + } + else + { + $result = $src_db->sql_query(str_replace('{' . strtoupper($group) . '}', $group_id . ', 0', $select_query)); + while ($row = $src_db->sql_fetchrow($result)) + { + // make sure it's exactly 3 ints that were returned + $data = array(); + reset($row); + for ($i = 0; $i < 3; $i++) + { + $data[] = (int) current($row); + next($row); + } + + // this might become quite a lot of INSERTS unfortunately + $sql = 'INSERT INTO ' . USER_GROUP_TABLE . ' (user_id, group_id, user_pending) + VALUES (' . implode(', ', $data) . ')'; + $db->sql_query($sql); + } + $src_db->sql_freeresult($result); + } } /** @@ -1109,14 +1133,19 @@ function get_config() return $convert_config; } - global $db, $phpbb_root_path, $config; + global $src_db, $same_db, $phpbb_root_path, $config; global $convert; if ($convert->config_schema['table_format'] != 'file') { + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'binary'"); + } + $sql = 'SELECT * FROM ' . $convert->src_table_prefix . $convert->config_schema['table_name']; - $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); + $result = $src_db->sql_query($sql); + $row = $src_db->sql_fetchrow($result); if (!$row) { @@ -1133,8 +1162,13 @@ function get_config() { $convert_config[$row[$key]] = $row[$val]; } - while ($row = $db->sql_fetchrow($result)); - $db->sql_freeresult($result); + while ($row = $src_db->sql_fetchrow($result)); + $src_db->sql_freeresult($result); + + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'utf8'"); + } } else if ($convert->config_schema['table_format'] == 'file') { @@ -1153,6 +1187,10 @@ function get_config() else { $convert_config = $row; + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'utf8'"); + } } if (!sizeof($convert_config)) diff --git a/phpBB/includes/functions_install.php b/phpBB/includes/functions_install.php new file mode 100644 index 0000000000..0b7bbb607f --- /dev/null +++ b/phpBB/includes/functions_install.php @@ -0,0 +1,455 @@ +<?php +/** +* +* @package install +* @version $Id$ +* @copyright (c) 2006 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +/** +* Determine if we are able to load a specified PHP module and do so if possible +*/ +function can_load_dll($dll) +{ + global $suffix; + + if (empty($suffix)) + { + $suffix = (defined('PHP_OS') && strpos(strtolower(PHP_OS), 'win') === 0) ? 'dll' : 'so'; + } + + return ((@ini_get('enable_dl') || strtolower(@ini_get('enable_dl')) == 'on') && (!@ini_get('safe_mode') || strtolower(@ini_get('safe_mode')) == 'off') && @dl($dll . ".$suffix")) ? true : false; +} + +/** +* Returns an array of available DBMS with some data, if a DBMS is specified it will only +* return data for that DBMS and will load its extension if necessary. +*/ +function get_available_dbms($dbms = false, $return_unavailable = false) +{ + $available_dbms = array( + 'firebird' => array( + 'LABEL' => 'FireBird', + 'SCHEMA' => 'firebird', + 'MODULE' => 'interbase', + 'DELIM' => ';;', + 'COMMENTS' => 'remove_remarks', + 'DRIVER' => 'firebird', + 'AVAILABLE' => true, + ), + 'mysqli' => array( + 'LABEL' => 'MySQL with MySQLi Extension', + 'SCHEMA' => 'mysql_41', + 'MODULE' => 'mysqli', + 'DELIM' => ';', + 'COMMENTS' => 'remove_remarks', + 'DRIVER' => 'mysqli', + 'AVAILABLE' => true, + ), + 'mysql' => array( + 'LABEL' => 'MySQL', + 'SCHEMA' => 'mysql', + 'MODULE' => 'mysql', + 'DELIM' => ';', + 'COMMENTS' => 'remove_remarks', + 'DRIVER' => 'mysql', + 'AVAILABLE' => true, + ), + 'mssql' => array( + 'LABEL' => 'MS SQL Server 2000+', + 'SCHEMA' => 'mssql', + 'MODULE' => 'mssql', + 'DELIM' => 'GO', + 'COMMENTS' => 'remove_comments', + 'DRIVER' => 'mssql', + 'AVAILABLE' => true, + ), + 'mssql_odbc'=> array( + 'LABEL' => 'MS SQL Server [ ODBC ]', + 'SCHEMA' => 'mssql', + 'MODULE' => 'odbc', + 'DELIM' => 'GO', + 'COMMENTS' => 'remove_comments', + 'DRIVER' => 'mssql_odbc', + 'AVAILABLE' => true, + ), + 'oracle' => array( + 'LABEL' => 'Oracle', + 'SCHEMA' => 'oracle', + 'MODULE' => 'oci8', + 'DELIM' => '/', + 'COMMENTS' => 'remove_comments', + 'DRIVER' => 'oracle', + 'AVAILABLE' => true, + ), + 'postgres' => array( + 'LABEL' => 'PostgreSQL 7.x/8.x', + 'SCHEMA' => 'postgres', + 'MODULE' => 'pgsql', + 'DELIM' => ';', + 'COMMENTS' => 'remove_comments', + 'DRIVER' => 'postgres', + 'AVAILABLE' => true, + ), + 'sqlite' => array( + 'LABEL' => 'SQLite', + 'SCHEMA' => 'sqlite', + 'MODULE' => 'sqlite', + 'DELIM' => ';', + 'COMMENTS' => 'remove_remarks', + 'DRIVER' => 'sqlite', + 'AVAILABLE' => true, + ), + ); + + if ($dbms) + { + if (isset($available_dbms[$dbms])) + { + $available_dbms = array($dbms => $available_dbms[$dbms]); + } + else + { + return array(); + } + } + + // now perform some checks whether they are really available + foreach ($available_dbms as $db_name => $db_ary) + { + $dll = $db_ary['MODULE']; + + if (!@extension_loaded($dll)) + { + if (!can_load_dll($dll)) + { + if ($return_unavailable) + { + $available_dbms[$db_name]['AVAILABLE'] = false; + } + else + { + unset($available_dbms[$db_name]); + } + continue; + } + } + $any_db_support = true; + } + + if ($return_unavailable) + { + $available_dbms['ANY_DB_SUPPORT'] = $any_db_support; + } + return $available_dbms; +} + +/** +* Generate the drop down of available database options +*/ +function dbms_select($default='') +{ + $available_dbms = get_available_dbms(); + $dbms_options = ''; + foreach ($available_dbms as $dbms_name => $details) + { + $selected = ($dbms_name == $default) ? ' selected="selected"' : ''; + $dbms_options .= '<option value="' . $dbms_name . '"' . $selected .'>' . $details['LABEL'] . '</option>'; + } + return $dbms_options; +} + + +/** +* Used to test whether we are able to connect to the database the user has specified +* and identify any problems (eg there are already tables with the names we want to use +* @param array $dbms should be of the format of an element of the array returned by {@link get_available_dbms get_available_dbms()} +* necessary extensions should be loaded already +*/ +function connect_check_db($error_connect, &$error, $dbms, $table_prefix, $dbhost, $dbuser, $dbpasswd, $dbname, $dbport, $prefix_may_exist = false, $load_dbal = true) +{ + global $phpbb_root_path, $phpEx, $config, $lang; + + if ($load_dbal) + { + // Include the DB layer + include($phpbb_root_path . 'includes/db/' . $dbms['DRIVER'] . '.' . $phpEx); + } + + // Instantiate it and set return on error true + $sql_db = 'dbal_' . $dbms['DRIVER']; + $db = new $sql_db(); + $db->sql_return_on_error(true); + + // Check that we actually have a database name before going any further..... + if ($dbms['DRIVER'] != 'sqlite' && $dbname === '') + { + $error[] = $lang['INST_ERR_DB_NO_NAME']; + return false; + } + + // Make sure we don't have a daft user who thinks having the SQLite database in the forum directory is a good idea + if ($dbms['DRIVER'] == 'sqlite' && stripos(phpbb_realpath($dbhost), phpbb_realpath('../')) === 0) + { + $error[] = $lang['INST_ERR_DB_FORUM_PATH']; + return false; + } + + // Check the prefix length to ensure that index names are not too long and does not contain invalid characters + switch ($dbms['DRIVER']) + { + case 'mysql': + case 'mysqli': + if (strpos($table_prefix, '-') !== false) + { + $error[] = $lang['INST_ERR_PREFIX_INVALID']; + return false; + } + + // no break; + + case 'postgres': + $prefix_length = 36; + break; + + case 'mssql': + case 'mssql_odbc': + $prefix_length = 90; + break; + + case 'sqlite': + $prefix_length = 200; + break; + + case 'firebird': + case 'oracle': + $prefix_length = 6; + break; + } + + if (strlen($table_prefix) > $prefix_length) + { + $error[] = sprintf($lang['INST_ERR_PREFIX_TOO_LONG'], $prefix_length); + return false; + } + + // Try and connect ... + if (is_array($db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false))) + { + $db_error = $db->sql_error(); + $error[] = $lang['INST_ERR_DB_CONNECT'] . '<br />' . (($db_error['message']) ? $db_error['message'] : $lang['INST_ERR_DB_NO_ERROR']); + } + else + { + switch ($dbms['DRIVER']) + { + case 'mysql': + case 'mysqli': + $sql = 'SHOW TABLES'; + $field = "Tables_in_{$dbname}"; + break; + + case 'sqlite': + $sql = 'SELECT name + FROM sqlite_master + WHERE type = "table"'; + $field = 'name'; + break; + + case 'mssql': + case 'mssql_odbc': + $sql = "SELECT name + FROM sysobjects + WHERE type='U'"; + $field = 'name'; + break; + + case 'postgres': + $sql = "SELECT relname + FROM pg_class + WHERE relkind = 'r' + AND relname NOT LIKE 'pg\_%'"; + $field = 'relname'; + break; + + case 'firebird': + $sql = 'SELECT rdb$relation_name + FROM rdb$relations + WHERE rdb$view_source is null + AND rdb$system_flag = 0'; + $field = 'rdb$relation_name'; + break; + + case 'oracle': + $sql = 'SELECT table_name + FROM USER_TABLES'; + $field = 'table_name'; + break; + } + $result = $db->sql_query($sql); + + if ($row = $db->sql_fetchrow($result)) + { + // Likely matches for an existing phpBB installation + $temp_prefix = strtolower($table_prefix); + $table_ary = array($temp_prefix . 'attachments', $temp_prefix . 'config', $temp_prefix . 'sessions', $temp_prefix . 'topics', $temp_prefix . 'users'); + + do + { + // All phpBB installations will at least have config else it won't work + if (in_array(strtolower($row[$field]), $table_ary)) + { + if (!$prefix_may_exist) + { + $error[] = $lang['INST_ERR_PREFIX']; + } + break; + } + } + while ($row = $db->sql_fetchrow($result)); + } + $db->sql_freeresult($result); + + // Make sure that the user has selected a sensible DBAL for the DBMS actually installed + switch ($dbms['DRIVER']) + { + case 'mysqli': + if (version_compare(mysqli_get_server_info($db->db_connect_id), '4.1.3', '<')) + { + $error[] = $lang['INST_ERR_DB_NO_MYSQLI']; + } + break; + + case 'sqlite': + if (version_compare(sqlite_libversion(), '2.8.2', '<')) + { + $error[] = $lang['INST_ERR_DB_NO_SQLITE']; + } + break; + + case 'firebird': + // check the version of FB, use some hackery if we can't get access to the server info + if ($db->service_handle !== false && function_exists('ibase_server_info')) + { + $val = @ibase_server_info($db->service_handle, IBASE_SVC_SERVER_VERSION); + preg_match('#V([\d.]+)#', $val, $match); + if ($match[1] < 2) + { + $error[] = $lang['INST_ERR_DB_NO_FIREBIRD']; + } + $db_info = @ibase_db_info($db->service_handle, $dbname, IBASE_STS_HDR_PAGES); + + preg_match('/^\\s*Page size\\s*(\\d+)/m', $db_info, $regs); + $page_size = intval($regs[1]); + if ($page_size < 8192) + { + $error[] = $lang['INST_ERR_DB_NO_FIREBIRD_PS']; + } + } + else + { + $sql = "SELECT * + FROM RDB$FUNCTIONS + WHERE RDB$SYSTEM_FLAG IS NULL + AND RDB$FUNCTION_NAME = 'CHAR_LENGTH'"; + $result = $db->sql_query($sql); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + // if its a UDF, its too old + if ($row) + { + $error[] = $lang['INST_ERR_DB_NO_FIREBIRD']; + } + else + { + $sql = "SELECT FIRST 0 char_length('') + FROM RDB\$DATABASE"; + $result = $db->sql_query($sql); + if (!$result) // This can only fail if char_length is not defined + { + $error[] = $lang['INST_ERR_DB_NO_FIREBIRD']; + } + $db->sql_freeresult($result); + } + + // Setup the stuff for our random table + $char_array = array_merge(range('A', 'Z'), range('0', '9')); + $char_len = mt_rand(7, 9); + $char_array_len = sizeof($char_array) - 1; + + $final = ''; + + for ($i = 0; $i < $char_len; $i++) + { + $final .= $char_array[mt_rand(0, $char_array_len)]; + } + + // Create some random table + $sql = 'CREATE TABLE ' . $final . " ( + FIELD1 VARCHAR(255) CHARACTER SET UTF8 DEFAULT '' NOT NULL COLLATE UNICODE, + FIELD2 INTEGER DEFAULT 0 NOT NULL);"; + $db->sql_query($sql); + + // Create an index that should fail if the page size is less than 8192 + $sql = 'CREATE INDEX ' . $final . ' ON ' . $final . '(FIELD1, FIELD2);'; + $db->sql_query($sql); + + if (ibase_errmsg() !== false) + { + $error[] = $lang['INST_ERR_DB_NO_FIREBIRD_PS']; + } + else + { + // Kill the old table + $db->sql_query('DROP TABLE ' . $final . ';'); + } + unset($final); + } + break; + + case 'oracle': + $sql = "SELECT * + FROM NLS_DATABASE_PARAMETERS + WHERE PARAMETER = 'NLS_RDBMS_VERSION' + OR PARAMETER = 'NLS_CHARACTERSET'"; + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + $stats[$row['parameter']] = $row['value']; + } + $db->sql_freeresult($result); + + if (version_compare($stats['NLS_RDBMS_VERSION'], '9.2', '<') && $stats['NLS_CHARACTERSET'] !== 'UTF8') + { + $error[] = $lang['INST_ERR_DB_NO_ORACLE']; + } + break; + + case 'postgres': + $sql = "SHOW server_encoding;"; + $result = $db->sql_query($sql); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + if ($row['server_encoding'] !== 'UNICODE' && $row['server_encoding'] !== 'UTF8') + { + $error[] = $lang['INST_ERR_DB_NO_POSTGRES']; + } + break; + } + + $db->sql_close(); + } + + if ($error_connect && (!isset($error) || !sizeof($error))) + { + return true; + } + return false; +} + +?>
\ No newline at end of file diff --git a/phpBB/includes/mcp/mcp_post.php b/phpBB/includes/mcp/mcp_post.php index 67f5472134..6ce9067d9e 100644 --- a/phpBB/includes/mcp/mcp_post.php +++ b/phpBB/includes/mcp/mcp_post.php @@ -426,7 +426,7 @@ function change_poster(&$post_info, $userdata) $to_username = $userdata['username']; // Renew post info - $post_info = get_post_data(array($post_id)); + $post_info = get_post_data(array($post_id), false, true); if (!sizeof($post_info)) { |