PUN_ADMIN) message($lang_common['No permission']); if (isset($_GET['i_per_page']) && isset($_GET['i_start_at'])) { $per_page = intval($_GET['i_per_page']); $start_at = intval($_GET['i_start_at']); if ($per_page < 1 || $start_at < 1) message($lang_common['Bad request']); @set_time_limit(0); // If this is the first cycle of posts we empty the search index before we proceed if (isset($_GET['i_empty_index'])) { // This is the only potentially "dangerous" thing we can do here, so we check the referer confirm_referrer('admin_maintenance.php'); $truncate_sql = ($db_type != 'sqlite' && $db_type != 'pgsql') ? 'TRUNCATE TABLE ' : 'DELETE FROM '; $db->query($truncate_sql.$db->prefix.'search_matches') or error('Unable to empty search index match table', __FILE__, __LINE__, $db->error()); $db->query($truncate_sql.$db->prefix.'search_words') or error('Unable to empty search index words table', __FILE__, __LINE__, $db->error()); // Reset the sequence for the search words (not needed for SQLite) switch ($db_type) { case 'mysql': case 'mysqli': $result = $db->query('ALTER TABLE '.$db->prefix.'search_words auto_increment=1') or error('Unable to update table auto_increment', __FILE__, __LINE__, $db->error()); break; case 'pgsql'; $result = $db->query('SELECT setval(\''.$db->prefix.'search_words_id_seq\', 1, false)') or error('Unable to update sequence', __FILE__, __LINE__, $db->error()); } } ?> <?php echo pun_htmlspecialchars($pun_config['o_board_title']) ?> / Rebuilding search index … Rebuilding index … This might be a good time to put on some coffee :-)

query('SELECT DISTINCT t.id, p.id, p.message FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'posts AS p ON t.id=p.topic_id WHERE t.id>='.$start_at.' ORDER BY t.id LIMIT '.$per_page) or error('Unable to fetch topic/post info', __FILE__, __LINE__, $db->error()); $cur_topic = 0; while ($cur_post = $db->fetch_row($result)) { if ($cur_post[0] <> $cur_topic) { // Fetch subject and ID of first post in topic $result2 = $db->query('SELECT p.id, t.subject, MIN(p.posted) AS first FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id WHERE t.id='.$cur_post[0].' GROUP BY p.id, t.subject ORDER BY first LIMIT 1') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error()); list($first_post, $subject) = $db->fetch_row($result2); $cur_topic = $cur_post[0]; } echo 'Processing post '.$cur_post[1].' in topic '.$cur_post[0].'
'."\n"; if ($cur_post[1] == $first_post) // This is the "topic post" so we have to index the subject as well update_search_index('post', $cur_post[1], $cur_post[2], $subject); else update_search_index('post', $cur_post[1], $cur_post[2]); } // Check if there is more work to do $result = $db->query('SELECT id FROM '.$db->prefix.'topics WHERE id>'.$cur_topic.' ORDER BY id ASC LIMIT 1') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error()); $query_str = ($db->num_rows($result)) ? '?i_per_page='.$per_page.'&i_start_at='.$db->result($result) : ''; $db->end_transaction(); $db->close(); exit('
JavaScript redirect unsuccessful. Click here to continue.'); } // Get the first post ID from the db $result = $db->query('SELECT id FROM '.$db->prefix.'topics ORDER BY id LIMIT 1') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error()); if ($db->num_rows($result)) $first_id = $db->result($result); $page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Maintenance'; require PUN_ROOT.'header.php'; generate_admin_menu('maintenance'); ?>

Forum Maintenance

Rebuild search index

If you've added, edited or removed posts manually in the database or if you're having problems searching, you should rebuild the search index. For best performance you should put the forum in maintenance mode during rebuilding. Rebuilding the search index can take a long time and will increase server load during the rebuild process!

Topics per cycle The number of topics to process per pageview. E.g. if you were to enter 100, one hundred topics would be processed and then the page would refresh. This is to prevent the script from timing out during the rebuild process.
Starting Topic ID The topic ID to start rebuilding at. It's default value is the first available ID in the database. Normally you wouldn't want to change this.
Empty index   Select this if you want the search index to be emptied before rebuilding (see below).

Once the process has completed you will be redirected back to this page. It is highly recommended that you have JavaScript enabled in your browser during rebuilding (for automatic redirect when a cycle has completed). If you are forced to abort the rebuild process, make a note of the last processed topic ID and enter that ID+1 in "Topic ID to start at" when/if you want to continue ("Empty index" must not be selected).