From 7d01f3202d588bc57b92b9a2dcc6dae8153349c9 Mon Sep 17 00:00:00 2001 From: "Paul S. Owen" Date: Wed, 26 Feb 2003 00:30:10 +0000 Subject: [PATCH] Merge the post tables, clean it and the topic table up ... note that this doesn't fail gracefully ... it'll be merged into the update script in due course, this is a rough and ready temporary solution. git-svn-id: file:///svn/phpbb/trunk@3535 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/develop/merge_post_tables.php | 205 ++++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 phpBB/develop/merge_post_tables.php diff --git a/phpBB/develop/merge_post_tables.php b/phpBB/develop/merge_post_tables.php new file mode 100644 index 0000000000..1a5164e468 --- /dev/null +++ b/phpBB/develop/merge_post_tables.php @@ -0,0 +1,205 @@ +sql_query($sql); + +$sql = "CREATE TABLE {$table_prefix}posts + SELECT p.*, pt.post_subject, pt.post_text, pt.post_checksum, pt.bbcode_bitfield, pt.bbcode_uid + FROM {$table_prefix}posts_temp p, {$table_prefix}posts_text pt + WHERE pt.post_id = p.post_id"; +$db->sql_query($sql); + +switch (SQL_LAYER) +{ + case 'mysql': + case 'mysql4': + $sql = 'ALTER TABLE ' . $table_prefix . 'posts + ADD PRIMARY KEY (post_id), + ADD INDEX topic_id (topic_id), + ADD INDEX poster_ip (poster_ip), + ADD INDEX post_approved (post_approved), + MODIFY COLUMN post_id mediumint(8) UNSIGNED NOT NULL auto_increment, + ADD COLUMN post_encoding varchar(11) DEFAULT \'iso-8859-15\' NOT NULL'; + break; + + case 'mssql': + case 'mssql-odbc': + case 'msaccess': + break; + + case 'postgresql': + break; +} +$db->sql_query($sql); + +$sql = "UPDATE {$table_prefix}topics SET topic_poster = 1 WHERE topic_poster = 0 OR topic_poster IS NULL"; +$db->sql_query($sql); +$sql = "UPDATE {$table_prefix}topics SET topic_last_poster_id = 1 WHERE topic_last_poster_id = 0 OR topic_last_poster_id IS NULL"; +$db->sql_query($sql); +$sql = "UPDATE {$table_prefix}posts SET poster_id = 1 WHERE poster_id = 0 OR poster_id IS NULL"; +$db->sql_query($sql); +$sql = "UPDATE {$table_prefix}users SET user_id = 1 WHERE user_id = 0"; +$db->sql_query($sql); + +$sql = "SELECT t.topic_id + FROM {$table_prefix}topics t + LEFT JOIN {$table_prefix}posts p ON p.topic_id = t.topic_id + WHERE p.topic_id IS NULL"; +$result = $db->sql_query($sql); + +if ($row = $db->sql_fetchrow($result)) +{ + $del_sql = ''; + do + { + $del_sql .= (($del_sql != '') ? ', ' : '') . $row['topic_id']; + } + while ($row = $db->sql_fetchrow($result)); + + $sql = "DELETE FROM {$table_prefix}topics + WHERE topic_id IN ($del_sql)"; + $db->sql_query($sql); +} +$db->sql_freeresult($result); + +$del_sql = ''; +$sql = "SELECT topic_id, MIN(post_id) AS first_post_id, MAX(post_id) AS last_post_id, COUNT(post_id) AS total_posts + FROM {$table_prefix}posts + GROUP BY topic_id"; +$result = $db->sql_query($sql); + +while ($row = $db->sql_fetchrow($result)) +{ + $del_sql .= (($del_sql != '') ? ', ' : '') . $row['topic_id']; + + $sql = "UPDATE {$table_prefix}topics + SET topic_first_post_id = " . $row['first_post_id'] . ", topic_last_post_id = " . $row['last_post_id'] . ", topic_replies = " . ($row['total_posts'] - 1) . " + WHERE topic_id = " . $row['topic_id']; + $db->sql_query($sql); +} +$db->sql_freeresult($result); + +$sql = "DELETE FROM {$table_prefix}topics WHERE topic_id NOT IN ($del_sql)"; +$db->sql_query($sql); + +$topic_count = $post_count = array(); +$sql = "SELECT forum_id, COUNT(topic_id) AS topics + FROM {$table_prefix}topics + GROUP BY forum_id"; +while ($row = $db->sql_fetchrow($result)) +{ + $topic_count[$row['forum_id']] = $row['topics']; +} +$db->sql_freeresult($result); + +$sql = "SELECT forum_id, COUNT(post_id) AS posts + FROM {$table_prefix}posts + GROUP BY forum_id"; +while ($row = $db->sql_fetchrow($result)) +{ + $post_count[$row['forum_id']] = $row['posts']; +} +$db->sql_freeresult($result); + +switch (SQL_LAYER) +{ + case 'oracle': + $sql = "SELECT f.*, p.post_time, p.post_username, u.username, u.user_id + FROM " . $table_prefix . "forums f, " . $table_prefix . "posts p, " . $table_prefix . "users u + WHERE p.post_id = f.forum_last_post_id(+) + AND u.user_id = p.poster_id(+)"; + break; + + default: + $sql = "SELECT f.forum_id, p.post_time, p.post_username, u.username, u.user_id + FROM ((" . $table_prefix . "forums f + LEFT JOIN " . $table_prefix . "posts p ON p.post_id = f.forum_last_post_id) + LEFT JOIN " . $table_prefix . "users u ON u.user_id = p.poster_id)"; + break; +} +$result = $db->sql_query($sql); + +$sql_ary = array(); +while ($row = $db->sql_fetchrow($result)) +{ + $forum_id = $row['forum_id']; + + $sql_ary[] = "UPDATE " . $table_prefix . "forums + SET forum_last_poster_id = " . ((!empty($row['user_id']) && $row['user_id'] != ANONYMOUS) ? $row['user_id'] : ANONYMOUS) . ", forum_last_poster_name = '" . ((!empty($row['user_id']) && $row['user_id'] != ANONYMOUS) ? addslashes($row['username']) : addslashes($row['post_username'])) . "', forum_last_post_time = " . $row['post_time'] . ", forum_posts = " . $post_count[$forum_id] . ", forum_topics = " . $topic_count[$forum_id] . " + WHERE forum_id = $forum_id"; + + $sql = "SELECT t.topic_id, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_username, p2.post_username AS post_username2, p2.post_time + FROM " . $table_prefix . "topics t, " . $table_prefix . "users u, " . $table_prefix . "posts p, " . $table_prefix . "posts p2, " . $table_prefix . "users u2 + WHERE t.forum_id = $forum_id + AND u.user_id = t.topic_poster + AND p.post_id = t.topic_first_post_id + AND p2.post_id = t.topic_last_post_id + AND u2.user_id = p2.poster_id"; + $result2 = $db->sql_query($sql); + + while ($row2 = $db->sql_fetchrow($result2)) + { + $sql_ary[] = "UPDATE " . $table_prefix . "topics + SET topic_poster = " . $row2['user_id'] . ", topic_first_poster_name = '" . ((!empty($row2['user_id']) && $row2['user_id'] != ANONYMOUS) ? addslashes($row2['username']) : addslashes($row2['post_username'])) . "', topic_last_poster_id = " . ((!empty($row2['id2']) && $row2['id2'] != ANONYMOUS) ? $row2['id2'] : ANONYMOUS) . ", topic_last_post_time = " . $row2['post_time'] . ", topic_last_poster_name = '" . ((!empty($row2['id2']) && $row2['id2'] != ANONYMOUS) ? addslashes($row2['user2']) : addslashes($row2['post_username2'])) . "' + WHERE topic_id = " . $row2['topic_id']; + } + $db->sql_freeresult($result2); + + unset($row2); +} +$db->sql_freeresult($result); + +foreach ($sql_ary as $sql) +{ + $sql . "
"; + $db->sql_query($sql); +} + +echo "

Done

\n"; + +?> \ No newline at end of file