punbb/admin_maintenance.php
changeset 6 5e1f1e916419
parent 5 e3d7322305bf
child 7 98bbc533541c
equal deleted inserted replaced
5:e3d7322305bf 6:5e1f1e916419
     1 <?php
       
     2 /***********************************************************************
       
     3 
       
     4   Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
       
     5 
       
     6   This file is part of PunBB.
       
     7 
       
     8   PunBB is free software; you can redistribute it and/or modify it
       
     9   under the terms of the GNU General Public License as published
       
    10   by the Free Software Foundation; either version 2 of the License,
       
    11   or (at your option) any later version.
       
    12 
       
    13   PunBB is distributed in the hope that it will be useful, but
       
    14   WITHOUT ANY WARRANTY; without even the implied warranty of
       
    15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       
    16   GNU General Public License for more details.
       
    17 
       
    18   You should have received a copy of the GNU General Public License
       
    19   along with this program; if not, write to the Free Software
       
    20   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
       
    21   MA  02111-1307  USA
       
    22 
       
    23 ************************************************************************/
       
    24 
       
    25 
       
    26 // Tell header.php to use the admin template
       
    27 define('PUN_ADMIN_CONSOLE', 1);
       
    28 // Tell common.php that we don't want output buffering
       
    29 define('PUN_DISABLE_BUFFERING', 1);
       
    30 
       
    31 //define('PUN_ROOT', './');
       
    32 //require PUN_ROOT.'include/common.php';
       
    33 
       
    34 global $pun_db, $pun_user, $pun_config, $lang_common;
       
    35 
       
    36 require PUN_ROOT.'include/common_admin.php';
       
    37 
       
    38 
       
    39 if ($pun_user['g_id'] < PUN_ADMIN)
       
    40 	message($lang_common['No permission']);
       
    41 
       
    42 
       
    43 if (isset($_GET['i_per_page']) && isset($_GET['i_start_at']))
       
    44 {
       
    45 	$per_page = intval($_GET['i_per_page']);
       
    46 	$start_at = intval($_GET['i_start_at']);
       
    47 	if ($per_page < 1 || $start_at < 1)
       
    48 		message($lang_common['Bad request']);
       
    49 
       
    50 	@set_time_limit(0);
       
    51 
       
    52 	// If this is the first cycle of posts we empty the search index before we proceed
       
    53 	if (isset($_GET['i_empty_index']))
       
    54 	{
       
    55 		// This is the only potentially "dangerous" thing we can do here, so we check the referer
       
    56 		confirm_referrer('admin_maintenance.php');
       
    57 
       
    58 		$truncate_sql = ($db_type != 'sqlite' && $db_type != 'pgsql') ? 'TRUNCATE TABLE ' : 'DELETE FROM ';
       
    59 		$pun_db->query($truncate_sql.$pun_db->prefix.'search_matches') or error('Unable to empty search index match table', __FILE__, __LINE__, $pun_db->error());
       
    60 		$pun_db->query($truncate_sql.$pun_db->prefix.'search_words') or error('Unable to empty search index words table', __FILE__, __LINE__, $pun_db->error());
       
    61 
       
    62 		// Reset the sequence for the search words (not needed for SQLite)
       
    63 		switch ($db_type)
       
    64 		{
       
    65 			case 'mysql':
       
    66 			case 'mysqli':
       
    67 				$result = $pun_db->query('ALTER TABLE '.$pun_db->prefix.'search_words auto_increment=1') or error('Unable to update table auto_increment', __FILE__, __LINE__, $pun_db->error());
       
    68 				break;
       
    69 
       
    70 			case 'pgsql';
       
    71 				$result = $pun_db->query('SELECT setval(\''.$pun_db->prefix.'search_words_id_seq\', 1, false)') or error('Unable to update sequence', __FILE__, __LINE__, $pun_db->error());
       
    72 		}
       
    73 	}
       
    74 
       
    75 	$end_at = $start_at + $per_page;
       
    76 
       
    77 ?>
       
    78 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
       
    79 
       
    80 <html>
       
    81 <head>
       
    82 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
       
    83 <title><?php echo pun_htmlspecialchars($pun_config['o_board_title']) ?> / Rebuilding search index &hellip;</title>
       
    84 <style type="text/css">
       
    85 body {
       
    86 	font: 10px Verdana, Arial, Helvetica, sans-serif;
       
    87 	color: #333333;
       
    88 	background-color: #FFFFFF
       
    89 }
       
    90 </style>
       
    91 </head>
       
    92 <body>
       
    93 
       
    94 Rebuilding index &hellip; This might be a good time to put on some coffee :-)<br /><br />
       
    95 
       
    96 <?php
       
    97 
       
    98 	require PUN_ROOT.'include/search_idx.php';
       
    99 
       
   100 	// Fetch posts to process
       
   101 	$result = $pun_db->query('SELECT DISTINCT t.id, p.id, p.message FROM '.$pun_db->prefix.'topics AS t INNER JOIN '.$pun_db->prefix.'posts AS p ON t.id=p.topic_id WHERE t.id>='.$start_at.' AND t.id<'.$end_at.' ORDER BY t.id') or error('Unable to fetch topic/post info', __FILE__, __LINE__, $pun_db->error());
       
   102 
       
   103 	$cur_topic = 0;
       
   104 	while ($cur_post = $pun_db->fetch_row($result))
       
   105 	{
       
   106 		if ($cur_post[0] <> $cur_topic)
       
   107 		{
       
   108 			// Fetch subject and ID of first post in topic
       
   109 			$result2 = $pun_db->query('SELECT p.id, t.subject, MIN(p.posted) AS first FROM '.$pun_db->prefix.'posts AS p INNER JOIN '.$pun_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__, $pun_db->error());
       
   110 			list($first_post, $subject) = $pun_db->fetch_row($result2);
       
   111 
       
   112 			$cur_topic = $cur_post[0];
       
   113 		}
       
   114 
       
   115 		echo 'Processing post <strong>'.$cur_post[1].'</strong> in topic <strong>'.$cur_post[0].'</strong><br />'."\n";
       
   116 
       
   117 		if ($cur_post[1] == $first_post)	// This is the "topic post" so we have to index the subject as well
       
   118 			update_search_index('post', $cur_post[1], $cur_post[2], $subject);
       
   119 		else
       
   120 			update_search_index('post', $cur_post[1], $cur_post[2]);
       
   121 	}
       
   122 
       
   123 	// Check if there is more work to do
       
   124 	$result = $pun_db->query('SELECT id FROM '.$pun_db->prefix.'topics WHERE id>'.$end_at) or error('Unable to fetch topic info', __FILE__, __LINE__, $pun_db->error());
       
   125 
       
   126 	$query_str = ($pun_db->num_rows($result)) ? '?i_per_page='.$per_page.'&i_start_at='.$end_at : '';
       
   127 
       
   128 	$pun_db->end_transaction();
       
   129 	$pun_db->close();
       
   130 
       
   131 	exit('<script type="text/javascript">window.location="admin_maintenance.php'.$query_str.'"</script><br />JavaScript redirect unsuccessful. Click <a href="admin_maintenance.php'.$query_str.'">here</a> to continue.');
       
   132 }
       
   133 
       
   134 
       
   135 // Get the first post ID from the db
       
   136 $result = $pun_db->query('SELECT id FROM '.$pun_db->prefix.'topics ORDER BY id LIMIT 1') or error('Unable to fetch topic info', __FILE__, __LINE__, $pun_db->error());
       
   137 if ($pun_db->num_rows($result))
       
   138 	$first_id = $pun_db->result($result);
       
   139 
       
   140 $page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Maintenance';
       
   141 require PUN_ROOT.'header.php';
       
   142 
       
   143 generate_admin_menu('maintenance');
       
   144 
       
   145 ?>
       
   146 	<div class="blockform">
       
   147 		<h2><span>Forum Maintenance</span></h2>
       
   148 		<div class="box">
       
   149 			<form method="get" action="admin_maintenance.php">
       
   150 				<div class="inform">
       
   151 					<fieldset>
       
   152 						<legend>Rebuild search index</legend>
       
   153 						<div class="infldset">
       
   154 							<p>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. <strong>Rebuilding the search index can take a long time and will increase server load during the rebuild process!</strong></p>
       
   155 							<table class="aligntop" cellspacing="0">
       
   156 								<tr>
       
   157 									<th scope="row">Topics per cycle</th>
       
   158 									<td>
       
   159 										<input type="text" name="i_per_page" size="7" maxlength="7" value="100" tabindex="1" />
       
   160 										<span>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.</span>
       
   161 									</td>
       
   162 								</tr>
       
   163 								<tr>
       
   164 									<th scope="row">Starting Topic ID</th>
       
   165 									<td>
       
   166 										<input type="text" name="i_start_at" size="7" maxlength="7" value="<?php echo (isset($first_id)) ? $first_id : 0 ?>" tabindex="2" />
       
   167 										<span>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.</span>
       
   168 									</td>
       
   169 								</tr>
       
   170 								<tr>
       
   171 									<th scope="row">Empty index</th>
       
   172 									<td class="inputadmin">
       
   173 										<span><input type="checkbox" name="i_empty_index" value="1" tabindex="3" checked="checked" />&nbsp;&nbsp;Select this if you want the search index to be emptied before rebuilding (see below).</span>
       
   174 									</td>
       
   175 								</tr>
       
   176 							</table>
       
   177 							<p class="topspace">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).</p>
       
   178 							<div class="fsetsubmit"><input type="submit" name="rebuild_index" value="Rebuild index" tabindex="4" /></div>
       
   179 						</div>
       
   180 					</fieldset>
       
   181 				</div>
       
   182 			</form>
       
   183 		</div>
       
   184 	</div>
       
   185 	<div class="clearer"></div>
       
   186 </div>
       
   187 <?php
       
   188 
       
   189 require PUN_ROOT.'footer.php';