(no commit message)
[opensuse:news_o_o.git] / wp-admin / includes / upgrade.php
1 <?php
2 /**
3  * WordPress Upgrade API
4  *
5  * Most of the functions are pluggable and can be overwritten
6  *
7  * @package WordPress
8  * @subpackage Administration
9  */
10
11 /** Include user install customize script. */
12 if ( file_exists(WP_CONTENT_DIR . '/install.php') )
13         require (WP_CONTENT_DIR . '/install.php');
14
15 /** WordPress Administration API */
16 require_once(ABSPATH . 'wp-admin/includes/admin.php');
17
18 /** WordPress Schema API */
19 require_once(ABSPATH . 'wp-admin/includes/schema.php');
20
21 if ( !function_exists('wp_install') ) :
22 /**
23  * Installs the blog
24  *
25  * {@internal Missing Long Description}}
26  *
27  * @since unknown
28  *
29  * @param string $blog_title Blog title.
30  * @param string $user_name User's username.
31  * @param string $user_email User's email.
32  * @param bool $public Whether blog is public.
33  * @param null $deprecated Optional. Not used.
34  * @param string $user_password Optional. User's chosen password. Will default to a random password.
35  * @return array Array keys 'url', 'user_id', 'password', 'password_message'.
36  */
37 function wp_install( $blog_title, $user_name, $user_email, $public, $deprecated = '', $user_password = '' ) {
38         global $wp_rewrite;
39
40         if ( !empty( $deprecated ) )
41                 _deprecated_argument( __FUNCTION__, '2.6' );
42
43         wp_check_mysql_version();
44         wp_cache_flush();
45         make_db_current_silent();
46         populate_options();
47         populate_roles();
48
49         update_option('blogname', $blog_title);
50         update_option('admin_email', $user_email);
51         update_option('blog_public', $public);
52
53         $guessurl = wp_guess_url();
54
55         update_option('siteurl', $guessurl);
56
57         // If not a public blog, don't ping.
58         if ( ! $public )
59                 update_option('default_pingback_flag', 0);
60
61         // Create default user.  If the user already exists, the user tables are
62         // being shared among blogs.  Just set the role in that case.
63         $user_id = username_exists($user_name);
64         $user_password = trim($user_password);
65         $email_password = false;
66         if ( !$user_id && empty($user_password) ) {
67                 $user_password = wp_generate_password();
68                 $message = __('<strong><em>Note that password</em></strong> carefully! It is a <em>random</em> password that was generated just for you.');
69                 $user_id = wp_create_user($user_name, $user_password, $user_email);
70                 update_user_option($user_id, 'default_password_nag', true, true);
71                 $email_password = true;
72         } else if ( !$user_id ) {
73                 // Password has been provided
74                 $message = '<em>'.__('Your chosen password.').'</em>';
75                 $user_id = wp_create_user($user_name, $user_password, $user_email);
76         } else {
77                 $message =  __('User already exists. Password inherited.');
78         }
79
80         $user = new WP_User($user_id);
81         $user->set_role('administrator');
82
83         wp_install_defaults($user_id);
84
85         $wp_rewrite->flush_rules();
86
87         wp_new_blog_notification($blog_title, $guessurl, $user_id, ($email_password ? $user_password : __('The password you chose during the install.') ) );
88
89         wp_cache_flush();
90
91         return array('url' => $guessurl, 'user_id' => $user_id, 'password' => $user_password, 'password_message' => $message);
92 }
93 endif;
94
95 if ( !function_exists('wp_install_defaults') ) :
96 /**
97  * {@internal Missing Short Description}}
98  *
99  * {@internal Missing Long Description}}
100  *
101  * @since unknown
102  *
103  * @param int $user_id User ID.
104  */
105 function wp_install_defaults($user_id) {
106         global $wpdb, $wp_rewrite, $current_site, $table_prefix;
107
108         // Default category
109         $cat_name = __('Uncategorized');
110         /* translators: Default category slug */
111         $cat_slug = sanitize_title(_x('Uncategorized', 'Default category slug'));
112
113         if ( global_terms_enabled() ) {
114                 $cat_id = $wpdb->get_var( $wpdb->prepare( "SELECT cat_ID FROM {$wpdb->sitecategories} WHERE category_nicename = %s", $cat_slug ) );
115                 if ( $cat_id == null ) {
116                         $wpdb->insert( $wpdb->sitecategories, array('cat_ID' => 0, 'cat_name' => $cat_name, 'category_nicename' => $cat_slug, 'last_updated' => current_time('mysql', true)) );
117                         $cat_id = $wpdb->insert_id;
118                 }
119                 update_option('default_category', $cat_id);
120         } else {
121                 $cat_id = 1;
122         }
123
124         $wpdb->insert( $wpdb->terms, array('term_id' => $cat_id, 'name' => $cat_name, 'slug' => $cat_slug, 'term_group' => 0) );
125         $wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $cat_id, 'taxonomy' => 'category', 'description' => '', 'parent' => 0, 'count' => 1));
126         $cat_tt_id = $wpdb->insert_id;
127
128         // Default link category
129         $cat_name = __('Blogroll');
130         /* translators: Default link category slug */
131         $cat_slug = sanitize_title(_x('Blogroll', 'Default link category slug'));
132
133         if ( global_terms_enabled() ) {
134                 $blogroll_id = $wpdb->get_var( $wpdb->prepare( "SELECT cat_ID FROM {$wpdb->sitecategories} WHERE category_nicename = %s", $cat_slug ) );
135                 if ( $blogroll_id == null ) {
136                         $wpdb->insert( $wpdb->sitecategories, array('cat_ID' => 0, 'cat_name' => $cat_name, 'category_nicename' => $cat_slug, 'last_updated' => current_time('mysql', true)) );
137                         $blogroll_id = $wpdb->insert_id;
138                 }
139                 update_option('default_link_category', $blogroll_id);
140         } else {
141                 $blogroll_id = 2;
142         }
143
144         $wpdb->insert( $wpdb->terms, array('term_id' => $blogroll_id, 'name' => $cat_name, 'slug' => $cat_slug, 'term_group' => 0) );
145         $wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $blogroll_id, 'taxonomy' => 'link_category', 'description' => '', 'parent' => 0, 'count' => 7));
146         $blogroll_tt_id = $wpdb->insert_id;
147
148         // Now drop in some default links
149         $default_links = array();
150         $default_links[] = array(       'link_url' => 'http://codex.wordpress.org/',
151                                                                 'link_name' => 'Documentation',
152                                                                 'link_rss' => '',
153                                                                 'link_notes' => '');
154
155         $default_links[] = array(       'link_url' => 'http://wordpress.org/news/',
156                                                                 'link_name' => 'WordPress Blog',
157                                                                 'link_rss' => 'http://wordpress.org/news/feed/',
158                                                                 'link_notes' => '');
159
160         $default_links[] = array(       'link_url' => 'http://wordpress.org/extend/ideas/',
161                                                                 'link_name' => 'Suggest Ideas',
162                                                                 'link_rss' => '',
163                                                                 'link_notes' =>'');
164
165         $default_links[] = array(       'link_url' => 'http://wordpress.org/support/',
166                                                                 'link_name' => 'Support Forum',
167                                                                 'link_rss' => '',
168                                                                 'link_notes' =>'');
169
170         $default_links[] = array(       'link_url' => 'http://wordpress.org/extend/plugins/',
171                                                                 'link_name' => 'Plugins',
172                                                                 'link_rss' => '',
173                                                                 'link_notes' =>'');
174
175         $default_links[] = array(       'link_url' => 'http://wordpress.org/extend/themes/',
176                                                                 'link_name' => 'Themes',
177                                                                 'link_rss' => '',
178                                                                 'link_notes' =>'');
179
180         $default_links[] = array(       'link_url' => 'http://planet.wordpress.org/',
181                                                                 'link_name' => 'WordPress Planet',
182                                                                 'link_rss' => '',
183                                                                 'link_notes' =>'');
184
185         foreach ( $default_links as $link ) {
186                 $wpdb->insert( $wpdb->links, $link);
187                 $wpdb->insert( $wpdb->term_relationships, array('term_taxonomy_id' => $blogroll_tt_id, 'object_id' => $wpdb->insert_id) );
188         }
189
190         // First post
191         $now = date('Y-m-d H:i:s');
192         $now_gmt = gmdate('Y-m-d H:i:s');
193         $first_post_guid = get_option('home') . '/?p=1';
194
195         if ( is_multisite() ) {
196                 $first_post = get_site_option( 'first_post' );
197
198                 if ( empty($first_post) )
199                         $first_post = stripslashes( __( 'Welcome to <a href="SITE_URL">SITE_NAME</a>. This is your first post. Edit or delete it, then start blogging!' ) );
200
201                 $first_post = str_replace( "SITE_URL", esc_url( network_home_url() ), $first_post );
202                 $first_post = str_replace( "SITE_NAME", $current_site->site_name, $first_post );
203         } else {
204                 $first_post = __('Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!');
205         }
206
207         $wpdb->insert( $wpdb->posts, array(
208                                                                 'post_author' => $user_id,
209                                                                 'post_date' => $now,
210                                                                 'post_date_gmt' => $now_gmt,
211                                                                 'post_content' => $first_post,
212                                                                 'post_excerpt' => '',
213                                                                 'post_title' => __('Hello world!'),
214                                                                 /* translators: Default post slug */
215                                                                 'post_name' => sanitize_title( _x('hello-world', 'Default post slug') ),
216                                                                 'post_modified' => $now,
217                                                                 'post_modified_gmt' => $now_gmt,
218                                                                 'guid' => $first_post_guid,
219                                                                 'comment_count' => 1,
220                                                                 'to_ping' => '',
221                                                                 'pinged' => '',
222                                                                 'post_content_filtered' => ''
223                                                                 ));
224         $wpdb->insert( $wpdb->term_relationships, array('term_taxonomy_id' => $cat_tt_id, 'object_id' => 1) );
225
226         // Default comment
227         $first_comment_author = __('Mr WordPress');
228         $first_comment_url = 'http://wordpress.org/';
229         $first_comment = __('Hi, this is a comment.<br />To delete a comment, just log in and view the post&#039;s comments. There you will have the option to edit or delete them.');
230         if ( is_multisite() ) {
231                 $first_comment_author = get_site_option( 'first_comment_author', $first_comment_author );
232                 $first_comment_url = get_site_option( 'first_comment_url', network_home_url() );
233                 $first_comment = get_site_option( 'first_comment', $first_comment );
234         }
235         $wpdb->insert( $wpdb->comments, array(
236                                                                 'comment_post_ID' => 1,
237                                                                 'comment_author' => $first_comment_author,
238                                                                 'comment_author_email' => '',
239                                                                 'comment_author_url' => $first_comment_url,
240                                                                 'comment_date' => $now,
241                                                                 'comment_date_gmt' => $now_gmt,
242                                                                 'comment_content' => $first_comment
243                                                                 ));
244
245         // First Page
246         $first_page = __('This is an example of a WordPress page, you could edit this to put information about yourself or your site so readers know where you are coming from. You can create as many pages like this one or sub-pages as you like and manage all of your content inside of WordPress.');
247         if ( is_multisite() )
248                 $first_page = get_site_option( 'first_page', $first_page );
249         $first_post_guid = get_option('home') . '/?page_id=2';
250         $wpdb->insert( $wpdb->posts, array(
251                                                                 'post_author' => $user_id,
252                                                                 'post_date' => $now,
253                                                                 'post_date_gmt' => $now_gmt,
254                                                                 'post_content' => $first_page,
255                                                                 'post_excerpt' => '',
256                                                                 'post_title' => __('About'),
257                                                                 /* translators: Default page slug */
258                                                                 'post_name' => _x('about', 'Default page slug'),
259                                                                 'post_modified' => $now,
260                                                                 'post_modified_gmt' => $now_gmt,
261                                                                 'guid' => $first_post_guid,
262                                                                 'post_type' => 'page',
263                                                                 'to_ping' => '',
264                                                                 'pinged' => '',
265                                                                 'post_content_filtered' => ''
266                                                                 ));
267         $wpdb->insert( $wpdb->postmeta, array( 'post_id' => 2, 'meta_key' => '_wp_page_template', 'meta_value' => 'default' ) );
268
269         // Setup default widgets for default theme.
270         update_option( 'widget_search', array ( 2 => array ( 'title' => '' ), '_multiwidget' => 1 ) );
271         update_option( 'widget_recent-posts', array ( 2 => array ( 'title' => '', 'number' => 5 ), '_multiwidget' => 1 ) );
272         update_option( 'widget_recent-comments', array ( 2 => array ( 'title' => '', 'number' => 5 ), '_multiwidget' => 1 ) );
273         update_option( 'widget_archives', array ( 2 => array ( 'title' => '', 'count' => 0, 'dropdown' => 0 ), '_multiwidget' => 1 ) );
274         update_option( 'widget_categories', array ( 2 => array ( 'title' => '', 'count' => 0, 'hierarchical' => 0, 'dropdown' => 0 ), '_multiwidget' => 1 ) );
275         update_option( 'widget_meta', array ( 2 => array ( 'title' => '' ), '_multiwidget' => 1 ) );
276         update_option( 'sidebars_widgets', array ( 'wp_inactive_widgets' => array ( ), 'primary-widget-area' => array ( 0 => 'search-2', 1 => 'recent-posts-2', 2 => 'recent-comments-2', 3 => 'archives-2', 4 => 'categories-2', 5 => 'meta-2', ), 'secondary-widget-area' => array ( ), 'first-footer-widget-area' => array ( ), 'second-footer-widget-area' => array ( ), 'third-footer-widget-area' => array ( ), 'fourth-footer-widget-area' => array ( ), 'array_version' => 3 ) );
277
278         if ( is_multisite() ) {
279                 // Flush rules to pick up the new page.
280                 $wp_rewrite->init();
281                 $wp_rewrite->flush_rules();
282
283                 $user = new WP_User($user_id);
284                 $wpdb->update( $wpdb->options, array('option_value' => $user->user_email), array('option_name' => 'admin_email') );
285
286                 // Remove all perms except for the login user.
287                 $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s", $user_id, $table_prefix.'user_level') );
288                 $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s", $user_id, $table_prefix.'capabilities') );
289
290                 // Delete any caps that snuck into the previously active blog. (Hardcoded to blog 1 for now.) TODO: Get previous_blog_id.
291                 if ( !is_super_admin( $user_id ) && $user_id != 1 )
292                         $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $wpdb->base_prefix.'1_capabilities') );
293         }
294 }
295 endif;
296
297 if ( !function_exists('wp_new_blog_notification') ) :
298 /**
299  * {@internal Missing Short Description}}
300  *
301  * {@internal Missing Long Description}}
302  *
303  * @since unknown
304  *
305  * @param string $blog_title Blog title.
306  * @param string $blog_url Blog url.
307  * @param int $user_id User ID.
308  * @param string $password User's Password.
309  */
310 function wp_new_blog_notification($blog_title, $blog_url, $user_id, $password) {
311         $user = new WP_User($user_id);
312         $email = $user->user_email;
313         $name = $user->user_login;
314         $message = sprintf(__("Your new WordPress site has been successfully set up at:
315
316 %1\$s
317
318 You can log in to the administrator account with the following information:
319
320 Username: %2\$s
321 Password: %3\$s
322
323 We hope you enjoy your new site. Thanks!
324
325 --The WordPress Team
326 http://wordpress.org/
327 "), $blog_url, $name, $password);
328
329         @wp_mail($email, __('New WordPress Site'), $message);
330 }
331 endif;
332
333 if ( !function_exists('wp_upgrade') ) :
334 /**
335  * Run WordPress Upgrade functions.
336  *
337  * {@internal Missing Long Description}}
338  *
339  * @since unknown
340  *
341  * @return null
342  */
343 function wp_upgrade() {
344         global $wp_current_db_version, $wp_db_version, $wpdb;
345
346         $wp_current_db_version = __get_option('db_version');
347
348         // We are up-to-date.  Nothing to do.
349         if ( $wp_db_version == $wp_current_db_version )
350                 return;
351
352         if ( ! is_blog_installed() )
353                 return;
354
355         wp_check_mysql_version();
356         wp_cache_flush();
357         pre_schema_upgrade();
358         make_db_current_silent();
359         upgrade_all();
360         if ( is_multisite() && is_main_site() )
361                 upgrade_network();
362         wp_cache_flush();
363
364         if ( is_multisite() ) {
365                 if ( $wpdb->get_row( "SELECT blog_id FROM {$wpdb->blog_versions} WHERE blog_id = '{$wpdb->blogid}'" ) )
366                         $wpdb->query( "UPDATE {$wpdb->blog_versions} SET db_version = '{$wp_db_version}' WHERE blog_id = '{$wpdb->blogid}'" );
367                 else
368                         $wpdb->query( "INSERT INTO {$wpdb->blog_versions} ( `blog_id` , `db_version` , `last_updated` ) VALUES ( '{$wpdb->blogid}', '{$wp_db_version}', NOW());" );
369         }
370 }
371 endif;
372
373 /**
374  * Functions to be called in install and upgrade scripts.
375  *
376  * {@internal Missing Long Description}}
377  *
378  * @since unknown
379  */
380 function upgrade_all() {
381         global $wp_current_db_version, $wp_db_version, $wp_rewrite;
382         $wp_current_db_version = __get_option('db_version');
383
384         // We are up-to-date.  Nothing to do.
385         if ( $wp_db_version == $wp_current_db_version )
386                 return;
387
388         // If the version is not set in the DB, try to guess the version.
389         if ( empty($wp_current_db_version) ) {
390                 $wp_current_db_version = 0;
391
392                 // If the template option exists, we have 1.5.
393                 $template = __get_option('template');
394                 if ( !empty($template) )
395                         $wp_current_db_version = 2541;
396         }
397
398         if ( $wp_current_db_version < 6039 )
399                 upgrade_230_options_table();
400
401         populate_options();
402
403         if ( $wp_current_db_version < 2541 ) {
404                 upgrade_100();
405                 upgrade_101();
406                 upgrade_110();
407                 upgrade_130();
408         }
409
410         if ( $wp_current_db_version < 3308 )
411                 upgrade_160();
412
413         if ( $wp_current_db_version < 4772 )
414                 upgrade_210();
415
416         if ( $wp_current_db_version < 4351 )
417                 upgrade_old_slugs();
418
419         if ( $wp_current_db_version < 5539 )
420                 upgrade_230();
421
422         if ( $wp_current_db_version < 6124 )
423                 upgrade_230_old_tables();
424
425         if ( $wp_current_db_version < 7499 )
426                 upgrade_250();
427
428         if ( $wp_current_db_version < 7935 )
429                 upgrade_252();
430
431         if ( $wp_current_db_version < 8201 )
432                 upgrade_260();
433
434         if ( $wp_current_db_version < 8989 )
435                 upgrade_270();
436
437         if ( $wp_current_db_version < 10360 )
438                 upgrade_280();
439
440         if ( $wp_current_db_version < 11958 )
441                 upgrade_290();
442
443         if ( $wp_current_db_version < 15260 )
444                 upgrade_300();
445
446         maybe_disable_automattic_widgets();
447
448         update_option( 'db_version', $wp_db_version );
449         update_option( 'db_upgraded', true );
450 }
451
452 /**
453  * Execute changes made in WordPress 1.0.
454  *
455  * @since 1.0.0
456  */
457 function upgrade_100() {
458         global $wpdb;
459
460         // Get the title and ID of every post, post_name to check if it already has a value
461         $posts = $wpdb->get_results("SELECT ID, post_title, post_name FROM $wpdb->posts WHERE post_name = ''");
462         if ($posts) {
463                 foreach($posts as $post) {
464                         if ('' == $post->post_name) {
465                                 $newtitle = sanitize_title($post->post_title);
466                                 $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_name = %s WHERE ID = %d", $newtitle, $post->ID) );
467                         }
468                 }
469         }
470
471         $categories = $wpdb->get_results("SELECT cat_ID, cat_name, category_nicename FROM $wpdb->categories");
472         foreach ($categories as $category) {
473                 if ('' == $category->category_nicename) {
474                         $newtitle = sanitize_title($category->cat_name);
475                         $wpdb>update( $wpdb->categories, array('category_nicename' => $newtitle), array('cat_ID' => $category->cat_ID) );
476                 }
477         }
478
479         $wpdb->query("UPDATE $wpdb->options SET option_value = REPLACE(option_value, 'wp-links/links-images/', 'wp-images/links/')
480         WHERE option_name LIKE 'links_rating_image%'
481         AND option_value LIKE 'wp-links/links-images/%'");
482
483         $done_ids = $wpdb->get_results("SELECT DISTINCT post_id FROM $wpdb->post2cat");
484         if ($done_ids) :
485                 foreach ($done_ids as $done_id) :
486                         $done_posts[] = $done_id->post_id;
487                 endforeach;
488                 $catwhere = ' AND ID NOT IN (' . implode(',', $done_posts) . ')';
489         else:
490                 $catwhere = '';
491         endif;
492
493         $allposts = $wpdb->get_results("SELECT ID, post_category FROM $wpdb->posts WHERE post_category != '0' $catwhere");
494         if ($allposts) :
495                 foreach ($allposts as $post) {
496                         // Check to see if it's already been imported
497                         $cat = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->post2cat WHERE post_id = %d AND category_id = %d", $post->ID, $post->post_category) );
498                         if (!$cat && 0 != $post->post_category) { // If there's no result
499                                 $wpdb->insert( $wpdb->post2cat, array('post_id' => $post->ID, 'category_id' => $post->post_category) );
500                         }
501                 }
502         endif;
503 }
504
505 /**
506  * Execute changes made in WordPress 1.0.1.
507  *
508  * @since 1.0.1
509  */
510 function upgrade_101() {
511         global $wpdb;
512
513         // Clean up indices, add a few
514         add_clean_index($wpdb->posts, 'post_name');
515         add_clean_index($wpdb->posts, 'post_status');
516         add_clean_index($wpdb->categories, 'category_nicename');
517         add_clean_index($wpdb->comments, 'comment_approved');
518         add_clean_index($wpdb->comments, 'comment_post_ID');
519         add_clean_index($wpdb->links , 'link_category');
520         add_clean_index($wpdb->links , 'link_visible');
521 }
522
523 /**
524  * Execute changes made in WordPress 1.2.
525  *
526  * @since 1.2.0
527  */
528 function upgrade_110() {
529         global $wpdb;
530
531         // Set user_nicename.
532         $users = $wpdb->get_results("SELECT ID, user_nickname, user_nicename FROM $wpdb->users");
533         foreach ($users as $user) {
534                 if ('' == $user->user_nicename) {
535                         $newname = sanitize_title($user->user_nickname);
536                         $wpdb->update( $wpdb->users, array('user_nicename' => $newname), array('ID' => $user->ID) );
537                 }
538         }
539
540         $users = $wpdb->get_results("SELECT ID, user_pass from $wpdb->users");
541         foreach ($users as $row) {
542                 if (!preg_match('/^[A-Fa-f0-9]{32}$/', $row->user_pass)) {
543                         $wpdb->update( $wpdb->users, array('user_pass' => md5($row->user_pass)), array('ID' => $row->ID) );
544                 }
545         }
546
547         // Get the GMT offset, we'll use that later on
548         $all_options = get_alloptions_110();
549
550         $time_difference = $all_options->time_difference;
551
552         $server_time = time()+date('Z');
553         $weblogger_time = $server_time + $time_difference*3600;
554         $gmt_time = time();
555
556         $diff_gmt_server = ($gmt_time - $server_time) / 3600;
557         $diff_weblogger_server = ($weblogger_time - $server_time) / 3600;
558         $diff_gmt_weblogger = $diff_gmt_server - $diff_weblogger_server;
559         $gmt_offset = -$diff_gmt_weblogger;
560
561         // Add a gmt_offset option, with value $gmt_offset
562         add_option('gmt_offset', $gmt_offset);
563
564         // Check if we already set the GMT fields (if we did, then
565         // MAX(post_date_gmt) can't be '0000-00-00 00:00:00'
566         // <michel_v> I just slapped myself silly for not thinking about it earlier
567         $got_gmt_fields = ! ($wpdb->get_var("SELECT MAX(post_date_gmt) FROM $wpdb->posts") == '0000-00-00 00:00:00');
568
569         if (!$got_gmt_fields) {
570
571                 // Add or substract time to all dates, to get GMT dates
572                 $add_hours = intval($diff_gmt_weblogger);
573                 $add_minutes = intval(60 * ($diff_gmt_weblogger - $add_hours));
574                 $wpdb->query("UPDATE $wpdb->posts SET post_date_gmt = DATE_ADD(post_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
575                 $wpdb->query("UPDATE $wpdb->posts SET post_modified = post_date");
576                 $wpdb->query("UPDATE $wpdb->posts SET post_modified_gmt = DATE_ADD(post_modified, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE) WHERE post_modified != '0000-00-00 00:00:00'");
577                 $wpdb->query("UPDATE $wpdb->comments SET comment_date_gmt = DATE_ADD(comment_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
578                 $wpdb->query("UPDATE $wpdb->users SET user_registered = DATE_ADD(user_registered, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
579         }
580
581 }
582
583 /**
584  * Execute changes made in WordPress 1.5.
585  *
586  * @since 1.5.0
587  */
588 function upgrade_130() {
589         global $wpdb;
590
591         // Remove extraneous backslashes.
592         $posts = $wpdb->get_results("SELECT ID, post_title, post_content, post_excerpt, guid, post_date, post_name, post_status, post_author FROM $wpdb->posts");
593         if ($posts) {
594                 foreach($posts as $post) {
595                         $post_content = addslashes(deslash($post->post_content));
596                         $post_title = addslashes(deslash($post->post_title));
597                         $post_excerpt = addslashes(deslash($post->post_excerpt));
598                         if ( empty($post->guid) )
599                                 $guid = get_permalink($post->ID);
600                         else
601                                 $guid = $post->guid;
602
603                         $wpdb->update( $wpdb->posts, compact('post_title', 'post_content', 'post_excerpt', 'guid'), array('ID' => $post->ID) );
604
605                 }
606         }
607
608         // Remove extraneous backslashes.
609         $comments = $wpdb->get_results("SELECT comment_ID, comment_author, comment_content FROM $wpdb->comments");
610         if ($comments) {
611                 foreach($comments as $comment) {
612                         $comment_content = deslash($comment->comment_content);
613                         $comment_author = deslash($comment->comment_author);
614
615                         $wpdb->update($wpdb->comments, compact('comment_content', 'comment_author'), array('comment_ID' => $comment->comment_ID) );
616                 }
617         }
618
619         // Remove extraneous backslashes.
620         $links = $wpdb->get_results("SELECT link_id, link_name, link_description FROM $wpdb->links");
621         if ($links) {
622                 foreach($links as $link) {
623                         $link_name = deslash($link->link_name);
624                         $link_description = deslash($link->link_description);
625
626                         $wpdb->update( $wpdb->links, compact('link_name', 'link_description'), array('link_id' => $link->link_id) );
627                 }
628         }
629
630         $active_plugins = __get_option('active_plugins');
631
632         // If plugins are not stored in an array, they're stored in the old
633         // newline separated format.  Convert to new format.
634         if ( !is_array( $active_plugins ) ) {
635                 $active_plugins = explode("\n", trim($active_plugins));
636                 update_option('active_plugins', $active_plugins);
637         }
638
639         // Obsolete tables
640         $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optionvalues');
641         $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiontypes');
642         $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroups');
643         $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroup_options');
644
645         // Update comments table to use comment_type
646         $wpdb->query("UPDATE $wpdb->comments SET comment_type='trackback', comment_content = REPLACE(comment_content, '<trackback />', '') WHERE comment_content LIKE '<trackback />%'");
647         $wpdb->query("UPDATE $wpdb->comments SET comment_type='pingback', comment_content = REPLACE(comment_content, '<pingback />', '') WHERE comment_content LIKE '<pingback />%'");
648
649         // Some versions have multiple duplicate option_name rows with the same values
650         $options = $wpdb->get_results("SELECT option_name, COUNT(option_name) AS dupes FROM `$wpdb->options` GROUP BY option_name");
651         foreach ( $options as $option ) {
652                 if ( 1 != $option->dupes ) { // Could this be done in the query?
653                         $limit = $option->dupes - 1;
654                         $dupe_ids = $wpdb->get_col( $wpdb->prepare("SELECT option_id FROM $wpdb->options WHERE option_name = %s LIMIT %d", $option->option_name, $limit) );
655                         if ( $dupe_ids ) {
656                                 $dupe_ids = join($dupe_ids, ',');
657                                 $wpdb->query("DELETE FROM $wpdb->options WHERE option_id IN ($dupe_ids)");
658                         }
659                 }
660         }
661
662         make_site_theme();
663 }
664
665 /**
666  * Execute changes made in WordPress 2.0.
667  *
668  * @since 2.0.0
669  */
670 function upgrade_160() {
671         global $wpdb, $wp_current_db_version;
672
673         populate_roles_160();
674
675         $users = $wpdb->get_results("SELECT * FROM $wpdb->users");
676         foreach ( $users as $user ) :
677                 if ( !empty( $user->user_firstname ) )
678                         update_user_meta( $user->ID, 'first_name', $wpdb->escape($user->user_firstname) );
679                 if ( !empty( $user->user_lastname ) )
680                         update_user_meta( $user->ID, 'last_name', $wpdb->escape($user->user_lastname) );
681                 if ( !empty( $user->user_nickname ) )
682                         update_user_meta( $user->ID, 'nickname', $wpdb->escape($user->user_nickname) );
683                 if ( !empty( $user->user_level ) )
684                         update_user_meta( $user->ID, $wpdb->prefix . 'user_level', $user->user_level );
685                 if ( !empty( $user->user_icq ) )
686                         update_user_meta( $user->ID, 'icq', $wpdb->escape($user->user_icq) );
687                 if ( !empty( $user->user_aim ) )
688                         update_user_meta( $user->ID, 'aim', $wpdb->escape($user->user_aim) );
689                 if ( !empty( $user->user_msn ) )
690                         update_user_meta( $user->ID, 'msn', $wpdb->escape($user->user_msn) );
691                 if ( !empty( $user->user_yim ) )
692                         update_user_meta( $user->ID, 'yim', $wpdb->escape($user->user_icq) );
693                 if ( !empty( $user->user_description ) )
694                         update_user_meta( $user->ID, 'description', $wpdb->escape($user->user_description) );
695
696                 if ( isset( $user->user_idmode ) ):
697                         $idmode = $user->user_idmode;
698                         if ($idmode == 'nickname') $id = $user->user_nickname;
699                         if ($idmode == 'login') $id = $user->user_login;
700                         if ($idmode == 'firstname') $id = $user->user_firstname;
701                         if ($idmode == 'lastname') $id = $user->user_lastname;
702                         if ($idmode == 'namefl') $id = $user->user_firstname.' '.$user->user_lastname;
703                         if ($idmode == 'namelf') $id = $user->user_lastname.' '.$user->user_firstname;
704                         if (!$idmode) $id = $user->user_nickname;
705                         $wpdb->update( $wpdb->users, array('display_name' => $id), array('ID' => $user->ID) );
706                 endif;
707
708                 // FIXME: RESET_CAPS is temporary code to reset roles and caps if flag is set.
709                 $caps = get_user_meta( $user->ID, $wpdb->prefix . 'capabilities');
710                 if ( empty($caps) || defined('RESET_CAPS') ) {
711                         $level = get_user_meta($user->ID, $wpdb->prefix . 'user_level', true);
712                         $role = translate_level_to_role($level);
713                         update_user_meta( $user->ID, $wpdb->prefix . 'capabilities', array($role => true) );
714                 }
715
716         endforeach;
717         $old_user_fields = array( 'user_firstname', 'user_lastname', 'user_icq', 'user_aim', 'user_msn', 'user_yim', 'user_idmode', 'user_ip', 'user_domain', 'user_browser', 'user_description', 'user_nickname', 'user_level' );
718         $wpdb->hide_errors();
719         foreach ( $old_user_fields as $old )
720                 $wpdb->query("ALTER TABLE $wpdb->users DROP $old");
721         $wpdb->show_errors();
722
723         // populate comment_count field of posts table
724         $comments = $wpdb->get_results( "SELECT comment_post_ID, COUNT(*) as c FROM $wpdb->comments WHERE comment_approved = '1' GROUP BY comment_post_ID" );
725         if ( is_array( $comments ) )
726                 foreach ($comments as $comment)
727                         $wpdb->update( $wpdb->posts, array('comment_count' => $comment->c), array('ID' => $comment->comment_post_ID) );
728
729         // Some alpha versions used a post status of object instead of attachment and put
730         // the mime type in post_type instead of post_mime_type.
731         if ( $wp_current_db_version > 2541 && $wp_current_db_version <= 3091 ) {
732                 $objects = $wpdb->get_results("SELECT ID, post_type FROM $wpdb->posts WHERE post_status = 'object'");
733                 foreach ($objects as $object) {
734                         $wpdb->update( $wpdb->posts, array(     'post_status' => 'attachment',
735                                                                                                 'post_mime_type' => $object->post_type,
736                                                                                                 'post_type' => ''),
737                                                                                  array( 'ID' => $object->ID ) );
738
739                         $meta = get_post_meta($object->ID, 'imagedata', true);
740                         if ( ! empty($meta['file']) )
741                                 update_attached_file( $object->ID, $meta['file'] );
742                 }
743         }
744 }
745
746 /**
747  * Execute changes made in WordPress 2.1.
748  *
749  * @since 2.1.0
750  */
751 function upgrade_210() {
752         global $wpdb, $wp_current_db_version;
753
754         if ( $wp_current_db_version < 3506 ) {
755                 // Update status and type.
756                 $posts = $wpdb->get_results("SELECT ID, post_status FROM $wpdb->posts");
757
758                 if ( ! empty($posts) ) foreach ($posts as $post) {
759                         $status = $post->post_status;
760                         $type = 'post';
761
762                         if ( 'static' == $status ) {
763                                 $status = 'publish';
764                                 $type = 'page';
765                         } else if ( 'attachment' == $status ) {
766                                 $status = 'inherit';
767                                 $type = 'attachment';
768                         }
769
770                         $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_status = %s, post_type = %s WHERE ID = %d", $status, $type, $post->ID) );
771                 }
772         }
773
774         if ( $wp_current_db_version < 3845 ) {
775                 populate_roles_210();
776         }
777
778         if ( $wp_current_db_version < 3531 ) {
779                 // Give future posts a post_status of future.
780                 $now = gmdate('Y-m-d H:i:59');
781                 $wpdb->query ("UPDATE $wpdb->posts SET post_status = 'future' WHERE post_status = 'publish' AND post_date_gmt > '$now'");
782
783                 $posts = $wpdb->get_results("SELECT ID, post_date FROM $wpdb->posts WHERE post_status ='future'");
784                 if ( !empty($posts) )
785                         foreach ( $posts as $post )
786                                 wp_schedule_single_event(mysql2date('U', $post->post_date, false), 'publish_future_post', array($post->ID));
787         }
788 }
789
790 /**
791  * Execute changes made in WordPress 2.3.
792  *
793  * @since 2.3.0
794  */
795 function upgrade_230() {
796         global $wp_current_db_version, $wpdb;
797
798         if ( $wp_current_db_version < 5200 ) {
799                 populate_roles_230();
800         }
801
802         // Convert categories to terms.
803         $tt_ids = array();
804         $have_tags = false;
805         $categories = $wpdb->get_results("SELECT * FROM $wpdb->categories ORDER BY cat_ID");
806         foreach ($categories as $category) {
807                 $term_id = (int) $category->cat_ID;
808                 $name = $category->cat_name;
809                 $description = $category->category_description;
810                 $slug = $category->category_nicename;
811                 $parent = $category->category_parent;
812                 $term_group = 0;
813
814                 // Associate terms with the same slug in a term group and make slugs unique.
815                 if ( $exists = $wpdb->get_results( $wpdb->prepare("SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $slug) ) ) {
816                         $term_group = $exists[0]->term_group;
817                         $id = $exists[0]->term_id;
818                         $num = 2;
819                         do {
820                                 $alt_slug = $slug . "-$num";
821                                 $num++;
822                                 $slug_check = $wpdb->get_var( $wpdb->prepare("SELECT slug FROM $wpdb->terms WHERE slug = %s", $alt_slug) );
823                         } while ( $slug_check );
824
825                         $slug = $alt_slug;
826
827                         if ( empty( $term_group ) ) {
828                                 $term_group = $wpdb->get_var("SELECT MAX(term_group) FROM $wpdb->terms GROUP BY term_group") + 1;
829                                 $wpdb->query( $wpdb->prepare("UPDATE $wpdb->terms SET term_group = %d WHERE term_id = %d", $term_group, $id) );
830                         }
831                 }
832
833                 $wpdb->query( $wpdb->prepare("INSERT INTO $wpdb->terms (term_id, name, slug, term_group) VALUES
834                 (%d, %s, %s, %d)", $term_id, $name, $slug, $term_group) );
835
836                 $count = 0;
837                 if ( !empty($category->category_count) ) {
838                         $count = (int) $category->category_count;
839                         $taxonomy = 'category';
840                         $wpdb->query( $wpdb->prepare("INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ( %d, %s, %s, %d, %d)", $term_id, $taxonomy, $description, $parent, $count) );
841                         $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
842                 }
843
844                 if ( !empty($category->link_count) ) {
845                         $count = (int) $category->link_count;
846                         $taxonomy = 'link_category';
847                         $wpdb->query( $wpdb->prepare("INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ( %d, %s, %s, %d, %d)", $term_id, $taxonomy, $description, $parent, $count) );
848                         $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
849                 }
850
851                 if ( !empty($category->tag_count) ) {
852                         $have_tags = true;
853                         $count = (int) $category->tag_count;
854                         $taxonomy = 'post_tag';
855                         $wpdb->insert( $wpdb->term_taxonomy, compact('term_id', 'taxonomy', 'description', 'parent', 'count') );
856                         $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
857                 }
858
859                 if ( empty($count) ) {
860                         $count = 0;
861                         $taxonomy = 'category';
862                         $wpdb->insert( $wpdb->term_taxonomy, compact('term_id', 'taxonomy', 'description', 'parent', 'count') );
863                         $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
864                 }
865         }
866
867         $select = 'post_id, category_id';
868         if ( $have_tags )
869                 $select .= ', rel_type';
870
871         $posts = $wpdb->get_results("SELECT $select FROM $wpdb->post2cat GROUP BY post_id, category_id");
872         foreach ( $posts as $post ) {
873                 $post_id = (int) $post->post_id;
874                 $term_id = (int) $post->category_id;
875                 $taxonomy = 'category';
876                 if ( !empty($post->rel_type) && 'tag' == $post->rel_type)
877                         $taxonomy = 'tag';
878                 $tt_id = $tt_ids[$term_id][$taxonomy];
879                 if ( empty($tt_id) )
880                         continue;
881
882                 $wpdb->insert( $wpdb->term_relationships, array('object_id' => $post_id, 'term_taxonomy_id' => $tt_id) );
883         }
884
885         // < 3570 we used linkcategories.  >= 3570 we used categories and link2cat.
886         if ( $wp_current_db_version < 3570 ) {
887                 // Create link_category terms for link categories.  Create a map of link cat IDs
888                 // to link_category terms.
889                 $link_cat_id_map = array();
890                 $default_link_cat = 0;
891                 $tt_ids = array();
892                 $link_cats = $wpdb->get_results("SELECT cat_id, cat_name FROM " . $wpdb->prefix . 'linkcategories');
893                 foreach ( $link_cats as $category) {
894                         $cat_id = (int) $category->cat_id;
895                         $term_id = 0;
896                         $name = $wpdb->escape($category->cat_name);
897                         $slug = sanitize_title($name);
898                         $term_group = 0;
899
900                         // Associate terms with the same slug in a term group and make slugs unique.
901                         if ( $exists = $wpdb->get_results( $wpdb->prepare("SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $slug) ) ) {
902                                 $term_group = $exists[0]->term_group;
903                                 $term_id = $exists[0]->term_id;
904                         }
905
906                         if ( empty($term_id) ) {
907                                 $wpdb->insert( $wpdb->terms, compact('name', 'slug', 'term_group') );
908                                 $term_id = (int) $wpdb->insert_id;
909                         }
910
911                         $link_cat_id_map[$cat_id] = $term_id;
912                         $default_link_cat = $term_id;
913
914                         $wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $term_id, 'taxonomy' => 'link_category', 'description' => '', 'parent' => 0, 'count' => 0) );
915                         $tt_ids[$term_id] = (int) $wpdb->insert_id;
916                 }
917
918                 // Associate links to cats.
919                 $links = $wpdb->get_results("SELECT link_id, link_category FROM $wpdb->links");
920                 if ( !empty($links) ) foreach ( $links as $link ) {
921                         if ( 0 == $link->link_category )
922                                 continue;
923                         if ( ! isset($link_cat_id_map[$link->link_category]) )
924                                 continue;
925                         $term_id = $link_cat_id_map[$link->link_category];
926                         $tt_id = $tt_ids[$term_id];
927                         if ( empty($tt_id) )
928                                 continue;
929
930                         $wpdb->insert( $wpdb->term_relationships, array('object_id' => $link->link_id, 'term_taxonomy_id' => $tt_id) );
931                 }
932
933                 // Set default to the last category we grabbed during the upgrade loop.
934                 update_option('default_link_category', $default_link_cat);
935         } else {
936                 $links = $wpdb->get_results("SELECT link_id, category_id FROM $wpdb->link2cat GROUP BY link_id, category_id");
937                 foreach ( $links as $link ) {
938                         $link_id = (int) $link->link_id;
939                         $term_id = (int) $link->category_id;
940                         $taxonomy = 'link_category';
941                         $tt_id = $tt_ids[$term_id][$taxonomy];
942                         if ( empty($tt_id) )
943                                 continue;
944                         $wpdb->insert( $wpdb->term_relationships, array('object_id' => $link_id, 'term_taxonomy_id' => $tt_id) );
945                 }
946         }
947
948         if ( $wp_current_db_version < 4772 ) {
949                 // Obsolete linkcategories table
950                 $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'linkcategories');
951         }
952
953         // Recalculate all counts
954         $terms = $wpdb->get_results("SELECT term_taxonomy_id, taxonomy FROM $wpdb->term_taxonomy");
955         foreach ( (array) $terms as $term ) {
956                 if ( ('post_tag' == $term->taxonomy) || ('category' == $term->taxonomy) )
957                         $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type = 'post' AND term_taxonomy_id = %d", $term->term_taxonomy_id) );
958                 else
959                         $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $term->term_taxonomy_id) );
960                 $wpdb->update( $wpdb->term_taxonomy, array('count' => $count), array('term_taxonomy_id' => $term->term_taxonomy_id) );
961         }
962 }
963
964 /**
965  * Remove old options from the database.
966  *
967  * @since 2.3.0
968  */
969 function upgrade_230_options_table() {
970         global $wpdb;
971         $old_options_fields = array( 'option_can_override', 'option_type', 'option_width', 'option_height', 'option_description', 'option_admin_level' );
972         $wpdb->hide_errors();
973         foreach ( $old_options_fields as $old )
974                 $wpdb->query("ALTER TABLE $wpdb->options DROP $old");
975         $wpdb->show_errors();
976 }
977
978 /**
979  * Remove old categories, link2cat, and post2cat database tables.
980  *
981  * @since 2.3.0
982  */
983 function upgrade_230_old_tables() {
984         global $wpdb;
985         $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'categories');
986         $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'link2cat');
987         $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'post2cat');
988 }
989
990 /**
991  * Upgrade old slugs made in version 2.2.
992  *
993  * @since 2.2.0
994  */
995 function upgrade_old_slugs() {
996         // upgrade people who were using the Redirect Old Slugs plugin
997         global $wpdb;
998         $wpdb->query("UPDATE $wpdb->postmeta SET meta_key = '_wp_old_slug' WHERE meta_key = 'old_slug'");
999 }
1000
1001 /**
1002  * Execute changes made in WordPress 2.5.0.
1003  *
1004  * @since 2.5.0
1005  */
1006 function upgrade_250() {
1007         global $wp_current_db_version;
1008
1009         if ( $wp_current_db_version < 6689 ) {
1010                 populate_roles_250();
1011         }
1012
1013 }
1014
1015 /**
1016  * Execute changes made in WordPress 2.5.2.
1017  *
1018  * @since 2.5.2
1019  */
1020 function upgrade_252() {
1021         global $wpdb;
1022
1023         $wpdb->query("UPDATE $wpdb->users SET user_activation_key = ''");
1024 }
1025
1026 /**
1027  * Execute changes made in WordPress 2.6.
1028  *
1029  * @since 2.6.0
1030  */
1031 function upgrade_260() {
1032         global $wp_current_db_version;
1033
1034         if ( $wp_current_db_version < 8000 )
1035                 populate_roles_260();
1036
1037         if ( $wp_current_db_version < 8201 ) {
1038                 update_option('enable_app', 1);
1039                 update_option('enable_xmlrpc', 1);
1040         }
1041 }
1042
1043 /**
1044  * Execute changes made in WordPress 2.7.
1045  *
1046  * @since 2.7.0
1047  */
1048 function upgrade_270() {
1049         global $wpdb, $wp_current_db_version;
1050
1051         if ( $wp_current_db_version < 8980 )
1052                 populate_roles_270();
1053
1054         // Update post_date for unpublished posts with empty timestamp
1055         if ( $wp_current_db_version < 8921 )
1056                 $wpdb->query( "UPDATE $wpdb->posts SET post_date = post_modified WHERE post_date = '0000-00-00 00:00:00'" );
1057 }
1058
1059 /**
1060  * Execute changes made in WordPress 2.8.
1061  *
1062  * @since 2.8.0
1063  */
1064 function upgrade_280() {
1065         global $wp_current_db_version, $wpdb;
1066
1067         if ( $wp_current_db_version < 10360 )
1068                 populate_roles_280();
1069         if ( is_multisite() ) {
1070                 $start = 0;
1071                 while( $rows = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options ORDER BY option_id LIMIT $start, 20" ) ) {
1072                         foreach( $rows as $row ) {
1073                                 $value = $row->option_value;
1074                                 if ( !@unserialize( $value ) )
1075                                         $value = stripslashes( $value );
1076                                 if ( $value !== $row->option_value ) {
1077                                         update_option( $row->option_name, $value );
1078                                 }
1079                         }
1080                         $start += 20;
1081                 }
1082                 refresh_blog_details( $wpdb->blogid );
1083         }
1084 }
1085
1086 /**
1087  * Execute changes made in WordPress 2.9.
1088  *
1089  * @since 2.9.0
1090  */
1091 function upgrade_290() {
1092         global $wp_current_db_version;
1093
1094         if ( $wp_current_db_version < 11958 ) {
1095                 // Previously, setting depth to 1 would redundantly disable threading, but now 2 is the minimum depth to avoid confusion
1096                 if ( get_option( 'thread_comments_depth' ) == '1' ) {
1097                         update_option( 'thread_comments_depth', 2 );
1098                         update_option( 'thread_comments', 0 );
1099                 }
1100         }
1101 }
1102
1103 /**
1104  * Execute changes made in WordPress 3.0.
1105  *
1106  * @since 3.0.0
1107  */
1108 function upgrade_300() {
1109         global $wp_current_db_version, $wpdb;
1110
1111         if ( $wp_current_db_version < 15093 )
1112                 populate_roles_300();
1113
1114         if ( $wp_current_db_version < 14139 && is_multisite() && is_main_site() && ! defined( 'MULTISITE' ) && get_site_option( 'siteurl' ) === false )
1115                 add_site_option( 'siteurl', '' );
1116
1117         // 3.0-alpha nav menu postmeta changes. can be removed before release. // r13802
1118         if ( $wp_current_db_version >= 13226 && $wp_current_db_version < 13974 )
1119                 $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_key IN( 'menu_type', 'object_id', 'menu_new_window', 'menu_link', '_menu_item_append', 'menu_item_append', 'menu_item_type', 'menu_item_object_id', 'menu_item_target', 'menu_item_classes', 'menu_item_xfn', 'menu_item_url' )" );
1120
1121         // 3.0-beta1 remove_user primitive->meta cap. can be removed before release. r13956
1122         if ( $wp_current_db_version >= 12751 && $wp_current_db_version < 13974 ) {
1123                 $role =& get_role( 'administrator' );
1124                 if ( ! empty( $role ) )
1125                         $role->remove_cap( 'remove_user' );
1126         }
1127
1128         // 3.0-beta1 nav menu postmeta changes. can be removed before release. r13974
1129         if ( $wp_current_db_version >= 13802 && $wp_current_db_version < 13974 )
1130                 $wpdb->update( $wpdb->postmeta, array( 'meta_value' => '' ), array( 'meta_key' => '_menu_item_target', 'meta_value' => '_self' ) );
1131
1132         // 3.0 screen options key name changes.
1133         if ( is_main_site() && !defined('DO_NOT_UPGRADE_GLOBAL_TABLES') ) {
1134                 $prefix = like_escape($wpdb->base_prefix);
1135                 $wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key LIKE '{$prefix}%meta-box-hidden%' OR meta_key LIKE '{$prefix}%closedpostboxes%' OR meta_key LIKE '{$prefix}%manage-%-columns-hidden%' OR meta_key LIKE '{$prefix}%meta-box-order%' OR meta_key LIKE '{$prefix}%metaboxorder%' OR meta_key LIKE '{$prefix}%screen_layout%'
1136                                          OR meta_key = 'manageedittagscolumnshidden' OR meta_key='managecategoriescolumnshidden' OR meta_key = 'manageedit-tagscolumnshidden' OR meta_key = 'manageeditcolumnshidden' OR meta_key = 'categories_per_page' OR meta_key = 'edit_tags_per_page'" );
1137         }
1138
1139 }
1140
1141 /**
1142  * Execute network level changes
1143  *
1144  * @since 3.0.0
1145  */
1146 function upgrade_network() {
1147         global $wp_current_db_version, $wpdb;
1148         // 2.8
1149         if ( $wp_current_db_version < 11549 ) {
1150                 $wpmu_sitewide_plugins = get_site_option( 'wpmu_sitewide_plugins' );
1151                 $active_sitewide_plugins = get_site_option( 'active_sitewide_plugins' );
1152                 if ( $wpmu_sitewide_plugins ) {
1153                         if ( !$active_sitewide_plugins )
1154                                 $sitewide_plugins = (array) $wpmu_sitewide_plugins;
1155                         else
1156                                 $sitewide_plugins = array_merge( (array) $active_sitewide_plugins, (array) $wpmu_sitewide_plugins );
1157
1158                         update_site_option( 'active_sitewide_plugins', $sitewide_plugins );
1159                 }
1160                 delete_site_option( 'wpmu_sitewide_plugins' );
1161                 delete_site_option( 'deactivated_sitewide_plugins' );
1162
1163                 $start = 0;
1164                 while( $rows = $wpdb->get_results( "SELECT meta_key, meta_value FROM {$wpdb->sitemeta} ORDER BY meta_id LIMIT $start, 20" ) ) {
1165                         foreach( $rows as $row ) {
1166                                 $value = $row->meta_value;
1167                                 if ( !@unserialize( $value ) )
1168                                         $value = stripslashes( $value );
1169                                 if ( $value !== $row->meta_value ) {
1170                                         update_site_option( $row->meta_key, $value );
1171                                 }
1172                         }
1173                         $start += 20;
1174                 }
1175         }
1176         // 3.0
1177         if ( $wp_current_db_version < 13576 )
1178                 update_site_option( 'global_terms_enabled', '1' );
1179 }
1180
1181 // The functions we use to actually do stuff
1182
1183 // General
1184
1185 /**
1186  * {@internal Missing Short Description}}
1187  *
1188  * {@internal Missing Long Description}}
1189  *
1190  * @since unknown
1191  *
1192  * @param string $table_name Database table name to create.
1193  * @param string $create_ddl SQL statement to create table.
1194  * @return bool If table already exists or was created by function.
1195  */
1196 function maybe_create_table($table_name, $create_ddl) {
1197         global $wpdb;
1198         if ( $wpdb->get_var("SHOW TABLES LIKE '$table_name'") == $table_name )
1199                 return true;
1200         //didn't find it try to create it.
1201         $q = $wpdb->query($create_ddl);
1202         // we cannot directly tell that whether this succeeded!
1203         if ( $wpdb->get_var("SHOW TABLES LIKE '$table_name'") == $table_name )
1204                 return true;
1205         return false;
1206 }
1207
1208 /**
1209  * {@internal Missing Short Description}}
1210  *
1211  * {@internal Missing Long Description}}
1212  *
1213  * @since unknown
1214  *
1215  * @param string $table Database table name.
1216  * @param string $index Index name to drop.
1217  * @return bool True, when finished.
1218  */
1219 function drop_index($table, $index) {
1220         global $wpdb;
1221         $wpdb->hide_errors();
1222         $wpdb->query("ALTER TABLE `$table` DROP INDEX `$index`");
1223         // Now we need to take out all the extra ones we may have created
1224         for ($i = 0; $i < 25; $i++) {
1225                 $wpdb->query("ALTER TABLE `$table` DROP INDEX `{$index}_$i`");
1226         }
1227         $wpdb->show_errors();
1228         return true;
1229 }
1230
1231 /**
1232  * {@internal Missing Short Description}}
1233  *
1234  * {@internal Missing Long Description}}
1235  *
1236  * @since unknown
1237  *
1238  * @param string $table Database table name.
1239  * @param string $index Database table index column.
1240  * @return bool True, when done with execution.
1241  */
1242 function add_clean_index($table, $index) {
1243         global $wpdb;
1244         drop_index($table, $index);
1245         $wpdb->query("ALTER TABLE `$table` ADD INDEX ( `$index` )");
1246         return true;
1247 }
1248
1249 /**
1250  ** maybe_add_column()
1251  ** Add column to db table if it doesn't exist.
1252  ** Returns:  true if already exists or on successful completion
1253  **           false on error
1254  */
1255 function maybe_add_column($table_name, $column_name, $create_ddl) {
1256         global $wpdb, $debug;
1257         foreach ($wpdb->get_col("DESC $table_name", 0) as $column ) {
1258                 if ($debug) echo("checking $column == $column_name<br />");
1259                 if ($column == $column_name) {
1260                         return true;
1261                 }
1262         }
1263         //didn't find it try to create it.
1264         $q = $wpdb->query($create_ddl);
1265         // we cannot directly tell that whether this succeeded!
1266         foreach ($wpdb->get_col("DESC $table_name", 0) as $column ) {
1267                 if ($column == $column_name) {
1268                         return true;
1269                 }
1270         }
1271         return false;
1272 }
1273
1274 /**
1275  * Retrieve all options as it was for 1.2.
1276  *
1277  * @since 1.2.0
1278  *
1279  * @return array List of options.
1280  */
1281 function get_alloptions_110() {
1282         global $wpdb;
1283         if ($options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options")) {
1284                 foreach ($options as $option) {
1285                         // "When trying to design a foolproof system,
1286                         //  never underestimate the ingenuity of the fools :)" -- Dougal
1287                         if ('siteurl' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
1288                         if ('home' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
1289                         if ('category_base' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
1290                         $all_options->{$option->option_name} = stripslashes($option->option_value);
1291                 }
1292         }
1293         return $all_options;
1294 }
1295
1296 /**
1297  * Version of get_option that is private to install/upgrade.
1298  *
1299  * @since unknown
1300  * @access private
1301  *
1302  * @param string $setting Option name.
1303  * @return mixed
1304  */
1305 function __get_option($setting) {
1306         global $wpdb;
1307
1308         if ( $setting == 'home' && defined( 'WP_HOME' ) ) {
1309                 return preg_replace( '|/+$|', '', WP_HOME );
1310         }
1311
1312         if ( $setting == 'siteurl' && defined( 'WP_SITEURL' ) ) {
1313                 return preg_replace( '|/+$|', '', WP_SITEURL );
1314         }
1315
1316         $option = $wpdb->get_var( $wpdb->prepare("SELECT option_value FROM $wpdb->options WHERE option_name = %s", $setting) );
1317
1318         if ( 'home' == $setting && '' == $option )
1319                 return __get_option('siteurl');
1320
1321         if ( 'siteurl' == $setting || 'home' == $setting || 'category_base' == $setting )
1322                 $option = preg_replace('|/+$|', '', $option);
1323
1324         @ $kellogs = unserialize($option);
1325         if ($kellogs !== FALSE)
1326                 return $kellogs;
1327         else
1328                 return $option;
1329 }
1330
1331 /**
1332  * {@internal Missing Short Description}}
1333  *
1334  * {@internal Missing Long Description}}
1335  *
1336  * @since unknown
1337  *
1338  * @param string $content
1339  * @return string
1340  */
1341 function deslash($content) {
1342         // Note: \\\ inside a regex denotes a single backslash.
1343
1344         // Replace one or more backslashes followed by a single quote with
1345         // a single quote.
1346         $content = preg_replace("/\\\+'/", "'", $content);
1347
1348         // Replace one or more backslashes followed by a double quote with
1349         // a double quote.
1350         $content = preg_replace('/\\\+"/', '"', $content);
1351
1352         // Replace one or more backslashes with one backslash.
1353         $content = preg_replace("/\\\+/", "\\", $content);
1354
1355         return $content;
1356 }
1357
1358 /**
1359  * {@internal Missing Short Description}}
1360  *
1361  * {@internal Missing Long Description}}
1362  *
1363  * @since unknown
1364  *
1365  * @param unknown_type $queries
1366  * @param unknown_type $execute
1367  * @return unknown
1368  */
1369 function dbDelta($queries, $execute = true) {
1370         global $wpdb;
1371
1372         // Separate individual queries into an array
1373         if ( !is_array($queries) ) {
1374                 $queries = explode( ';', $queries );
1375                 if ('' == $queries[count($queries) - 1]) array_pop($queries);
1376         }
1377
1378         $cqueries = array(); // Creation Queries
1379         $iqueries = array(); // Insertion Queries
1380         $for_update = array();
1381
1382         // Create a tablename index for an array ($cqueries) of queries
1383         foreach($queries as $qry) {
1384                 if (preg_match("|CREATE TABLE ([^ ]*)|", $qry, $matches)) {
1385                         $cqueries[trim( strtolower($matches[1]), '`' )] = $qry;
1386                         $for_update[$matches[1]] = 'Created table '.$matches[1];
1387                 } else if (preg_match("|CREATE DATABASE ([^ ]*)|", $qry, $matches)) {
1388                         array_unshift($cqueries, $qry);
1389                 } else if (preg_match("|INSERT INTO ([^ ]*)|", $qry, $matches)) {
1390                         $iqueries[] = $qry;
1391                 } else if (preg_match("|UPDATE ([^ ]*)|", $qry, $matches)) {
1392                         $iqueries[] = $qry;
1393                 } else {
1394                         // Unrecognized query type
1395                 }
1396         }
1397
1398         // Check to see which tables and fields exist
1399         if ($tables = $wpdb->get_col('SHOW TABLES;')) {
1400                 // For every table in the database
1401                 foreach ($tables as $table) {
1402                         // Upgrade global tables only for the main site. Don't upgrade at all if DO_NOT_UPGRADE_GLOBAL_TABLES is defined.
1403                         if ( in_array($table, $wpdb->tables('global')) && ( !is_main_site() || defined('DO_NOT_UPGRADE_GLOBAL_TABLES') ) )
1404                                 continue;
1405
1406                         // If a table query exists for the database table...
1407                         if ( array_key_exists(strtolower($table), $cqueries) ) {
1408                                 // Clear the field and index arrays
1409                                 $cfields = $indices = array();
1410                                 // Get all of the field names in the query from between the parens
1411                                 preg_match("|\((.*)\)|ms", $cqueries[strtolower($table)], $match2);
1412                                 $qryline = trim($match2[1]);
1413
1414                                 // Separate field lines into an array
1415                                 $flds = explode("\n", $qryline);
1416
1417                                 //echo "<hr/><pre>\n".print_r(strtolower($table), true).":\n".print_r($cqueries, true)."</pre><hr/>";
1418
1419                                 // For every field line specified in the query
1420                                 foreach ($flds as $fld) {
1421                                         // Extract the field name
1422                                         preg_match("|^([^ ]*)|", trim($fld), $fvals);
1423                                         $fieldname = trim( $fvals[1], '`' );
1424
1425                                         // Verify the found field name
1426                                         $validfield = true;
1427                                         switch (strtolower($fieldname)) {
1428                                         case '':
1429                                         case 'primary':
1430                                         case 'index':
1431                                         case 'fulltext':
1432                                         case 'unique':
1433                                         case 'key':
1434                                                 $validfield = false;
1435                                                 $indices[] = trim(trim($fld), ", \n");
1436                                                 break;
1437                                         }
1438                                         $fld = trim($fld);
1439
1440                                         // If it's a valid field, add it to the field array
1441                                         if ($validfield) {
1442                                                 $cfields[strtolower($fieldname)] = trim($fld, ", \n");
1443                                         }
1444                                 }
1445
1446                                 // Fetch the table column structure from the database
1447                                 $tablefields = $wpdb->get_results("DESCRIBE {$table};");
1448
1449                                 // For every field in the table
1450                                 foreach ($tablefields as $tablefield) {
1451                                         // If the table field exists in the field array...
1452                                         if (array_key_exists(strtolower($tablefield->Field), $cfields)) {
1453                                                 // Get the field type from the query
1454                                                 preg_match("|".$tablefield->Field." ([^ ]*( unsigned)?)|i", $cfields[strtolower($tablefield->Field)], $matches);
1455                                                 $fieldtype = $matches[1];
1456
1457                                                 // Is actual field type different from the field type in query?
1458                                                 if ($tablefield->Type != $fieldtype) {
1459                                                         // Add a query to change the column type
1460                                                         $cqueries[] = "ALTER TABLE {$table} CHANGE COLUMN {$tablefield->Field} " . $cfields[strtolower($tablefield->Field)];
1461                                                         $for_update[$table.'.'.$tablefield->Field] = "Changed type of {$table}.{$tablefield->Field} from {$tablefield->Type} to {$fieldtype}";
1462                                                 }
1463
1464                                                 // Get the default value from the array
1465                                                         //echo "{$cfields[strtolower($tablefield->Field)]}<br>";
1466                                                 if (preg_match("| DEFAULT '(.*)'|i", $cfields[strtolower($tablefield->Field)], $matches)) {
1467                                                         $default_value = $matches[1];
1468                                                         if ($tablefield->Default != $default_value) {
1469                                                                 // Add a query to change the column's default value
1470                                                                 $cqueries[] = "ALTER TABLE {$table} ALTER COLUMN {$tablefield->Field} SET DEFAULT '{$default_value}'";
1471                                                                 $for_update[$table.'.'.$tablefield->Field] = "Changed default value of {$table}.{$tablefield->Field} from {$tablefield->Default} to {$default_value}";
1472                                                         }
1473                                                 }
1474
1475                                                 // Remove the field from the array (so it's not added)
1476                                                 unset($cfields[strtolower($tablefield->Field)]);
1477                                         } else {
1478                                                 // This field exists in the table, but not in the creation queries?
1479                                         }
1480                                 }
1481
1482                                 // For every remaining field specified for the table
1483                                 foreach ($cfields as $fieldname => $fielddef) {
1484                                         // Push a query line into $cqueries that adds the field to that table
1485                                         $cqueries[] = "ALTER TABLE {$table} ADD COLUMN $fielddef";
1486                                         $for_update[$table.'.'.$fieldname] = 'Added column '.$table.'.'.$fieldname;
1487                                 }
1488
1489                                 // Index stuff goes here
1490                                 // Fetch the table index structure from the database
1491                                 $tableindices = $wpdb->get_results("SHOW INDEX FROM {$table};");
1492
1493                                 if ($tableindices) {
1494                                         // Clear the index array
1495                                         unset($index_ary);
1496
1497                                         // For every index in the table
1498                                         foreach ($tableindices as $tableindex) {
1499                                                 // Add the index to the index data array
1500                                                 $keyname = $tableindex->Key_name;
1501                                                 $index_ary[$keyname]['columns'][] = array('fieldname' => $tableindex->Column_name, 'subpart' => $tableindex->Sub_part);
1502                                                 $index_ary[$keyname]['unique'] = ($tableindex->Non_unique == 0)?true:false;
1503                                         }
1504
1505                                         // For each actual index in the index array
1506                                         foreach ($index_ary as $index_name => $index_data) {
1507                                                 // Build a create string to compare to the query
1508                                                 $index_string = '';
1509                                                 if ($index_name == 'PRIMARY') {
1510                                                         $index_string .= 'PRIMARY ';
1511                                                 } else if($index_data['unique']) {
1512                                                         $index_string .= 'UNIQUE ';
1513                                                 }
1514                                                 $index_string .= 'KEY ';
1515                                                 if ($index_name != 'PRIMARY') {
1516                                                         $index_string .= $index_name;
1517                                                 }
1518                                                 $index_columns = '';
1519                                                 // For each column in the index
1520                                                 foreach ($index_data['columns'] as $column_data) {
1521                                                         if ($index_columns != '') $index_columns .= ',';
1522                                                         // Add the field to the column list string
1523                                                         $index_columns .= $column_data['fieldname'];
1524                                                         if ($column_data['subpart'] != '') {
1525                                                                 $index_columns .= '('.$column_data['subpart'].')';
1526                                                         }
1527                                                 }
1528                                                 // Add the column list to the index create string
1529                                                 $index_string .= ' ('.$index_columns.')';
1530                                                 if (!(($aindex = array_search($index_string, $indices)) === false)) {
1531                                                         unset($indices[$aindex]);
1532                                                         //echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">{$table}:<br />Found index:".$index_string."</pre>\n";
1533                                                 }
1534                                                 //else echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">{$table}:<br /><b>Did not find index:</b>".$index_string."<br />".print_r($indices, true)."</pre>\n";
1535                                         }
1536                                 }
1537
1538                                 // For every remaining index specified for the table
1539                                 foreach ( (array) $indices as $index ) {
1540                                         // Push a query line into $cqueries that adds the index to that table
1541                                         $cqueries[] = "ALTER TABLE {$table} ADD $index";
1542                                         $for_update[$table.'.'.$fieldname] = 'Added index '.$table.' '.$index;
1543                                 }
1544
1545                                 // Remove the original table creation query from processing
1546                                 unset($cqueries[strtolower($table)]);
1547                                 unset($for_update[strtolower($table)]);
1548                         } else {
1549                                 // This table exists in the database, but not in the creation queries?
1550                         }
1551                 }
1552         }
1553
1554         $allqueries = array_merge($cqueries, $iqueries);
1555         if ($execute) {
1556                 foreach ($allqueries as $query) {
1557                         //echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">".print_r($query, true)."</pre>\n";
1558                         $wpdb->query($query);
1559                 }
1560         }
1561
1562         return $for_update;
1563 }
1564
1565 /**
1566  * {@internal Missing Short Description}}
1567  *
1568  * {@internal Missing Long Description}}
1569  *
1570  * @since unknown
1571  */
1572 function make_db_current() {
1573         global $wp_queries;
1574
1575         $alterations = dbDelta($wp_queries);
1576         echo "<ol>\n";
1577         foreach($alterations as $alteration) echo "<li>$alteration</li>\n";
1578         echo "</ol>\n";
1579 }
1580
1581 /**
1582  * {@internal Missing Short Description}}
1583  *
1584  * {@internal Missing Long Description}}
1585  *
1586  * @since unknown
1587  */
1588 function make_db_current_silent() {
1589         global $wp_queries;
1590
1591         $alterations = dbDelta($wp_queries);
1592 }
1593
1594 /**
1595  * {@internal Missing Short Description}}
1596  *
1597  * {@internal Missing Long Description}}
1598  *
1599  * @since unknown
1600  *
1601  * @param unknown_type $theme_name
1602  * @param unknown_type $template
1603  * @return unknown
1604  */
1605 function make_site_theme_from_oldschool($theme_name, $template) {
1606         $home_path = get_home_path();
1607         $site_dir = WP_CONTENT_DIR . "/themes/$template";
1608
1609         if (! file_exists("$home_path/index.php"))
1610                 return false;
1611
1612         // Copy files from the old locations to the site theme.
1613         // TODO: This does not copy arbitarary include dependencies.  Only the
1614         // standard WP files are copied.
1615         $files = array('index.php' => 'index.php', 'wp-layout.css' => 'style.css', 'wp-comments.php' => 'comments.php', 'wp-comments-popup.php' => 'comments-popup.php');
1616
1617         foreach ($files as $oldfile => $newfile) {
1618                 if ($oldfile == 'index.php')
1619                         $oldpath = $home_path;
1620                 else
1621                         $oldpath = ABSPATH;
1622
1623                 if ($oldfile == 'index.php') { // Check to make sure it's not a new index
1624                         $index = implode('', file("$oldpath/$oldfile"));
1625                         if (strpos($index, 'WP_USE_THEMES') !== false) {
1626                                 if (! @copy(WP_CONTENT_DIR . '/themes/' . WP_DEFAULT_THEME . '/index.php', "$site_dir/$newfile"))
1627                                         return false;
1628                                 continue; // Don't copy anything
1629                                 }
1630                 }
1631
1632                 if (! @copy("$oldpath/$oldfile", "$site_dir/$newfile"))
1633                         return false;
1634
1635                 chmod("$site_dir/$newfile", 0777);
1636
1637                 // Update the blog header include in each file.
1638                 $lines = explode("\n", implode('', file("$site_dir/$newfile")));
1639                 if ($lines) {
1640                         $f = fopen("$site_dir/$newfile", 'w');
1641
1642                         foreach ($lines as $line) {
1643                                 if (preg_match('/require.*wp-blog-header/', $line))
1644                                         $line = '//' . $line;
1645
1646                                 // Update stylesheet references.
1647                                 $line = str_replace("<?php echo __get_option('siteurl'); ?>/wp-layout.css", "<?php bloginfo('stylesheet_url'); ?>", $line);
1648
1649                                 // Update comments template inclusion.
1650                                 $line = str_replace("<?php include(ABSPATH . 'wp-comments.php'); ?>", "<?php comments_template(); ?>", $line);
1651
1652                                 fwrite($f, "{$line}\n");
1653                         }
1654                         fclose($f);
1655                 }
1656         }
1657
1658         // Add a theme header.
1659         $header = "/*\nTheme Name: $theme_name\nTheme URI: " . __get_option('siteurl') . "\nDescription: A theme automatically created by the upgrade.\nVersion: 1.0\nAuthor: Moi\n*/\n";
1660
1661         $stylelines = file_get_contents("$site_dir/style.css");
1662         if ($stylelines) {
1663                 $f = fopen("$site_dir/style.css", 'w');
1664
1665                 fwrite($f, $header);
1666                 fwrite($f, $stylelines);
1667                 fclose($f);
1668         }
1669
1670         return true;
1671 }
1672
1673 /**
1674  * {@internal Missing Short Description}}
1675  *
1676  * {@internal Missing Long Description}}
1677  *
1678  * @since unknown
1679  *
1680  * @param unknown_type $theme_name
1681  * @param unknown_type $template
1682  * @return unknown
1683  */
1684 function make_site_theme_from_default($theme_name, $template) {
1685         $site_dir = WP_CONTENT_DIR . "/themes/$template";
1686         $default_dir = WP_CONTENT_DIR . '/themes/' . WP_DEFAULT_THEME;
1687
1688         // Copy files from the default theme to the site theme.
1689         //$files = array('index.php', 'comments.php', 'comments-popup.php', 'footer.php', 'header.php', 'sidebar.php', 'style.css');
1690
1691         $theme_dir = @ opendir($default_dir);
1692         if ($theme_dir) {
1693                 while(($theme_file = readdir( $theme_dir )) !== false) {
1694                         if (is_dir("$default_dir/$theme_file"))
1695                                 continue;
1696                         if (! @copy("$default_dir/$theme_file", "$site_dir/$theme_file"))
1697                                 return;
1698                         chmod("$site_dir/$theme_file", 0777);
1699                 }
1700         }
1701         @closedir($theme_dir);
1702
1703         // Rewrite the theme header.
1704         $stylelines = explode("\n", implode('', file("$site_dir/style.css")));
1705         if ($stylelines) {
1706                 $f = fopen("$site_dir/style.css", 'w');
1707
1708                 foreach ($stylelines as $line) {
1709                         if (strpos($line, 'Theme Name:') !== false) $line = 'Theme Name: ' . $theme_name;
1710                         elseif (strpos($line, 'Theme URI:') !== false) $line = 'Theme URI: ' . __get_option('url');
1711                         elseif (strpos($line, 'Description:') !== false) $line = 'Description: Your theme.';
1712                         elseif (strpos($line, 'Version:') !== false) $line = 'Version: 1';
1713                         elseif (strpos($line, 'Author:') !== false) $line = 'Author: You';
1714                         fwrite($f, $line . "\n");
1715                 }
1716                 fclose($f);
1717         }
1718
1719         // Copy the images.
1720         umask(0);
1721         if (! mkdir("$site_dir/images", 0777)) {
1722                 return false;
1723         }
1724
1725         $images_dir = @ opendir("$default_dir/images");
1726         if ($images_dir) {
1727                 while(($image = readdir($images_dir)) !== false) {
1728                         if (is_dir("$default_dir/images/$image"))
1729                                 continue;
1730                         if (! @copy("$default_dir/images/$image", "$site_dir/images/$image"))
1731                                 return;
1732                         chmod("$site_dir/images/$image", 0777);
1733                 }
1734         }
1735         @closedir($images_dir);
1736 }
1737
1738 // Create a site theme from the default theme.
1739 /**
1740  * {@internal Missing Short Description}}
1741  *
1742  * {@internal Missing Long Description}}
1743  *
1744  * @since unknown
1745  *
1746  * @return unknown
1747  */
1748 function make_site_theme() {
1749         // Name the theme after the blog.
1750         $theme_name = __get_option('blogname');
1751         $template = sanitize_title($theme_name);
1752         $site_dir = WP_CONTENT_DIR . "/themes/$template";
1753
1754         // If the theme already exists, nothing to do.
1755         if ( is_dir($site_dir)) {
1756                 return false;
1757         }
1758
1759         // We must be able to write to the themes dir.
1760         if (! is_writable(WP_CONTENT_DIR . "/themes")) {
1761                 return false;
1762         }
1763
1764         umask(0);
1765         if (! mkdir($site_dir, 0777)) {
1766                 return false;
1767         }
1768
1769         if (file_exists(ABSPATH . 'wp-layout.css')) {
1770                 if (! make_site_theme_from_oldschool($theme_name, $template)) {
1771                         // TODO:  rm -rf the site theme directory.
1772                         return false;
1773                 }
1774         } else {
1775                 if (! make_site_theme_from_default($theme_name, $template))
1776                         // TODO:  rm -rf the site theme directory.
1777                         return false;
1778         }
1779
1780         // Make the new site theme active.
1781         $current_template = __get_option('template');
1782         if ($current_template == WP_DEFAULT_THEME) {
1783                 update_option('template', $template);
1784                 update_option('stylesheet', $template);
1785         }
1786         return $template;
1787 }
1788
1789 /**
1790  * Translate user level to user role name.
1791  *
1792  * @since unknown
1793  *
1794  * @param int $level User level.
1795  * @return string User role name.
1796  */
1797 function translate_level_to_role($level) {
1798         switch ($level) {
1799         case 10:
1800         case 9:
1801         case 8:
1802                 return 'administrator';
1803         case 7:
1804         case 6:
1805         case 5:
1806                 return 'editor';
1807         case 4:
1808         case 3:
1809         case 2:
1810                 return 'author';
1811         case 1:
1812                 return 'contributor';
1813         case 0:
1814                 return 'subscriber';
1815         }
1816 }
1817
1818 /**
1819  * {@internal Missing Short Description}}
1820  *
1821  * {@internal Missing Long Description}}
1822  *
1823  * @since unknown
1824  */
1825 function wp_check_mysql_version() {
1826         global $wpdb;
1827         $result = $wpdb->check_database_version();
1828         if ( is_wp_error( $result ) )
1829                 die( $result->get_error_message() );
1830 }
1831
1832 /**
1833  * {@internal Missing Short Description}}
1834  *
1835  * {@internal Missing Long Description}}
1836  *
1837  * @since unknown
1838  */
1839 function maybe_disable_automattic_widgets() {
1840         $plugins = __get_option( 'active_plugins' );
1841
1842         foreach ( (array) $plugins as $plugin ) {
1843                 if ( basename( $plugin ) == 'widgets.php' ) {
1844                         array_splice( $plugins, array_search( $plugin, $plugins ), 1 );
1845                         update_option( 'active_plugins', $plugins );
1846                         break;
1847                 }
1848         }
1849 }
1850
1851 /**
1852  * Runs before the schema is upgraded.
1853  */
1854 function pre_schema_upgrade() {
1855         global $wp_current_db_version, $wp_db_version, $wpdb;
1856
1857         // Upgrade versions prior to 2.9
1858         if ( $wp_current_db_version < 11557 ) {
1859                 // Delete duplicate options.  Keep the option with the highest option_id.
1860                 $wpdb->query("DELETE o1 FROM $wpdb->options AS o1 JOIN $wpdb->options AS o2 USING (`option_name`) WHERE o2.option_id > o1.option_id");
1861
1862                 // Drop the old primary key and add the new.
1863                 $wpdb->query("ALTER TABLE $wpdb->options DROP PRIMARY KEY, ADD PRIMARY KEY(option_id)");
1864
1865                 // Drop the old option_name index. dbDelta() doesn't do the drop.
1866                 $wpdb->query("ALTER TABLE $wpdb->options DROP INDEX option_name");
1867         }
1868
1869 }
1870
1871 /**
1872  * Install Network.
1873  *
1874  * @since 3.0.0
1875  *
1876  */
1877 if ( !function_exists( 'install_network' ) ) :
1878 function install_network() {
1879         global $wpdb, $charset_collate;
1880         $ms_queries = "
1881 CREATE TABLE $wpdb->users (
1882   ID bigint(20) unsigned NOT NULL auto_increment,
1883   user_login varchar(60) NOT NULL default '',
1884   user_pass varchar(64) NOT NULL default '',
1885   user_nicename varchar(50) NOT NULL default '',
1886   user_email varchar(100) NOT NULL default '',
1887   user_url varchar(100) NOT NULL default '',
1888   user_registered datetime NOT NULL default '0000-00-00 00:00:00',
1889   user_activation_key varchar(60) NOT NULL default '',
1890   user_status int(11) NOT NULL default '0',
1891   display_name varchar(250) NOT NULL default '',
1892   spam tinyint(2) NOT NULL default '0',
1893   deleted tinyint(2) NOT NULL default '0',
1894   PRIMARY KEY  (ID),
1895   KEY user_login_key (user_login),
1896   KEY user_nicename (user_nicename)
1897 ) $charset_collate;
1898 CREATE TABLE $wpdb->blogs (
1899   blog_id bigint(20) NOT NULL auto_increment,
1900   site_id bigint(20) NOT NULL default '0',
1901   domain varchar(200) NOT NULL default '',
1902   path varchar(100) NOT NULL default '',
1903   registered datetime NOT NULL default '0000-00-00 00:00:00',
1904   last_updated datetime NOT NULL default '0000-00-00 00:00:00',
1905   public tinyint(2) NOT NULL default '1',
1906   archived enum('0','1') NOT NULL default '0',
1907   mature tinyint(2) NOT NULL default '0',
1908   spam tinyint(2) NOT NULL default '0',
1909   deleted tinyint(2) NOT NULL default '0',
1910   lang_id int(11) NOT NULL default '0',
1911   PRIMARY KEY  (blog_id),
1912   KEY domain (domain(50),path(5)),
1913   KEY lang_id (lang_id)
1914 ) $charset_collate;
1915 CREATE TABLE $wpdb->blog_versions (
1916   blog_id bigint(20) NOT NULL default '0',
1917   db_version varchar(20) NOT NULL default '',
1918   last_updated datetime NOT NULL default '0000-00-00 00:00:00',
1919   PRIMARY KEY  (blog_id),
1920   KEY db_version (db_version)
1921 ) $charset_collate;
1922 CREATE TABLE $wpdb->registration_log (
1923   ID bigint(20) NOT NULL auto_increment,
1924   email varchar(255) NOT NULL default '',
1925   IP varchar(30) NOT NULL default '',
1926   blog_id bigint(20) NOT NULL default '0',
1927   date_registered datetime NOT NULL default '0000-00-00 00:00:00',
1928   PRIMARY KEY  (ID),
1929   KEY IP (IP)
1930 ) $charset_collate;
1931 CREATE TABLE $wpdb->site (
1932   id bigint(20) NOT NULL auto_increment,
1933   domain varchar(200) NOT NULL default '',
1934   path varchar(100) NOT NULL default '',
1935   PRIMARY KEY  (id),
1936   KEY domain (domain,path)
1937 ) $charset_collate;
1938 CREATE TABLE $wpdb->sitemeta (
1939   meta_id bigint(20) NOT NULL auto_increment,
1940   site_id bigint(20) NOT NULL default '0',
1941   meta_key varchar(255) default NULL,
1942   meta_value longtext,
1943   PRIMARY KEY  (meta_id),
1944   KEY meta_key (meta_key),
1945   KEY site_id (site_id)
1946 ) $charset_collate;
1947 CREATE TABLE $wpdb->signups (
1948   domain varchar(200) NOT NULL default '',
1949   path varchar(100) NOT NULL default '',
1950   title longtext NOT NULL,
1951   user_login varchar(60) NOT NULL default '',
1952   user_email varchar(100) NOT NULL default '',
1953   registered datetime NOT NULL default '0000-00-00 00:00:00',
1954   activated datetime NOT NULL default '0000-00-00 00:00:00',
1955   active tinyint(1) NOT NULL default '0',
1956   activation_key varchar(50) NOT NULL default '',
1957   meta longtext,
1958   KEY activation_key (activation_key),
1959   KEY domain (domain)
1960 ) $charset_collate;
1961 ";
1962 // now create tables
1963         dbDelta( $ms_queries );
1964 }
1965 endif;
1966
1967 /**
1968  * Install global terms.
1969  *
1970  * @since 3.0.0
1971  *
1972  */
1973 if ( !function_exists( 'install_global_terms' ) ) :
1974 function install_global_terms() {
1975         global $wpdb, $charset_collate;
1976         $ms_queries = "
1977 CREATE TABLE $wpdb->sitecategories (
1978   cat_ID bigint(20) NOT NULL auto_increment,
1979   cat_name varchar(55) NOT NULL default '',
1980   category_nicename varchar(200) NOT NULL default '',
1981   last_updated timestamp NOT NULL,
1982   PRIMARY KEY  (cat_ID),
1983   KEY category_nicename (category_nicename),
1984   KEY last_updated (last_updated)
1985 ) $charset_collate;
1986 ";
1987 // now create tables
1988         dbDelta( $ms_queries );
1989 }
1990 endif;
1991 ?>