Rearrange the updaters into chronological order, instead of four separate
authorBrion Vibber <brion@users.mediawiki.org>
Wed, 5 Mar 2008 22:16:40 +0000 (22:16 +0000)
committerBrion Vibber <brion@users.mediawiki.org>
Wed, 5 Mar 2008 22:16:40 +0000 (22:16 +0000)
groups by type with weird ordering within them.

This should make it a lot easier to avoid regressions due to unnoticed
dependencies, like the one we had in 1.11 which broke upgrades from 1.4 or
below, when someone didn't realize there was an ordering problem and moved
one of the updates for aesthetic grouping reasons. :) (r24608)

It also makes it easier to see when past updates were added, since they're
now grouped by version.

Extension updates are still using the 'add table', 'add field', 'add index'
grouping.

I also removed the special-case checks for whether to do updates to the user
table. This was presumably meant for shared-db situations to avoid running
updates multiple times, but there's no need for it as the updates all check
if they've been previously applied.

maintenance/updaters.inc

index 86e8701..61abff4 100644 (file)
@@ -16,77 +16,124 @@ require_once 'deleteDefaultMessages.php';
 # Extension updates
 require_once( "$IP/includes/Hooks.php" );
 
-$wgRenamedTables = array(
-#           from             to                  patch file
-#      array( 'group',         'groups',           'patch-rename-group.sql' ),
-);
-
-$wgNewTables = array(
-#            table          patch file (in maintenance/archives)
-       array( 'hitcounter',       'patch-hitcounter.sql' ),
-       array( 'querycache',       'patch-querycache.sql' ),
-       array( 'objectcache',      'patch-objectcache.sql' ),
-       array( 'categorylinks',    'patch-categorylinks.sql' ),
-       array( 'logging',          'patch-logging.sql' ),
-       array( 'user_newtalk',     'patch-usernewtalk2.sql' ),
-       array( 'transcache',       'patch-transcache.sql' ),
-       array( 'trackbacks',       'patch-trackbacks.sql' ),
-       array( 'externallinks',    'patch-externallinks.sql' ),
-       array( 'job',              'patch-job.sql' ),
-       array( 'langlinks',        'patch-langlinks.sql' ),
-       array( 'querycache_info',  'patch-querycacheinfo.sql' ),
-       array( 'filearchive',      'patch-filearchive.sql' ),
-       array( 'querycachetwo',    'patch-querycachetwo.sql' ),
-       array( 'redirect',         'patch-redirect.sql' ),
-       array( 'protected_titles', 'patch-protected_titles.sql' ),
-       array( 'page_props',       'patch-page_props.sql' ),
+/**
+ * List of update functions to call on a MySQL-based MediaWiki installation,
+ * in sequence. First item is function name, rest are parameters to pass.
+ */
+$wgMysqlUpdates = array(
+       // 1.2
+       // update_passwords obsolete
+       array( 'add_field', 'ipblocks',      'ipb_id',           'patch-ipblocks.sql' ),
+       array( 'add_field', 'ipblocks',      'ipb_expiry',       'patch-ipb_expiry.sql' ),
+       array( 'do_interwiki_update' ),
+       array( 'do_index_update' ),
+       // do_linkscc_update obsolete
+       array( 'add_table', 'hitcounter',                        'patch-hitcounter.sql' ),
+       array( 'add_field', 'recentchanges', 'rc_type',          'patch-rc_type.sql' ),
+       
+       // 1.3
+       array( 'add_field', 'user',          'user_real_name',   'patch-user-realname.sql' ),
+       array( 'add_table', 'querycache',                        'patch-querycache.sql' ),
+       array( 'add_table', 'objectcache',                       'patch-objectcache.sql' ),
+       array( 'add_table', 'categorylinks',                     'patch-categorylinks.sql' ),
+       // do_linkscc_1_3_update obsolete
+       array( 'do_old_links_update' ),
+       array( 'add_field', 'recentchanges', 'rc_ip',            'patch-rc_ip.sql' ),
+       
+       // 1.4
+       array( 'do_image_name_unique_update' ),
+       array( 'add_field', 'recentchanges', 'rc_id',            'patch-rc_id.sql' ),
+       array( 'add_field', 'recentchanges', 'rc_patrolled',     'patch-rc-patrol.sql' ),
+       array( 'add_table', 'logging',                           'patch-logging.sql' ),
+       // do_user_rights_update obsolete
+       array( 'add_field', 'user',          'user_token',       'patch-user_token.sql' ),
+       // old, old_articleid, patch-remove-old-title-namespace.sql obsolete
+       // user_groups, patch-userlevels.sql obsolete
+       // do_group_update() obsolete
+       array( 'do_watchlist_update' ),
+       array( 'do_user_update' ),
+       // do_copy_newtalk_to_watchlist obsolete
+       
+       // 1.5
+       array( 'do_schema_restructuring' ),
+       array( 'add_field', 'logging',       'log_params',       'patch-log_params.sql' ),
+       array( 'do_logging_encoding' ),
+       array( 'add_field', 'archive',       'ar_rev_id',        'patch-archive-rev_id.sql' ),
+       array( 'add_field', 'page',          'page_len',         'patch-page_len.sql' ),
+       array( 'do_inverse_timestamp' ),
+       array( 'do_text_id' ),
+       array( 'add_field', 'revision',      'rev_deleted',      'patch-rev_deleted.sql' ),
+       array( 'add_field', 'image',         'img_width',        'patch-img_width.sql' ),
+       array( 'add_field', 'image',         'img_metadata',     'patch-img_metadata.sql' ),
+       array( 'add_field', 'user',          'user_email_token', 'patch-user_email_token.sql' ),
+       array( 'add_field', 'archive',       'ar_text_id',       'patch-archive-text_id.sql' ),
+       array( 'do_namespace_size' ),
+       array( 'add_field', 'image',         'img_media_type',   'patch-img_media_type.sql' ),
+       array( 'do_pagelinks_update' ),
+       array( 'do_drop_img_type' ),
+       array( 'do_user_unique_update' ),
+       array( 'do_user_groups_update' ),
+       array( 'add_field', 'site_stats',    'ss_total_pages',   'patch-ss_total_articles.sql' ),
+       array( 'add_table', 'user_newtalk',                      'patch-usernewtalk2.sql' ),
+       array( 'add_table', 'transcache',                        'patch-transcache.sql' ),
+       array( 'add_field', 'interwiki',     'iw_trans',         'patch-interwiki-trans.sql' ),
+       array( 'add_table', 'trackbacks',                        'patch-trackbacks.sql' ),
+       
+       // 1.6
+       array( 'do_watchlist_null' ),
+       // do_image_index_update obsolete
+       array( 'do_logging_timestamp_index' ),
+       array( 'add_field', 'ipblocks',        'ipb_range_start',  'patch-ipb_range_start.sql' ),
+       array( 'do_page_random_update' ),
+       array( 'add_field', 'user',            'user_registration','patch-user_registration.sql' ),
+       array( 'do_templatelinks_update' ),
+       array( 'add_table', 'externallinks',                       'patch-externallinks.sql' ),
+       array( 'add_table', 'job',                                 'patch-job.sql' ),
+       array( 'add_field', 'site_stats',      'ss_images',        'patch-ss_images.sql' ),
+       array( 'add_table', 'langlinks',                           'patch-langlinks.sql' ),
+       array( 'add_table', 'querycache_info',                     'patch-querycacheinfo.sql' ),
+       array( 'add_table', 'filearchive',                         'patch-filearchive.sql' ),
+       array( 'add_field', 'ipblocks',        'ipb_anon_only',    'patch-ipb_anon_only.sql' ),
+       array( 'do_rc_indices_update' ),
+       
+       // 1.9
+       array( 'add_field', 'user',          'user_newpass_time', 'patch-user_newpass_time.sql' ),
+       array( 'add_table', 'redirect',                           'patch-redirect.sql' ),
+       array( 'add_table', 'querycachetwo', 'patch-querycachetwo.sql' ),
+       array( 'add_field', 'ipblocks',      'ipb_enable_autoblock', 'patch-ipb_optional_autoblock.sql' ),
+       array( 'do_backlinking_indices_update' ),
+       array( 'add_field', 'recentchanges', 'rc_old_len',        'patch-rc_len.sql' ),
+       array( 'add_field', 'user',          'user_editcount',    'patch-user_editcount.sql' ),
+       
+       // 1.10
+       array( 'do_restrictions_update' ),
+       array( 'add_field', 'logging',       'log_id',           'patch-log_id.sql' ),
+       array( 'add_field', 'revision',      'rev_parent_id',    'patch-rev_parent_id.sql' ),
+       array( 'add_field', 'page_restrictions', 'pr_id',        'patch-page_restrictions_sortkey.sql' ),
+       array( 'add_field', 'revision',      'rev_len',          'patch-rev_len.sql' ),
+       array( 'add_field', 'recentchanges', 'rc_deleted',       'patch-rc_deleted.sql' ),
+       array( 'add_field', 'logging',       'log_deleted',      'patch-log_deleted.sql' ),
+       array( 'add_field', 'archive',       'ar_deleted',       'patch-ar_deleted.sql' ),
+       array( 'add_field', 'ipblocks',      'ipb_deleted',      'patch-ipb_deleted.sql' ),
+       array( 'add_field', 'filearchive',   'fa_deleted',       'patch-fa_deleted.sql' ),
+       array( 'add_field', 'archive',       'ar_len',           'patch-ar_len.sql' ),
+       
+       // 1.11
+       array( 'add_field', 'ipblocks',      'ipb_block_email',  'patch-ipb_emailban.sql' ),
+       array( 'do_categorylinks_indices_update' ),
+       array( 'add_field', 'oldimage',      'oi_metadata',      'patch-oi_metadata.sql'),
+       array( 'do_archive_user_index' ),
+       array( 'do_image_user_index' ),
+       array( 'do_oldimage_user_index' ),
+       array( 'add_field', 'archive',       'ar_page_id',       'patch-archive-page_id.sql'),
+       array( 'add_field', 'image',         'img_sha1',         'patch-img_sha1.sql' ),
+       array( 'add_table', 'protected_titles',                  'patch-protected_titles.sql' ),
+       
+       // 1.13
+       array( 'add_field', 'ipblocks',      'ipb_by_text',      'patch-ipb_by_text.sql' ),
+       array( 'add_table', 'page_props',                        'patch-page_props.sql' ),
 );
 
-$wgNewFields = array(
-#           table            field             patch file (in maintenance/archives)
-       array( 'ipblocks',      'ipb_id',           'patch-ipblocks.sql' ),
-       array( 'ipblocks',      'ipb_expiry',       'patch-ipb_expiry.sql' ),
-       array( 'recentchanges', 'rc_type',          'patch-rc_type.sql' ),
-       array( 'recentchanges', 'rc_ip',            'patch-rc_ip.sql' ),
-       array( 'recentchanges', 'rc_id',            'patch-rc_id.sql' ),
-       array( 'recentchanges', 'rc_patrolled',     'patch-rc-patrol.sql' ),
-       array( 'recentchanges', 'rc_old_len',       'patch-rc_len.sql' ),
-       array( 'user',          'user_real_name',   'patch-user-realname.sql' ),
-       array( 'user',          'user_token',       'patch-user_token.sql' ),
-       array( 'user',          'user_email_token', 'patch-user_email_token.sql' ),
-       array( 'user',          'user_registration','patch-user_registration.sql' ),
-       array( 'logging',       'log_params',       'patch-log_params.sql' ),
-       array( 'archive',       'ar_rev_id',        'patch-archive-rev_id.sql' ),
-       array( 'archive',       'ar_text_id',       'patch-archive-text_id.sql' ),
-       array( 'page',          'page_len',         'patch-page_len.sql' ),
-       array( 'revision',      'rev_deleted',      'patch-rev_deleted.sql' ),
-       array( 'image',         'img_width',        'patch-img_width.sql' ),
-       array( 'image',         'img_metadata',     'patch-img_metadata.sql' ),
-       array( 'image',         'img_media_type',   'patch-img_media_type.sql' ),
-       array( 'site_stats',    'ss_total_pages',   'patch-ss_total_articles.sql' ),
-       array( 'interwiki',     'iw_trans',         'patch-interwiki-trans.sql' ),
-       array( 'ipblocks',      'ipb_range_start',  'patch-ipb_range_start.sql' ),
-       array( 'site_stats',    'ss_images',        'patch-ss_images.sql' ),
-       array( 'ipblocks',      'ipb_anon_only',    'patch-ipb_anon_only.sql' ),
-       array( 'ipblocks',              'ipb_enable_autoblock', 'patch-ipb_optional_autoblock.sql' ),
-       array( 'user',          'user_newpass_time','patch-user_newpass_time.sql' ),
-       array( 'user',          'user_editcount',   'patch-user_editcount.sql' ),
-       array( 'recentchanges', 'rc_deleted',           'patch-rc_deleted.sql' ),
-       array( 'logging',               'log_id',                       'patch-log_id.sql' ),
-       array( 'logging',               'log_deleted',          'patch-log_deleted.sql' ),
-       array( 'archive',               'ar_deleted',           'patch-ar_deleted.sql' ),
-       array( 'ipblocks',              'ipb_deleted',          'patch-ipb_deleted.sql' ),
-       array( 'filearchive',   'fa_deleted',           'patch-fa_deleted.sql' ),
-       array( 'revision',          'rev_len',          'patch-rev_len.sql' ),
-       array( 'archive',           'ar_len',           'patch-ar_len.sql' ),
-       array( 'revision',          'rev_parent_id',    'patch-rev_parent_id.sql' ),
-       array( 'page_restrictions', 'pr_id',            'patch-page_restrictions_sortkey.sql' ),
-       array( 'ipblocks',      'ipb_block_email',  'patch-ipb_emailban.sql' ),
-       array( 'oldimage',      'oi_metadata',      'patch-oi_metadata.sql'),
-       array( 'archive',       'ar_page_id',       'patch-archive-page_id.sql'),
-       array( 'image',         'img_sha1',         'patch-img_sha1.sql' ),
-       array( 'ipblocks',      'ipb_by_text',      'patch-ipb_by_text.sql' ),
-);
 
 # For extensions only, should be populated via hooks
 # $wgDBtype should be checked to specifiy the proper file
@@ -946,26 +993,16 @@ function do_all_updates( $shared = false, $purge = true ) {
                do_postgres_updates();
                return;
        }
-
-       # Rename tables
-       foreach ( $wgRenamedTables as $tableRecord ) {
-               rename_table( $tableRecord[0], $tableRecord[1], $tableRecord[2] );
-       }
-
-       # Add missing tables
-       foreach ( $wgNewTables as $tableRecord ) {
-               add_table( $tableRecord[0], $tableRecord[1] );
-               flush();
-       }
-
-       # Add missing fields
-       foreach ( $wgNewFields as $fieldRecord ) {
-               if ( $fieldRecord[0] != 'user' || $doUser ) {
-                       add_field( $fieldRecord[0], $fieldRecord[1], $fieldRecord[2] );
-               }
+       
+       # Run core updates in sequence...
+       global $wgMysqlUpdates;
+       foreach( $wgMysqlUpdates as $params ) {
+               $func = array_shift( $params );
+               call_user_func_array( $func, $params );
                flush();
        }
        
+       /// @fixme clean up this mess too!
        global $wgExtNewTables, $wgExtNewFields, $wgExtNewIndexes;
        # Add missing extension tables
        foreach ( $wgExtNewTables as $tableRecord ) {
@@ -985,54 +1022,6 @@ function do_all_updates( $shared = false, $purge = true ) {
                flush();
        }
 
-       # Do schema updates which require special handling
-       do_interwiki_update(); flush();
-       do_index_update(); flush();
-       do_old_links_update(); flush();
-       do_image_name_unique_update(); flush();
-       do_watchlist_update(); flush();
-       if ( $doUser ) {
-               do_user_update(); flush();
-       }
-###### do_copy_newtalk_to_watchlist(); flush();
-       do_logging_encoding(); flush();
-
-       do_schema_restructuring(); flush();
-       do_inverse_timestamp(); flush();
-       do_text_id(); flush();
-       do_namespace_size(); flush();
-
-       do_pagelinks_update(); flush();
-       do_templatelinks_update(); flush(); // after pagelinks
-
-       do_drop_img_type(); flush();
-
-       if ( $doUser ) {
-               do_user_unique_update(); flush();
-       }
-       do_user_groups_update(); flush();
-
-       do_watchlist_null(); flush();
-
-       //do_image_index_update(); flush();
-
-       do_logging_timestamp_index(); flush();
-
-       do_page_random_update(); flush();
-       
-       do_rc_indices_update(); flush();
-
-       do_backlinking_indices_update(); flush();
-
-       do_categorylinks_indices_update(); flush();
-
-       do_restrictions_update(); flush ();
-       
-       do_archive_user_index(); flush ();
-       
-       do_image_user_index(); flush ();
-       
-       do_oldimage_user_index(); flush ();
 
        echo "Deleting old default messages (this may take a long time!)..."; flush();
        deleteDefaultMessages();