sql_transaction('begin'); $user_id = (int) $data['user_id']; $forum_id = (int) $data['forum_id']; $topic_title = $data['title']; $post_contents = $data['post_contents']; $approved = $data['approved']; $time = ($data['time']) ? (int) $data['time'] : time(); if (isset($data['username'])) { $username = $data['username']; } else { $sql = 'SELECT username FROM ' . USERS_TABLE . ' WHERE user_id = ' . $user_id; $result = $db->sql_query($sql); $username = (string) $db->sql_fetchfield('username'); $db->sql_freeresult($result); } $sql = 'SELECT forum_topics, forum_unapproved_topics, forum_posts, forum_unapproved_posts FROM ' . FORUMS_TABLE . ' WHERE forum_id = ' . (int) $forum_id; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); // everything starts out normal, one way or another $topic_status = self::NORMAL; // are we approved? if (!$approved) { // this topic is going to be unapproved $topic_status |= self::UNAPPROVED; } // throw our topic to the dogs $topic_data = array( 'topic_title' => $topic_title, 'topic_status' => $topic_status, 'topic_posts' => 1, 'topic_moved_posts' => 0, 'topic_deleted_posts' => 0, 'topic_unapproved_posts' => ($approved) ? 0 : 1, 'topic_first_poster_name' => $username, 'topic_poster' => $user_id, 'topic_last_username' => $username, 'topic_last_post_title' => $topic_title, 'topic_last_post_time' => $time, 'topic_last_poster_id' => $user_id, 'forum_id' => $forum_id ); $db->sql_handle_data('INSERT', TOPICS_TABLE, $topic_data); $topic_id = $db->sql_nextid(); // I suppose it is time to make us a post, no? $post_data = array( 'topic_id' => $topic_id, 'post_subject' => $topic_title, 'post_body' => $post_contents, 'post_username' => $username, 'poster_id' => $user_id, 'post_status' => $topic_status, 'forum_id' => $forum_id ); $db->sql_handle_data('INSERT', POSTS_TABLE, $post_data); $post_id = $db->sql_nextid(); // time to fill in the blanks $db->sql_handle_data('UPDATE', TOPICS_TABLE, array('topic_first_post_id' => $post_id, 'topic_last_post_id' => $post_id), "topic_id = $topic_id"); // let's go update the forum table $forum_data = array( 'forum_posts' => ++$row['forum_posts'], 'forum_topics' => ++$row['forum_topics'], ); // the last post inserted is always the latest, // we must update the forum records to make sure everybody knows the good news if ($approved) { $forum_data['forum_last_poster_name'] = $username; $forum_data['forum_last_user_id'] = $user_id; $forum_data['forum_last_post_title'] = $topic_title; $forum_data['forum_last_post_time'] = $time; } else { $forum_data['forum_unapproved_posts'] = ++$row['forum_unapproved_posts']; $forum_data['forum_unapproved_topics'] = ++$row['forum_unapproved_topics']; } $db->sql_handle_data('UPDATE', FORUMS_TABLE, $forum_data, "forum_id = $forum_id"); // we are consistant, victory is ours $db->sql_transaction('commit'); } public function insert_post($data) { global $db; // one transaction, we can now garuntee that atomicity of insertions $db->sql_transaction('begin'); $user_id = (int) $data['user_id']; $topic_id = (int) $data['topic_id']; // begin massive amounts of hand holding if (isset($data['forum_id'])) { $forum_id = (int) $data['forum_id']; } else { $sql = 'SELECT forum_id FROM ' . TOPICS_TABLE . ' WHERE topic_id = ' . $topic_id; $result = $db->sql_query($sql); $forum_id = (int) $db->sql_fetchfield('forum_id'); $db->sql_freeresult($result); } $post_title = $data['title']; $post_contents = $data['post_contents']; $approved = $data['approved']; $time = ($data['time']) ? (int) $data['time'] : time(); if (isset($data['username'])) { $username = $data['username']; } else { $sql = 'SELECT username FROM ' . USERS_TABLE . ' WHERE user_id = ' . $user_id; $result = $db->sql_query($sql); $username = (string) $db->sql_fetchfield('username'); $db->sql_freeresult($result); } // hand holding complete, lets write some posts $sql = 'SELECT forum_topics, forum_unapproved_topics, forum_posts, forum_unapproved_posts FROM ' . FORUMS_TABLE . ' WHERE forum_id = ' . (int) $forum_id; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); // everything starts out normal, one way or another $post_status = self::NORMAL; // are we approved? if (!$approved) { // this topic is going to be unapproved $post_status |= self::UNAPPROVED; } // I suppose it is time to make us a post, no? $post_data = array( 'topic_id' => $topic_id, 'post_subject' => $post_title, 'post_body' => $post_contents, 'post_username' => $username, 'poster_id' => $user_id, 'post_status' => $post_status, 'forum_id' => $forum_id, ); $db->sql_handle_data('INSERT', POSTS_TABLE, $post_data); // what is the new post_id? $post_id = $db->sql_nextid(); // iceberg ahead! we must only update the topic information if the post is approved ;) if ($approved) { // time to fill in the blanks $topics_data = array( 'topic_last_poster_id' => $user_id, 'topic_last_post_id' => $post_id, 'topic_last_poster_name'=> $username, 'topic_last_post_title' => $post_title, 'topic_last_post_time' => $time, ); $db->sql_handle_data('UPDATE', TOPICS_TABLE, $topics_data, "topic_id = $topic_id"); } // let's go update the forum table $forum_data = array( 'forum_posts' => ++$row['forum_posts'], ); // the last post inserted is always the latest, // we must update the forum records to make sure everybody knows the good news if ($approved) { $forum_data['forum_last_poster_name'] = $username; $forum_data['forum_last_user_id'] = $user_id; $forum_data['forum_last_post_title'] = $post_title; $forum_data['forum_last_post_time'] = $time; } else { $forum_data['forum_unapproved_posts'] = ++$row['forum_unapproved_posts']; } $db->sql_handle_data('UPDATE', FORUMS_TABLE, $forum_data, "forum_id = $forum_id"); // we are consistant, victory is ours $db->sql_transaction('commit'); } function move_topic($data) { global $db; // lets get this party started $db->sql_transaction('begin'); $topic_id = (int) $data['topic_id']; $to_forum_id = (int) $data['forum_id']; // let us first determine how many items we are removing from the pool $sql = 'SELECT topic_posts, topic_moved_posts, topic_deleted_posts, topic_unapproved_posts, forum_id as from_forum_id, topic_status FROM ' . TOPICS_TABLE. ' WHERE topic_id = ' . $topic_id; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $topic_status = (int) $row['topic_status']; $from_forum_id = (int) $row['from_forum_id']; $topic_row['topic_posts'] = (int) $row['topic_posts']; $topic_row['topic_moved_posts'] = (int) $row['topic_moved_posts']; $topic_row['topic_deleted_posts'] = (int) $row['topic_deleted_posts']; $topic_row['topic_unapproved_posts'] = (int) $row['topic_unapproved_posts']; // let us first determine how many items we are removing from the pool $sql = 'SELECT forum_posts, forum_moved_posts, forum_deleted_posts, forum_unapproved_posts, forum_id, forum_topics, forum_deleted_topics, forum_unapproved_topics FROM ' . FORUMS_TABLE. ' WHERE ' . $db->sql_in_set('forum_id', array($to_forum_id, $from_forum_id)); $result = $db->sql_query($sql); $forum_row = array(); while ($row = $db->sql_fetchrow($result)) { $forum_id = (int) $row['forum_id']; $forum_row[$forum_id]['forum_posts'] = (int) $row['forum_posts']; $forum_row[$forum_id]['forum_moved_posts'] = (int) $row['forum_moved_posts']; $forum_row[$forum_id]['forum_deleted_posts'] = (int) $row['forum_deleted_posts']; $forum_row[$forum_id]['forum_unapproved_posts'] = (int) $row['forum_unapproved_posts']; $forum_row[$forum_id]['forum_topics'] = (int) $row['forum_topics']; $forum_row[$forum_id]['forum_moved_topics'] = (int) $row['forum_moved_topics']; $forum_row[$forum_id]['forum_deleted_topics'] = (int) $row['forum_deleted_topics']; $forum_row[$forum_id]['forum_unapproved_topics'] = (int) $row['forum_unapproved_topics']; } $db->sql_freeresult($result); // update the topic itself $db->sql_handle_data('UPDATE', TOPICS_TABLE, array('forum_id' => $to_forum_id), "topic_id = $topic_id"); // update the posts now $db->sql_handle_data('UPDATE', POSTS_TABLE, array('forum_id' => $to_forum_id), "forum_id = $topic_id"); // remove the numbers from the old forum row $from_forum_array = array( 'forum_posts' => $forum_row[$from_forum_id]['forum_posts'] - $topic_id['forum_posts'], 'forum_moved_posts' => $forum_row[$from_forum_id]['forum_moved_posts'] - $topic_id['forum_moved_posts'], 'forum_deleted_posts' => $forum_row[$from_forum_id]['forum_deleted_posts'] - $topic_id['forum_deleted_posts'], 'forum_unapproved_posts' => $forum_row[$from_forum_id]['forum_unapproved_posts'] - $topic_id['forum_unapproved_posts'], 'forum_topics' => $forum_row[$from_forum_id]['forum_topics'] - 1, 'forum_moved_topics' => $forum_row[$from_forum_id]['forum_moved_topics'] - (($topic_status & self::MOVED) ? 1 : 0), 'forum_deleted_topics' => $forum_row[$from_forum_id]['forum_deleted_topics'] - (($topic_status & self::DELETED) ? 1 : 0), 'forum_unapproved_topics' => $forum_row[$from_forum_id]['forum_unapproved_topics'] - (($topic_status & self::UNAPPROVED) ? 1 : 0), ); // get the last "normal" post in the old forum, we _must_ update it $sql = 'SELECT MAX(post_id) as max_post_id FROM ' . POSTS_TABLE . ' WHERE post_status = ' . self::NORMAL . ' AND forum_id = ' . $from_forum_id; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); // anything left? if ($row) { // OK, lets go do some magick $sql = 'SELECT post_username, poster_id, post_subject, post_time FROM '. POSTS_TABLE . ' WHERE post_id = ' . (int) $row['max_post_id']; $result = $db->sql_query($sql); $last_post = $db->sql_fetchrow($result); $db->sql_freeresult($result); $from_forum_array['forum_last_user_id'] = (int) $last_post['poster_id']; $from_forum_array['forum_last_poster_name'] = (int) $last_post['post_username']; $from_forum_array['forum_last_post_title'] = (int) $last_post['post_subject']; $from_forum_array['forum_last_post_time'] = (int) $last_post['post_time']; } // update the old forum $db->sql_handle_data('UPDATE', FORUMS_TABLE, $from_forum_array, "forum_id = $from_forum_id"); // add the numbers to the new forum row $to_forum_array = array( 'forum_posts' => $forum_row[$to_forum_id]['forum_posts'] - $topic_id['forum_posts'], 'forum_moved_posts' => $forum_row[$to_forum_id]['forum_moved_posts'] - $topic_id['forum_moved_posts'], 'forum_deleted_posts' => $forum_row[$to_forum_id]['forum_deleted_posts'] - $topic_id['forum_deleted_posts'], 'forum_unapproved_posts'=> $forum_row[$to_forum_id]['forum_unapproved_posts'] - $topic_id['forum_unapproved_posts'], 'forum_topics' => $forum_row[$from_forum_id]['forum_topics'] + 1, 'forum_moved_topics' => $forum_row[$from_forum_id]['forum_moved_topics'] + (($topic_status & self::MOVED) ? 1 : 0), 'forum_deleted_topics' => $forum_row[$from_forum_id]['forum_deleted_topics'] + (($topic_status & self::DELETED) ? 1 : 0), 'forum_unapproved_topics' => $forum_row[$from_forum_id]['forum_unapproved_topics'] + (($topic_status & self::UNAPPROVED) ? 1 : 0), ); // the new topic is approved and is not soft deleted and is not moved, go and sync some status if ($topic_status === self::NORMAL) { // get the lastest "normal" post in the new forum, we _must_ update it $sql = 'SELECT MAX(post_id) as max_post_id FROM ' . POSTS_TABLE . ' WHERE post_status = ' . self::NORMAL . ' AND forum_id = ' . $to_forum_id; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); // anything left? if ($row) { // OK, lets go do some magick $sql = 'SELECT post_username, poster_id, post_subject, post_time FROM '. POSTS_TABLE . ' WHERE post_id = ' . (int) $row['max_post_id']; $result = $db->sql_query($sql); $last_post = $db->sql_fetchrow($result); $db->sql_freeresult($result); $from_forum_array['forum_last_user_id'] = (int) $last_post['poster_id']; $from_forum_array['forum_last_poster_name'] = (int) $last_post['post_username']; $from_forum_array['forum_last_post_title'] = (int) $last_post['post_subject']; $from_forum_array['forum_last_post_time'] = (int) $last_post['post_time']; } } // update the new forum $db->sql_handle_data('UPDATE', FORUMS_TABLE, $to_forum_array, "forum_id = $to_forum_id"); // in hundreds of fewer lines of code, we have now moved a topic // (this totally ignores the shadow topic thingy, I do not care for now) $db->sql_transaction('commit'); } } ?>