From a0f6c4469dbd423ed57145ea27255e9f9a318e6f Mon Sep 17 00:00:00 2001 From: ryan Date: Thu, 6 Oct 2011 00:21:24 +0000 Subject: [PATCH] Introduce wp_get_db_schema() for rerieving the various flavors of the WP db schema. Eliminates need to use global. Allows multiple calls to wpmu_create_blog(). see #12028 git-svn-id: http://svn.automattic.com/wordpress/trunk@18899 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-admin/includes/schema.php | 183 ++++++++++++++++++++++++++++++++-- wp-admin/includes/upgrade.php | 113 ++------------------- wp-admin/network.php | 2 +- wp-includes/l10n.php | 2 +- wp-includes/ms-functions.php | 2 +- 5 files changed, 183 insertions(+), 119 deletions(-) diff --git a/wp-admin/includes/schema.php b/wp-admin/includes/schema.php index 8a6f0e30e..6a3c4fab6 100644 --- a/wp-admin/includes/schema.php +++ b/wp-admin/includes/schema.php @@ -8,6 +8,9 @@ * @subpackage Administration */ +// Declare these as global in case schema.php is included from a function. +global $wpdb, $wp_queries, $charset_collate; + /** * The database character collate. * @var string @@ -16,16 +19,36 @@ */ $charset_collate = ''; -// Declare these as global in case schema.php is included from a function. -global $wpdb, $wp_queries; - -if ( ! empty($wpdb->charset) ) +if ( ! empty( $wpdb->charset ) ) $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset"; -if ( ! empty($wpdb->collate) ) +if ( ! empty( $wpdb->collate ) ) $charset_collate .= " COLLATE $wpdb->collate"; -/** Create WordPress database tables SQL */ -$wp_queries = "CREATE TABLE $wpdb->terms ( +/** + * Retrieve the SQL for creating database tables. + * + * @since 3.3.0 + * + * @param string $scope Optional. The tables for which to retrieve SQL. Can be all, global, ms_global, or blog tables. Defaults to all. + * @param int $blog_id Optional. The blog ID for which to retrieve SQL. Default is the current blog ID. + * @return string The SQL needed to create the requested tables. + */ +function wp_get_db_schema( $scope = 'all', $blog_id = null ) { + global $wpdb; + + if ( ! empty($wpdb->charset) ) + $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset"; + if ( ! empty($wpdb->collate) ) + $charset_collate .= " COLLATE $wpdb->collate"; + + if ( $blog_id && $blog_id != $wpdb->blogid ) + $old_blog_id = $wpdb->set_blog_id( $blog_id ); + + // Engage multisite if in the middle of turning it on from network.php. + $is_multisite = is_multisite() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK ); + + // Blog specific tables. + $blog_tables = "CREATE TABLE $wpdb->terms ( term_id bigint(20) unsigned NOT NULL auto_increment, name varchar(200) NOT NULL default '', slug varchar(200) NOT NULL default '', @@ -148,8 +171,10 @@ CREATE TABLE $wpdb->posts ( KEY type_status_date (post_type,post_status,post_date,ID), KEY post_parent (post_parent), KEY post_author (post_author) -) $charset_collate; -CREATE TABLE $wpdb->users ( +) $charset_collate;\n"; + + // Single site users table. The multisite flavor of the users table is handled below. + $users_single_table = "CREATE TABLE $wpdb->users ( ID bigint(20) unsigned NOT NULL auto_increment, user_login varchar(60) NOT NULL default '', user_pass varchar(64) NOT NULL default '', @@ -163,8 +188,29 @@ CREATE TABLE $wpdb->users ( PRIMARY KEY (ID), KEY user_login_key (user_login), KEY user_nicename (user_nicename) -) $charset_collate; -CREATE TABLE $wpdb->usermeta ( +) $charset_collate;\n"; + + // Multisite users table + $users_multi_table = "CREATE TABLE $wpdb->users ( + ID bigint(20) unsigned NOT NULL auto_increment, + user_login varchar(60) NOT NULL default '', + user_pass varchar(64) NOT NULL default '', + user_nicename varchar(50) NOT NULL default '', + user_email varchar(100) NOT NULL default '', + user_url varchar(100) NOT NULL default '', + user_registered datetime NOT NULL default '0000-00-00 00:00:00', + user_activation_key varchar(60) NOT NULL default '', + user_status int(11) NOT NULL default '0', + display_name varchar(250) NOT NULL default '', + spam tinyint(2) NOT NULL default '0', + deleted tinyint(2) NOT NULL default '0', + PRIMARY KEY (ID), + KEY user_login_key (user_login), + KEY user_nicename (user_nicename) +) $charset_collate;\n"; + + // usermeta + $usermeta_table = "CREATE TABLE $wpdb->usermeta ( umeta_id bigint(20) unsigned NOT NULL auto_increment, user_id bigint(20) unsigned NOT NULL default '0', meta_key varchar(255) default NULL, @@ -172,8 +218,108 @@ CREATE TABLE $wpdb->usermeta ( PRIMARY KEY (umeta_id), KEY user_id (user_id), KEY meta_key (meta_key) +) $charset_collate;\n"; + + // Global tables + if ( $is_multisite ) + $global_tables = $users_multi_table . $usermeta_table; + else + $global_tables = $users_single_table . $usermeta_table; + + // Multisite global tables. + $ms_global_tables = "CREATE TABLE $wpdb->blogs ( + blog_id bigint(20) NOT NULL auto_increment, + site_id bigint(20) NOT NULL default '0', + domain varchar(200) NOT NULL default '', + path varchar(100) NOT NULL default '', + registered datetime NOT NULL default '0000-00-00 00:00:00', + last_updated datetime NOT NULL default '0000-00-00 00:00:00', + public tinyint(2) NOT NULL default '1', + archived enum('0','1') NOT NULL default '0', + mature tinyint(2) NOT NULL default '0', + spam tinyint(2) NOT NULL default '0', + deleted tinyint(2) NOT NULL default '0', + lang_id int(11) NOT NULL default '0', + PRIMARY KEY (blog_id), + KEY domain (domain(50),path(5)), + KEY lang_id (lang_id) +) $charset_collate; +CREATE TABLE $wpdb->blog_versions ( + blog_id bigint(20) NOT NULL default '0', + db_version varchar(20) NOT NULL default '', + last_updated datetime NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (blog_id), + KEY db_version (db_version) +) $charset_collate; +CREATE TABLE $wpdb->registration_log ( + ID bigint(20) NOT NULL auto_increment, + email varchar(255) NOT NULL default '', + IP varchar(30) NOT NULL default '', + blog_id bigint(20) NOT NULL default '0', + date_registered datetime NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (ID), + KEY IP (IP) +) $charset_collate; +CREATE TABLE $wpdb->site ( + id bigint(20) NOT NULL auto_increment, + domain varchar(200) NOT NULL default '', + path varchar(100) NOT NULL default '', + PRIMARY KEY (id), + KEY domain (domain,path) +) $charset_collate; +CREATE TABLE $wpdb->sitemeta ( + meta_id bigint(20) NOT NULL auto_increment, + site_id bigint(20) NOT NULL default '0', + meta_key varchar(255) default NULL, + meta_value longtext, + PRIMARY KEY (meta_id), + KEY meta_key (meta_key), + KEY site_id (site_id) +) $charset_collate; +CREATE TABLE $wpdb->signups ( + domain varchar(200) NOT NULL default '', + path varchar(100) NOT NULL default '', + title longtext NOT NULL, + user_login varchar(60) NOT NULL default '', + user_email varchar(100) NOT NULL default '', + registered datetime NOT NULL default '0000-00-00 00:00:00', + activated datetime NOT NULL default '0000-00-00 00:00:00', + active tinyint(1) NOT NULL default '0', + activation_key varchar(50) NOT NULL default '', + meta longtext, + KEY activation_key (activation_key), + KEY domain (domain) ) $charset_collate;"; + switch ( $scope ) { + case 'blog' : + $queries = $blog_tables; + break; + case 'global' : + $queries = $global_tables; + if ( $is_multisite ) + $queries .= $ms_global_tables; + break; + case 'ms_global' : + $queries = $ms_global_tables; + break; + default: + case 'all' : + $queries = $global_tables . $blog_tables; + if ( $is_multisite ) + $queries .= $ms_global_tables; + break; + } + + if ( isset( $old_blog_id ) ) + $wpdb->set_blog_id( $old_blog_id ); + + return $queries; +} + +// Populate for back compat. +$wp_queries = wp_get_db_schema( 'all' ); + /** * Create WordPress options and set the default values. * @@ -623,6 +769,21 @@ function populate_roles_300() { } } +/** + * Install Network. + * + * @since 3.0.0 + * + */ +if ( !function_exists( 'install_network' ) ) : +function install_network() { + if ( ! defined( 'WP_INSTALLING_NETWORK' ) ) + define( 'WP_INSTALLING_NETWORK', true ); + + dbDelta( wp_get_db_schema( 'global' ) ); +} +endif; + /** * populate network settings * diff --git a/wp-admin/includes/upgrade.php b/wp-admin/includes/upgrade.php index 6b798252b..365258f7b 100644 --- a/wp-admin/includes/upgrade.php +++ b/wp-admin/includes/upgrade.php @@ -1424,9 +1424,12 @@ function deslash($content) { * @param unknown_type $execute * @return unknown */ -function dbDelta($queries, $execute = true) { +function dbDelta( $queries = '', $execute = true ) { global $wpdb; + if ( in_array( $queries, array( '', 'all', 'blog', 'global', 'ms_global' ), true ) ) + $queries = wp_get_db_schema( $queries ); + // Separate individual queries into an array if ( !is_array($queries) ) { $queries = explode( ';', $queries ); @@ -1631,10 +1634,8 @@ function dbDelta($queries, $execute = true) { * * @since 1.5.0 */ -function make_db_current() { - global $wp_queries; - - $alterations = dbDelta($wp_queries); +function make_db_current( $tables = 'all' ) { + $alterations = dbDelta( $tables ); echo "
    \n"; foreach($alterations as $alteration) echo "
  1. $alteration
  2. \n"; echo "
