示例#1
0
function relatedUpdateTopics($topics, $dont_remove = false)
{
    global $context;
    // Make sure $topics is array
    if (!is_array($topics)) {
        $topics = array((int) $topics);
    }
    if (empty($topics)) {
        return;
    }
    if (!isset($context['relatedClass']) && !initRelated()) {
        return;
    }
    // First remove old related topics
    if (!$dont_remove) {
        relatedRemoveTopics($topics, true);
    }
    foreach ($context['relatedClass'] as $class) {
        $class->updateTopics($topics);
    }
}
示例#2
0
function removeTopics($topics, $decreasePostCount = true, $ignoreRecycling = false)
{
    global $sourcedir, $modSettings, $backend_subdir;
    // Nothing to do?
    if (empty($topics)) {
        return;
    } elseif (is_numeric($topics)) {
        $topics = array($topics);
    }
    // Decrease the post counts.
    if ($decreasePostCount) {
        $requestMembers = smf_db_query('
			SELECT m.id_member, COUNT(*) AS posts
			FROM {db_prefix}messages AS m
				INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board)
			WHERE m.id_topic IN ({array_int:topics})
				AND m.icon != {string:recycled}
				AND b.count_posts = {int:do_count_posts}
				AND m.approved = {int:is_approved}
			GROUP BY m.id_member', array('do_count_posts' => 0, 'recycled' => 'recycled', 'topics' => $topics, 'is_approved' => 1));
        if (mysql_num_rows($requestMembers) > 0) {
            while ($rowMembers = mysql_fetch_assoc($requestMembers)) {
                updateMemberData($rowMembers['id_member'], array('posts' => 'posts - ' . $rowMembers['posts']));
            }
        }
        mysql_free_result($requestMembers);
    }
    // Recycle topics that aren't in the recycle board...
    // Added by Related Topics
    if (isset($modSettings['have_related_topics']) && $modSettings['have_related_topics']) {
        require_once $sourcedir . '/lib/Subs-Related.php';
        relatedRemoveTopics($topics);
    }
    // Related Topics END
    if (!empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0 && !$ignoreRecycling) {
        $request = smf_db_query('
			SELECT id_topic, id_board, unapproved_posts, approved
			FROM {db_prefix}topics
			WHERE id_topic IN ({array_int:topics})
				AND id_board != {int:recycle_board}
			LIMIT ' . count($topics), array('recycle_board' => $modSettings['recycle_board'], 'topics' => $topics));
        if (mysql_num_rows($request) > 0) {
            // Get topics that will be recycled.
            $recycleTopics = array();
            while ($row = mysql_fetch_assoc($request)) {
                if (function_exists('apache_reset_timeout')) {
                    @apache_reset_timeout();
                }
                $recycleTopics[] = $row['id_topic'];
                // Set the id_previous_board for this topic - and make it not sticky.
                smf_db_query('
					UPDATE {db_prefix}topics
					SET id_previous_board = {int:id_previous_board}, is_sticky = {int:not_sticky}
					WHERE id_topic = {int:id_topic}', array('id_previous_board' => $row['id_board'], 'id_topic' => $row['id_topic'], 'not_sticky' => 0));
            }
            mysql_free_result($request);
            // Mark recycled topics as recycled.
            smf_db_query('
				UPDATE {db_prefix}messages
				SET icon = {string:recycled}
				WHERE id_topic IN ({array_int:recycle_topics})', array('recycle_topics' => $recycleTopics, 'recycled' => 'recycled'));
            // Move the topics to the recycle board.
            require_once $sourcedir . '/MoveTopic.php';
            moveTopics($recycleTopics, $modSettings['recycle_board']);
            // Close reports that are being recycled.
            require_once $sourcedir . '/ModerationCenter.php';
            smf_db_query('
				UPDATE {db_prefix}log_reported
				SET closed = {int:is_closed}
				WHERE id_topic IN ({array_int:recycle_topics})', array('recycle_topics' => $recycleTopics, 'is_closed' => 1));
            updateSettings(array('last_mod_report_action' => time()));
            recountOpenReports();
            // Topics that were recycled don't need to be deleted, so subtract them.
            $topics = array_diff($topics, $recycleTopics);
        } else {
            mysql_free_result($request);
        }
    }
    // Still topics left to delete?
    if (empty($topics)) {
        return;
    }
    $adjustBoards = array();
    // Find out how many posts we are deleting.
    $request = smf_db_query('
		SELECT id_board, approved, COUNT(*) AS num_topics, SUM(unapproved_posts) AS unapproved_posts,
			SUM(num_replies) AS num_replies
		FROM {db_prefix}topics
		WHERE id_topic IN ({array_int:topics})
		GROUP BY id_board, approved', array('topics' => $topics));
    while ($row = mysql_fetch_assoc($request)) {
        if (!isset($adjustBoards[$row['id_board']]['num_posts'])) {
            $adjustBoards[$row['id_board']] = array('num_posts' => 0, 'num_topics' => 0, 'unapproved_posts' => 0, 'unapproved_topics' => 0, 'id_board' => $row['id_board']);
        }
        // Posts = (num_replies + 1) for each approved topic.
        $adjustBoards[$row['id_board']]['num_posts'] += $row['num_replies'] + ($row['approved'] ? $row['num_topics'] : 0);
        $adjustBoards[$row['id_board']]['unapproved_posts'] += $row['unapproved_posts'];
        // Add the topics to the right type.
        if ($row['approved']) {
            $adjustBoards[$row['id_board']]['num_topics'] += $row['num_topics'];
        } else {
            $adjustBoards[$row['id_board']]['unapproved_topics'] += $row['num_topics'];
        }
    }
    mysql_free_result($request);
    // Decrease the posts/topics...
    foreach ($adjustBoards as $stats) {
        if (function_exists('apache_reset_timeout')) {
            @apache_reset_timeout();
        }
        smf_db_query('
			UPDATE {db_prefix}boards
			SET
				num_posts = CASE WHEN {int:num_posts} > num_posts THEN 0 ELSE num_posts - {int:num_posts} END,
				num_topics = CASE WHEN {int:num_topics} > num_topics THEN 0 ELSE num_topics - {int:num_topics} END,
				unapproved_posts = CASE WHEN {int:unapproved_posts} > unapproved_posts THEN 0 ELSE unapproved_posts - {int:unapproved_posts} END,
				unapproved_topics = CASE WHEN {int:unapproved_topics} > unapproved_topics THEN 0 ELSE unapproved_topics - {int:unapproved_topics} END
			WHERE id_board = {int:id_board}', array('id_board' => $stats['id_board'], 'num_posts' => $stats['num_posts'], 'num_topics' => $stats['num_topics'], 'unapproved_posts' => $stats['unapproved_posts'], 'unapproved_topics' => $stats['unapproved_topics']));
    }
    // Remove Polls.
    $request = smf_db_query('
		SELECT id_poll
		FROM {db_prefix}topics
		WHERE id_topic IN ({array_int:topics})
			AND id_poll > {int:no_poll}
		LIMIT ' . count($topics), array('no_poll' => 0, 'topics' => $topics));
    $polls = array();
    while ($row = mysql_fetch_assoc($request)) {
        $polls[] = $row['id_poll'];
    }
    mysql_free_result($request);
    if (!empty($polls)) {
        smf_db_query('
			DELETE FROM {db_prefix}polls
			WHERE id_poll IN ({array_int:polls})', array('polls' => $polls));
        smf_db_query('
			DELETE FROM {db_prefix}poll_choices
			WHERE id_poll IN ({array_int:polls})', array('polls' => $polls));
        smf_db_query('
			DELETE FROM {db_prefix}log_polls
			WHERE id_poll IN ({array_int:polls})', array('polls' => $polls));
    }
    // Get rid of the attachment, if it exists.
    require_once $sourcedir . '/lib/Subs-ManageAttachments.php';
    $attachmentQuery = array('attachment_type' => 0, 'id_topic' => $topics);
    removeAttachments($attachmentQuery, 'messages');
    // Delete possible search index entries.
    if (!empty($modSettings['search_custom_index_config'])) {
        $customIndexSettings = unserialize($modSettings['search_custom_index_config']);
        $words = array();
        $messages = array();
        $request = smf_db_query('
			SELECT id_msg, body
			FROM {db_prefix}messages
			WHERE id_topic IN ({array_int:topics})', array('topics' => $topics));
        while ($row = mysql_fetch_assoc($request)) {
            if (function_exists('apache_reset_timeout')) {
                @apache_reset_timeout();
            }
            $words = array_merge($words, text2words($row['body'], $customIndexSettings['bytes_per_word'], true));
            $messages[] = $row['id_msg'];
        }
        mysql_free_result($request);
        $words = array_unique($words);
        if (!empty($words) && !empty($messages)) {
            smf_db_query('
				DELETE FROM {db_prefix}log_search_words
				WHERE id_word IN ({array_int:word_list})
					AND id_msg IN ({array_int:message_list})', array('word_list' => $words, 'message_list' => $messages));
        }
    }
    require_once $sourcedir . '/lib/Subs-Activities.php';
    aStreamRemoveByTopic($topics);
    // Delete anything related to the topic.
    smf_db_query('
		DELETE m.*, l.*, c.*, mc.* FROM {db_prefix}messages AS m
		LEFT JOIN {db_prefix}likes AS l ON (l.id_msg = m.id_msg AND l.ctype = 1)
		LEFT JOIN {db_prefix}like_cache AS c ON (c.id_msg = m.id_msg AND c.ctype = 1)
		LEFT JOIN {db_prefix}messages_cache AS mc ON (mc.id_msg = m.id_msg)
		WHERE m.id_topic IN ({array_int:topics})', array('topics' => $topics));
    smf_db_query('
		DELETE FROM {db_prefix}calendar
		WHERE id_topic IN ({array_int:topics})', array('topics' => $topics));
    smf_db_query('
		DELETE FROM {db_prefix}log_topics
		WHERE id_topic IN ({array_int:topics})', array('topics' => $topics));
    smf_db_query('
		DELETE FROM {db_prefix}log_notify
		WHERE id_topic IN ({array_int:topics})', array('topics' => $topics));
    smf_db_query('
		DELETE FROM {db_prefix}topics
		WHERE id_topic IN ({array_int:topics})', array('topics' => $topics));
    smf_db_query('
		DELETE FROM {db_prefix}tags_log 
		WHERE id_topic IN ({array_int:topics})', array('topics' => $topics));
    smf_db_query('
		DELETE FROM {db_prefix}log_search_subjects
		WHERE id_topic IN ({array_int:topics})', array('topics' => $topics));
    // Update the totals...
    updateStats('message');
    updateStats('topic');
    updateSettings(array('calendar_updated' => time()));
    require_once $sourcedir . '/lib/Subs-Post.php';
    $updates = array();
    foreach ($adjustBoards as $stats) {
        $updates[] = $stats['id_board'];
    }
    updateLastMessages($updates);
}