From 02c7c0e38ee1130db1742eba64be5a1d24ab8dbd Mon Sep 17 00:00:00 2001
From: ryan
define('WP_ALLOW_REPAIR', true);
");
+} elseif ( isset($_GET['repair']) ) {
+ $problems = array();
+ check_admin_referer('repair_db');
+
+ // Loop over the WP tables, checking and repairing as needed.
+ foreach ($wpdb->tables as $table) {
+ if ( in_array($table, $wpdb->old_tables) )
+ continue;
+
+ $check = $wpdb->get_row("CHECK TABLE {$wpdb->prefix}$table");
+ if ( 'OK' == $check->Msg_text ) {
+ echo "The {$wpdb->prefix}$table table is okay.
"; + } else { + echo "The {$wpdb->prefix}$table table is not okay. It is reporting the following error: $check->Msg_text
. WordPress will attempt to repair this table…
";
+ $repair = $wpdb->get_row("REPAIR TABLE {$wpb->prefix}$table");
+ if ( 'OK' == $check->Msg_text ) {
+ echo " Sucessfully repaired the {$wpb->prefix}$table table.
";
+ } else {
+ echo " Failed to repair the {$wpdb->prefix}$table table. Error: $check->Msg_text
";
+ $problems["{$wpdb->prefix}$table"] = $check->Msg_text;
+ }
+ }
+ }
+
+ if ( !empty($problems) ) {
+ printf(__('
Some database problems could not be repaired. Please copy-and-paste the following list of errors to the WordPress support forums to get additional assistance.
'), 'http://wordpress.org/support/forum/3'); + $problem_output = array(); + foreach ( $problems as $table => $problem ) + $problem_output[] = "$table: $problem"; + echo ''; + } else { + _e("Repairs complete. Please remove the following line from wp-config.php to prevent this page from being used by unauthorized users.
define('WP_ALLOW_REPAIR', true);
");
+ }
+} else {
+ if ( isset($_GET['referrer']) && 'is_blog_installed' == $_GET['referrer'] )
+ _e('One or more database tables is unavailable. To allow WordPress to attempt to repair these tables, press the "Repair Database" button. Repairing can take awhile, so please be patient.');
+ else
+ _e('WordPress can automatically look for some common database problems and repair them. Repairing can take awhile, so please be patient.')
+?>
+
+
+
+
\ No newline at end of file
diff --git a/wp-includes/functions.php b/wp-includes/functions.php
index 9bf745248b..372ee8cab3 100644
--- a/wp-includes/functions.php
+++ b/wp-includes/functions.php
@@ -1771,7 +1771,31 @@ function is_blog_installed() {
$installed = !empty( $installed );
wp_cache_set( 'is_blog_installed', $installed );
- return $installed;
+ if ( $installed )
+ return true;
+
+ $suppress = $wpdb->suppress_errors();
+ $tables = $wpdb->get_col('SHOW TABLES');
+ $wpdb->suppress_errors( $suppress );
+
+ // Loop over the WP tables. If none exist, then scratch install is allowed.
+ // If one or more exist, suggest table repair since we got here because the options
+ // table could not be accessed.
+ foreach ($wpdb->tables as $table) {
+ // If one of the WP tables exist, then we are in an insane state.
+ if ( in_array($wpdb->prefix . $table, $tables) ) {
+ // If visiting repair.php, return true and let it take over.
+ if ( defined('WP_REPAIRING') )
+ return true;
+ // Die with a DB error.
+ $wpdb->error = __('One or more database tables are unavailable. The database may need to be repaired.');
+ dead_db();
+ }
+ }
+
+ wp_cache_set( 'is_blog_installed', false );
+
+ return false;
}
/**
diff --git a/wp-includes/wp-db.php b/wp-includes/wp-db.php
index b35bbee697..9527ee4466 100644
--- a/wp-includes/wp-db.php
+++ b/wp-includes/wp-db.php
@@ -254,6 +254,16 @@ class wpdb {
var $tables = array('users', 'usermeta', 'posts', 'categories', 'post2cat', 'comments', 'links', 'link2cat', 'options',
'postmeta', 'terms', 'term_taxonomy', 'term_relationships');
+ /**
+ * List of deprecated WordPress tables
+ *
+ * @since 2.9.0
+ * @access private
+ * @var array
+ */
+ var $old_tables = array('categories', 'post2cat', 'link2cat');
+
+
/**
* Format specifiers for DB columns. Columns not listed here default to %s. Initialized in wp-settings.php.
*