\n"; @@ -1647,10 +1648,8 @@ function make_db_current() { * * @since 1.5.0 */ -function make_db_current_silent() { - global $wp_queries; - - $alterations = dbDelta($wp_queries); +function make_db_current_silent( $tables = 'all' ) { + $alterations = dbDelta( $tables ); } /** @@ -1932,102 +1931,6 @@ function pre_schema_upgrade() { } -/** - * Install Network. - * - * @since 3.0.0 - * - */ -if ( !function_exists( 'install_network' ) ) : -function install_network() { - global $wpdb, $charset_collate; - $ms_queries = " -CREATE TABLE $wpdb->users ( - ID bigint(20) unsigned NOT NULL auto_increment, - user_login varchar(60) NOT NULL default '', - user_pass varchar(64) NOT NULL default '', - user_nicename varchar(50) NOT NULL default '', - user_email varchar(100) NOT NULL default '', - user_url varchar(100) NOT NULL default '', - user_registered datetime NOT NULL default '0000-00-00 00:00:00', - user_activation_key varchar(60) NOT NULL default '', - user_status int(11) NOT NULL default '0', - display_name varchar(250) NOT NULL default '', - spam tinyint(2) NOT NULL default '0', - deleted tinyint(2) NOT NULL default '0', - PRIMARY KEY (ID), - KEY user_login_key (user_login), - KEY user_nicename (user_nicename) -) $charset_collate; -CREATE TABLE $wpdb->blogs ( - blog_id bigint(20) NOT NULL auto_increment, - site_id bigint(20) NOT NULL default '0', - domain varchar(200) NOT NULL default '', - path varchar(100) NOT NULL default '', - registered datetime NOT NULL default '0000-00-00 00:00:00', - last_updated datetime NOT NULL default '0000-00-00 00:00:00', - public tinyint(2) NOT NULL default '1', - archived enum('0','1') NOT NULL default '0', - mature tinyint(2) NOT NULL default '0', - spam tinyint(2) NOT NULL default '0', - deleted tinyint(2) NOT NULL default '0', - lang_id int(11) NOT NULL default '0', - PRIMARY KEY (blog_id), - KEY domain (domain(50),path(5)), - KEY lang_id (lang_id) -) $charset_collate; -CREATE TABLE $wpdb->blog_versions ( - blog_id bigint(20) NOT NULL default '0', - db_version varchar(20) NOT NULL default '', - last_updated datetime NOT NULL default '0000-00-00 00:00:00', - PRIMARY KEY (blog_id), - KEY db_version (db_version) -) $charset_collate; -CREATE TABLE $wpdb->registration_log ( - ID bigint(20) NOT NULL auto_increment, - email varchar(255) NOT NULL default '', - IP varchar(30) NOT NULL default '', - blog_id bigint(20) NOT NULL default '0', - date_registered datetime NOT NULL default '0000-00-00 00:00:00', - PRIMARY KEY (ID), - KEY IP (IP) -) $charset_collate; -CREATE TABLE $wpdb->site ( - id bigint(20) NOT NULL auto_increment, - domain varchar(200) NOT NULL default '', - path varchar(100) NOT NULL default '', - PRIMARY KEY (id), - KEY domain (domain,path) -) $charset_collate; -CREATE TABLE $wpdb->sitemeta ( - meta_id bigint(20) NOT NULL auto_increment, - site_id bigint(20) NOT NULL default '0', - meta_key varchar(255) default NULL, - meta_value longtext, - PRIMARY KEY (meta_id), - KEY meta_key (meta_key), - KEY site_id (site_id) -) $charset_collate; -CREATE TABLE $wpdb->signups ( - domain varchar(200) NOT NULL default '', - path varchar(100) NOT NULL default '', - title longtext NOT NULL, - user_login varchar(60) NOT NULL default '', - user_email varchar(100) NOT NULL default '', - registered datetime NOT NULL default '0000-00-00 00:00:00', - activated datetime NOT NULL default '0000-00-00 00:00:00', - active tinyint(1) NOT NULL default '0', - activation_key varchar(50) NOT NULL default '', - meta longtext, - KEY activation_key (activation_key), - KEY domain (domain) -) $charset_collate; -"; -// now create tables - dbDelta( $ms_queries ); -} -endif; - /** * Install global terms. * diff --git a/wp-admin/network.php b/wp-admin/network.php index c85492458..7ebaa91c2 100644 --- a/wp-admin/network.php +++ b/wp-admin/network.php @@ -10,7 +10,7 @@ * @subpackage Administration */ -define( 'WP_NETWORK_ADMIN_PAGE', true ); +define( 'WP_INSTALLING_NETWORK', true ); /** WordPress Administration Bootstrap */ require_once( './admin.php' ); diff --git a/wp-includes/l10n.php b/wp-includes/l10n.php index 50cf57890..94534c4e5 100644 --- a/wp-includes/l10n.php +++ b/wp-includes/l10n.php @@ -382,7 +382,7 @@ function load_default_textdomain() { load_textdomain( 'default', WP_LANG_DIR . "/$locale.mo" ); - if ( is_multisite() || ( defined( 'WP_NETWORK_ADMIN_PAGE' ) && WP_NETWORK_ADMIN_PAGE ) ) { + if ( is_multisite() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK ) ) { load_textdomain( 'default', WP_LANG_DIR . "/ms-$locale.mo" ); } } diff --git a/wp-includes/ms-functions.php b/wp-includes/ms-functions.php index eda032f5c..8ebb0698b 100644 --- a/wp-includes/ms-functions.php +++ b/wp-includes/ms-functions.php @@ -1172,7 +1172,7 @@ function install_blog($blog_id, $blog_title = '') { $url = get_blogaddress_by_id($blog_id); // Set everything up - make_db_current_silent(); + make_db_current_silent( 'blog' ); populate_options(); populate_roles(); $wp_roles->_init();