Documentation

RepairBoards
in package
implements ActionInterface uses ActionTrait

This is here for the "repair any errors" feature in the admin center.

Table of Contents

Interfaces

ActionInterface
Interface for all action classes.

Properties

$errorTests  : array<string|int, mixed>
$loops  : int
$salvage_board  : int
$salvage_category  : int
$salvage_created  : bool
$obj  : static

Methods

call()  : void
Convenience method to load() and execute() an instance of this class.
canBeLogged()  : bool
Determines whether this action can be logged in the online log.
canShowDebuggingInfo()  : bool
Determines whether debugging info should be shown.
canShowInMaintenanceMode()  : bool
Determines whether this action allows access in maintenance mode.
execute()  : void
Does the job.
getOutputType()  : OutputTypeInterface
Gets the output type for this action.
isAgreementAction()  : bool
Determines whether this action can be accessed without accepting the registration agreement and privacy policy.
isRestrictedGuestAccessAllowed()  : bool
Determines whether this action allows access if guest access is restricted.
isSimpleAction()  : bool
Determines whether this is a simple action.
load()  : static
Static wrapper for constructor.
__construct()  : mixed
Constructor. Protected to force instantiation via self::load().
createSalvageArea()  : void
Create a salvage area for repair purposes, if one doesn't already exist.
findForumErrors()  : array<string|int, mixed>
Checks for errors in steps, until 5 seconds have passed.
fixCommentMissingReport()  : void
Callback to remove comments made on non-existent reports.
fixGroupRequestMissingGroup()  : void
Callback to remove requests to join non-existent groups.
fixGroupRequestMissingMember()  : void
Callback to remove requests to join a group made by non-existent members.
fixMissingBoards()  : void
Callback to give a home to topics that have no board.
fixMissingCachedSubject()  : void
Callback to fix missing log_search_subjects entries for a topic.
fixMissingCaledarTopics()  : void
Callback to remove broken links to topics from calendar events.
fixMissingCategories()  : void
Callback to give a home to boards that have no category.
fixMissingLogBoards()  : void
Callback to remove log_boards entries for non-existent boards.
fixMissingLogBoardsMembers()  : void
Callback to remove log_boards entries for non-existent members.
fixMissingLogMarkRead()  : void
Callback to remove log_mark_read entries for non-existent boards.
fixMissingLogMarkReadMembers()  : void
Callback to remove log_mark_read entries for non-existent members.
fixMissingLogPollVote()  : void
Callback to remove poll votes made in non-existent polls.
fixMissingLogTopics()  : void
Callback to remove log_topics entries for non-existent topics.
fixMissingLogTopicsMembers()  : void
Callback to remove log_topics entries for non-existent members.
fixMissingMemberVote()  : void
Callback to remove poll votes made by non-existent members.
fixMissingMessages()  : void
Callback to remove all topics that have zero messages in the messages table.
fixMissingNotifyMembers()  : void
Callback to remove log_notify entries for non-existent members.
fixMissingParents()  : void
Callback to let our salvage board adopt orphaned child boards.
fixMissingPMs()  : void
Callback to remove non-existent personal messages from the recipients' inboxes.
fixMissingPollOptions()  : void
Callback to fix missing poll options.
fixMissingPolls()  : void
Callback to remove non-existent polls from topics.
fixMissingPollTopics()  : void
Callback to fix polls that have no topic.
fixMissingPosters()  : void
Callback to give an author to messages that don't have one.
fixMissingRecipients()  : void
Callback to remove non-existent recipients from personal messages.
fixMissingSenders()  : void
Callback to fix the assigned authorship of PMs from non-existent senders.
fixMissingTopicForCache()  : void
Callback to remove log_search_subjects entries for non-existent topics.
fixMissingTopics()  : void
Callback to fix missing topics.
fixReportMissingComments()  : void
Callback to remove non-existent comments from reports.
fixTopicStats()  : bool
Callback to fix missing first and last message IDs for a topic.
fixTopicStats2()  : bool
Callback to fix the recorded number of replies to a topic.
fixTopicStats3()  : void
Callback to fix the recorded number of unapproved replies to a topic.
missingCachedSubjectMessage()  : bool
Callback to get a message about missing log_search_subjects entries for a topic.
pauseRepairProcess()  : void
Shows the not_done template to avoid CGI timeouts and similar.
topicStatsMessage()  : bool
Callback to get a message about missing first and last message IDs for a topic.
topicStatsMessage2()  : bool
Callback to get a message about an incorrect record of the number of replies to a topic.

Properties

$errorTests

