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 @@ + 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 .= ''; + } + 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'] . '
' . (($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)) { diff --git a/phpBB/install/convertors/convert_phpbb20.php b/phpBB/install/convertors/convert_phpbb20.php index 6c55a42440..4f66d3848a 100644 --- a/phpBB/install/convertors/convert_phpbb20.php +++ b/phpBB/install/convertors/convert_phpbb20.php @@ -31,6 +31,12 @@ $convertor_data = array( 'version' => '0.9', 'phpbb_version' => '3.0.0', 'author' => 'phpBB Group', + 'dbms' => 'mysql', + 'dbhost' => 'localhost', + 'dbport' => '', + 'dbuser' => 'user', + 'dbpasswd' => 'password', + 'dbname' => '', 'table_prefix' => 'phpbb_', 'forum_path' => '../forums', 'author_notes' => 'Avatars may be on a different width/height than with the old forum. This is due to dimensions being stored within phpBB3 but not within phpBB2. The default dimension was set to 80x80 for avatars where dimension settings could not be determined. You might wish to instruct your users to check their profiles after the conversion to ensure that the size is correct.', @@ -210,7 +216,8 @@ if (!$get_info) * 'schema' Syntax Description * -> 'target' => Target Table. If not specified the next table will be handled * -> 'primary' => Primary Key. If this is specified then this table is processed in batches -* -> 'query_first' => Query to execute before beginning the process (if more than one then specified as array) +* -> 'query_first' => array('target' or 'src', Query to execute before beginning the process +* (if more than one then specified as array)) * -> 'function_first' => Function to execute before beginning the process (if more than one then specified as array) * (This is mostly useful if variables need to be given to the converting process) * -> 'test_file' => This is not used at the moment but should be filled with a file from the old installation @@ -276,10 +283,10 @@ if (!$get_info) // We empty some tables to have clean data available 'query_first' => array( - $convert->truncate_statement . SEARCH_RESULTS_TABLE, - $convert->truncate_statement . SEARCH_WORDLIST_TABLE, - $convert->truncate_statement . SEARCH_WORDMATCH_TABLE, - $convert->truncate_statement . LOG_TABLE, + array('target', $convert->truncate_statement . SEARCH_RESULTS_TABLE), + array('target', $convert->truncate_statement . SEARCH_WORDLIST_TABLE), + array('target', $convert->truncate_statement . SEARCH_WORDMATCH_TABLE), + array('target', $convert->truncate_statement . LOG_TABLE), ), // with this you are able to import all attachment files on the fly. For large boards this is not an option, therefore commented out by default. @@ -313,7 +320,7 @@ if (!$get_info) array( 'target' => (defined('MOD_ATTACHMENT')) ? ATTACHMENTS_TABLE : '', 'primary' => 'attachments.attach_id', - 'query_first' => (defined('MOD_ATTACHMENT')) ? $convert->truncate_statement . ATTACHMENTS_TABLE : '', + 'query_first' => (defined('MOD_ATTACHMENT')) ? array('target', $convert->truncate_statement . ATTACHMENTS_TABLE) : '', 'autoincrement' => 'attach_id', array('attach_id', 'attachments.attach_id', ''), @@ -363,7 +370,7 @@ if (!$get_info) array( 'target' => (defined('MOD_ATTACHMENT')) ? EXTENSIONS_TABLE : '', - 'query_first' => (defined('MOD_ATTACHMENT')) ? $convert->truncate_statement . EXTENSIONS_TABLE : '', + 'query_first' => (defined('MOD_ATTACHMENT')) ? array('target', $convert->truncate_statement . EXTENSIONS_TABLE) : '', 'autoincrement' => 'extension_id', array('extension_id', 'extensions.ext_id', ''), @@ -373,7 +380,7 @@ if (!$get_info) array( 'target' => (defined('MOD_ATTACHMENT')) ? EXTENSION_GROUPS_TABLE : '', - 'query_first' => (defined('MOD_ATTACHMENT')) ? $convert->truncate_statement . EXTENSION_GROUPS_TABLE : '', + 'query_first' => (defined('MOD_ATTACHMENT')) ? array('target', $convert->truncate_statement . EXTENSION_GROUPS_TABLE) : '', 'autoincrement' => 'group_id', array('group_id', 'extension_groups.group_id', ''), @@ -389,7 +396,7 @@ if (!$get_info) array( 'target' => BANLIST_TABLE, - 'query_first' => $convert->truncate_statement . BANLIST_TABLE, + 'query_first' => array('target', $convert->truncate_statement . BANLIST_TABLE), array('ban_ip', 'banlist.ban_ip', 'decode_ban_ip'), array('ban_userid', 'banlist.ban_userid', 'phpbb_user_id'), @@ -410,14 +417,14 @@ if (!$get_info) array( 'target' => DISALLOW_TABLE, - 'query_first' => $convert->truncate_statement . DISALLOW_TABLE, + 'query_first' => array('target', $convert->truncate_statement . DISALLOW_TABLE), array('disallow_username', 'disallow.disallow_username', 'phpbb_disallowed_username'), ), array( 'target' => RANKS_TABLE, - 'query_first' => $convert->truncate_statement . RANKS_TABLE, + 'query_first' => array('target', $convert->truncate_statement . RANKS_TABLE), 'autoincrement' => 'rank_id', array('rank_id', 'ranks.rank_id', ''), @@ -429,7 +436,7 @@ if (!$get_info) array( 'target' => TOPICS_TABLE, - 'query_first' => $convert->truncate_statement . TOPICS_TABLE, + 'query_first' => array('target', $convert->truncate_statement . TOPICS_TABLE), 'primary' => 'topics.topic_id', 'autoincrement' => 'topic_id', @@ -493,7 +500,7 @@ if (!$get_info) array( 'target' => TOPICS_WATCH_TABLE, 'primary' => 'topics_watch.topic_id', - 'query_first' => $convert->truncate_statement . TOPICS_WATCH_TABLE, + 'query_first' => array('target', $convert->truncate_statement . TOPICS_WATCH_TABLE), array('topic_id', 'topics_watch.topic_id', ''), array('user_id', 'topics_watch.user_id', 'phpbb_user_id'), @@ -502,7 +509,7 @@ if (!$get_info) array( 'target' => SMILIES_TABLE, - 'query_first' => $convert->truncate_statement . SMILIES_TABLE, + 'query_first' => array('target', $convert->truncate_statement . SMILIES_TABLE), 'autoincrement' => 'smiley_id', array('smiley_id', 'smilies.smilies_id', ''), @@ -522,7 +529,7 @@ if (!$get_info) array( 'target' => POLL_OPTIONS_TABLE, 'primary' => 'vote_results.vote_option_id', - 'query_first' => $convert->truncate_statement . POLL_OPTIONS_TABLE, + 'query_first' => array('target', $convert->truncate_statement . POLL_OPTIONS_TABLE), array('poll_option_id', 'vote_results.vote_option_id', ''), array('topic_id', 'vote_desc.topic_id', ''), @@ -537,7 +544,7 @@ if (!$get_info) array( 'target' => POLL_VOTES_TABLE, 'primary' => 'vote_desc.topic_id', - 'query_first' => $convert->truncate_statement . POLL_VOTES_TABLE, + 'query_first' => array('target', $convert->truncate_statement . POLL_VOTES_TABLE), array('poll_option_id', 1, ''), array('topic_id', 'vote_desc.topic_id', ''), @@ -550,7 +557,7 @@ if (!$get_info) array( 'target' => WORDS_TABLE, 'primary' => 'words.word_id', - 'query_first' => $convert->truncate_statement . WORDS_TABLE, + 'query_first' => array('target', $convert->truncate_statement . WORDS_TABLE), 'autoincrement' => 'word_id', array('word_id', 'words.word_id', ''), @@ -562,7 +569,7 @@ if (!$get_info) 'target' => POSTS_TABLE, 'primary' => 'posts.post_id', 'autoincrement' => 'post_id', - 'query_first' => $convert->truncate_statement . POSTS_TABLE, + 'query_first' => array('target', $convert->truncate_statement . POSTS_TABLE), 'execute_first' => ' $config["max_post_chars"] = 0; ', @@ -607,8 +614,8 @@ if (!$get_info) 'primary' => 'privmsgs.privmsgs_id', 'autoincrement' => 'privmsgs_id', 'query_first' => array( - $convert->truncate_statement . PRIVMSGS_TABLE, - $convert->truncate_statement . PRIVMSGS_RULES_TABLE, + array('target', $convert->truncate_statement . PRIVMSGS_TABLE), + array('target', $convert->truncate_statement . PRIVMSGS_RULES_TABLE), ), 'execute_first' => ' @@ -645,7 +652,7 @@ if (!$get_info) array( 'target' => PRIVMSGS_FOLDER_TABLE, 'primary' => 'users.user_id', - 'query_first' => $convert->truncate_statement . PRIVMSGS_FOLDER_TABLE, + 'query_first' => array('target', $convert->truncate_statement . PRIVMSGS_FOLDER_TABLE), array('user_id', 'users.user_id', 'phpbb_user_id'), array('folder_name', $user->lang['CONV_SAVED_MESSAGES'], ''), @@ -658,7 +665,7 @@ if (!$get_info) array( 'target' => PRIVMSGS_TO_TABLE, 'primary' => 'privmsgs.privmsgs_id', - 'query_first' => $convert->truncate_statement . PRIVMSGS_TO_TABLE, + 'query_first' => array('target', $convert->truncate_statement . PRIVMSGS_TO_TABLE), array('msg_id', 'privmsgs.privmsgs_id', ''), array('user_id', 'privmsgs.privmsgs_to_userid', 'phpbb_user_id'), @@ -753,7 +760,7 @@ if (!$get_info) array( 'target' => GROUPS_TABLE, 'autoincrement' => 'group_id', - 'query_first' => $convert->truncate_statement . GROUPS_TABLE, + 'query_first' => array('target', $convert->truncate_statement . GROUPS_TABLE), array('group_id', 'groups.group_id', ''), array('group_type', 'groups.group_type', 'phpbb_convert_group_type'), @@ -766,7 +773,7 @@ if (!$get_info) array( 'target' => USER_GROUP_TABLE, - 'query_first' => $convert->truncate_statement . USER_GROUP_TABLE, + 'query_first' => array('target', $convert->truncate_statement . USER_GROUP_TABLE), 'execute_first' => ' add_default_groups(); ', @@ -795,8 +802,8 @@ if (!$get_info) 'primary' => 'users.user_id', 'autoincrement' => 'user_id', 'query_first' => array( - 'DELETE FROM ' . USERS_TABLE . ' WHERE user_id <> ' . ANONYMOUS, - $convert->truncate_statement . BOTS_TABLE + array('target', 'DELETE FROM ' . USERS_TABLE . ' WHERE user_id <> ' . ANONYMOUS), + array('target', $convert->truncate_statement . BOTS_TABLE) ), array('user_id', 'users.user_id', 'phpbb_user_id'), diff --git a/phpBB/install/convertors/functions_phpbb20.php b/phpBB/install/convertors/functions_phpbb20.php index fdde80c82c..c80a0a0de2 100644 --- a/phpBB/install/convertors/functions_phpbb20.php +++ b/phpBB/install/convertors/functions_phpbb20.php @@ -46,16 +46,16 @@ function phpbb_forum_flags() */ function phpbb_insert_forums() { - global $db, $convert, $user, $config; + global $db, $src_db, $same_db, $convert, $user, $config; $db->sql_query($convert->truncate_statement . FORUMS_TABLE); // Determine the highest id used within the old forums table (we add the categories after the forum ids) $sql = 'SELECT MAX(forum_id) AS max_forum_id FROM ' . $convert->src_table_prefix . 'forums'; - $result = $db->sql_query($sql); - $max_forum_id = (int) $db->sql_fetchfield('max_forum_id'); - $db->sql_freeresult($result); + $result = $src_db->sql_query($sql); + $max_forum_id = (int) $src_db->sql_fetchfield('max_forum_id'); + $src_db->sql_freeresult($result); $max_forum_id++; @@ -64,16 +64,16 @@ function phpbb_insert_forums() FROM ' . $convert->src_table_prefix . 'categories ORDER BY cat_order'; - if ($convert->mysql_convert) + if ($convert->mysql_convert && $same_db) { - $db->sql_query("SET NAMES 'binary'"); + $src_db->sql_query("SET NAMES 'binary'"); } - $result = $db->sql_query($sql); + $result = $src_db->sql_query($sql); - if ($convert->mysql_convert) + if ($convert->mysql_convert && $same_db) { - $db->sql_query("SET NAMES 'utf8'"); + $src_db->sql_query("SET NAMES 'utf8'"); } switch ($db->sql_layer) @@ -85,7 +85,7 @@ function phpbb_insert_forums() } $cats_added = array(); - while ($row = $db->sql_fetchrow($result)) + while ($row = $src_db->sql_fetchrow($result)) { $sql_ary = array( 'forum_id' => $max_forum_id, @@ -113,17 +113,17 @@ function phpbb_insert_forums() $cats_added[$row['cat_id']] = $max_forum_id; $max_forum_id++; } - $db->sql_freeresult($result); + $src_db->sql_freeresult($result); // There may be installations having forums with non-existant category ids. // We try to catch them and add them to an "unknown" category instead of leaving them out. $sql = 'SELECT cat_id FROM ' . $convert->src_table_prefix . 'forums GROUP BY cat_id'; - $result = $db->sql_query($sql); + $result = $src_db->sql_query($sql); $unknown_cat_id = false; - while ($row = $db->sql_fetchrow($result)) + while ($row = $src_db->sql_fetchrow($result)) { // Catch those categories not been added before if (!isset($cats_added[$row['cat_id']])) @@ -131,7 +131,7 @@ function phpbb_insert_forums() $unknown_cat_id = true; } } - $db->sql_freeresult($result); + $src_db->sql_freeresult($result); // Is there at least one category not known? if ($unknown_cat_id === true) @@ -171,19 +171,19 @@ function phpbb_insert_forums() GROUP BY f.forum_id, f.forum_name, f.cat_id, f.forum_desc, f.forum_status, f.prune_enable, f.prune_next, f.forum_order, fp.prune_days, fp.prune_freq ORDER BY f.cat_id, f.forum_order'; - if ($convert->mysql_convert) + if ($convert->mysql_convert && $same_db) { - $db->sql_query("SET NAMES 'binary'"); + $src_db->sql_query("SET NAMES 'binary'"); } - $result = $db->sql_query($sql); + $result = $src_db->sql_query($sql); - if ($convert->mysql_convert) + if ($convert->mysql_convert && $same_db) { - $db->sql_query("SET NAMES 'utf8'"); + $src_db->sql_query("SET NAMES 'utf8'"); } - while ($row = $db->sql_fetchrow($result)) + while ($row = $src_db->sql_fetchrow($result)) { // Some might have forums here with an id not being "possible"... // To be somewhat friendly we "change" the category id for those to a previously created ghost category @@ -266,7 +266,7 @@ function phpbb_insert_forums() $sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); $db->sql_query($sql); } - $db->sql_freeresult($result); + $src_db->sql_freeresult($result); switch ($db->sql_layer) { @@ -342,14 +342,24 @@ function phpbb_set_encoding($text, $grab_user_lang = true) } else if (!empty($convert_row['poster_id'])) { - global $db; + global $src_db, $same_db; + + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'binary'"); + } $sql = 'SELECT user_lang FROM ' . $convert->src_table_prefix . 'users WHERE user_id = ' . (int) $convert_row['poster_id']; - $result = $db->sql_query($sql); - $get_lang = (string) $db->sql_fetchfield('user_lang'); - $db->sql_freeresult($result); + $result = $src_db->sql_query($sql); + $get_lang = (string) $src_db->sql_fetchfield('user_lang'); + $src_db->sql_freeresult($result); + + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'utf8'"); + } $get_lang = (!trim($get_lang)) ? trim(get_config_value('default_lang')) : trim($get_lang); } @@ -441,15 +451,25 @@ function phpbb_user_id($user_id) // Increment user id if the old forum is having a user with the id 1 if (!isset($config['increment_user_id'])) { - global $db, $convert; + global $src_db, $same_db, $convert; + + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'binary'"); + } // Now let us set a temporary config variable for user id incrementing $sql = "SELECT user_id FROM {$convert->src_table_prefix}users WHERE user_id = 1"; - $result = $db->sql_query($sql); - $id = (int) $db->sql_fetchfield('user_id'); - $db->sql_freeresult($result); + $result = $src_db->sql_query($sql); + $id = (int) $src_db->sql_fetchfield('user_id'); + $src_db->sql_freeresult($result); + + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'utf8'"); + } // If there is a user id 1, we need to increment user ids. :/ if ($id === 1) @@ -484,7 +504,7 @@ function phpbb_copy_table_fields() */ function phpbb_convert_authentication($mode) { - global $db, $convert, $user, $config, $cache; + global $db, $src_db, $same_db, $convert, $user, $config, $cache; if ($mode == 'start') { @@ -494,14 +514,15 @@ function phpbb_convert_authentication($mode) // What we will do is handling all 2.0.x admins as founder to replicate what is common in 2.0.x. // After conversion the main admin need to make sure he is removing permissions and the founder status if wanted. + // Grab user ids of users with user_level of ADMIN $sql = "SELECT user_id FROM {$convert->src_table_prefix}users WHERE user_level = 1 ORDER BY user_regdate ASC"; - $result = $db->sql_query($sql); + $result = $src_db->sql_query($sql); - while ($row = $db->sql_fetchrow($result)) + while ($row = $src_db->sql_fetchrow($result)) { $user_id = (int) phpbb_user_id($row['user_id']); @@ -511,49 +532,58 @@ function phpbb_convert_authentication($mode) WHERE user_id = $user_id"; $db->sql_query($sql); } - $db->sql_freeresult($result); + $src_db->sql_freeresult($result); } // Grab forum auth information $sql = "SELECT * FROM {$convert->src_table_prefix}forums"; - $result = $db->sql_query($sql); + $result = $src_db->sql_query($sql); $forum_access = array(); - while ($row = $db->sql_fetchrow($result)) + while ($row = $src_db->sql_fetchrow($result)) { $forum_access[] = $row; } - $db->sql_freeresult($result); + $src_db->sql_freeresult($result); + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'binary'"); + } // Grab user auth information from 2.0.x board $sql = "SELECT ug.user_id, aa.* FROM {$convert->src_table_prefix}auth_access aa, {$convert->src_table_prefix}user_group ug, {$convert->src_table_prefix}groups g WHERE g.group_id = aa.group_id AND g.group_single_user = 1 AND ug.group_id = g.group_id"; - $result = $db->sql_query($sql); + $result = $src_db->sql_query($sql); $user_access = array(); - while ($row = $db->sql_fetchrow($result)) + while ($row = $src_db->sql_fetchrow($result)) { $user_access[$row['forum_id']][] = $row; } - $db->sql_freeresult($result); + $src_db->sql_freeresult($result); // Grab group auth information $sql = "SELECT g.group_id, aa.* FROM {$convert->src_table_prefix}auth_access aa, {$convert->src_table_prefix}groups g WHERE g.group_id = aa.group_id AND g.group_single_user <> 1"; - $result = $db->sql_query($sql); + $result = $src_db->sql_query($sql); $group_access = array(); - while ($row = $db->sql_fetchrow($result)) + while ($row = $src_db->sql_fetchrow($result)) { $group_access[$row['forum_id']][] = $row; } - $db->sql_freeresult($result); + $src_db->sql_freeresult($result); + + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'utf8'"); + } // Add Forum Access List $auth_map = array( @@ -852,25 +882,25 @@ function phpbb_convert_authentication($mode) $sql = 'SELECT user_id FROM ' . $convert->src_table_prefix . 'users WHERE user_allowavatar = 0 AND user_id > 0'; - $result = $db->sql_query($sql); + $result = $src_db->sql_query($sql); - while ($row = $db->sql_fetchrow($result)) + while ($row = $src_db->sql_fetchrow($result)) { mass_auth('user_role', 0, (int) phpbb_user_id($row['user_id']), 'USER_NOAVATAR'); } - $db->sql_freeresult($result); + $src_db->sql_freeresult($result); // And the same for those who have had their PM rights removed $sql = 'SELECT user_id FROM ' . $convert->src_table_prefix . 'users WHERE user_allow_pm = 0 AND user_id > 0'; - $result = $db->sql_query($sql); + $result = $src_db->sql_query($sql); - while ($row = $db->sql_fetchrow($result)) + while ($row = $src_db->sql_fetchrow($result)) { mass_auth('user_role', 0, (int) phpbb_user_id($row['user_id']), 'USER_NOPM'); } - $db->sql_freeresult($result); + $src_db->sql_freeresult($result); } else if ($mode == 'third') { @@ -1169,21 +1199,30 @@ function phpbb_get_files_dir() return; } - global $db, $convert, $user, $config, $cache; + global $src_db, $same_db, $convert, $user, $config, $cache; + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'binary'"); + } $sql = 'SELECT config_value AS upload_dir FROM ' . $convert->src_table_prefix . "attachments_config WHERE config_name = 'upload_dir'"; - $result = $db->sql_query($sql); - $upload_path = $db->sql_fetchfield('upload_dir'); - $db->sql_freeresult($result); + $result = $src_db->sql_query($sql); + $upload_path = $src_db->sql_fetchfield('upload_dir'); + $src_db->sql_freeresult($result); $sql = 'SELECT config_value AS ftp_upload FROM ' . $convert->src_table_prefix . "attachments_config WHERE config_name = 'allow_ftp_upload'"; - $result = $db->sql_query($sql); - $ftp_upload = (int) $db->sql_fetchfield('ftp_upload'); - $db->sql_freeresult($result); + $result = $src_db->sql_query($sql); + $ftp_upload = (int) $src_db->sql_fetchfield('ftp_upload'); + $src_db->sql_freeresult($result); + + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'utf8'"); + } if ($ftp_upload) { @@ -1402,18 +1441,28 @@ function phpbb_get_savebox_id($user_id) */ function phpbb_import_attach_config() { - global $db, $convert, $config; + global $db, $src_db, $same_db, $convert, $config; + + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'binary'"); + } $sql = 'SELECT * FROM ' . $convert->src_table_prefix . 'attachments_config'; - $result = $db->sql_query($sql); + $result = $src_db->sql_query($sql); + + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'utf8'"); + } $attach_config = array(); - while ($row = $db->sql_fetchrow($result)) + while ($row = $src_db->sql_fetchrow($result)) { $attach_config[$row['config_name']] = $row['config_value']; } - $db->sql_freeresult($result); + $src_db->sql_freeresult($result); set_config('allow_attachments', 1); diff --git a/phpBB/install/index.php b/phpBB/install/index.php index eb49ac5c9b..146f55ddb6 100755 --- a/phpBB/install/index.php +++ b/phpBB/install/index.php @@ -115,6 +115,7 @@ include($phpbb_root_path . 'includes/acm/acm_file.' . $phpEx); include($phpbb_root_path . 'includes/cache.' . $phpEx); include($phpbb_root_path . 'includes/functions_admin.' . $phpEx); include($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx); +require($phpbb_root_path . 'includes/functions_install.' . $phpEx); // Try and load an appropriate language if required $language = request_var('language', ''); diff --git a/phpBB/install/install_convert.php b/phpBB/install/install_convert.php index 0656f7e5f4..a3541f6f29 100644 --- a/phpBB/install/install_convert.php +++ b/phpBB/install/install_convert.php @@ -39,12 +39,19 @@ class convert var $options = array(); var $convertor_tag = ''; + var $src_dbms = ''; + var $src_dbhost = ''; + var $src_dbport = ''; + var $src_dbuser = ''; + var $src_dbpasswd = ''; + var $src_dbname = ''; var $src_table_prefix = ''; var $convertor_data = array(); var $tables = array(); var $config_schema = array(); var $convertor = array(); + var $src_truncate_statement = 'DELETE FROM '; var $truncate_statement = 'DELETE FROM '; var $fulltext_search; @@ -142,19 +149,32 @@ class install_convert extends module if ($new_conversion) { $config['convert_progress'] = ''; - $db->sql_query('DELETE FROM ' . CONFIG_TABLE . " WHERE config_name = 'convert_progress'"); + $config['convert_db_server'] = ''; + $config['convert_db_user'] = ''; + $db->sql_query('DELETE FROM ' . CONFIG_TABLE . " + WHERE config_name = 'convert_progress' + OR config_name = 'convert_db_server' + OR config_name = 'convert_db_user'" + ); } // Let's see if there is a conversion in the works... $options = array(); - if (!empty($config['convert_progress']) && !empty($config['convert_options'])) + if (!empty($config['convert_progress']) && !empty($config['convert_db_server']) && !empty($config['convert_db_user']) && !empty($config['convert_options'])) { $options = unserialize($config['convert_progress']); - $options = array_merge($options, unserialize($config['convert_options'])); + $options = array_merge($options, unserialize($config['convert_db_server']), unserialize($config['convert_db_user']), unserialize($config['convert_options'])); } // This information should have already been checked once, but do it again for safety - if (!empty($options) && !empty($options['tag']) && isset($options['table_prefix'])) + if (!empty($options) && !empty($options['tag']) && + isset($convert->options['dbms']) && + isset($convert->options['dbhost']) && + isset($convert->options['dbport']) && + isset($convert->options['dbuser']) && + isset($convert->options['dbpasswd']) && + isset($convert->options['dbname']) && + isset($convert->options['table_prefix'])) { $this->page_title = $lang['CONTINUE_CONVERT']; @@ -270,6 +290,12 @@ class install_convert extends module 'tag' => $m[1], 'forum_name' => $convertor_data['forum_name'], 'version' => $convertor_data['version'], + 'dbms' => $convertor_data['dbms'], + 'dbhost' => $convertor_data['dbhost'], + 'dbport' => $convertor_data['dbport'], + 'dbuser' => $convertor_data['dbuser'], + 'dbpasswd' => $convertor_data['dbpasswd'], + 'dbname' => $convertor_data['dbname'], 'table_prefix' => $convertor_data['table_prefix'], 'author' => $convertor_data['author'] ); @@ -347,6 +373,12 @@ class install_convert extends module $submit = (isset($_POST['submit'])) ? true : false; + $src_dbms = request_var('src_dbms', $convertor_data['dbms']); + $src_dbhost = request_var('src_dbhost', $convertor_data['dbhost']); + $src_dbport = request_var('src_dbport', $convertor_data['dbport']); + $src_dbuser = request_var('src_dbuser', $convertor_data['dbuser']); + $src_dbpasswd = request_var('src_dbpasswd', $convertor_data['dbpasswd']); + $src_dbname = request_var('src_dbname', $convertor_data['dbname']); $src_table_prefix = request_var('src_table_prefix', $convertor_data['table_prefix']); $forum_path = request_var('forum_path', $convertor_data['forum_path']); $refresh = request_var('refresh', 1); @@ -364,10 +396,22 @@ class install_convert extends module $error[] = sprintf($lang['COULD_NOT_FIND_PATH'], $forum_path); } - // The forum prefix of the old and the new forum can't be the same because the - // convertor requires all tables to be in one database. I.e. there can't be - // two tables named 'phpbb_users' - if ($src_table_prefix == $table_prefix) + $connect_test = false; + $available_dbms = get_available_dbms(false, true); + + if (!isset($available_dbms[$src_dbms]) || !$available_dbms[$src_dbms]['AVAILABLE']) + { + $error['db'][] = $lang['INST_ERR_NO_DB']; + $connect_test = false; + } + else + { + $src_dbpasswd = htmlspecialchars_decode($src_dbpasswd); + $connect_test = connect_check_db(true, $error, $available_dbms[$src_dbms], false, $src_dbhost, $src_dbuser, $src_dbpasswd, $src_dbname, $src_dbport, ($src_dbms == $dbms) ? false : true); + } + + // The forum prefix of the old and the new forum can only be the same if two different databases are used. + if ($src_table_prefix == $table_prefix && $src_dbms == $dbms && $src_dbhost == $dbhost && $src_dbport == $dbport && $src_dbname == $dbname) { $error[] = sprintf($lang['TABLE_PREFIX_SAME'], $src_table_prefix); } @@ -375,17 +419,35 @@ class install_convert extends module // Check table prefix if (!sizeof($error)) { + // initiate database connection to old db if old and new db differ + global $src_db, $same_db; + $src_db = $same_db = null; + + if ($src_dbms != $dbms || $src_dbhost != $dbhost || $src_dbport != $dbport || $src_dbname != $dbname || $src_dbuser != $dbuser) + { + $sql_db = 'dbal_' . $src_dbms; + $src_db = new $sql_db(); + $src_db->sql_connect($src_dbhost, $src_dbuser, $src_dbpasswd, $src_dbname, $src_dbport, false); + $same_db = false; + } + else + { + $src_db = &$db; + $same_db = true; + } + + $src_db->sql_return_on_error(true); $db->sql_return_on_error(true); // Try to select one row from the first table to see if the prefix is OK - $result = $db->sql_query_limit('SELECT * FROM ' . $src_table_prefix . $tables[0], 1); + $result = $src_db->sql_query_limit('SELECT * FROM ' . $src_table_prefix . $tables[0], 1); if (!$result) { $prefixes = array(); - if ($result = $db->sql_query('SHOW TABLES')) + if ($result = $src_db->sql_query('SHOW TABLES')) { - while ($row = $db->sql_fetchrow($result)) + while ($row = $src_db->sql_fetchrow($result)) { if (sizeof($row) > 1) { @@ -396,7 +458,7 @@ class install_convert extends module compare_table($tables, $tablename, $prefixes); } } - $db->sql_freeresult($result); + $src_->sql_freeresult($result); } foreach ($prefixes as $prefix => $count) @@ -423,14 +485,28 @@ class install_convert extends module $error[] = $msg; } - $db->sql_freeresult($result); - $db->sql_return_on_error(false); + $src_db->sql_freeresult($result); + $src_db->sql_return_on_error(false); } if (!sizeof($error)) { // Save convertor Status - set_config('convert_progress', serialize(array('step' => '', 'table_prefix' => $src_table_prefix, 'tag' => $convertor_tag)), true); + set_config('convert_progress', serialize(array( + 'step' => '', + 'table_prefix' => $src_table_prefix, + 'tag' => $convertor_tag, + )), true); + set_config('convert_db_server', serialize(array( + 'dbms' => $src_dbms, + 'dbhost' => $src_dbhost, + 'dbport' => $src_dbport, + 'dbname' => $src_dbname, + )), true); + set_config('convert_db_user', serialize(array( + 'dbuser' => $src_dbuser, + 'dbpasswd' => $src_dbpasswd, + )), true); // Save options set_config('convert_options', serialize(array('forum_path' => './../' . $forum_path, 'refresh' => $refresh)), true); @@ -527,24 +603,6 @@ class install_convert extends module // @todo Need to confirm that max post length in source is <= max post length in destination or there may be interesting formatting issues $config['max_post_chars'] = -1; - $convert->mysql_convert = false; - - switch ($db->sql_layer) - { - // Thanks MySQL, for silently converting... - case 'mysql': - case 'mysql4': - if (version_compare($db->mysql_version, '4.1.3', '>=')) - { - $convert->mysql_convert = true; - } - break; - - case 'mysqli': - $convert->mysql_convert = true; - break; - } - // Set up a user as well. We _should_ have enough of a database here at this point to do this // and it helps for any core code we call $user->session_begin(); @@ -560,19 +618,84 @@ class install_convert extends module if (isset($config['convert_progress'])) { $convert->options = unserialize($config['convert_progress']); - $convert->options = array_merge($convert->options, unserialize($config['convert_options'])); + $convert->options = array_merge($convert->options, unserialize($config['convert_db_server']), unserialize($config['convert_db_user']), unserialize($config['convert_options'])); } // This information should have already been checked once, but do it again for safety - if (empty($convert->options) || empty($convert->options['tag']) || !isset($convert->options['table_prefix'])) + if (empty($convert->options) || empty($convert->options['tag']) || + !isset($convert->options['dbms']) || + !isset($convert->options['dbhost']) || + !isset($convert->options['dbport']) || + !isset($convert->options['dbuser']) || + !isset($convert->options['dbpasswd']) || + !isset($convert->options['dbname']) || + !isset($convert->options['table_prefix'])) { $this->p_master->error($user->lang['NO_CONVERT_SPECIFIED'], __LINE__, __FILE__); } // Make some short variables accessible, for easier referencing $convert->convertor_tag = basename($convert->options['tag']); + $convert->src_dbms = $convert->options['dbms']; + $convert->src_dbhost = $convert->options['dbhost']; + $convert->src_dbport = $convert->options['dbport']; + $convert->src_dbuser = $convert->options['dbuser']; + $convert->src_dbpasswd = $convert->options['dbpasswd']; + $convert->src_dbname = $convert->options['dbname']; $convert->src_table_prefix = $convert->options['table_prefix']; + // initiate database connection to old db if old and new db differ + global $src_db, $same_db; + $src_db = $same_db = null; + if ($convert->src_dbms != $dbms || $convert->src_dbhost != $dbhost || $convert->src_dbport != $dbport || $convert->src_dbname != $dbname || $convert->src_dbuser != $dbuser) + { + if ($convert->src_dbms != $dbms) + { + require($phpbb_root_path . 'includes/db/' . $convert->src_dbms . '.' . $phpEx); + } + $sql_db = 'dbal_' . $convert->src_dbms; + $src_db = new $sql_db(); + $src_db->sql_connect($convert->src_dbhost, $convert->src_dbuser, $convert->src_dbpasswd, $convert->src_dbname, $convert->src_dbport, false); + $same_db = false; + } + else + { + $src_db = &$db; + $same_db = true; + } + + $convert->mysql_convert = false; + switch ($src_db->sql_layer) + { + case 'sqlite': + case 'firebird': + $convert->src_truncate_statement = 'DELETE FROM '; + break; + + // Thanks MySQL, for silently converting... + case 'mysql': + case 'mysql4': + if (version_compare($src_db->mysql_version, '4.1.3', '>=')) + { + $convert->mysql_convert = true; + } + $convert->src_truncate_statement = 'TRUNCATE TABLE '; + break; + + case 'mysqli': + $convert->mysql_convert = true; + $convert->src_truncate_statement = 'TRUNCATE TABLE '; + break; + + default: + $convert->src_truncate_statement = 'TRUNCATE TABLE '; + break; + } + + if ($convert->mysql_convert && !$same_db) + { + $src_db->sql_query("SET NAMES 'binary'"); + } switch ($db->sql_layer) { @@ -785,19 +908,19 @@ class install_convert extends module } // Check if the tables that we need exist - $db->sql_return_on_error(true); + $src_db->sql_return_on_error(true); foreach ($tables_list as $table => $null) { $sql = 'SELECT 1 FROM ' . $table; - $_result = $db->sql_query_limit($sql, 1); + $_result = $src_db->sql_query_limit($sql, 1); if (!$_result) { $missing_tables[] = $table; } - $db->sql_freeresult($_result); + $src_db->sql_freeresult($_result); } - $db->sql_return_on_error(false); + $src_db->sql_return_on_error(false); // Throw an error if some tables are missing // We used to do some guessing here, but since we have a suggestion of possible values earlier, I don't see it adding anything here to do it again @@ -812,7 +935,21 @@ class install_convert extends module } $step = '&confirm=1'; - set_config('convert_progress', serialize(array('step' => $step, 'table_prefix' => $convert->src_table_prefix, 'tag' => $convert->convertor_tag)), true); + set_config('convert_progress', serialize(array( + 'step' => $step, + 'table_prefix' => $convert->src_table_prefix, + 'tag' => $convert->convertor_tag, + )), true); + set_config('convert_db_server', serialize(array( + 'dbms' => $convert->src_dbms, + 'dbhost' => $convert->src_dbhost, + 'dbport' => $convert->src_dbport, + 'dbname' => $convert->src_dbname, + )), true); + set_config('convert_db_user', serialize(array( + 'dbuser' => $convert->src_dbuser, + 'dbpasswd' => $convert->src_dbpasswd, + )), true); $msg = $user->lang['PRE_CONVERT_COMPLETE'] . '

' . sprintf($user->lang['AUTHOR_NOTES'], $convert->convertor_data['author_notes']); $url = $this->p_master->module_url . "?mode=$mode&sub=in_progress&tag={$convert->convertor_tag}$step"; @@ -858,12 +995,33 @@ class install_convert extends module { if (!is_array($convert->convertor['query_first'])) { - $convert->convertor['query_first'] = array($convert->convertor['query_first']); + $convert->convertor['query_first'] = array('target', array($convert->convertor['query_first'])); + } + else if (!is_array($convert->convertor['query_first'][0])) + { + $convert->convertor['query_first'] = array(array($convert->convertor['query_first'][0], $convert->convertor['query_first'][1])); } foreach ($convert->convertor['query_first'] as $query_first) { - $db->sql_query($query_first); + if ($query_first[0] == 'src') + { + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'binary'"); + } + + $src_db->sql_query($query_first[1]); + + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'utf8'"); + } + } + else + { + $db->sql_query($query_first[1]); + } } } @@ -907,12 +1065,31 @@ class install_convert extends module { if (!is_array($schema['query_first'])) { - $schema['query_first'] = array($schema['query_first']); + $schema['query_first'] = array('target', array($schema['query_first'])); + } + else if (!is_array($schema['query_first'][0])) + { + $schema['query_first'] = array(array($schema['query_first'][0], $schema['query_first'][1])); } foreach ($schema['query_first'] as $query_first) { - $db->sql_query($query_first); + if ($query_first[0] == 'src') + { + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'binary'"); + } + $src_db->sql_query($query_first[1]); + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'utf8'"); + } + } + else + { + $db->sql_query($query_first[1]); + } } } @@ -1004,17 +1181,17 @@ class install_convert extends module $mtime = explode(' ', microtime()); $batch_time = $mtime[0] + $mtime[1]; - if ($convert->mysql_convert) + if ($convert->mysql_convert && $same_db) { - $db->sql_query("SET NAMES 'binary'"); + $src_db->sql_query("SET NAMES 'binary'"); } // Take skip rows into account and only fetch batch_size amount of rows - $___result = $db->sql_query_limit($sql, $convert->batch_size, $skip_rows); + $___result = $src_db->sql_query_limit($sql, $convert->batch_size, $skip_rows); - if ($convert->mysql_convert) + if ($convert->mysql_convert && $same_db) { - $db->sql_query("SET NAMES 'utf8'"); + $src_db->sql_query("SET NAMES 'utf8'"); } // This loop processes each row @@ -1036,12 +1213,12 @@ class install_convert extends module // Now handle the rows until time is over or no more rows to process... while (still_on_time()) { - $convert_row = $db->sql_fetchrow($___result); + $convert_row = $src_db->sql_fetchrow($___result); if (!$convert_row) { // move to the next batch or table - $db->sql_freeresult($___result); + $src_db->sql_freeresult($___result); break; } @@ -1184,7 +1361,21 @@ class install_convert extends module $step = '&current_table=' . $current_table . '&skip_rows=' . $skip_rows; // Save convertor Status - set_config('convert_progress', serialize(array('step' => $step, 'table_prefix' => $convert->src_table_prefix, 'tag' => $convert->convertor_tag)), true); + set_config('convert_progress', serialize(array( + 'step' => $step, + 'table_prefix' => $convert->src_table_prefix, + 'tag' => $convert->convertor_tag, + )), true); + set_config('convert_db_server', serialize(array( + 'dbms' => $convert->src_dbms, + 'dbhost' => $convert->src_dbhost, + 'dbport' => $convert->src_dbport, + 'dbname' => $convert->src_dbname, + )), true); + set_config('convert_db_user', serialize(array( + 'dbuser' => $convert->src_dbuser, + 'dbpasswd' => $convert->src_dbpasswd, + )), true); $current_table++; // $percentage = ($skip_rows == 0) ? 0 : floor(100 / ($total_rows / $skip_rows)); @@ -1208,7 +1399,21 @@ class install_convert extends module $step = '&jump=1'; // Save convertor Status - set_config('convert_progress', serialize(array('step' => $step, 'table_prefix' => $convert->src_table_prefix, 'tag' => $convert->convertor_tag)), true); + set_config('convert_progress', serialize(array( + 'step' => $step, + 'table_prefix' => $convert->src_table_prefix, + 'tag' => $convert->convertor_tag, + )), true); + set_config('convert_db_server', serialize(array( + 'dbms' => $convert->src_dbms, + 'dbhost' => $convert->src_dbhost, + 'dbport' => $convert->src_dbport, + 'dbname' => $convert->src_dbname, + )), true); + set_config('convert_db_user', serialize(array( + 'dbuser' => $convert->src_dbuser, + 'dbpasswd' => $convert->src_dbpasswd, + )), true); $url = $this->p_master->module_url . "?mode=$mode&sub=in_progress&tag={$convert->convertor_tag}$step"; @@ -1278,7 +1483,10 @@ class install_convert extends module $sync_batch = -1; $db->sql_query('DELETE FROM ' . CONFIG_TABLE . " - WHERE config_name = 'convert_progress' OR config_name = 'convert_options'"); + WHERE config_name = 'convert_progress' + OR config_name = 'convert_options' + OR config_name = 'convert_db_server' + OR config_name = 'convert_db_user'"); $db->sql_query('DELETE FROM ' . SESSIONS_TABLE); @unlink($phpbb_root_path . 'cache/data_global.php'); @@ -1305,7 +1513,21 @@ class install_convert extends module $step = '&sync_batch=' . $sync_batch; // Save convertor Status - set_config('convert_progress', serialize(array('step' => $step, 'table_prefix' => $convert->options['table_prefix'], 'tag' => $convert->convertor_tag)), true); + set_config('convert_progress', serialize(array( + 'step' => $step, + 'table_prefix' => $convert->src_table_prefix, + 'tag' => $convert->convertor_tag, + )), true); + set_config('convert_db_server', serialize(array( + 'dbms' => $convert->src_dbms, + 'dbhost' => $convert->src_dbhost, + 'dbport' => $convert->src_dbport, + 'dbname' => $convert->src_dbname, + )), true); + set_config('convert_db_user', serialize(array( + 'dbuser' => $convert->src_dbuser, + 'dbpasswd' => $convert->src_dbpasswd, + )), true); $url = $this->p_master->module_url . "?mode=$this->mode&sub=in_progress&tag={$convert->convertor_tag}$step"; @@ -1323,7 +1545,7 @@ class install_convert extends module */ function jump($jump, $last_statement) { - global $template, $user, $db, $phpbb_root_path, $phpEx, $config, $cache; + global $template, $user, $src_db, $same_db, $db, $phpbb_root_path, $phpEx, $config, $cache; global $convert; $template->assign_block_vars('checks', array( @@ -1355,7 +1577,21 @@ class install_convert extends module $step = '&jump=1&last=' . $last_statement; // Save convertor Status - set_config('convert_progress', serialize(array('step' => $step, 'table_prefix' => $convert->src_table_prefix, 'tag' => $convert->convertor_tag)), true); + set_config('convert_progress', serialize(array( + 'step' => $step, + 'table_prefix' => $convert->src_table_prefix, + 'tag' => $convert->convertor_tag, + )), true); + set_config('convert_db_server', serialize(array( + 'dbms' => $convert->src_dbms, + 'dbhost' => $convert->src_dbhost, + 'dbport' => $convert->src_dbport, + 'dbname' => $convert->src_dbname, + )), true); + set_config('convert_db_user', serialize(array( + 'dbuser' => $convert->src_dbuser, + 'dbpasswd' => $convert->src_dbpasswd, + )), true); $percentage = ($last_statement == 0) ? 0 : floor(100 / (sizeof($convert->convertor['execute_last']) / $last_statement)); $msg = sprintf($user->lang['STEP_PERCENT_COMPLETED'], $last_statement, sizeof($convert->convertor['execute_last']), $percentage); @@ -1377,17 +1613,39 @@ class install_convert extends module { if (!is_array($convert->convertor['query_last'])) { - $convert->convertor['query_last'] = array($convert->convertor['query_last']); + $convert->convertor['query_last'] = array('target', array($convert->convertor['query_last'])); + } + else if (!is_array($convert->convertor['query_last'][0])) + { + $convert->convertor['query_last'] = array(array($convert->convertor['query_last'][0], $convert->convertor['query_last'][1])); } foreach ($convert->convertor['query_last'] as $query_last) { - $db->sql_query($query_last); + if ($query_last[0] == 'src') + { + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'binary'"); + } + + $src_db->sql_query($query_last[1]); + + if ($convert->mysql_convert && $same_db) + { + $src_db->sql_query("SET NAMES 'utf8'"); + } + } + else + { + $db->sql_query($query_last[1]); + } } } // Sanity check $db->sql_return_on_error(false); + $src_db->sql_return_on_error(false); fix_empty_primary_groups(); @@ -1416,7 +1674,21 @@ class install_convert extends module $step = '&jump=2'; // Save convertor Status - set_config('convert_progress', serialize(array('step' => $step, 'table_prefix' => $convert->src_table_prefix, 'tag' => $convert->convertor_tag)), true); + set_config('convert_progress', serialize(array( + 'step' => $step, + 'table_prefix' => $convert->src_table_prefix, + 'tag' => $convert->convertor_tag, + )), true); + set_config('convert_db_server', serialize(array( + 'dbms' => $convert->src_dbms, + 'dbhost' => $convert->src_dbhost, + 'dbport' => $convert->src_dbport, + 'dbname' => $convert->src_dbname, + )), true); + set_config('convert_db_user', serialize(array( + 'dbuser' => $convert->src_dbuser, + 'dbpasswd' => $convert->src_dbpasswd, + )), true); $url = $this->p_master->module_url . "?mode={$this->mode}&sub=in_progress&tag={$convert->convertor_tag}$step"; @@ -1446,7 +1718,21 @@ class install_convert extends module $step = '&jump=3'; // Save convertor Status - set_config('convert_progress', serialize(array('step' => $step, 'table_prefix' => $convert->src_table_prefix, 'tag' => $convert->convertor_tag)), true); + set_config('convert_progress', serialize(array( + 'step' => $step, + 'table_prefix' => $convert->src_table_prefix, + 'tag' => $convert->convertor_tag, + )), true); + set_config('convert_db_server', serialize(array( + 'dbms' => $convert->src_dbms, + 'dbhost' => $convert->src_dbhost, + 'dbport' => $convert->src_dbport, + 'dbname' => $convert->src_dbname, + )), true); + set_config('convert_db_user', serialize(array( + 'dbuser' => $convert->src_dbuser, + 'dbpasswd' => $convert->src_dbpasswd, + )), true); $url = $this->p_master->module_url . "?mode={$this->mode}&sub=in_progress&tag={$convert->convertor_tag}$step"; @@ -1472,7 +1758,21 @@ class install_convert extends module $step = '&sync_batch=0'; // Save convertor Status - set_config('convert_progress', serialize(array('step' => $step, 'table_prefix' => $convert->src_table_prefix, 'tag' => $convert->convertor_tag)), true); + set_config('convert_progress', serialize(array( + 'step' => $step, + 'table_prefix' => $convert->src_table_prefix, + 'tag' => $convert->convertor_tag, + )), true); + set_config('convert_db_server', serialize(array( + 'dbms' => $convert->src_dbms, + 'dbhost' => $convert->src_dbhost, + 'dbport' => $convert->src_dbport, + 'dbname' => $convert->src_dbname, + )), true); + set_config('convert_db_user', serialize(array( + 'dbuser' => $convert->src_dbuser, + 'dbpasswd' => $convert->src_dbpasswd, + )), true); $url = $this->p_master->module_url . "?mode={$this->mode}&sub=in_progress&tag={$convert->convertor_tag}$step"; @@ -1810,10 +2110,16 @@ class install_convert extends module */ var $convert_options = array( 'legend1' => 'SPECIFY_OPTIONS', + 'src_dbms' => array('lang' => 'DBMS', 'type' => 'select', 'options' => 'dbms_select(\'{VALUE}\')', 'explain' => false), + 'src_dbhost' => array('lang' => 'DB_HOST', 'type' => 'text:25:100', 'explain' => true), + 'src_dbport' => array('lang' => 'DB_PORT', 'type' => 'text:25:100', 'explain' => true), + 'src_dbname' => array('lang' => 'DB_NAME', 'type' => 'text:25:100', 'explain' => false), + 'src_dbuser' => array('lang' => 'DB_USERNAME', 'type' => 'text:25:100', 'explain' => false), + 'src_dbpasswd' => array('lang' => 'DB_PASSWORD', 'type' => 'password:25:100', 'explain' => false), 'src_table_prefix' => array('lang' => 'TABLE_PREFIX', 'type' => 'text:25:100', 'explain' => false), //'src_url' => array('lang' => 'FORUM_ADDRESS', 'type' => 'text:50:100', 'explain' => true), 'forum_path' => array('lang' => 'FORUM_PATH', 'type' => 'text:25:100', 'explain' => true), - 'refresh' => array('lang' => 'REFRESH_PAGE', 'type' => 'radio:yes_no', 'explain' => true), + 'refresh' => array('lang' => 'REFRESH_PAGE', 'type' => 'radio:yes_no', 'explain' => true), ); } diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php index 79fd828784..ca91cf6396 100755 --- a/phpBB/install/install_install.php +++ b/phpBB/install/install_install.php @@ -208,7 +208,7 @@ class install_install extends module * Better not enabling and adding to the loaded extensions due to the specific requirements needed if (!@extension_loaded('mbstring')) { - $this->can_load_dll('mbstring'); + can_load_dll('mbstring'); } */ @@ -276,35 +276,32 @@ class install_install extends module 'LEGEND_EXPLAIN' => $lang['PHP_SUPPORTED_DB_EXPLAIN'], )); - $dlls_db = array(); - $passed['db'] = false; - foreach ($this->available_dbms as $db_name => $db_ary) + $available_dbms = get_available_dbms(false, true); + $passed['db'] = $available_dbms['ANY_DB_SUPPORT']; + unset($available_dbms['ANY_DB_SUPPORT']); + + foreach ($available_dbms as $db_name => $db_ary) { - $dll = $db_ary['MODULE']; - - if (!@extension_loaded($dll)) + if (!$db_ary['AVAILABLE']) { - if (!$this->can_load_dll($dll)) - { - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['DLL_' . strtoupper($db_name)], - 'RESULT' => '' . $lang['UNAVAILABLE'] . '', + $template->assign_block_vars('checks', array( + 'TITLE' => $lang['DLL_' . strtoupper($db_name)], + 'RESULT' => '' . $lang['UNAVAILABLE'] . '', - 'S_EXPLAIN' => false, - 'S_LEGEND' => false, - )); - continue; - } + 'S_EXPLAIN' => false, + 'S_LEGEND' => false, + )); } + else + { + $template->assign_block_vars('checks', array( + 'TITLE' => $lang['DLL_' . strtoupper($db_name)], + 'RESULT' => '' . $lang['AVAILABLE'] . '', - $template->assign_block_vars('checks', array( - 'TITLE' => $lang['DLL_' . strtoupper($db_name)], - 'RESULT' => '' . $lang['AVAILABLE'] . '', - - 'S_EXPLAIN' => false, - 'S_LEGEND' => false, - )); - $passed['db'] = true; + 'S_EXPLAIN' => false, + 'S_LEGEND' => false, + )); + } } // Test for other modules @@ -318,7 +315,7 @@ class install_install extends module { if (!@extension_loaded($dll)) { - if (!$this->can_load_dll($dll)) + if (!can_load_dll($dll)) { $template->assign_block_vars('checks', array( 'TITLE' => $lang['DLL_' . strtoupper($dll)], @@ -502,21 +499,22 @@ class install_install extends module } $connect_test = false; + $error = array(); + $available_dbms = get_available_dbms(false, true); // Has the user opted to test the connection? if (isset($_POST['testdb'])) { - // If the module for the selected database isn't loaded, let's try and load it now - if (!@extension_loaded($this->available_dbms[$dbms]['MODULE'])) + if (!isset($available_dbms[$dbms]) || !$available_dbms[$dbms]['AVAILABLE']) { - if (!$this->can_load_dll($this->available_dbms[$dbms]['MODULE'])) - { - $error['db'][] = $lang['INST_ERR_NO_DB']; - } + $error['db'][] = $lang['INST_ERR_NO_DB']; + $connect_test = false; + } + else + { + $dbpasswd = htmlspecialchars_decode($dbpasswd); + $connect_test = connect_check_db(true, $error, $available_dbms[$dbms], $table_prefix, $dbhost, $dbuser, $dbpasswd, $dbname, $dbport); } - - $dbpasswd = htmlspecialchars_decode($dbpasswd); - $connect_test = $this->connect_check_db(true, $error, $dbms, $table_prefix, $dbhost, $dbuser, $dbpasswd, $dbname, $dbport); $template->assign_block_vars('checks', array( 'S_LEGEND' => true, @@ -550,20 +548,17 @@ class install_install extends module { // Update the list of available DBMS modules to only contain those which can be used $available_dbms_temp = array(); - foreach ($this->available_dbms as $type => $dbms_ary) + foreach ($available_dbms as $type => $dbms_ary) { - if (!@extension_loaded($dbms_ary['MODULE'])) + if (!$dbms_ary['AVAILABLE']) { - if (!$this->can_load_dll($dbms_ary['MODULE'])) - { - continue; - } + continue; } $available_dbms_temp[$type] = $dbms_ary; } - $this->available_dbms = &$available_dbms_temp; + $available_dbms = &$available_dbms_temp; // And now for the main part of this page $table_prefix = (!empty($table_prefix) ? $table_prefix : 'phpbb_'); @@ -828,7 +823,8 @@ class install_install extends module // Create a list of any PHP modules we wish to have loaded $load_extensions = array(); - $check_exts = array_merge(array($this->available_dbms[$dbms]['MODULE']), $this->php_dlls_other); + $available_dbms = get_available_dbms($dbms); + $check_exts = array_merge(array($available_dbms[$dbms]['MODULE']), $this->php_dlls_other); $suffix = (defined('PHP_OS') && strpos(strtolower(PHP_OS), 'win') === 0) ? 'dll' : 'so'; @@ -836,7 +832,7 @@ class install_install extends module { if (!@extension_loaded($dll)) { - if (!$this->can_load_dll($dll)) + if (!can_load_dll($dll)) { continue; } @@ -860,7 +856,7 @@ class install_install extends module // Time to convert the data provided into a config file $config_data = "available_dbms[$dbms]['DRIVER'] . "';\n"; + $config_data .= "\$dbms = '" . $available_dbms[$dbms]['DRIVER'] . "';\n"; $config_data .= "\$dbhost = '$dbhost';\n"; $config_data .= "\$dbport = '$dbport';\n"; $config_data .= "\$dbname = '$dbname';\n"; @@ -1085,19 +1081,16 @@ class install_install extends module $cookie_domain = str_replace('www.', '.', $cookie_domain); } - // If we get here and the extension isn't loaded it should be safe to just go ahead and load it - if (!@extension_loaded($this->available_dbms[$dbms]['MODULE'])) - { - $this->can_load_dll($this->available_dbms[$dbms]['MODULE']); - } + // If we get here and the extension isn't loaded it should be safe to just go ahead and load it + $available_dbms = get_available_dbms($dbms); $dbpasswd = htmlspecialchars_decode($dbpasswd); // Load the appropriate database class if not already loaded - include($phpbb_root_path . 'includes/db/' . $this->available_dbms[$dbms]['DRIVER'] . '.' . $phpEx); + include($phpbb_root_path . 'includes/db/' . $available_dbms[$dbms]['DRIVER'] . '.' . $phpEx); // Instantiate the database - $sql_db = 'dbal_' . $this->available_dbms[$dbms]['DRIVER']; + $sql_db = 'dbal_' . $available_dbms[$dbms]['DRIVER']; $db = new $sql_db(); $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false); @@ -1109,21 +1102,21 @@ class install_install extends module { if (version_compare($db->mysql_version, '4.1.3', '>=')) { - $this->available_dbms[$dbms]['SCHEMA'] .= '_41'; + $available_dbms[$dbms]['SCHEMA'] .= '_41'; } else { - $this->available_dbms[$dbms]['SCHEMA'] .= '_40'; + $available_dbms[$dbms]['SCHEMA'] .= '_40'; } } // Ok we have the db info go ahead and read in the relevant schema // and work on building the table - $dbms_schema = 'schemas/' . $this->available_dbms[$dbms]['SCHEMA'] . '_schema.sql'; + $dbms_schema = 'schemas/' . $available_dbms[$dbms]['SCHEMA'] . '_schema.sql'; // How should we treat this schema? - $remove_remarks = $this->available_dbms[$dbms]['COMMENTS']; - $delimiter = $this->available_dbms[$dbms]['DELIM']; + $remove_remarks = $available_dbms[$dbms]['COMMENTS']; + $delimiter = $available_dbms[$dbms]['DELIM']; $sql_query = @file_get_contents($dbms_schema); @@ -1309,7 +1302,7 @@ class install_install extends module if (!@extension_loaded('gd')) { - $this->can_load_dll('gd'); + can_load_dll('gd'); } // This is for people who have TTF and GD @@ -1372,16 +1365,13 @@ class install_install extends module $dbpasswd = htmlspecialchars_decode($dbpasswd); // If we get here and the extension isn't loaded it should be safe to just go ahead and load it - if (!@extension_loaded($this->available_dbms[$dbms]['MODULE'])) - { - $this->can_load_dll($this->available_dbms[$dbms]['MODULE']); - } + $available_dbms = get_available_dbms($dbms); // Load the appropriate database class if not already loaded - include($phpbb_root_path . 'includes/db/' . $this->available_dbms[$dbms]['DRIVER'] . '.' . $phpEx); + include($phpbb_root_path . 'includes/db/' . $available_dbms[$dbms]['DRIVER'] . '.' . $phpEx); // Instantiate the database - $sql_db = 'dbal_' . $this->available_dbms[$dbms]['DRIVER']; + $sql_db = 'dbal_' . $available_dbms[$dbms]['DRIVER']; $db = new $sql_db(); $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false); @@ -1790,317 +1780,6 @@ class install_install extends module 'U_ACTION' => append_sid($phpbb_root_path . 'adm/index.' . $phpEx), )); } - - /** - * Determine if we are able to load a specified PHP module - */ - 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; - } - - /** - * 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 - */ - function connect_check_db($error_connect, &$error, $dbms, $table_prefix, $dbhost, $dbuser, $dbpasswd, $dbname, $dbport) - { - global $phpbb_root_path, $phpEx, $config, $lang; - - // Include the DB layer - include($phpbb_root_path . 'includes/db/' . $this->available_dbms[$dbms]['DRIVER'] . '.' . $phpEx); - - // Instantiate it and set return on error true - $sql_db = 'dbal_' . $this->available_dbms[$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 != '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 == '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) - { - 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'] . '
' . (($db_error['message']) ? $db_error['message'] : $lang['INST_ERR_DB_NO_ERROR']); - } - else - { - switch ($dbms) - { - 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)) - { - $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) - { - 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; - } - - /** - * Generate the drop down of available database options - */ - function dbms_select($default='') - { - $dbms_options = ''; - foreach ($this->available_dbms as $dbms_name => $details) - { - $selected = ($dbms_name == $default) ? ' selected="selected"' : ''; - $dbms_options .= ''; - } - return $dbms_options; - } /** * Generate a list of available mail server authentication methods @@ -2132,7 +1811,7 @@ class install_install extends module */ var $db_config_options = array( 'legend1' => 'DB_CONFIG', - 'dbms' => array('lang' => 'DBMS', 'type' => 'select', 'options' => '$this->module->dbms_select(\'{VALUE}\')', 'explain' => false), + 'dbms' => array('lang' => 'DBMS', 'type' => 'select', 'options' => 'dbms_select(\'{VALUE}\')', 'explain' => false), 'dbhost' => array('lang' => 'DB_HOST', 'type' => 'text:25:100', 'explain' => true), 'dbport' => array('lang' => 'DB_PORT', 'type' => 'text:25:100', 'explain' => true), 'dbname' => array('lang' => 'DB_NAME', 'type' => 'text:25:100', 'explain' => false), @@ -2172,76 +1851,6 @@ class install_install extends module */ var $php_dlls_other = array('zlib', 'ftp', 'gd', 'xml'); - /** - * Details of the database management systems supported - */ - var $available_dbms = array( - 'firebird' => array( - 'LABEL' => 'FireBird', - 'SCHEMA' => 'firebird', - 'MODULE' => 'interbase', - 'DELIM' => ';;', - 'COMMENTS' => 'remove_remarks', - 'DRIVER' => 'firebird' - ), - 'mysqli' => array( - 'LABEL' => 'MySQL with MySQLi Extension', - 'SCHEMA' => 'mysql_41', - 'MODULE' => 'mysqli', - 'DELIM' => ';', - 'COMMENTS' => 'remove_remarks', - 'DRIVER' => 'mysqli' - ), - 'mysql' => array( - 'LABEL' => 'MySQL', - 'SCHEMA' => 'mysql', - 'MODULE' => 'mysql', - 'DELIM' => ';', - 'COMMENTS' => 'remove_remarks', - 'DRIVER' => 'mysql' - ), - 'mssql' => array( - 'LABEL' => 'MS SQL Server 2000+', - 'SCHEMA' => 'mssql', - 'MODULE' => 'mssql', - 'DELIM' => 'GO', - 'COMMENTS' => 'remove_comments', - 'DRIVER' => 'mssql' - ), - 'mssql_odbc'=> array( - 'LABEL' => 'MS SQL Server [ ODBC ]', - 'SCHEMA' => 'mssql', - 'MODULE' => 'odbc', - 'DELIM' => 'GO', - 'COMMENTS' => 'remove_comments', - 'DRIVER' => 'mssql_odbc' - ), - 'oracle' => array( - 'LABEL' => 'Oracle', - 'SCHEMA' => 'oracle', - 'MODULE' => 'oci8', - 'DELIM' => '/', - 'COMMENTS' => 'remove_comments', - 'DRIVER' => 'oracle' - ), - 'postgres' => array( - 'LABEL' => 'PostgreSQL 7.x/8.x', - 'SCHEMA' => 'postgres', - 'MODULE' => 'pgsql', - 'DELIM' => ';', - 'COMMENTS' => 'remove_comments', - 'DRIVER' => 'postgres' - ), - 'sqlite' => array( - 'LABEL' => 'SQLite', - 'SCHEMA' => 'sqlite', - 'MODULE' => 'sqlite', - 'DELIM' => ';', - 'COMMENTS' => 'remove_remarks', - 'DRIVER' => 'sqlite' - ), - ); - /** * A list of the web-crawlers/bots we recognise by default * diff --git a/phpBB/language/en/install.php b/phpBB/language/en/install.php index 42e0cf5ccf..4bcc26bccf 100755 --- a/phpBB/language/en/install.php +++ b/phpBB/language/en/install.php @@ -46,7 +46,7 @@ $lang = array_merge($lang, array( 'BEGIN_CONVERT' => 'Begin conversion', 'BLANK_PREFIX_FOUND' => 'A scan of your tables has shown a valid installation using no table prefix.', 'BOARD_NOT_INSTALLED' => 'No installation found', - 'BOARD_NOT_INSTALLED_EXPLAIN' => 'To perform a conversion you need to have a default installation of phpBB3. Please note that for a conversion the new installation and the old installation need to reside within the same database. You may now want to perform an installation.', + 'BOARD_NOT_INSTALLED_EXPLAIN' => 'To perform a conversion you need to have a default installation of phpBB3. You may now want to perform an installation.', 'CATEGORY' => 'Category', 'CACHE_STORE' => 'Cache type',