+ * @global int $wp_current_db_version
+ */
+function upgrade_370() {
+ global $wp_current_db_version;
+ if ( $wp_current_db_version < 25824 )
+ wp_clear_scheduled_hook( 'wp_auto_updates_maybe_update' );
+}
+
+/**
+ * Execute changes made in WordPress 3.7.2.
+ *
+ * @since 3.7.2
+ * @since 3.8.0
+ *
+ * @global int $wp_current_db_version
+ */
+function upgrade_372() {
+ global $wp_current_db_version;
+ if ( $wp_current_db_version < 26148 )
+ wp_clear_scheduled_hook( 'wp_maybe_auto_update' );
+}
+
+/**
+ * Execute changes made in WordPress 3.8.0.
+ *
+ * @since 3.8.0
+ *
+ * @global int $wp_current_db_version
+ */
+function upgrade_380() {
+ global $wp_current_db_version;
+ if ( $wp_current_db_version < 26691 ) {
+ deactivate_plugins( array( 'mp6/mp6.php' ), true );
+ }
+}
+
+/**
+ * Execute changes made in WordPress 4.0.0.
+ *
+ * @since 4.0.0
+ *
+ * @global int $wp_current_db_version
+ */
+function upgrade_400() {
+ global $wp_current_db_version;
+ if ( $wp_current_db_version < 29630 ) {
+ if ( ! is_multisite() && false === get_option( 'WPLANG' ) ) {
+ if ( defined( 'WPLANG' ) && ( '' !== WPLANG ) && in_array( WPLANG, get_available_languages() ) ) {
+ update_option( 'WPLANG', WPLANG );
+ } else {
+ update_option( 'WPLANG', '' );
+ }
+ }
+ }
+}
+
+/**
+ * Execute changes made in WordPress 4.2.0.
+ *
+ * @since 4.2.0
+ *
+ * @global int $wp_current_db_version
+ * @global wpdb $wpdb
+ */
+function upgrade_420() {}
+
+/**
+ * Executes changes made in WordPress 4.3.0.
+ *
+ * @since 4.3.0
+ *
+ * @global int $wp_current_db_version Current version.
+ * @global wpdb $wpdb WordPress database abstraction object.
+ */
+function upgrade_430() {
+ global $wp_current_db_version, $wpdb;
+
+ if ( $wp_current_db_version < 32364 ) {
+ upgrade_430_fix_comments();
+ }
+
+ // Shared terms are split in a separate process.
+ if ( $wp_current_db_version < 32814 ) {
+ update_option( 'finished_splitting_shared_terms', 0 );
+ wp_schedule_single_event( time() + ( 1 * MINUTE_IN_SECONDS ), 'wp_split_shared_term_batch' );
+ }
+
+ if ( $wp_current_db_version < 33055 && 'utf8mb4' === $wpdb->charset ) {
+ if ( is_multisite() ) {
+ $tables = $wpdb->tables( 'blog' );
+ } else {
+ $tables = $wpdb->tables( 'all' );
+ if ( ! wp_should_upgrade_global_tables() ) {
+ $global_tables = $wpdb->tables( 'global' );
+ $tables = array_diff_assoc( $tables, $global_tables );
+ }
+ }
+
+ foreach ( $tables as $table ) {
+ maybe_convert_table_to_utf8mb4( $table );
+ }
+ }
+}
+
+/**
+ * Executes comments changes made in WordPress 4.3.0.
+ *
+ * @since 4.3.0
+ *
+ * @global int $wp_current_db_version Current version.
+ * @global wpdb $wpdb WordPress database abstraction object.
+ */
+function upgrade_430_fix_comments() {
+ global $wp_current_db_version, $wpdb;
+
+ $content_length = $wpdb->get_col_length( $wpdb->comments, 'comment_content' );
+
+ if ( is_wp_error( $content_length ) ) {
+ return;
+ }
+
+ if ( false === $content_length ) {
+ $content_length = array(
+ 'type' => 'byte',
+ 'length' => 65535,
+ );
+ } elseif ( ! is_array( $content_length ) ) {
+ $length = (int) $content_length > 0 ? (int) $content_length : 65535;
+ $content_length = array(
+ 'type' => 'byte',
+ 'length' => $length
+ );
+ }
+
+ if ( 'byte' !== $content_length['type'] || 0 === $content_length['length'] ) {
+ // Sites with malformed DB schemas are on their own.
+ return;
+ }
+
+ $allowed_length = intval( $content_length['length'] ) - 10;
+
+ $comments = $wpdb->get_results(
+ "SELECT `comment_ID` FROM `{$wpdb->comments}`
+ WHERE `comment_date_gmt` > '2015-04-26'
+ AND LENGTH( `comment_content` ) >= {$allowed_length}
+ AND ( `comment_content` LIKE '%<%' OR `comment_content` LIKE '%>%' )"
+ );
+
+ foreach ( $comments as $comment ) {
+ wp_delete_comment( $comment->comment_ID, true );
+ }
+}
+
+/**
+ * Executes changes made in WordPress 4.3.1.
+ *
+ * @since 4.3.1
+ */
+function upgrade_431() {
+ // Fix incorrect cron entries for term splitting
+ $cron_array = _get_cron_array();
+ if ( isset( $cron_array['wp_batch_split_terms'] ) ) {
+ unset( $cron_array['wp_batch_split_terms'] );
+ _set_cron_array( $cron_array );
+ }
+}
+
+/**
+ * Executes network-level upgrade routines.
+ *
+ * @since 3.0.0
+ *
+ * @global int $wp_current_db_version
+ * @global wpdb $wpdb
+ */
+function upgrade_network() {
+ global $wp_current_db_version, $wpdb;
+
+ // Always.
+ if ( is_main_network() ) {
+ /*
+ * Deletes all expired transients. The multi-table delete syntax is used
+ * to delete the transient record from table a, and the corresponding
+ * transient_timeout record from table b.
+ */
+ $time = time();
+ $sql = "DELETE a, b FROM $wpdb->sitemeta a, $wpdb->sitemeta b
+ WHERE a.meta_key LIKE %s
+ AND a.meta_key NOT LIKE %s
+ AND b.meta_key = CONCAT( '_site_transient_timeout_', SUBSTRING( a.meta_key, 17 ) )
+ AND b.meta_value < %d";
+ $wpdb->query( $wpdb->prepare( $sql, $wpdb->esc_like( '_site_transient_' ) . '%', $wpdb->esc_like ( '_site_transient_timeout_' ) . '%', $time ) );
+ }
+
+ // 2.8.
+ if ( $wp_current_db_version < 11549 ) {
+ $wpmu_sitewide_plugins = get_site_option( 'wpmu_sitewide_plugins' );
+ $active_sitewide_plugins = get_site_option( 'active_sitewide_plugins' );
+ if ( $wpmu_sitewide_plugins ) {
+ if ( !$active_sitewide_plugins )
+ $sitewide_plugins = (array) $wpmu_sitewide_plugins;
+ else
+ $sitewide_plugins = array_merge( (array) $active_sitewide_plugins, (array) $wpmu_sitewide_plugins );
+
+ update_site_option( 'active_sitewide_plugins', $sitewide_plugins );
+ }
+ delete_site_option( 'wpmu_sitewide_plugins' );
+ delete_site_option( 'deactivated_sitewide_plugins' );
+
+ $start = 0;
+ while( $rows = $wpdb->get_results( "SELECT meta_key, meta_value FROM {$wpdb->sitemeta} ORDER BY meta_id LIMIT $start, 20" ) ) {
+ foreach( $rows as $row ) {
+ $value = $row->meta_value;
+ if ( !@unserialize( $value ) )
+ $value = stripslashes( $value );
+ if ( $value !== $row->meta_value ) {
+ update_site_option( $row->meta_key, $value );
+ }
+ }
+ $start += 20;
+ }
+ }
+
+ // 3.0
+ if ( $wp_current_db_version < 13576 )
+ update_site_option( 'global_terms_enabled', '1' );
+
+ // 3.3
+ if ( $wp_current_db_version < 19390 )
+ update_site_option( 'initial_db_version', $wp_current_db_version );
+
+ if ( $wp_current_db_version < 19470 ) {
+ if ( false === get_site_option( 'active_sitewide_plugins' ) )
+ update_site_option( 'active_sitewide_plugins', array() );
+ }
+
+ // 3.4
+ if ( $wp_current_db_version < 20148 ) {
+ // 'allowedthemes' keys things by stylesheet. 'allowed_themes' keyed things by name.
+ $allowedthemes = get_site_option( 'allowedthemes' );
+ $allowed_themes = get_site_option( 'allowed_themes' );
+ if ( false === $allowedthemes && is_array( $allowed_themes ) && $allowed_themes ) {
+ $converted = array();
+ $themes = wp_get_themes();
+ foreach ( $themes as $stylesheet => $theme_data ) {
+ if ( isset( $allowed_themes[ $theme_data->get('Name') ] ) )
+ $converted[ $stylesheet ] = true;
+ }
+ update_site_option( 'allowedthemes', $converted );
+ delete_site_option( 'allowed_themes' );
+ }
+ }
+
+ // 3.5
+ if ( $wp_current_db_version < 21823 )
+ update_site_option( 'ms_files_rewriting', '1' );
+
+ // 3.5.2
+ if ( $wp_current_db_version < 24448 ) {
+ $illegal_names = get_site_option( 'illegal_names' );
+ if ( is_array( $illegal_names ) && count( $illegal_names ) === 1 ) {
+ $illegal_name = reset( $illegal_names );
+ $illegal_names = explode( ' ', $illegal_name );
+ update_site_option( 'illegal_names', $illegal_names );
+ }
+ }
+
+ // 4.2
+ if ( $wp_current_db_version < 31351 && $wpdb->charset === 'utf8mb4' ) {
+ if ( wp_should_upgrade_global_tables() ) {
+ $wpdb->query( "ALTER TABLE $wpdb->usermeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))" );
+ $wpdb->query( "ALTER TABLE $wpdb->site DROP INDEX domain, ADD INDEX domain(domain(140),path(51))" );
+ $wpdb->query( "ALTER TABLE $wpdb->sitemeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))" );
+ $wpdb->query( "ALTER TABLE $wpdb->signups DROP INDEX domain_path, ADD INDEX domain_path(domain(140),path(51))" );
+
+ $tables = $wpdb->tables( 'global' );
+
+ // sitecategories may not exist.
+ if ( ! $wpdb->get_var( "SHOW TABLES LIKE '{$tables['sitecategories']}'" ) ) {
+ unset( $tables['sitecategories'] );
+ }
+
+ foreach ( $tables as $table ) {
+ maybe_convert_table_to_utf8mb4( $table );
+ }
+ }
+ }
+
+ // 4.3
+ if ( $wp_current_db_version < 33055 && 'utf8mb4' === $wpdb->charset ) {
+ if ( wp_should_upgrade_global_tables() ) {
+ $upgrade = false;
+ $indexes = $wpdb->get_results( "SHOW INDEXES FROM $wpdb->signups" );
+ foreach( $indexes as $index ) {
+ if ( 'domain_path' == $index->Key_name && 'domain' == $index->Column_name && 140 != $index->Sub_part ) {
+ $upgrade = true;
+ break;
+ }
+ }
+
+ if ( $upgrade ) {
+ $wpdb->query( "ALTER TABLE $wpdb->signups DROP INDEX domain_path, ADD INDEX domain_path(domain(140),path(51))" );
+ }
+
+ $tables = $wpdb->tables( 'global' );
+
+ // sitecategories may not exist.
+ if ( ! $wpdb->get_var( "SHOW TABLES LIKE '{$tables['sitecategories']}'" ) ) {
+ unset( $tables['sitecategories'] );
+ }
+
+ foreach ( $tables as $table ) {
+ maybe_convert_table_to_utf8mb4( $table );
+ }
+ }
+ }
+}
+
+//
+// General functions we use to actually do stuff
+//
+
+/**
+ * Creates a table in the database if it doesn't already exist.
+ *
+ * This method checks for an existing database and creates a new one if it's not
+ * already present. It doesn't rely on MySQL's "IF NOT EXISTS" statement, but chooses
+ * to query all tables first and then run the SQL statement creating the table.
+ *
+ * @since 1.0.0
+ *
+ * @global wpdb $wpdb