Per r40414: Add new CSS files to message files.
[lhc/web/wiklou.git] / maintenance / updaters.inc
index 56aa5f8..09e4680 100644 (file)
@@ -1,10 +1,9 @@
 <?php
 /**
- * @addtogroup Maintenance
+ * @file
+ * @ingroup Maintenance
  */
 
- /** */
-
 if ( !defined( 'MEDIAWIKI' ) ) {
        echo "This file is not a valid entry point\n";
        exit( 1 );
@@ -57,7 +56,7 @@ $wgMysqlUpdates = array(
        // 1.5
        array( 'do_schema_restructuring' ),
        array( 'add_field', 'logging',       'log_params',       'patch-log_params.sql' ),
-       array( 'do_logging_encoding' ),
+       array( 'check_bin', 'logging',       'log_title',        'patch-logging-title.sql', ),
        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' ),
@@ -127,6 +126,8 @@ $wgMysqlUpdates = array(
        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' ),
+
+       // 1.12
        array( 'add_table', 'protected_titles',                  'patch-protected_titles.sql' ),
        
        // 1.13
@@ -135,7 +136,17 @@ $wgMysqlUpdates = array(
        array( 'add_table', 'updatelog',                         'patch-updatelog.sql' ),
        array( 'add_table', 'category',                          'patch-category.sql' ),
        array( 'do_category_population' ),
+       array( 'add_field', 'archive',       'ar_parent_id',     'patch-ar_parent_id.sql'),
+       array( 'add_field', 'user_newtalk',  'user_last_timestamp', 'patch-user_last_timestamp.sql'),
        array( 'do_populate_parent_id' ),
+       array( 'check_bin', 'protected_titles', 'pt_title',      'patch-pt_title-encoding.sql', ),
+       array( 'maybe_do_profiling_memory_update' ),
+       array( 'do_filearchive_indices_update' ),
+       array( 'update_password_format' ),
+       
+       // 1.14
+       array( 'add_field', 'site_stats',     'ss_active_users',  'patch-ss_active_users.sql' ),
+       array( 'do_active_users_init' )
 );
 
 
@@ -442,20 +453,20 @@ function do_user_update() {
  * 1.4 betas were missing the 'binary' marker from logging.log_title,
  * which causes a collation mismatch error on joins in MySQL 4.1.
  */
-function do_logging_encoding() {
+function check_bin( $table, $field, $patchFile ) {
        global $wgDatabase, $wgDBtype;
        if ($wgDBtype != 'mysql')
                return;
-       $logging = $wgDatabase->tableName( 'logging' );
-       $res = $wgDatabase->query( "SELECT log_title FROM $logging LIMIT 0" );
+       $tableName = $wgDatabase->tableName( $table );
+       $res = $wgDatabase->query( "SELECT $field FROM $tableName LIMIT 0" );
        $flags = explode( ' ', mysql_field_flags( $res->result, 0 ) );
        $wgDatabase->freeResult( $res );
 
        if( in_array( 'binary', $flags ) ) {
-               echo "Logging table has correct title encoding.\n";
+               echo "$table table has correct $field encoding.\n";
        } else {
-               echo "Fixing title encoding on logging table... ";
-               dbsource( archive( 'patch-logging-title.sql' ), $wgDatabase );
+               echo "Fixing $field encoding on $table table... ";
+               dbsource( archive( $patchFile ), $wgDatabase );
                echo "ok\n";
        }
 }
@@ -548,7 +559,7 @@ function do_schema_restructuring() {
                        UNIQUE INDEX name_title (page_namespace,page_title),
                        INDEX (page_random),
                        INDEX (page_len)
-                       ) TYPE=InnoDB", $fname );
+                       ) ENGINE=InnoDB", $fname );
                $wgDatabase->query("CREATE TABLE $revision (
                        rev_id int(8) unsigned NOT NULL auto_increment,
                        rev_page int(8) unsigned NOT NULL,
@@ -566,7 +577,7 @@ function do_schema_restructuring() {
                        INDEX page_timestamp (rev_page,rev_timestamp),
                        INDEX user_timestamp (rev_user,rev_timestamp),
                        INDEX usertext_timestamp (rev_user_text,rev_timestamp)
-                       ) TYPE=InnoDB", $fname );
+                       ) ENGINE=InnoDB", $fname );
 
                echo wfTimestamp( TS_DB );
                echo "......Locking tables.\n";
@@ -964,6 +975,7 @@ function do_backlinking_indices_update() {
                !index_has_field('imagelinks', 'il_to', 'il_from'))
        {       
                dbsource( archive( 'patch-backlinkindexes.sql' ) );
+               echo( "...backlinking indices updated\n" );
        }
 }
 
@@ -972,6 +984,31 @@ function do_categorylinks_indices_update() {
        if (!index_has_field('categorylinks', 'cl_sortkey', 'cl_from'))
        {       
                dbsource( archive( 'patch-categorylinksindex.sql' ) );
+               echo( "...categorylinks indices updated\n" );
+       }
+}
+
+function do_filearchive_indices_update() {
+       global $wgDatabase;
+       echo( "Checking filearchive indices...\n" );
+       $info = $wgDatabase->indexInfo( 'filearchive', 'fa_user_timestamp', __METHOD__ );
+       if ( !$info )
+       {       
+               dbsource( archive( 'patch-filearhive-user-index.sql' ) );
+               echo( "...filearchive indices updated\n" );
+       }
+}
+
+function maybe_do_profiling_memory_update() {
+       global $wgDatabase;
+       if ( !$wgDatabase->tableExists( 'profiling' ) ) {
+               // Simply ignore
+       } elseif ( $wgDatabase->fieldExists( 'profiling', 'pf_memory' ) ) {
+               echo "profiling table has pf_memory field.\n";
+       } else {
+               echo "Adding pf_memory field to table profiling...";
+               dbsource( archive( 'patch-profiling-memory.sql' ), $wgDatabase );
+               echo "ok\n";
        }
 }
 
@@ -991,6 +1028,22 @@ function do_stats_init() {
        }
 }
 
+function do_active_users_init() {
+       global $wgDatabase;
+       $activeUsers = $wgDatabase->selectField( 'site_stats', 'ss_active_users', false, __METHOD__ );
+       if( $activeUsers == -1 ) {
+               $activeUsers = $wgDatabase->selectField( 'recentchanges', 
+                       'COUNT( DISTINCT rc_user_text )',
+                       array( 'rc_user != 0', 'rc_bot' => 0, "rc_log_type != 'newusers'" ), __METHOD__ 
+               );
+               $wgDatabase->update( 'site_stats', 
+                       array( 'ss_active_users' => intval($activeUsers) ),
+                       array( 'ss_row_id' => 1 ), __METHOD__, array( 'LIMIT' => 1 )
+               );
+       }
+       echo( "...ss_active_users user count set...\n" );
+}
+
 function purge_cache() {
        global $wgDatabase;
        # We can't guarantee that the user will be able to use TRUNCATE,
@@ -1001,11 +1054,11 @@ function purge_cache() {
 }
 
 function do_all_updates( $shared = false, $purge = true ) {
-       global $wgNewTables, $wgNewFields, $wgRenamedTables, $wgSharedDB, $wgDatabase, $wgDBtype, $IP;
+       global $wgNewTables, $wgNewFields, $wgRenamedTables, $wgSharedDB, $wgSharedTables, $wgDatabase, $wgDBtype, $IP;
 
        wfRunHooks('LoadExtensionSchemaUpdates');
 
-       $doUser = !$wgSharedDB || $shared;
+       $doUser = $shared ? $wgSharedDB && in_array('user', $wgSharedTables) : !$wgSharedDB || !in_array('user', $wgSharedTables);
 
        if ($wgDBtype === 'postgres') {
                do_postgres_updates();
@@ -1158,6 +1211,32 @@ function do_populate_parent_id() {
                return;
        }
        require_once( 'populateParentId.inc' );
+       
+       global $wgDatabase;
+       populate_rev_parent_id( $wgDatabase );
+}
+
+function update_password_format() {
+       if ( update_row_exists( 'password format' ) ) {
+               echo "...password hash format already changed\n";
+               return;
+       }
+
+       echo "Updating password hash format...";
+
+       global $wgDatabase, $wgPasswordSalt;
+       $user = $wgDatabase->tableName( 'user' );
+       if ( $wgPasswordSalt ) {
+               $sql = "UPDATE $user SET user_password=CONCAT(':B:', user_id, ':', user_password) " .
+                       "WHERE user_password NOT LIKE ':%'";
+       } else {
+               $sql = "UPDATE $user SET user_password=CONCAT(':A:', user_password) " .
+                       "WHERE user_password NOT LIKE ':%'";
+       }
+       $wgDatabase->query( $sql, __METHOD__ );
+       $wgDatabase->insert( 'updatelog', array( 'ul_key' => 'password format' ), __METHOD__ );
+
+       echo "done\n";
 }
 
 function
@@ -1372,13 +1451,14 @@ function do_postgres_updates() {
                array("archive",       "ar_deleted",           "SMALLINT NOT NULL DEFAULT 0"),
                array("archive",       "ar_len",               "INTEGER"),
                array("archive",       "ar_page_id",           "INTEGER"),
+               array("archive",       "ar_parent_id",         "INTEGER"),
                array("image",         "img_sha1",             "TEXT NOT NULL DEFAULT ''"),
-               array("ipblocks",      "ipb_anon_only",        "CHAR NOT NULL DEFAULT '0'"),
+               array("ipblocks",      "ipb_anon_only",        "SMALLINT NOT NULL DEFAULT '0'"),
                array("ipblocks",      "ipb_by_text",          "TEXT NOT NULL DEFAULT ''"),
-               array("ipblocks",      "ipb_block_email",      "CHAR NOT NULL DEFAULT '0'"),
-               array("ipblocks",      "ipb_create_account",   "CHAR NOT NULL DEFAULT '1'"),
+               array("ipblocks",      "ipb_block_email",      "SMALLINT NOT NULL DEFAULT '0'"),
+               array("ipblocks",      "ipb_create_account",   "SMALLINT NOT NULL DEFAULT '1'"),
                array("ipblocks",      "ipb_deleted",          "SMALLINT NOT NULL DEFAULT 0"),
-               array("ipblocks",      "ipb_enable_autoblock", "CHAR NOT NULL DEFAULT '1'"),
+               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')"),
@@ -1392,6 +1472,7 @@ function do_postgres_updates() {
                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("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"),
@@ -1401,6 +1482,8 @@ function do_postgres_updates() {
                array("recentchanges", "rc_params",            "TEXT"),
                array("revision",      "rev_len",              "INTEGER"),
                array("revision",      "rev_deleted",          "SMALLINT NOT NULL DEFAULT 0"),
+               array("user_newtalk",  "user_last_timestamp",  "TIMESTAMPTZ"),
+               array("site_stats",    "ss_active_users",      "INTEGER DEFAULT '-1'"),
        );
 
 
@@ -1422,10 +1505,10 @@ function do_postgres_updates() {
                array("interwiki",    "iw_local",        "smallint", "iw_local::smallint DEFAULT 0"),
                array("interwiki",    "iw_trans",        "smallint", "iw_trans::smallint DEFAULT 0"),
                array("ipblocks",     "ipb_auto",        "smallint", "ipb_auto::smallint DEFAULT 0"),
-               array("ipblocks",     "ipb_anon_only",   "smallint", "ipb_anon_only::smallint DEFAULT 0"),
-               array("ipblocks",     "ipb_create_account", "smallint", "ipb_create_account::smallint DEFAULT 1"),
-               array("ipblocks",     "ipb_enable_autoblock", "smallint", "ipb_enable_autoblock::smallint DEFAULT 1"),
-               array("ipblocks",     "ipb_block_email", "smallint", "ipb_block_email::smallint DEFAULT 0"),
+               array("ipblocks",     "ipb_anon_only",   "smallint", "CASE WHEN ipb_anon_only=' ' THEN 0 ELSE ipb_anon_only::smallint END DEFAULT 0"),
+               array("ipblocks",     "ipb_create_account", "smallint", "CASE WHEN ipb_create_account=' ' THEN 0 ELSE ipb_create_account::smallint END DEFAULT 1"),
+               array("ipblocks",     "ipb_enable_autoblock", "smallint", "CASE WHEN ipb_enable_autoblock=' ' THEN 0 ELSE ipb_enable_autoblock::smallint END DEFAULT 1"),
+               array("ipblocks",     "ipb_block_email", "smallint", "CASE WHEN ipb_block_email=' ' THEN 0 ELSE ipb_block_email::smallint END DEFAULT 0"),
                array("ipblocks",     "ipb_address",     "text",     "ipb_address::text"),
                array("ipblocks",     "ipb_deleted",     "smallint", "ipb_deleted::smallint"),
                array("math",         "math_inputhash",  "bytea",    "decode(math_inputhash,'escape')"),
@@ -1446,16 +1529,19 @@ function do_postgres_updates() {
                array("recentchanges","rc_new",          "smallint", "rc_new::smallint DEFAULT 0"),
                array("recentchanges","rc_type",         "smallint", "rc_type::smallint DEFAULT 0"),
                array("recentchanges","rc_patrolled",    "smallint", "rc_patrolled::smallint DEFAULT 0"),
+               array("revision",     "rev_deleted",     "smallint", "rev_deleted::smallint DEFAULT 0"),
                array("revision",     "rev_minor_edit",  "smallint", "rev_minor_edit::smallint DEFAULT 0"),
                array("templatelinks","tl_namespace",    "smallint", "tl_namespace::smallint"),
                array("user_newtalk", "user_ip",         "text",     "host(user_ip)"),
        );
 
        $newindexes = array(
-               array("archive",       "archive_user_text", "(ar_user_text)"),
-               array("image",         "img_sha1",          "(img_sha1)"),
-               array("oldimage",      "oi_sha1",           "(oi_sha1)"),
-               array("revision",      "rev_text_id_idx",   "(rev_text_id)"),
+               array("archive",       "archive_user_text",  "(ar_user_text)"),
+               array("image",         "img_sha1",           "(img_sha1)"),
+               array("oldimage",      "oi_sha1",            "(oi_sha1)"),
+               array("revision",      "rev_text_id_idx",    "(rev_text_id)"),
+               array("recentchanges", "rc_timestamp_nobot", "(rc_timestamp) WHERE rc_bot = 0"),
+               array("watchlist",     "wl_user",            "(wl_user)"),
        );
 
        $newrules = array(
@@ -1600,7 +1686,7 @@ function do_postgres_updates() {
                $wgDatabase->query("CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title)");
        }
        else
-               echo "... index \"pagelink_unique_index\" aready exists\n";
+               echo "... index \"pagelink_unique_index\" already exists\n";
 
        if (pg_fkey_deltype("revision_rev_user_fkey") == 'r') {
                echo "... constraint \"revision_rev_user_fkey\" is ON DELETE RESTRICT\n";
@@ -1610,6 +1696,14 @@ function do_postgres_updates() {
                dbsource(archive('patch-revision_rev_user_fkey.sql'));
        }
 
+       # Fix ipb_address index
+       if (pg_index_exists('ipblocks', 'ipb_address_unique' )) {
+               echo "... have ipb_address_unique\n";
+       } else {
+               echo "Adding ipb_address_unique index\n";
+               dbsource(archive('patch-ipb_address_unique.sql'));
+       }
+
        global $wgExtNewTables, $wgExtPGNewFields, $wgExtNewIndexes;
        # Add missing extension tables
        foreach ( $wgExtNewTables as $nt ) {
@@ -1651,3 +1745,4 @@ function do_postgres_updates() {
 
        return;
 }
+