Make WordPress Core


Ignore:
Timestamp:
08/26/2009 10:46:33 PM (16 years ago)
Author:
ryan
Message:

Make option_name the primary key for the options table. Props Denis-de-Bernardy. fixes #2699

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/includes/upgrade.php

    r11326 r11883  
    270270    wp_check_mysql_version();
    271271    wp_cache_flush();
     272    pre_schema_upgrade();
    272273    make_db_current_silent();
    273274    upgrade_all();
     
    555556            $limit = $option->dupes - 1;
    556557            $dupe_ids = $wpdb->get_col( $wpdb->prepare("SELECT option_id FROM $wpdb->options WHERE option_name = %s LIMIT %d", $option->option_name, $limit) );
    557             $dupe_ids = join($dupe_ids, ',');
    558             $wpdb->query("DELETE FROM $wpdb->options WHERE option_id IN ($dupe_ids)");
     558            if ( $dupe_ids ) {
     559                $dupe_ids = join($dupe_ids, ',');
     560                $wpdb->query("DELETE FROM $wpdb->options WHERE option_id IN ($dupe_ids)");
     561            }
    559562        }
    560563    }
     
    16571660}
    16581661
     1662/**
     1663 * Runs before the schema is upgraded.
     1664 */
     1665function pre_schema_upgrade() {
     1666    global $wp_current_db_version, $wp_db_version, $wpdb;
     1667
     1668    // Only run if less than 2.9
     1669    if ( $wp_current_db_version >= 11557 )
     1670        return;
     1671
     1672    // Delete duplicate options.  Keep the option with the highest option_id.
     1673    $delete_options = $wpdb->get_col("SELECT o1.option_id FROM $wpdb->options AS o1 JOIN $wpdb->options AS o2 ON o2.option_name = o1.option_name AND o2.option_id > o1.option_id");
     1674    if ( !empty($delete_options) ) {
     1675        $delete_options = implode("', '", $delete_options);
     1676        $wpdb->query("DELETE FROM $wpdb->options WHERE option_id IN ($delete_options)");
     1677    }
     1678
     1679    // Add an index on option_id to satisfy the auto_increment requirement
     1680    $wpdb->query("ALTER TABLE $wpdb->options ADD INDEX option_id (option_id)");
     1681
     1682    // Drop the old primary key. The new primary will be created by dbDelta()
     1683    $wpdb->query("ALTER TABLE $wpdb->options DROP PRIMARY KEY");
     1684
     1685    // Drop the old option_name index. dbDelta() doesn't do the drop.
     1686    $wpdb->query("ALTER TABLE $wpdb->options DROP INDEX option_name");
     1687}
     1688
    16591689?>
Note: See TracChangeset for help on using the changeset viewer.