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