/** * Insert/Convert forums */ function phpbb_insert_forums() { 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 = $src_db->sql_query($sql); $max_forum_id = (int) $src_db->sql_fetchfield('max_forum_id'); $src_db->sql_freeresult($result); $max_forum_id++; // pruning disabled globally? $sql = "SELECT config_value FROM {$convert->src_table_prefix}config WHERE config_name = 'prune_enable'"; $result = $src_db->sql_query($sql); $prune_enabled = (int) $src_db->sql_fetchfield('config_value'); $src_db->sql_freeresult($result); // Insert categories $sql = 'SELECT cat_id, cat_title FROM ' . $convert->src_table_prefix . 'categories ORDER BY cat_order'; if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'binary'"); } $result = $src_db->sql_query($sql); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'utf8'"); } switch ($db->sql_layer) { case 'mssql': case 'mssql_odbc': $db->sql_query('SET IDENTITY_INSERT ' . FORUMS_TABLE . ' ON'); break; } $cats_added = array(); while ($row = $src_db->sql_fetchrow($result)) { $sql_ary = array( 'forum_id' => (int) $max_forum_id, 'forum_name' => ($row['cat_title']) ? htmlspecialchars(phpbb_set_default_encoding($row['cat_title']), ENT_COMPAT, 'UTF-8') : $user->lang['CATEGORY'], 'parent_id' => 0, 'forum_parents' => '', 'forum_desc' => '', 'forum_type' => FORUM_CAT, 'forum_status' => ITEM_UNLOCKED, 'forum_rules' => '', ); $sql = 'SELECT MAX(right_id) AS right_id FROM ' . FORUMS_TABLE; $_result = $db->sql_query($sql); $cat_row = $db->sql_fetchrow($_result); $db->sql_freeresult($_result); $sql_ary['left_id'] = (int) ($cat_row['right_id'] + 1); $sql_ary['right_id'] = (int) ($cat_row['right_id'] + 2); $sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); $db->sql_query($sql); $cats_added[$row['cat_id']] = $max_forum_id; $max_forum_id++; } $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 = $src_db->sql_query($sql); $unknown_cat_id = false; while ($row = $src_db->sql_fetchrow($result)) { // Catch those categories not been added before if (!isset($cats_added[$row['cat_id']])) { $unknown_cat_id = true; } } $src_db->sql_freeresult($result); // Is there at least one category not known? if ($unknown_cat_id === true) { $unknown_cat_id = 'ghost'; $sql_ary = array( 'forum_id' => (int) $max_forum_id, 'forum_name' => (string) $user->lang['CATEGORY'], 'parent_id' => 0, 'forum_parents' => '', 'forum_desc' => '', 'forum_type' => FORUM_CAT, 'forum_status' => ITEM_UNLOCKED, 'forum_rules' => '', ); $sql = 'SELECT MAX(right_id) AS right_id FROM ' . FORUMS_TABLE; $_result = $db->sql_query($sql); $cat_row = $db->sql_fetchrow($_result); $db->sql_freeresult($_result); $sql_ary['left_id'] = (int) ($cat_row['right_id'] + 1); $sql_ary['right_id'] = (int) ($cat_row['right_id'] + 2); $sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); $db->sql_query($sql); $cats_added[$unknown_cat_id] = $max_forum_id; $max_forum_id++; } // Now insert the forums $sql = 'SELECT f.forum_id, f.forum_name, f.cat_id, f.forum_desc, f.forum_status, f.prune_enable, f.prune_next, fp.prune_days, fp.prune_freq FROM ' . $convert->src_table_prefix . 'forums f LEFT JOIN ' . $convert->src_table_prefix . 'forum_prune fp ON f.forum_id = fp.forum_id 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 && $same_db) { $src_db->sql_query("SET NAMES 'binary'"); } $result = $src_db->sql_query($sql); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'utf8'"); } 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 if (!isset($cats_added[$row['cat_id']]) && $unknown_cat_id !== false) { $row['cat_id'] = $unknown_cat_id; } if (!isset($cats_added[$row['cat_id']])) { continue; } // Define the new forums sql ary $sql_ary = array( 'forum_id' => (int) $row['forum_id'], 'forum_name' => htmlspecialchars(phpbb_set_default_encoding($row['forum_name']), ENT_COMPAT, 'UTF-8'), 'parent_id' => (int) $cats_added[$row['cat_id']], 'forum_parents' => '', 'forum_desc' => htmlspecialchars(phpbb_set_default_encoding($row['forum_desc']), ENT_COMPAT, 'UTF-8'), 'forum_type' => FORUM_POST, 'forum_status' => is_item_locked($row['forum_status']), 'enable_prune' => ($prune_enabled) ? (int)$row['prune_enable'] : 0, 'prune_next' => (int) null_to_zero($row['prune_next']), 'prune_days' => (int) null_to_zero($row['prune_days']), 'prune_viewed' => 0, 'prune_freq' => (int) null_to_zero($row['prune_freq']), 'forum_flags' => phpbb_forum_flags(), // Default values 'forum_desc_bitfield' => '', 'forum_desc_options' => 7, 'forum_desc_uid' => '', 'forum_link' => '', 'forum_password' => '', 'forum_style' => 0, 'forum_image' => '', 'forum_rules' => '', 'forum_rules_link' => '', 'forum_rules_bitfield' => '', 'forum_rules_options' => 7, 'forum_rules_uid' => '', 'forum_topics_per_page' => 0, 'forum_posts' => 0, 'forum_topics' => 0, 'forum_topics_real' => 0, 'forum_last_post_id' => 0, 'forum_last_poster_id' => 0, 'forum_last_post_subject' => '', 'forum_last_post_time' => 0, 'forum_last_poster_name' => '', 'forum_last_poster_colour' => '', 'display_on_index' => 1, 'enable_indexing' => 1, 'enable_icons' => 0, ); // Now add the forums with proper left/right ids $sql = 'SELECT left_id, right_id FROM ' . FORUMS_TABLE . ' WHERE forum_id = ' . $cats_added[$row['cat_id']]; $_result = $db->sql_query($sql); $cat_row = $db->sql_fetchrow($_result); $db->sql_freeresult($_result); $sql = 'UPDATE ' . FORUMS_TABLE . ' SET left_id = left_id + 2, right_id = right_id + 2 WHERE left_id > ' . $cat_row['right_id']; $db->sql_query($sql); $sql = 'UPDATE ' . FORUMS_TABLE . ' SET right_id = right_id + 2 WHERE ' . $cat_row['left_id'] . ' BETWEEN left_id AND right_id'; $db->sql_query($sql); $sql_ary['left_id'] = (int) $cat_row['right_id']; $sql_ary['right_id'] = (int) ($cat_row['right_id'] + 1); $sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); $db->sql_query($sql); } $src_db->sql_freeresult($result); switch ($db->sql_layer) { case 'postgres': $db->sql_query("SELECT SETVAL('" . FORUMS_TABLE . "_seq',(select case when max(forum_id)>0 then max(forum_id)+1 else 1 end from " . FORUMS_TABLE . '));'); break; case 'mssql': case 'mssql_odbc': $db->sql_query('SET IDENTITY_INSERT ' . FORUMS_TABLE . ' OFF'); break; case 'oracle': $result = $db->sql_query('SELECT MAX(forum_id) as max_id FROM ' . FORUMS_TABLE); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $largest_id = (int) $row['max_id']; if ($largest_id) { $db->sql_query('DROP SEQUENCE ' . FORUMS_TABLE . '_seq'); $db->sql_query('CREATE SEQUENCE ' . FORUMS_TABLE . '_seq START WITH ' . ($largest_id + 1)); } break; } }
/** * Insert/Convert forums */ function phpbb_insert_forums() { global $db, $src_db, $same_db, $convert, $user, $config; $db->sql_query($convert->truncate_statement . FORUMS_TABLE); $sql = 'SELECT fid, name, description, linkto, type, pid, disporder, password, open, allowpicons FROM ' . $convert->src_table_prefix . 'forums ORDER BY disporder, fid'; if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'binary'"); } $result = $src_db->sql_query($sql); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'utf8'"); } $forums = $forum_groups = $last_topics = array(); while ($row = $src_db->sql_fetchrow($result)) { $forums[$row['fid']] = $row; $forum_groups[$row['pid']][] = $row['fid']; } $db->sql_freeresult($result); $node = 1; mybb_left_right_ids($forum_groups, 0, $forums, $node); foreach ($forums as $forum_id => $row) { $forum_type = FORUM_POST; if ($row['type'] == 'c') { $forum_type = FORUM_CAT; } else if ($row['linkto']) { $forum_type = FORUM_LINK; } // Define the new forums sql ary $sql_ary = array( 'forum_id' => (int) $row['fid'], 'forum_name' => htmlspecialchars(phpbb_set_encoding($row['name']), ENT_COMPAT, 'UTF-8'), 'parent_id' => (int) $row['pid'], 'forum_parents' => '', 'forum_desc' => htmlspecialchars(phpbb_set_encoding($row['description']), ENT_COMPAT, 'UTF-8'), 'forum_type' => $forum_type, 'forum_status' => ($row['open']) ? ITEM_UNLOCKED : ITEM_LOCKED, 'forum_password' => ($row['password']) ? phpbb_hash($row['password']) : '', 'forum_link' => $row['linkto'], 'left_id' => $row['left_id'], 'right_id' => $row['right_id'], 'enable_icons' => $row['allowpicons'], 'enable_prune' => 0, 'prune_next' => 0, 'prune_days' => 0, 'prune_viewed' => 0, 'prune_freq' => 0, 'forum_flags' => phpbb_forum_flags(), 'forum_options' => 0, // Default values 'forum_desc_bitfield' => '', 'forum_desc_options' => 7, 'forum_desc_uid' => '', 'forum_style' => 0, 'forum_image' => '', 'forum_rules' => '', 'forum_rules_link' => '', 'forum_rules_bitfield' => '', 'forum_rules_options' => 7, 'forum_rules_uid' => '', 'forum_topics_per_page' => 0, 'forum_posts' => 0, 'forum_topics' => 0, 'forum_topics_real' => 0, 'display_on_index' => 1, 'enable_indexing' => 1, ); $sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); $db->sql_query($sql); } switch ($db->sql_layer) { case 'postgres': $db->sql_query("SELECT SETVAL('" . FORUMS_TABLE . "_seq',(select case when max(forum_id)>0 then max(forum_id)+1 else 1 end from " . FORUMS_TABLE . '));'); break; case 'mssql': case 'mssql_odbc': case 'mssqlnative': $db->sql_query('SET IDENTITY_INSERT ' . FORUMS_TABLE . ' OFF'); break; case 'oracle': $result = $db->sql_query('SELECT MAX(forum_id) as max_id FROM ' . FORUMS_TABLE); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $largest_id = (int) $row['max_id']; if ($largest_id) { $db->sql_query('DROP SEQUENCE ' . FORUMS_TABLE . '_seq'); $db->sql_query('CREATE SEQUENCE ' . FORUMS_TABLE . '_seq START WITH ' . ($largest_id + 1)); } break; } }