info['ID'] = 'DBCHECK'; $this->info['name'] = __( 'DB Check', 'backwpup' ); $this->info['description'] = __( 'Check database tables', 'backwpup' ); $this->info['URI'] = __( 'https://backwpup.com', 'backwpup' ); $this->info['author'] = 'WP Media'; $this->info['authorURI'] = 'https://wp-media.me'; $this->info['version'] = BackWPup::get_plugin_data( 'Version' ); } /** * Returns default options for the job type. * * @return array Default options. */ public function option_defaults() { return [ 'dbcheckwponly' => true, 'dbcheckrepair' => false, ]; } /** * Renders the job type edit tab. * * @param int|array $jobid Job ID or list of job IDs. */ public function edit_tab( $jobid ) { ?>

log( sprintf( /* translators: %d: attempt number. */ __( '%d. Trying to check database …', 'backwpup' ), $job_object->steps_data[ $job_object->step_working ]['STEP_TRY'] ) ); if ( ! isset( $job_object->steps_data[ $job_object->step_working ]['DONETABLE'] ) || ! is_array( $job_object->steps_data[ $job_object->step_working ]['DONETABLE'] ) ) { $job_object->steps_data[ $job_object->step_working ]['DONETABLE'] = []; } // To check. $tables = []; $tablestype = []; $cache_group = 'backwpup_dbcheck'; $tables_key = 'show_full_tables_' . DB_NAME; $restables = wp_cache_get( $tables_key, $cache_group ); if ( false === $restables ) { $restables = $wpdb->get_results( 'SHOW FULL TABLES', ARRAY_N ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- No WP API for SHOW FULL TABLES. wp_cache_set( $tables_key, $restables, $cache_group, MINUTE_IN_SECONDS ); } foreach ( $restables as $table ) { $table_name = (string) $table[0]; $has_prefix = 0 === strpos( $table_name, $wpdb->prefix ); if ( true === $job_object->job['dbcheckwponly'] && ! $has_prefix ) { continue; } $tables[] = $table_name; $tablestype[ $table_name ] = $table[1]; } // Set num. $job_object->substeps_todo = count( $tables ); // Get table status. $status = []; $status_key = 'show_table_status_' . DB_NAME; $resstatus = wp_cache_get( $status_key, $cache_group ); if ( false === $resstatus ) { $resstatus = $wpdb->get_results( 'SHOW TABLE STATUS', ARRAY_A ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- No WP API for SHOW TABLE STATUS. wp_cache_set( $status_key, $resstatus, $cache_group, MINUTE_IN_SECONDS ); } foreach ( $resstatus as $tablestatus ) { $status[ $tablestatus['Name'] ] = $tablestatus; } // Check tables. if ( $job_object->substeps_todo > 0 ) { foreach ( $tables as $table ) { if ( in_array( $table, $job_object->steps_data[ $job_object->step_working ]['DONETABLE'], true ) ) { continue; } if ( ! isset( $tablestype[ $table ] ) ) { continue; } $table_name = esc_sql( $table ); if ( 'VIEW' === $tablestype[ $table ] ) { /* translators: %s: table name. */ $job_object->log( sprintf( __( 'Table %1$s is a view. Not checked.', 'backwpup' ), $table ) ); continue; } if ( 'MyISAM' !== $status[ $table ]['Engine'] && 'InnoDB' !== $status[ $table ]['Engine'] ) { /* translators: %s: table name. */ $job_object->log( sprintf( __( 'Table %1$s is not a MyISAM/InnoDB table. Not checked.', 'backwpup' ), $table ) ); continue; } // CHECK TABLE funktioniert bei MyISAM- und InnoDB-Tabellen (http://dev.mysql.com/doc/refman/5.1/de/check-table.html). $check = $wpdb->get_row( "CHECK TABLE `{$table_name}` MEDIUM", OBJECT ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Table name comes from SHOW TABLES. $check_msg_text = (string) $check->Msg_text; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase $check_msg_type = (string) $check->Msg_type; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase $check_msg_text_lower = strtolower( $check_msg_text ); $check_msg_type_lower = strtolower( $check_msg_type ); /* translators: 1: table name, 2: database message. */ $check_result_message = __( 'Result of table check for %1$s is: %2$s', 'backwpup' ); if ( 'ok' === $check_msg_text_lower ) { if ( $job_object->is_debug() ) { $job_object->log( sprintf( $check_result_message, $table, $check_msg_text ) ); } } elseif ( 'warning' === $check_msg_type_lower ) { $job_object->log( sprintf( $check_result_message, $table, $check_msg_text ), E_USER_WARNING ); } else { $job_object->log( sprintf( $check_result_message, $table, $check_msg_text ), E_USER_ERROR ); } // Try to repair table. if ( ! empty( $job_object->job['dbcheckrepair'] ) && 'ok' !== $check_msg_text_lower && 'MyISAM' === $status[ $table ]['Engine'] ) { $repair = $wpdb->get_row( "REPAIR TABLE `{$table_name}` EXTENDED", OBJECT ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Table name comes from SHOW TABLES. $repair_msg_text = (string) $repair->Msg_text; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase $repair_msg_type = (string) $repair->Msg_type; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase $repair_msg_text_lower = strtolower( $repair_msg_text ); $repair_msg_type_lower = strtolower( $repair_msg_type ); /* translators: 1: table name, 2: database message. */ $repair_result_message = __( 'Result of table repair for %1$s is: %2$s', 'backwpup' ); if ( 'ok' === $repair_msg_text_lower ) { $job_object->log( sprintf( $repair_result_message, $table, $repair_msg_text ) ); } elseif ( 'warning' === $repair_msg_type_lower ) { $job_object->log( sprintf( $repair_result_message, $table, $repair_msg_text ), E_USER_WARNING ); } else { $job_object->log( sprintf( $repair_result_message, $table, $repair_msg_text ), E_USER_ERROR ); } } $job_object->steps_data[ $job_object->step_working ]['DONETABLE'][] = $table; ++$job_object->substeps_done; } $job_object->log( __( 'Database check done!', 'backwpup' ) ); } else { $job_object->log( __( 'No tables to check.', 'backwpup' ) ); } unset( $job_object->steps_data[ $job_object->step_working ]['DONETABLE'] ); return true; } }