individual message cache entries should start with ' ', also in memcached
[lhc/web/wiklou.git] / maintenance / updaters.inc
index 354ef44..32bbc49 100644 (file)
@@ -15,7 +15,7 @@ require_once 'userDupes.inc';
 require_once( "$IP/includes/Hooks.php" );
 
 /**
- * List of update functions to call for each DB type, in sequence. First item 
+ * List of update functions to call for each DB type, in sequence. First item
  * is function name, rest are parameters to pass.
  */
 $wgUpdates = array(
@@ -29,7 +29,7 @@ $wgUpdates = array(
                // 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' ),
@@ -39,7 +39,7 @@ $wgUpdates = array(
                array( 'do_old_links_update' ),
                array( 'fix_ancient_imagelinks' ),
                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' ),
@@ -53,7 +53,7 @@ $wgUpdates = array(
                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' ),
@@ -78,7 +78,7 @@ $wgUpdates = array(
                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
@@ -95,16 +95,16 @@ $wgUpdates = array(
                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_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' ),
@@ -117,7 +117,7 @@ $wgUpdates = array(
                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' ),
@@ -130,7 +130,7 @@ $wgUpdates = array(
 
                // 1.12
                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' ),
@@ -143,45 +143,60 @@ $wgUpdates = array(
                array( 'check_bin', 'protected_titles', 'pt_title',      'patch-pt_title-encoding.sql', ),
                array( 'maybe_do_profiling_memory_update' ),
                array( 'do_filearchive_indices_update' ),
-               
+
                // 1.14
-               array( 'add_field', 'site_stats',     'ss_active_users',  'patch-ss_active_users.sql' ),
+               array( 'add_field', 'site_stats',    'ss_active_users',  'patch-ss_active_users.sql' ),
                array( 'do_active_users_init' ),
-               array( 'add_field', 'ipblocks',     'ipb_allow_usertalk',  'patch-ipb_allow_usertalk.sql' ),
+               array( 'add_field', 'ipblocks',      'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
 
                // 1.15
                array( 'do_unique_pl_tl_il' ),
-               array( 'add_table', 'change_tag',                          'patch-change_tag.sql' ),
-               array( 'add_table', 'tag_summary',                         'patch-change_tag.sql' ),
-               array( 'add_table', 'valid_tag',                           'patch-change_tag.sql' ),
+               array( 'add_table', 'change_tag',                        'patch-change_tag.sql' ),
+               array( 'add_table', 'tag_summary',                       'patch-change_tag.sql' ),
+               array( 'add_table', 'valid_tag',                         'patch-change_tag.sql' ),
 
                // 1.16
-               array( 'add_table', 'user_properties',             'patch-user_properties.sql' ),
-               array( 'add_table', 'log_search',                          'patch-log_search.sql' ),
+               array( 'add_table', 'user_properties',                   'patch-user_properties.sql' ),
+               array( 'add_table', 'log_search',                        'patch-log_search.sql' ),
                array( 'do_log_search_population' ),
-               array( 'add_field', 'logging',       'log_user_text',  'patch-log_user_text.sql' ),
-               array( 'add_table', 'l10n_cache',              'patch-l10n_cache.sql' ),
-               array( 'add_table', 'external_user', 'patch-external_user.sql' ),
+               array( 'add_field', 'logging',       'log_user_text',    'patch-log_user_text.sql' ),
+               array( 'add_table', 'l10n_cache',                        'patch-l10n_cache.sql' ),
+               array( 'add_table', 'external_user',                     'patch-external_user.sql' ),
+               array( 'add_index', 'log_search',    'ls_field_val',     'patch-log_search-rename-index.sql' ),
+               array( 'add_index', 'change_tag',    'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
+               array( 'add_field', 'redirect',      'rd_interwiki',     'patch-rd_interwiki.sql' ),
+               array( 'do_update_transcache_field' ),
+               // A field changed name mid-release cycle, so fix it for anyone using
+               // trunk
+               array( 'rename_eu_wiki_id' ),
        ),
 
        'sqlite' => array(
                // 1.14
-               array( 'add_field', 'site_stats',     'ss_active_users',  'patch-ss_active_users.sql' ),
+               array( 'add_field', 'site_stats',    'ss_active_users',  'patch-ss_active_users.sql' ),
                array( 'do_active_users_init' ),
-               array( 'add_field', 'ipblocks',     'ipb_allow_usertalk',  'patch-ipb_allow_usertalk.sql' ),
+               array( 'add_field', 'ipblocks',      'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
                array( 'sqlite_initial_indexes' ),
 
                // 1.15
-               array( 'add_table', 'change_tag',                          'patch-change_tag.sql' ),
-               array( 'add_table', 'tag_summary',                         'patch-change_tag.sql' ),
-               array( 'add_table', 'valid_tag',                           'patch-change_tag.sql' ),
+               array( 'add_table', 'change_tag',                        'patch-change_tag.sql' ),
+               array( 'add_table', 'tag_summary',                       'patch-change_tag.sql' ),
+               array( 'add_table', 'valid_tag',                         'patch-change_tag.sql' ),
 
                // 1.16
-               array( 'add_table', 'user_properties',             'patch-user_properties.sql' ),
-               array( 'add_table', 'log_search',                          'patch-log_search.sql' ),
+               array( 'add_table', 'user_properties',                   'patch-user_properties.sql' ),
+               array( 'add_table', 'log_search',                        'patch-log_search.sql' ),
                array( 'do_log_search_population' ),
-               array( 'add_field', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ),
-               array( 'add_table', 'l10n_cache',              'patch-l10n_cache.sql' ),
+               array( 'add_field', 'logging',       'log_user_text',    'patch-log_user_text.sql' ),
+               array( 'add_table', 'l10n_cache',                        'patch-l10n_cache.sql' ),
+               array( 'add_table', 'external_user',                     'patch-external_user.sql' ),
+               array( 'add_index', 'log_search',    'ls_field_val',     'patch-log_search-rename-index.sql' ),
+               array( 'add_index', 'change_tag',    'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
+               array( 'add_field', 'redirect',      'rd_interwiki',     'patch-rd_interwiki.sql' ),
+               array( 'do_update_transcache_field' ),
+
+               // version-independent searchindex setup, added in 1.16
+               array( 'sqlite_setup_searchindex' ),
        ),
 );
 
@@ -193,6 +208,7 @@ $wgExtNewFields = array(); // table, column, dir
 $wgExtPGNewFields = array(); // table, column, column attributes; for PostgreSQL
 $wgExtPGAlteredFields = array(); // table, column, new type, conversion method; for PostgreSQL
 $wgExtNewIndexes = array(); // table, index, dir
+$wgExtModifiedFields = array(); //table, index, dir
 
 # Helper function: check if the given key is present in the updatelog table.
 # Obviously, only use this for updates that occur after the updatelog table was
@@ -240,6 +256,25 @@ function add_table( $name, $patch, $fullpath=false ) {
        }
 }
 
+function modify_field($table, $field, $patch, $fullpath=false){
+       global $wgDatabase;
+       if ( !$wgDatabase->tableExists( $table ) ) {
+               wfOut( "...$table table does not exist, skipping modify field patch\n" );
+       } elseif (! $wgDatabase->fieldExists( $table, $field ) ) {
+               wfOut( "...$field field does not exist in $table table, skipping modify field patch\n" );
+       } else {
+               wfOut( "Modifying $field field of table $table..." );
+               if( $fullpath ) {
+                       $wgDatabase->sourceFile( $patch );
+               } else {
+                       $wgDatabase->sourceFile( archive($patch) );
+               }
+               wfOut( "ok\n" );
+       }
+}
+
+
+
 function add_field( $table, $field, $patch, $fullpath=false ) {
        global $wgDatabase;
        if ( !$wgDatabase->tableExists( $table ) ) {
@@ -388,7 +423,7 @@ function do_watchlist_update() {
                wfOut( "Adding missing watchlist talk page rows... " );
                flush();
 
-               $wgDatabase->insertSelect( 'watchlist', 'watchlist', 
+               $wgDatabase->insertSelect( 'watchlist', 'watchlist',
                        array(
                                'wl_user' => 'wl_user',
                                'wl_namespace' => 'wl_namespace | 1',
@@ -403,7 +438,7 @@ function do_watchlist_update() {
 
 function do_copy_newtalk_to_watchlist() {
        global $wgDatabase;
-       global $wgCommandLineMode;      # this needs to be saved while getID() and getName() are called
+       global $wgCommandLineMode; # this needs to be saved while getID() and getName() are called
 
        $res = $wgDatabase->safeQuery( 'SELECT user_id, user_ip FROM !',
                $wgDatabase->tableName( 'user_newtalk' ) );
@@ -417,10 +452,10 @@ function do_copy_newtalk_to_watchlist() {
                        if ($user->isIP($wluser->user_ip)) { # do only if it really looks like an IP number (double checked)
                                $wgDatabase->replace( 'watchlist',
                                        array(array('wl_user','wl_namespace', 'wl_title', 'wl_notificationtimestamp' )),
-                                         array('wl_user'                       => 0,
-                                               'wl_namespace'                  => NS_USER_TALK,
-                                               'wl_title'                      => $wluser->user_ip,
-                                               'wl_notificationtimestamp'      => '19700101000000'
+                                       array('wl_user' => 0,
+                                               'wl_namespace' => NS_USER_TALK,
+                                               'wl_title' => $wluser->user_ip,
+                                               'wl_notificationtimestamp' => '19700101000000'
                                                ), 'updaters.inc::do_watchlist_update2'
                                        );
                        }
@@ -428,10 +463,10 @@ function do_copy_newtalk_to_watchlist() {
                        $user->setID($wluser->user_id);
                        $wgDatabase->replace( 'watchlist',
                                array(array('wl_user','wl_namespace', 'wl_title', 'wl_notificationtimestamp' )),
-                                 array('wl_user'                       => $user->getID(),
-                                       'wl_namespace'                  => NS_USER_TALK,
-                                       'wl_title'                      => $user->getName(),
-                                       'wl_notificationtimestamp'      => '19700101000000'
+                               array('wl_user' => $user->getID(),
+                                       'wl_namespace' => NS_USER_TALK,
+                                       'wl_title' => $user->getName(),
+                                       'wl_notificationtimestamp' => '19700101000000'
                                        ), 'updaters.inc::do_watchlist_update3'
                                );
                }
@@ -545,40 +580,40 @@ function do_schema_restructuring() {
                wfOut( wfTimestamp( TS_DB ) );
                wfOut( "......Creating tables.\n" );
                $wgDatabase->query("CREATE TABLE $page (
-                       page_id int(8) unsigned NOT NULL auto_increment,
-                       page_namespace int NOT NULL,
-                       page_title varchar(255) binary NOT NULL,
-                       page_restrictions tinyblob NOT NULL,
-                       page_counter bigint(20) unsigned NOT NULL default '0',
-                       page_is_redirect tinyint(1) unsigned NOT NULL default '0',
-                       page_is_new tinyint(1) unsigned NOT NULL default '0',
-                       page_random real unsigned NOT NULL,
-                       page_touched char(14) binary NOT NULL default '',
-                       page_latest int(8) unsigned NOT NULL,
-                       page_len int(8) unsigned NOT NULL,
-
-                       PRIMARY KEY page_id (page_id),
-                       UNIQUE INDEX name_title (page_namespace,page_title),
-                       INDEX (page_random),
-                       INDEX (page_len)
+                       page_id int(8) unsigned NOT NULL auto_increment,
+                       page_namespace int NOT NULL,
+                       page_title varchar(255) binary NOT NULL,
+                       page_restrictions tinyblob NOT NULL,
+                       page_counter bigint(20) unsigned NOT NULL default '0',
+                       page_is_redirect tinyint(1) unsigned NOT NULL default '0',
+                       page_is_new tinyint(1) unsigned NOT NULL default '0',
+                       page_random real unsigned NOT NULL,
+                       page_touched char(14) binary NOT NULL default '',
+                       page_latest int(8) unsigned NOT NULL,
+                       page_len int(8) unsigned NOT NULL,
+
+                       PRIMARY KEY page_id (page_id),
+                       UNIQUE INDEX name_title (page_namespace,page_title),
+                       INDEX (page_random),
+                       INDEX (page_len)
                        ) ENGINE=InnoDB", $fname );
                $wgDatabase->query("CREATE TABLE $revision (
-                       rev_id int(8) unsigned NOT NULL auto_increment,
-                       rev_page int(8) unsigned NOT NULL,
-                       rev_comment tinyblob NOT NULL,
-                       rev_user int(5) unsigned NOT NULL default '0',
-                       rev_user_text varchar(255) binary NOT NULL default '',
-                       rev_timestamp char(14) binary NOT NULL default '',
-                       rev_minor_edit tinyint(1) unsigned NOT NULL default '0',
+                       rev_id int(8) unsigned NOT NULL auto_increment,
+                       rev_page int(8) unsigned NOT NULL,
+                       rev_comment tinyblob NOT NULL,
+                       rev_user int(5) unsigned NOT NULL default '0',
+                       rev_user_text varchar(255) binary NOT NULL default '',
+                       rev_timestamp char(14) binary NOT NULL default '',
+                       rev_minor_edit tinyint(1) unsigned NOT NULL default '0',
                        rev_deleted tinyint(1) unsigned NOT NULL default '0',
                        rev_len int(8) unsigned,
                        rev_parent_id int(8) unsigned default NULL,
-                       PRIMARY KEY rev_page_id (rev_page, rev_id),
-                       UNIQUE INDEX rev_id (rev_id),
-                       INDEX rev_timestamp (rev_timestamp),
-                       INDEX page_timestamp (rev_page,rev_timestamp),
-                       INDEX user_timestamp (rev_user,rev_timestamp),
-                       INDEX usertext_timestamp (rev_user_text,rev_timestamp)
+                       PRIMARY KEY rev_page_id (rev_page, rev_id),
+                       UNIQUE INDEX rev_id (rev_id),
+                       INDEX rev_timestamp (rev_timestamp),
+                       INDEX page_timestamp (rev_page,rev_timestamp),
+                       INDEX user_timestamp (rev_user,rev_timestamp),
+                       INDEX usertext_timestamp (rev_user_text,rev_timestamp)
                        ) ENGINE=InnoDB", $fname );
 
                wfOut( wfTimestamp( TS_DB ) );
@@ -605,26 +640,26 @@ function do_schema_restructuring() {
                        $cur_flags = "''";
                }
                $wgDatabase->query( "INSERT INTO $old (old_namespace, old_title, old_text, old_comment, old_user, old_user_text,
-                               old_timestamp, old_minor_edit, old_flags)
-                       SELECT cur_namespace, cur_title, $cur_text, cur_comment, cur_user, cur_user_text, cur_timestamp, cur_minor_edit, $cur_flags
-                       FROM $cur", $fname );
+                                       old_timestamp, old_minor_edit, old_flags)
+                       SELECT cur_namespace, cur_title, $cur_text, cur_comment, cur_user, cur_user_text, cur_timestamp, cur_minor_edit, $cur_flags
+                       FROM $cur", $fname );
 
                wfOut( wfTimestamp( TS_DB ) );
                wfOut( "......Setting up revision table.\n" );
                $wgDatabase->query( "INSERT INTO $revision (rev_id, rev_page, rev_comment, rev_user, rev_user_text, rev_timestamp,
-                               rev_minor_edit)
+                               rev_minor_edit)
                        SELECT old_id, cur_id, old_comment, old_user, old_user_text,
-                               old_timestamp, old_minor_edit
+                               old_timestamp, old_minor_edit
                        FROM $old,$cur WHERE old_namespace=cur_namespace AND old_title=cur_title", $fname );
 
                wfOut( wfTimestamp( TS_DB ) );
                wfOut( "......Setting up page table.\n" );
                $wgDatabase->query( "INSERT INTO $page (page_id, page_namespace, page_title, page_restrictions, page_counter,
-                               page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len)
-                       SELECT cur_id, cur_namespace, cur_title, cur_restrictions, cur_counter, cur_is_redirect, cur_is_new,
-                               cur_random, cur_touched, rev_id, LENGTH(cur_text)
-                       FROM $cur,$revision
-                       WHERE cur_id=rev_page AND rev_timestamp=cur_timestamp AND rev_id > {$maxold}", $fname );
+                       page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len)
+                       SELECT cur_id, cur_namespace, cur_title, cur_restrictions, cur_counter, cur_is_redirect, cur_is_new,
+                               cur_random, cur_touched, rev_id, LENGTH(cur_text)
+                       FROM $cur,$revision
+                       WHERE cur_id=rev_page AND rev_timestamp=cur_timestamp AND rev_id > {$maxold}", $fname );
 
                wfOut( wfTimestamp( TS_DB ) );
                wfOut( "......Unlocking tables.\n" );
@@ -954,7 +989,7 @@ function do_rc_indices_update() {
                'rc_ns_usertext' => 'patch-recentchanges-utindex.sql',
                'rc_user_text' => 'patch-rc_user_text-index.sql',
        );
-       
+
        foreach( $indexes as $index => $patch ) {
                $info = $wgDatabase->indexInfo( 'recentchanges', $index, __METHOD__ );
                if( !$info ) {
@@ -984,20 +1019,22 @@ function index_has_field($table, $index, $field) {
 }
 
 function do_backlinking_indices_update() {
+       global $wgDatabase;
        wfOut( "Checking for backlinking indices...\n" );
        if (!index_has_field('pagelinks', 'pl_namespace', 'pl_from') ||
                !index_has_field('templatelinks', 'tl_namespace', 'tl_from') ||
                !index_has_field('imagelinks', 'il_to', 'il_from'))
-       {       
+       {
                $wgDatabase->sourceFile( archive( 'patch-backlinkindexes.sql' ) );
                wfOut( "...backlinking indices updated\n" );
        }
 }
 
 function do_categorylinks_indices_update() {
+       global $wgDatabase;
        wfOut( "Checking for categorylinks indices...\n" );
        if (!index_has_field('categorylinks', 'cl_sortkey', 'cl_from'))
-       {       
+       {
                $wgDatabase->sourceFile( archive( 'patch-categorylinksindex.sql' ) );
                wfOut( "...categorylinks indices updated\n" );
        }
@@ -1008,7 +1045,7 @@ function do_filearchive_indices_update() {
        wfOut( "Checking filearchive indices...\n" );
        $info = $wgDatabase->indexInfo( 'filearchive', 'fa_user_timestamp', __METHOD__ );
        if ( !$info )
-       {       
+       {
                $wgDatabase->sourceFile( archive( 'patch-filearchive-user-index.sql' ) );
                wfOut( "...filearchive indices updated\n" );
        }
@@ -1040,18 +1077,18 @@ function do_stats_init() {
                wfOut( "ok.\n" );
                return;
        }
-       SiteStatsInit::doAllAndUpdate( false );
+       SiteStatsInit::doAllAndCommit( false );
 }
 
 function do_active_users_init() {
        global $wgDatabase;
        $activeUsers = $wgDatabase->selectField( 'site_stats', 'ss_active_users', false, __METHOD__ );
        if( $activeUsers == -1 ) {
-               $activeUsers = $wgDatabase->selectField( 'recentchanges', 
+               $activeUsers = $wgDatabase->selectField( 'recentchanges',
                        'COUNT( DISTINCT rc_user_text )',
-                       array( 'rc_user != 0', 'rc_bot' => 0, "rc_log_type != 'newusers'" ), __METHOD__ 
+                       array( 'rc_user != 0', 'rc_bot' => 0, "rc_log_type != 'newusers'" ), __METHOD__
                );
-               $wgDatabase->update( 'site_stats', 
+               $wgDatabase->update( 'site_stats',
                        array( 'ss_active_users' => intval($activeUsers) ),
                        array( 'ss_row_id' => 1 ), __METHOD__, array( 'LIMIT' => 1 )
                );
@@ -1069,7 +1106,7 @@ function purge_cache() {
 }
 
 function do_all_updates( $shared = false, $purge = true ) {
-       global $wgNewTables, $wgNewFields, $wgRenamedTables, $wgSharedDB, $wgSharedTables, $wgDatabase, $wgDBtype, $IP;
+       global $wgNewTables, $wgExtModifiedFields, $wgNewFields, $wgRenamedTables, $wgSharedDB, $wgSharedTables, $wgDatabase, $wgDBtype, $IP;
 
        wfRunHooks('LoadExtensionSchemaUpdates');
 
@@ -1079,7 +1116,7 @@ function do_all_updates( $shared = false, $purge = true ) {
                do_postgres_updates();
                return;
        }
-       
+
        # Run core updates in sequence...
        global $wgUpdates;
        if ( isset( $wgUpdates[$wgDBtype] ) ) {
@@ -1089,7 +1126,7 @@ function do_all_updates( $shared = false, $purge = true ) {
                        flush();
                }
        }
-       
+
        /// @fixme clean up this mess too!
        global $wgExtNewTables, $wgExtNewFields, $wgExtNewIndexes;
        # Add missing extension tables
@@ -1109,18 +1146,23 @@ function do_all_updates( $shared = false, $purge = true ) {
                add_index( $fieldRecord[0], $fieldRecord[1], $fieldRecord[2], true );
                flush();
        }
+       # Add modified extension fields
+       foreach ( $wgExtModifiedFields as $fieldRecord ) {
+               modify_field($fieldRecord[0], $fieldRecord[1], $fieldRecord[2], true);
+               flush();
+       }
 
 
-       wfOut( "Deleting old default messages (this may take a long time!)..." ); 
+       wfOut( "Deleting old default messages (this may take a long time!)..." );
        if( !defined( 'MW_NO_SETUP' ) ) {
                define( 'MW_NO_SETUP', true );
        }
        require_once 'deleteDefaultMessages.php';
        DeleteDefaultMessages::reallyExecute();
        wfOut( "Done\n" );
-       
+
        do_stats_init();
-       
+
        if( $purge ) {
                purge_cache();
        }
@@ -1196,7 +1238,7 @@ function do_restrictions_update() {
                        $wgDatabase->update( 'page', array ( 'page_restrictions' => ''), array( 'page_id' => $id ), __METHOD__ );
 
                        }
-                       
+
                        foreach( $restrictions as $type => $level ) {
                                $wgDatabase->insert( 'page_restrictions', array ( 'pr_page' => $id,
                                                                                        'pr_type' => $type,
@@ -1230,14 +1272,15 @@ function do_populate_parent_id() {
                return;
        }
        require_once( 'populateParentId.inc' );
-       
+
        global $wgDatabase;
        populate_rev_parent_id( $wgDatabase );
 }
 
 function sqlite_initial_indexes() {
        global $wgDatabase;
-       if ( update_row_exists( 'initial_indexes' ) ) {
+       // initial-indexes.sql fails if the indexes are already present, so we perform a quick check if our database is newer.
+       if ( update_row_exists( 'initial_indexes' ) || $wgDatabase->indexExists( 'user', 'user_name' ) ) {
                wfOut( "...have initial indexes\n" );
                return;
        }
@@ -1246,6 +1289,23 @@ function sqlite_initial_indexes() {
        wfOut( "done\n" );
 }
 
+function sqlite_setup_searchindex() {
+       global $wgDatabase;
+       $module = $wgDatabase->getFulltextSearchModule();
+       $fts3tTable = update_row_exists( 'fts3' );
+       if ( $fts3tTable &&  !$module ) {
+               wfOut( '...PHP is missing FTS3 support, downgrading tables...' );
+               $wgDatabase->sourceFile( archive( 'searchindex-no-fts.sql' ) );
+               wfOut( "done\n" );
+       } elseif ( !$fts3tTable && $module == 'FTS3' ) {
+               wfOut( '...adding FTS3 search capabilities...' );
+               $wgDatabase->sourceFile( archive( 'searchindex-fts3.sql' ) );
+               wfOut( "done\n" );
+       } else {
+               wfOut( "...fulltext search table appears to be in order.\n" );
+       }
+}
+
 function do_unique_pl_tl_il() {
        global $wgDatabase;
        $info = $wgDatabase->indexInfo( 'pagelinks', 'pl_namespace' );
@@ -1273,18 +1333,39 @@ function do_log_search_population() {
        wfOut( "Done populating log_search table.\n" );
 }
 
+function rename_eu_wiki_id() {
+       global $wgDatabase;
+       wfOut( "Renaming eu_wiki_id -> eu_local_id... " );
+       if ( $wgDatabase->fieldExists( 'external_user', 'eu_local_id' ) ) {
+               wfOut( "already done.\n" );
+               return;
+       }
+       $wgDatabase->sourceFile( archive( 'patch-eu_local_id.sql' ) );
+       wfOut( "ok\n" );
+}
+
+function do_update_transcache_field() {
+       global $wgDatabase;
+       if( update_row_exists( 'convert transcache field' ) ) {
+               wfOut( "...transcache tc_time already converted.\n" );
+               return;
+       } else {
+               wfOut( "Converting tc_time from UNIX epoch to MediaWiki timestamp... " );
+               $wgDatabase->sourceFile( archive( 'patch-tc-timestamp.sql' ) );
+               wfOut( "ok\n" );
+       }
+}
+
 /***********************************************************************
- * Start PG crap
+ * Start PG stuff
  * TODO: merge with above
  ***********************************************************************/
 
-function
-pg_describe_table($table)
-{
-global $wgDatabase, $wgDBmwschema;
+function pg_describe_table($table) {
+       global $wgDatabase, $wgDBmwschema;
        $q = <<<END
 SELECT attname, attnum FROM pg_namespace, pg_class, pg_attribute
-       WHERE pg_class.relnamespace = pg_namespace.oid 
+       WHERE pg_class.relnamespace = pg_namespace.oid
          AND attrelid=pg_class.oid AND attnum > 0
          AND relname=%s AND nspname=%s
 END;
@@ -1296,7 +1377,7 @@ END;
 
        $cols = array();
        while ($r = $wgDatabase->fetchRow($res)) {
-               $cols[] = array(        
+               $cols[] = array(
                                "name" => $r[0],
                                "ord" => $r[1],
                        );
@@ -1304,10 +1385,8 @@ END;
        return $cols;
 }
 
-function
-pg_describe_index($idx)
-{
-global $wgDatabase, $wgDBmwschema;
+function pg_describe_index($idx) {
+       global $wgDatabase, $wgDBmwschema;
 
        // first fetch the key (which is a list of columns ords) and
        // the table the index applies to (an oid)
@@ -1355,10 +1434,8 @@ END;
        return $colnames;
 }
 
-function
-pg_index_exists($table, $index)
-{
-global $wgDatabase, $wgDBmwschema;
+function pg_index_exists($table, $index) {
+       global $wgDatabase, $wgDBmwschema;
        $exists = $wgDatabase->selectField("pg_indexes", "indexname",
                        array(  "indexname" => $index,
                                "tablename" => $table,
@@ -1366,10 +1443,8 @@ global   $wgDatabase, $wgDBmwschema;
        return $exists === $index;
 }
 
-function
-pg_fkey_deltype($fkey)
-{
-global $wgDatabase, $wgDBmwschema;
+function pg_fkey_deltype($fkey) {
+       global $wgDatabase, $wgDBmwschema;
        $q = <<<END
 SELECT confdeltype FROM pg_constraint, pg_namespace
        WHERE connamespace=pg_namespace.oid
@@ -1384,10 +1459,8 @@ END;
        return $row[0];
 }
 
-function
-pg_rule_def($table, $rule)
-{
-global $wgDatabase, $wgDBmwschema;
+function pg_rule_def($table, $rule) {
+       global $wgDatabase, $wgDBmwschema;
        $q = <<<END
 SELECT definition FROM pg_rules
        WHERE schemaname = %s
@@ -1469,8 +1542,8 @@ function do_postgres_updates() {
        }
 
        $newsequences = array(
-               "log_log_id_seq",
-               "pr_id_val",
+               "logging_log_id_seq",
+               "page_restrictions_pr_id_seq",
        );
 
        $newtables = array(
@@ -1508,7 +1581,7 @@ function do_postgres_updates() {
                array("ipblocks",      "ipb_enable_autoblock", "SMALLINT NOT NULL DEFAULT 1"),
                array("filearchive",   "fa_deleted",           "SMALLINT NOT NULL DEFAULT 0"),
                array("logging",       "log_deleted",          "SMALLINT NOT NULL DEFAULT 0"),
-               array("logging",       "log_id",               "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('log_log_id_seq')"),
+               array("logging",       "log_id",               "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')"),
                array("logging",       "log_params",           "TEXT"),
                array("mwuser",        "user_editcount",       "INTEGER"),
                array("mwuser",        "user_hidden",          "SMALLINT NOT NULL DEFAULT 0"),
@@ -1519,15 +1592,17 @@ function do_postgres_updates() {
                array("oldimage",      "oi_metadata",          "BYTEA NOT NULL DEFAULT ''"),
                array("oldimage",      "oi_minor_mime",        "TEXT NOT NULL DEFAULT 'unknown'"),
                array("oldimage",      "oi_sha1",              "TEXT NOT NULL DEFAULT ''"),
-               array("page_restrictions", "pr_id",            "INTEGER NOT NULL UNIQUE DEFAULT nextval('pr_id_val')"),
+               array("page_restrictions", "pr_id",            "INTEGER NOT NULL UNIQUE DEFAULT nextval('page_restrictions_pr_id_val')"),
                array("profiling",     "pf_memory",            "NUMERIC(18,10) NOT NULL DEFAULT 0"),
                array("recentchanges", "rc_deleted",           "SMALLINT NOT NULL DEFAULT 0"),
                array("recentchanges", "rc_log_action",        "TEXT"),
-        array("recentchanges", "rc_log_type",          "TEXT"),
-        array("recentchanges", "rc_logid",             "INTEGER NOT NULL DEFAULT 0"),
+               array("recentchanges", "rc_log_type",          "TEXT"),
+               array("recentchanges", "rc_logid",             "INTEGER NOT NULL DEFAULT 0"),
                array("recentchanges", "rc_new_len",           "INTEGER"),
                array("recentchanges", "rc_old_len",           "INTEGER"),
                array("recentchanges", "rc_params",            "TEXT"),
+               array("redirect",      "rd_interwiki",         "TEXT NULL"),
+               array("redirect",      "rd_fragment",          "TEXT NULL"),
                array("revision",      "rev_deleted",          "SMALLINT NOT NULL DEFAULT 0"),
                array("revision",      "rev_len",              "INTEGER"),
                array("revision",      "rev_parent_id",        "INTEGER DEFAULT NULL"),
@@ -1610,14 +1685,19 @@ function do_postgres_updates() {
        $newrules = array(
        );
 
+       #Check new sequences, rename if needed
        foreach ($newsequences as $ns) {
-               if ($wgDatabase->sequenceExists($ns)) {
-                       wfOut( "... sequence \"$ns\" already exists\n" );
+               if( $wgDatabase->sequenceExists('pr_id_val') ) {
+                       wfOut( "Updating sequence names\n" );
+                       $wgDatabase->sourceFile(archive('patch-update_sequences.sql'));
                        continue;
+               } elseif ( $wgDatabase->sequenceExists('page_restrictions_pr_id_seq') ) {
+                       wfOut( "... sequences already updated\n" );
+                       continue;
+               } else {
+                       wfOut( "Creating sequence \"$ns\"\n" );
+                       $wgDatabase->query("CREATE SEQUENCE $ns");
                }
-
-               wfOut( "Creating sequence \"$ns\"\n" );
-               $wgDatabase->query("CREATE SEQUENCE $ns");
        }
 
        foreach ($newtables as $nt) {