public array<string|int, mixed> $errorTests = [ // Make a last-ditch-effort check to get rid of topics with zeros.. 'zero_topics' => ['check_query' => ' SELECT COUNT(*) FROM {db_prefix}topics WHERE id_topic = 0', 'check_type' => 'count', 'fix_it_query' => ' UPDATE {db_prefix}topics SET id_topic = NULL WHERE id_topic = 0', 'message' => 'repair_zero_ids'], // ... and same with messages. 'zero_messages' => ['check_query' => ' SELECT COUNT(*) FROM {db_prefix}messages WHERE id_msg = 0', 'check_type' => 'count', 'fix_it_query' => ' UPDATE {db_prefix}messages SET id_msg = NULL WHERE id_msg = 0', 'message' => 'repair_zero_ids'], // Find messages that don't have existing topics. 'missing_topics' => ['substeps' => ['step_size' => 1000, 'step_max' => ' SELECT MAX(id_topic) FROM {db_prefix}messages'], 'check_query' => ' SELECT m.id_topic, m.id_msg FROM {db_prefix}messages AS m LEFT JOIN {db_prefix}topics AS t ON (t.id_topic = m.id_topic) WHERE m.id_topic BETWEEN {STEP_LOW} AND {STEP_HIGH} AND t.id_topic IS NULL ORDER BY m.id_topic, m.id_msg', 'fix_query' => ' SELECT m.id_board, m.id_topic, MIN(m.id_msg) AS myid_first_msg, MAX(m.id_msg) AS myid_last_msg, COUNT(*) - 1 AS my_num_replies FROM {db_prefix}messages AS m LEFT JOIN {db_prefix}topics AS t ON (t.id_topic = m.id_topic) WHERE t.id_topic IS NULL GROUP BY m.id_topic, m.id_board', 'fix_processing' => 'fixMissingTopics', 'force_fix' => ['stats_topics'], 'messages' => ['repair_missing_topics', 'id_msg', 'id_topic']], // Find topics with no messages. 'missing_messages' => [ 'substeps' => ['step_size' => 1000, 'step_max' => ' SELECT MAX(id_topic) FROM {db_prefix}topics'], 'check_query' => ' SELECT t.id_topic, COUNT(m.id_msg) AS num_msg FROM {db_prefix}topics AS t LEFT JOIN {db_prefix}messages AS m ON (m.id_topic = t.id_topic) WHERE t.id_topic BETWEEN {STEP_LOW} AND {STEP_HIGH} GROUP BY t.id_topic HAVING COUNT(m.id_msg) = 0', // Remove all topics that have zero messages in the messages table. 'fix_collect' => ['index' => 'id_topic', 'process' => 'fixMissingMessages'], 'messages' => ['repair_missing_messages', 'id_topic'], ], 'poll_options_missing_poll' => ['substeps' => ['step_size' => 500, 'step_max' => ' SELECT MAX(id_poll) FROM {db_prefix}poll_choices'], 'check_query' => ' SELECT o.id_poll, count(*) as amount, t.id_topic, t.id_board, t.id_member_started AS id_poster, m.member_name AS poster_name FROM {db_prefix}poll_choices AS o LEFT JOIN {db_prefix}polls AS p ON (p.id_poll = o.id_poll) LEFT JOIN {db_prefix}topics AS t ON (t.id_poll = o.id_poll) LEFT JOIN {db_prefix}members AS m ON (m.id_member = t.id_member_started) WHERE o.id_poll BETWEEN {STEP_LOW} AND {STEP_HIGH} AND p.id_poll IS NULL GROUP BY o.id_poll, t.id_topic, t.id_board, t.id_member_started, m.member_name', 'fix_processing' => 'fixMissingPollOptions', 'force_fix' => ['stats_topics'], 'messages' => ['repair_poll_options_missing_poll', 'id_poll', 'amount']], 'polls_missing_topics' => ['substeps' => ['step_size' => 500, 'step_max' => ' SELECT MAX(id_poll) FROM {db_prefix}polls'], 'check_query' => ' SELECT p.id_poll, p.id_member, p.poster_name, t.id_board FROM {db_prefix}polls AS p LEFT JOIN {db_prefix}topics AS t ON (t.id_poll = p.id_poll) WHERE p.id_poll BETWEEN {STEP_LOW} AND {STEP_HIGH} AND t.id_poll IS NULL', 'fix_processing' => 'fixMissingPollTopics', 'force_fix' => ['stats_topics'], 'messages' => ['repair_polls_missing_topics', 'id_poll', 'id_topic']], 'stats_topics' => ['substeps' => ['step_size' => 200, 'step_max' => ' SELECT MAX(id_topic) FROM {db_prefix}topics'], 'check_query' => ' SELECT t.id_topic, t.id_first_msg, t.id_last_msg, CASE WHEN MIN(ma.id_msg) > 0 THEN CASE WHEN MIN(mu.id_msg) > 0 THEN CASE WHEN MIN(mu.id_msg) < MIN(ma.id_msg) THEN MIN(mu.id_msg) ELSE MIN(ma.id_msg) END ELSE MIN(ma.id_msg) END ELSE MIN(mu.id_msg) END AS myid_first_msg, CASE WHEN MAX(ma.id_msg) > 0 THEN MAX(ma.id_msg) ELSE MIN(mu.id_msg) END AS myid_last_msg, t.approved, mf.approved, mf.approved AS firstmsg_approved FROM {db_prefix}topics AS t LEFT JOIN {db_prefix}messages AS ma ON (ma.id_topic = t.id_topic AND ma.approved = 1) LEFT JOIN {db_prefix}messages AS mu ON (mu.id_topic = t.id_topic AND mu.approved = 0) LEFT JOIN {db_prefix}messages AS mf ON (mf.id_msg = t.id_first_msg) WHERE t.id_topic BETWEEN {STEP_LOW} AND {STEP_HIGH} GROUP BY t.id_topic, t.id_first_msg, t.id_last_msg, t.approved, mf.approved ORDER BY t.id_topic', 'fix_processing' => 'fixTopicStats', 'message_function' => 'topicStatsMessage'], // Find topics with incorrect num_replies. 'stats_topics2' => ['substeps' => ['step_size' => 300, 'step_max' => ' SELECT MAX(id_topic) FROM {db_prefix}topics'], 'check_query' => ' SELECT t.id_topic, t.num_replies, mf.approved, CASE WHEN COUNT(ma.id_msg) > 0 THEN CASE WHEN mf.approved > 0 THEN COUNT(ma.id_msg) - 1 ELSE COUNT(ma.id_msg) END ELSE 0 END AS my_num_replies FROM {db_prefix}topics AS t LEFT JOIN {db_prefix}messages AS ma ON (ma.id_topic = t.id_topic AND ma.approved = 1) LEFT JOIN {db_prefix}messages AS mf ON (mf.id_msg = t.id_first_msg) WHERE t.id_topic BETWEEN {STEP_LOW} AND {STEP_HIGH} GROUP BY t.id_topic, t.num_replies, mf.approved ORDER BY t.id_topic', 'fix_processing' => 'fixTopicStats2', 'message_function' => 'topicStatsMessage2'], // Find topics with incorrect unapproved_posts. 'stats_topics3' => ['substeps' => ['step_size' => 1000, 'step_max' => ' SELECT MAX(id_topic) FROM {db_prefix}topics'], 'check_query' => ' SELECT t.id_topic, t.unapproved_posts, COUNT(mu.id_msg) AS my_unapproved_posts FROM {db_prefix}topics AS t LEFT JOIN {db_prefix}messages AS mu ON (mu.id_topic = t.id_topic AND mu.approved = 0) WHERE t.id_topic BETWEEN {STEP_LOW} AND {STEP_HIGH} GROUP BY t.id_topic, t.unapproved_posts HAVING unapproved_posts != COUNT(mu.id_msg) ORDER BY t.id_topic', 'fix_processing' => 'fixTopicStats3', 'messages' => ['repair_topic_wrong_unapproved_number', 'id_topic', 'unapproved_posts']], // Find topics with nonexistent boards. 'missing_boards' => ['substeps' => ['step_size' => 1000, 'step_max' => ' SELECT MAX(id_topic) FROM {db_prefix}topics'], 'check_query' => ' SELECT t.id_topic, t.id_board FROM {db_prefix}topics AS t LEFT JOIN {db_prefix}boards AS b ON (b.id_board = t.id_board) WHERE b.id_board IS NULL AND t.id_topic BETWEEN {STEP_LOW} AND {STEP_HIGH} ORDER BY t.id_board, t.id_topic', 'fix_query' => ' SELECT t.id_board, COUNT(*) AS my_num_topics, COUNT(m.id_msg) AS my_num_posts FROM {db_prefix}topics AS t LEFT JOIN {db_prefix}boards AS b ON (b.id_board = t.id_board) LEFT JOIN {db_prefix}messages AS m ON (m.id_topic = t.id_topic) WHERE b.id_board IS NULL AND t.id_topic BETWEEN {STEP_LOW} AND {STEP_HIGH} GROUP BY t.id_board', 'fix_processing' => 'fixMissingBoards', 'messages' => ['repair_missing_boards', 'id_topic', 'id_board']], // Find boards with nonexistent categories. 'missing_categories' => ['check_query' => ' SELECT b.id_board, b.id_cat FROM {db_prefix}boards AS b LEFT JOIN {db_prefix}categories AS c ON (c.id_cat = b.id_cat) WHERE c.id_cat IS NULL ORDER BY b.id_cat, b.id_board', 'fix_collect' => ['index' => 'id_cat', 'process' => 'fixMissingCategories'], 'messages' => ['repair_missing_categories', 'id_board', 'id_cat']], // Find messages with nonexistent members. 'missing_posters' => [ 'substeps' => ['step_size' => 2000, 'step_max' => ' SELECT MAX(id_msg) FROM {db_prefix}messages'], 'check_query' => ' SELECT m.id_msg, m.id_member FROM {db_prefix}messages AS m LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member) WHERE mem.id_member IS NULL AND m.id_member != 0 AND m.id_msg BETWEEN {STEP_LOW} AND {STEP_HIGH} ORDER BY m.id_msg', // Last step-make sure all non-guest posters still exist. 'fix_collect' => ['index' => 'id_msg', 'process' => 'fixMissingPosters'], 'messages' => ['repair_missing_posters', 'id_msg', 'id_member'], ], // Find boards with nonexistent parents. 'missing_parents' => ['check_query' => ' SELECT b.id_board, b.id_parent FROM {db_prefix}boards AS b LEFT JOIN {db_prefix}boards AS p ON (p.id_board = b.id_parent) WHERE b.id_parent != 0 AND (p.id_board IS NULL OR p.id_board = b.id_board) ORDER BY b.id_parent, b.id_board', 'fix_collect' => ['index' => 'id_parent', 'process' => 'fixMissingParents'], 'messages' => ['repair_missing_parents', 'id_board', 'id_parent']], 'missing_polls' => ['substeps' => ['step_size' => 500, 'step_max' => ' SELECT MAX(id_poll) FROM {db_prefix}topics'], 'check_query' => ' SELECT t.id_poll, t.id_topic FROM {db_prefix}topics AS t LEFT JOIN {db_prefix}polls AS p ON (p.id_poll = t.id_poll) WHERE t.id_poll != 0 AND t.id_poll BETWEEN {STEP_LOW} AND {STEP_HIGH} AND p.id_poll IS NULL', 'fix_collect' => ['index' => 'id_poll', 'process' => 'fixMissingPolls'], 'messages' => ['repair_missing_polls', 'id_topic', 'id_poll']], 'missing_calendar_topics' => ['substeps' => ['step_size' => 1000, 'step_max' => ' SELECT MAX(id_topic) FROM {db_prefix}calendar'], 'check_query' => ' SELECT cal.id_topic, cal.id_event FROM {db_prefix}calendar AS cal LEFT JOIN {db_prefix}topics AS t ON (t.id_topic = cal.id_topic) WHERE cal.id_topic != 0 AND cal.id_topic BETWEEN {STEP_LOW} AND {STEP_HIGH} AND t.id_topic IS NULL ORDER BY cal.id_topic', 'fix_collect' => ['index' => 'id_topic', 'process' => 'fixMissingCaledarTopics'], 'messages' => ['repair_missing_calendar_topics', 'id_event', 'id_topic']], 'missing_log_topics' => ['substeps' => ['step_size' => 150, 'step_max' => ' SELECT MAX(id_member) FROM {db_prefix}log_topics'], 'check_query' => ' SELECT lt.id_topic FROM {db_prefix}log_topics AS lt LEFT JOIN {db_prefix}topics AS t ON (t.id_topic = lt.id_topic) WHERE t.id_topic IS NULL AND lt.id_member BETWEEN {STEP_LOW} AND {STEP_HIGH}', 'fix_collect' => ['index' => 'id_topic', 'process' => 'fixMissingLogTopics'], 'messages' => ['repair_missing_log_topics', 'id_topic']], 'missing_log_topics_members' => ['substeps' => ['step_size' => 150, 'step_max' => ' SELECT MAX(id_member) FROM {db_prefix}log_topics'], 'check_query' => ' SELECT lt.id_member FROM {db_prefix}log_topics AS lt LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lt.id_member) WHERE mem.id_member IS NULL AND lt.id_member BETWEEN {STEP_LOW} AND {STEP_HIGH} GROUP BY lt.id_member', 'fix_collect' => ['index' => 'id_member', 'process' => 'fixMissingLogTopicsMembers'], 'messages' => ['repair_missing_log_topics_members', 'id_member']], 'missing_log_boards' => ['substeps' => ['step_size' => 500, 'step_max' => ' SELECT MAX(id_member) FROM {db_prefix}log_boards'], 'check_query' => ' SELECT lb.id_board FROM {db_prefix}log_boards AS lb LEFT JOIN {db_prefix}boards AS b ON (b.id_board = lb.id_board) WHERE b.id_board IS NULL AND lb.id_member BETWEEN {STEP_LOW} AND {STEP_HIGH} GROUP BY lb.id_board', 'fix_collect' => ['index' => 'id_board', 'process' => 'fixMissingLogBoards'], 'messages' => ['repair_missing_log_boards', 'id_board']], 'missing_log_boards_members' => ['substeps' => ['step_size' => 500, 'step_max' => ' SELECT MAX(id_member) FROM {db_prefix}log_boards'], 'check_query' => ' SELECT lb.id_member FROM {db_prefix}log_boards AS lb LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lb.id_member) WHERE mem.id_member IS NULL AND lb.id_member BETWEEN {STEP_LOW} AND {STEP_HIGH} GROUP BY lb.id_member', 'fix_collect' => ['index' => 'id_member', 'process' => 'fixMissingLogBoardsMembers'], 'messages' => ['repair_missing_log_boards_members', 'id_member']], 'missing_log_mark_read' => ['substeps' => ['step_size' => 500, 'step_max' => ' SELECT MAX(id_member) FROM {db_prefix}log_mark_read'], 'check_query' => ' SELECT lmr.id_board FROM {db_prefix}log_mark_read AS lmr LEFT JOIN {db_prefix}boards AS b ON (b.id_board = lmr.id_board) WHERE b.id_board IS NULL AND lmr.id_member BETWEEN {STEP_LOW} AND {STEP_HIGH} GROUP BY lmr.id_board', 'fix_collect' => ['index' => 'id_board', 'process' => 'fixMissingLogMarkRead'], 'messages' => ['repair_missing_log_mark_read', 'id_board']], 'missing_log_mark_read_members' => ['substeps' => ['step_size' => 500, 'step_max' => ' SELECT MAX(id_member) FROM {db_prefix}log_mark_read'], 'check_query' => ' SELECT lmr.id_member FROM {db_prefix}log_mark_read AS lmr LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lmr.id_member) WHERE mem.id_member IS NULL AND lmr.id_member BETWEEN {STEP_LOW} AND {STEP_HIGH} GROUP BY lmr.id_member', 'fix_collect' => ['index' => 'id_member', 'process' => 'fixMissingLogMarkReadMembers'], 'messages' => ['repair_missing_log_mark_read_members', 'id_member']], 'missing_pms' => ['substeps' => ['step_size' => 500, 'step_max' => ' SELECT MAX(id_pm) FROM {db_prefix}pm_recipients'], 'check_query' => ' SELECT pmr.id_pm FROM {db_prefix}pm_recipients AS pmr LEFT JOIN {db_prefix}personal_messages AS pm ON (pm.id_pm = pmr.id_pm) WHERE pm.id_pm IS NULL AND pmr.id_pm BETWEEN {STEP_LOW} AND {STEP_HIGH} GROUP BY pmr.id_pm', 'fix_collect' => ['index' => 'id_pm', 'process' => 'fixMissingPMs'], 'messages' => ['repair_missing_pms', 'id_pm']], 'missing_recipients' => ['substeps' => ['step_size' => 500, 'step_max' => ' SELECT MAX(id_member) FROM {db_prefix}pm_recipients'], 'check_query' => ' SELECT pmr.id_member FROM {db_prefix}pm_recipients AS pmr LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = pmr.id_member) WHERE pmr.id_member != 0 AND pmr.id_member BETWEEN {STEP_LOW} AND {STEP_HIGH} AND mem.id_member IS NULL GROUP BY pmr.id_member', 'fix_collect' => ['index' => 'id_member', 'process' => 'fixMissingRecipients'], 'messages' => ['repair_missing_recipients', 'id_member']], 'missing_senders' => ['substeps' => ['step_size' => 500, 'step_max' => ' SELECT MAX(id_pm) FROM {db_prefix}personal_messages'], 'check_query' => ' SELECT pm.id_pm, pm.id_member_from FROM {db_prefix}personal_messages AS pm LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = pm.id_member_from) WHERE pm.id_member_from != 0 AND pm.id_pm BETWEEN {STEP_LOW} AND {STEP_HIGH} AND mem.id_member IS NULL', 'fix_collect' => ['index' => 'id_pm', 'process' => 'fixMissingSenders'], 'messages' => ['repair_missing_senders', 'id_pm', 'id_member_from']], 'missing_notify_members' => ['substeps' => ['step_size' => 500, 'step_max' => ' SELECT MAX(id_member) FROM {db_prefix}log_notify'], 'check_query' => ' SELECT ln.id_member FROM {db_prefix}log_notify AS ln LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = ln.id_member) WHERE ln.id_member BETWEEN {STEP_LOW} AND {STEP_HIGH} AND mem.id_member IS NULL GROUP BY ln.id_member', 'fix_collect' => ['index' => 'id_member', 'process' => 'fixMissingNotifyMembers'], 'messages' => ['repair_missing_notify_members', 'id_member']], 'missing_cached_subject' => ['substeps' => ['step_size' => 100, 'step_max' => ' SELECT MAX(id_topic) FROM {db_prefix}topics'], 'check_query' => ' SELECT t.id_topic, fm.subject FROM {db_prefix}topics AS t INNER JOIN {db_prefix}messages AS fm ON (fm.id_msg = t.id_first_msg) LEFT JOIN {db_prefix}log_search_subjects AS lss ON (lss.id_topic = t.id_topic) WHERE t.id_topic BETWEEN {STEP_LOW} AND {STEP_HIGH} AND lss.id_topic IS NULL', 'fix_full_processing' => 'fixMissingCachedSubject', 'message_function' => 'missingCachedSubjectMessage'], 'missing_topic_for_cache' => ['substeps' => ['step_size' => 50, 'step_max' => ' SELECT MAX(id_topic) FROM {db_prefix}log_search_subjects'], 'check_query' => ' SELECT lss.id_topic, lss.word FROM {db_prefix}log_search_subjects AS lss LEFT JOIN {db_prefix}topics AS t ON (t.id_topic = lss.id_topic) WHERE lss.id_topic BETWEEN {STEP_LOW} AND {STEP_HIGH} AND t.id_topic IS NULL', 'fix_collect' => ['index' => 'id_topic', 'process' => 'fixMissingTopicForCache'], 'messages' => ['repair_missing_topic_for_cache', 'word']], 'missing_member_vote' => ['substeps' => ['step_size' => 500, 'step_max' => ' SELECT MAX(id_member) FROM {db_prefix}log_polls'], 'check_query' => ' SELECT lp.id_poll, lp.id_member FROM {db_prefix}log_polls AS lp LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lp.id_member) WHERE lp.id_member BETWEEN {STEP_LOW} AND {STEP_HIGH} AND lp.id_member > 0 AND mem.id_member IS NULL', 'fix_collect' => ['index' => 'id_member', 'process' => 'fixMissingMemberVote'], 'messages' => ['repair_missing_log_poll_member', 'id_poll', 'id_member']], 'missing_log_poll_vote' => ['substeps' => ['step_size' => 500, 'step_max' => ' SELECT MAX(id_poll) FROM {db_prefix}log_polls'], 'check_query' => ' SELECT lp.id_poll, lp.id_member FROM {db_prefix}log_polls AS lp LEFT JOIN {db_prefix}polls AS p ON (p.id_poll = lp.id_poll) WHERE lp.id_poll BETWEEN {STEP_LOW} AND {STEP_HIGH} AND p.id_poll IS NULL', 'fix_collect' => ['index' => 'id_poll', 'process' => 'fixMissingLogPollVote'], 'messages' => ['repair_missing_log_poll_vote', 'id_member', 'id_poll']], 'report_missing_comments' => ['substeps' => ['step_size' => 500, 'step_max' => ' SELECT MAX(id_report) FROM {db_prefix}log_reported'], 'check_query' => ' SELECT lr.id_report, lr.subject FROM {db_prefix}log_reported AS lr LEFT JOIN {db_prefix}log_reported_comments AS lrc ON (lrc.id_report = lr.id_report) WHERE lr.id_report BETWEEN {STEP_LOW} AND {STEP_HIGH} AND lrc.id_report IS NULL', 'fix_collect' => ['index' => 'id_report', 'process' => 'fixReportMissingComments'], 'messages' => ['repair_report_missing_comments', 'id_report', 'subject']], 'comments_missing_report' => ['substeps' => ['step_size' => 200, 'step_max' => ' SELECT MAX(id_report) FROM {db_prefix}log_reported_comments'], 'check_query' => ' SELECT lrc.id_report, lrc.membername FROM {db_prefix}log_reported_comments AS lrc LEFT JOIN {db_prefix}log_reported AS lr ON (lr.id_report = lrc.id_report) WHERE lrc.id_report BETWEEN {STEP_LOW} AND {STEP_HIGH} AND lr.id_report IS NULL', 'fix_collect' => ['index' => 'id_report', 'process' => 'fixCommentMissingReport'], 'messages' => ['repair_comments_missing_report', 'id_report', 'membername']], 'group_request_missing_member' => ['substeps' => ['step_size' => 200, 'step_max' => ' SELECT MAX(id_member) FROM {db_prefix}log_group_requests'], 'check_query' => ' SELECT lgr.id_member FROM {db_prefix}log_group_requests AS lgr LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lgr.id_member) WHERE lgr.id_member BETWEEN {STEP_LOW} AND {STEP_HIGH} AND mem.id_member IS NULL GROUP BY lgr.id_member', 'fix_collect' => ['index' => 'id_member', 'process' => 'fixGroupRequestMissingMember'], 'messages' => ['repair_group_request_missing_member', 'id_member']], 'group_request_missing_group' => ['substeps' => ['step_size' => 200, 'step_max' => ' SELECT MAX(id_group) FROM {db_prefix}log_group_requests'], 'check_query' => ' SELECT lgr.id_group FROM {db_prefix}log_group_requests AS lgr LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = lgr.id_group) WHERE lgr.id_group BETWEEN {STEP_LOW} AND {STEP_HIGH} AND mg.id_group IS NULL GROUP BY lgr.id_group', 'fix_collect' => ['index' => 'id_group', 'process' => 'fixGroupRequestMissingGroup'], 'messages' => ['repair_group_request_missing_group', 'id_group']], ]

All the tests we might want to do.

This array is defined like so:

string check_query: Query to be executed when testing if errors exist.

string check_type: Defines how it knows if a problem was found. If set to count looks for the first variable from check_query being > 0. Anything else it looks for some results. If not set assumes you want results.

string fix_it_query: When doing fixes if an error was detected this query is executed to "fix" it.

string fix_query: The query to execute to get data when doing a fix. If not set check_query is used again.

array fix_collect: This array is used if the fix is basically gathering all broken ids and then doing something with them.

  • string index: The value returned from the main query and passed to the processing function.
  • string process: Name of a function that will be passed an array of ids to execute the fix on.

string fix_processing: Name of a function called for each row returned from fix_query to execute whatever fixes are required.

string fix_full_processing: As above but does the while loop and everything itself, except the freeing.

array force_fix: If this is set then the error types included within this array will also be assumed broken. These are only processed if they occur after the primary error in the array.

In all cases where a function name is provided, the findForumErrors() method will first look for a method of this class with that name. If no such method exists, it will ask Utils::getCallable() to figure out what to call.

MOD AUTHORS: If you want to add tests to this array so that SMF can fix data for your mod, use the integrate_repair_boards hook.

$loops

public int $loops = 0

Tracks how many loops we have done for pauseRepairProcess().

$salvage_created

public bool $salvage_created = false

Whether the salvage area has been created yet.

$obj

protected static static $obj

An instance of this class. This is used by the load() method to prevent multiple instantiations.

Methods

call()

Convenience method to load() and execute() an instance of this class.

public static call() : void

canBeLogged()

Determines whether this action can be logged in the online log.

public canBeLogged() : bool
Return values
bool

canShowDebuggingInfo()

Determines whether debugging info should be shown.

public canShowDebuggingInfo() : bool
Return values
bool

canShowInMaintenanceMode()

Determines whether this action allows access in maintenance mode.

public canShowInMaintenanceMode() : bool
Return values
bool

True if access is allowed, false otherwise.

isAgreementAction()

Determines whether this action can be accessed without accepting the registration agreement and privacy policy.

public isAgreementAction() : bool
Return values
bool

isRestrictedGuestAccessAllowed()

Determines whether this action allows access if guest access is restricted.

public isRestrictedGuestAccessAllowed() : bool
Return values
bool

True if access is allowed, false otherwise.

isSimpleAction()

Determines whether this is a simple action.

public isSimpleAction() : bool
Return values
bool

load()

Static wrapper for constructor.

public static load() : static
Return values
static

An instance of this class.

__construct()

Constructor. Protected to force instantiation via self::load().

protected __construct() : mixed

createSalvageArea()

Create a salvage area for repair purposes, if one doesn't already exist.

protected createSalvageArea() : void

Uses the forum's default language, and checks based on that name.

findForumErrors()

Checks for errors in steps, until 5 seconds have passed.

protected findForumErrors([bool $do_fix = false ]) : array<string|int, mixed>

It keeps track of the errors it did find, so that the actual repair won't have to recheck everything.

Parameters
$do_fix : bool = false

Whether to fix the errors or just return the info.

Return values
array<string|int, mixed>

The errors found.

fixCommentMissingReport()

Callback to remove comments made on non-existent reports.

protected fixCommentMissingReport(array<string|int, mixed> $reports) : void
Parameters
$reports : array<string|int, mixed>

An array of report ids.

fixGroupRequestMissingGroup()

Callback to remove requests to join non-existent groups.

protected fixGroupRequestMissingGroup(array<string|int, mixed> $groups) : void
Parameters
$groups : array<string|int, mixed>

An array of group ids.

fixGroupRequestMissingMember()

Callback to remove requests to join a group made by non-existent members.

protected fixGroupRequestMissingMember(array<string|int, mixed> $members) : void
Parameters
$members : array<string|int, mixed>

An array of member ids.

fixMissingBoards()

Callback to give a home to topics that have no board.

protected fixMissingBoards(array<string|int, mixed> $row) : void
Parameters
$row : array<string|int, mixed>

Topic data.

fixMissingCachedSubject()

Callback to fix missing log_search_subjects entries for a topic.

protected fixMissingCachedSubject(mixed $result) : void
Parameters
$result : mixed

Search result

fixMissingCaledarTopics()

Callback to remove broken links to topics from calendar events.

protected fixMissingCaledarTopics(array<string|int, mixed> $events) : void
Parameters
$events : array<string|int, mixed>

An array of topic ids.

fixMissingCategories()

Callback to give a home to boards that have no category.

protected fixMissingCategories(array<string|int, mixed> $cats) : void
Parameters
$cats : array<string|int, mixed>

An array of missing Categories.

fixMissingLogBoards()

Callback to remove log_boards entries for non-existent boards.

protected fixMissingLogBoards(array<string|int, mixed> $boards) : void
Parameters
$boards : array<string|int, mixed>

An array of board ids.

fixMissingLogBoardsMembers()

Callback to remove log_boards entries for non-existent members.

protected fixMissingLogBoardsMembers(array<string|int, mixed> $members) : void
Parameters
$members : array<string|int, mixed>

An array of member ids.

fixMissingLogMarkRead()

Callback to remove log_mark_read entries for non-existent boards.

protected fixMissingLogMarkRead(array<string|int, mixed> $boards) : void
Parameters
$boards : array<string|int, mixed>

An array of board ids.

fixMissingLogMarkReadMembers()

Callback to remove log_mark_read entries for non-existent members.

protected fixMissingLogMarkReadMembers(array<string|int, mixed> $members) : void
Parameters
$members : array<string|int, mixed>

An array of member ids.

fixMissingLogPollVote()

Callback to remove poll votes made in non-existent polls.

protected fixMissingLogPollVote(array<string|int, mixed> $polls) : void
Parameters
$polls : array<string|int, mixed>

An array of poll ids.

fixMissingLogTopics()

Callback to remove log_topics entries for non-existent topics.

protected fixMissingLogTopics(array<string|int, mixed> $topics) : void
Parameters
$topics : array<string|int, mixed>

An array of topic ids.

fixMissingLogTopicsMembers()

Callback to remove log_topics entries for non-existent members.

protected fixMissingLogTopicsMembers(array<string|int, mixed> $members) : void
Parameters
$members : array<string|int, mixed>

An array of member ids.

fixMissingMemberVote()

Callback to remove poll votes made by non-existent members.

protected fixMissingMemberVote(array<string|int, mixed> $members) : void
Parameters
$members : array<string|int, mixed>

An array of member ids.

fixMissingMessages()

Callback to remove all topics that have zero messages in the messages table.

protected fixMissingMessages(array<string|int, mixed> $topics) : void
Parameters
$topics : array<string|int, mixed>

An array of topic ids.

fixMissingNotifyMembers()

Callback to remove log_notify entries for non-existent members.

protected fixMissingNotifyMembers(array<string|int, mixed> $members) : void
Parameters
$members : array<string|int, mixed>

An array of member ids.

fixMissingParents()

Callback to let our salvage board adopt orphaned child boards.

protected fixMissingParents(array<string|int, mixed> $parents) : void
Parameters
$parents : array<string|int, mixed>

An array of board ids.

fixMissingPMs()

Callback to remove non-existent personal messages from the recipients' inboxes.

protected fixMissingPMs(array<string|int, mixed> $pms) : void
Parameters
$pms : array<string|int, mixed>

An array of personal message ids.

fixMissingPollOptions()

Callback to fix missing poll options.

protected fixMissingPollOptions(array<string|int, mixed> $row) : void
Parameters
$row : array<string|int, mixed>

Message with missing topic.

fixMissingPolls()

Callback to remove non-existent polls from topics.

protected fixMissingPolls(array<string|int, mixed> $polls) : void
Parameters
$polls : array<string|int, mixed>

An array of poll ids.

fixMissingPollTopics()

Callback to fix polls that have no topic.

protected fixMissingPollTopics(array<string|int, mixed> $row) : void
Parameters
$row : array<string|int, mixed>

Message with missing topic.

fixMissingPosters()

Callback to give an author to messages that don't have one.

protected fixMissingPosters(array<string|int, mixed> $msgs) : void
Parameters
$msgs : array<string|int, mixed>

An array of messages.

fixMissingRecipients()

Callback to remove non-existent recipients from personal messages.

protected fixMissingRecipients(array<string|int, mixed> $members) : void
Parameters
$members : array<string|int, mixed>

An array of member ids.

fixMissingSenders()

Callback to fix the assigned authorship of PMs from non-existent senders.

protected fixMissingSenders(array<string|int, mixed> $guestMessages) : void

Specifically, such PMs will be shown to have been sent from a guest.

Parameters
$guestMessages : array<string|int, mixed>

An array of personal messages ids.

fixMissingTopicForCache()

Callback to remove log_search_subjects entries for non-existent topics.

protected fixMissingTopicForCache(array<string|int, mixed> $deleteTopics) : void
Parameters
$deleteTopics : array<string|int, mixed>

An array of topic ids.

fixMissingTopics()

Callback to fix missing topics.

protected fixMissingTopics(array<string|int, mixed> $row) : void
Parameters
$row : array<string|int, mixed>

Message with missing topic.

fixReportMissingComments()

Callback to remove non-existent comments from reports.

protected fixReportMissingComments(array<string|int, mixed> $reports) : void
Parameters
$reports : array<string|int, mixed>

An array of report ids.

fixTopicStats()

Callback to fix missing first and last message IDs for a topic.

protected fixTopicStats(array<string|int, mixed> $row) : bool
Parameters
$row : array<string|int, mixed>

Topic data.

Return values
bool

fixTopicStats2()

Callback to fix the recorded number of replies to a topic.

protected fixTopicStats2(array<string|int, mixed> $row) : bool
Parameters
$row : array<string|int, mixed>

Topic data.

Return values
bool

fixTopicStats3()

Callback to fix the recorded number of unapproved replies to a topic.

protected fixTopicStats3(array<string|int, mixed> $row) : void
Parameters
$row : array<string|int, mixed>

Topic data.

missingCachedSubjectMessage()

Callback to get a message about missing log_search_subjects entries for a topic.

protected missingCachedSubjectMessage(array<string|int, mixed> $row) : bool
Parameters
$row : array<string|int, mixed>

Search result id

Return values
bool

pauseRepairProcess()

Shows the not_done template to avoid CGI timeouts and similar.

protected pauseRepairProcess(array<string|int, mixed> $to_fix, string $current_step_description[, int $max_substep = 0 ][, bool $force = false ]) : void

Called when 3 or more seconds have passed while searching for errors.

Parameters
$to_fix : array<string|int, mixed>

An array of information about what to fix.

$current_step_description : string

Description of the current step.

$max_substep : int = 0

The maximum substep to reach before pausing.

$force : bool = false

Whether to force pausing even if we don't need to.

topicStatsMessage()

Callback to get a message about missing first and last message IDs for a topic.

protected topicStatsMessage(array<string|int, mixed> $row) : bool
Parameters
$row : array<string|int, mixed>

Topic data.

Return values
bool

topicStatsMessage2()

Callback to get a message about an incorrect record of the number of replies to a topic.

protected topicStatsMessage2(array<string|int, mixed> $row) : bool
Parameters
$row : array<string|int, mixed>

Topic data.

Return values
bool

        
On this page

Search results