summaryrefslogtreecommitdiff
path: root/maintenance/updaters.inc
diff options
context:
space:
mode:
authorPierre Schmitz <pierre@archlinux.de>2008-08-15 01:29:47 +0200
committerPierre Schmitz <pierre@archlinux.de>2008-08-15 01:29:47 +0200
commit370e83bb0dfd0c70de268c93bf07ad5ee0897192 (patch)
tree491674f4c242e4d6ba0d04eafa305174c35a3391 /maintenance/updaters.inc
parentf4debf0f12d0524d2b2427c55ea3f16b680fad97 (diff)
Update auf 1.13.0
Diffstat (limited to 'maintenance/updaters.inc')
-rw-r--r--maintenance/updaters.inc175
1 files changed, 144 insertions, 31 deletions
diff --git a/maintenance/updaters.inc b/maintenance/updaters.inc
index 9d7e32cb..67680c49 100644
--- a/maintenance/updaters.inc
+++ b/maintenance/updaters.inc
@@ -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,7 +126,23 @@ $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
+ array( 'add_field', 'ipblocks', 'ipb_by_text', 'patch-ipb_by_text.sql' ),
+ array( 'add_table', 'page_props', 'patch-page_props.sql' ),
+ 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' ),
);
@@ -138,6 +153,20 @@ $wgExtNewFields = array(); // table, column, dir
$wgExtPGNewFields = array(); // table, column attributes; for PostgreSQL
$wgExtNewIndexes = 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
+# created!
+function update_row_exists( $key ) {
+ $dbr = wfGetDB( DB_SLAVE );
+ $row = $dbr->selectRow(
+ 'updatelog',
+ '1',
+ array( 'ul_key' => $key ),
+ __FUNCTION__
+ );
+ return (bool)$row;
+}
+
function rename_table( $from, $to, $patch ) {
global $wgDatabase;
if ( $wgDatabase->tableExists( $from ) ) {
@@ -420,20 +449,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";
}
}
@@ -526,7 +555,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,
@@ -544,7 +573,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";
@@ -942,6 +971,7 @@ function do_backlinking_indices_update() {
!index_has_field('imagelinks', 'il_to', 'il_from'))
{
dbsource( archive( 'patch-backlinkindexes.sql' ) );
+ echo( "...backlinking indices updated\n" );
}
}
@@ -950,6 +980,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";
}
}
@@ -979,11 +1034,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();
@@ -1114,7 +1169,54 @@ function do_restrictions_update() {
}
print "ok\n";
}
+}
+
+function do_category_population() {
+ if( update_row_exists( 'populate category' ) ) {
+ echo "...category table already populated.\n";
+ return;
+ }
+ require_once( 'populateCategory.inc' );
+ echo "Populating category table, printing progress markers. ".
+"For large databases, you\n".
+"may want to hit Ctrl-C and do this manually with maintenance/\n".
+"populateCategory.php.\n";
+ populateCategory( '', 10, 0, true );
+ echo "Done populating category table.\n";
+}
+
+function do_populate_parent_id() {
+ if( update_row_exists( 'populate rev_parent_id' ) ) {
+ echo "...rev_parent_id column already populated.\n";
+ 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
@@ -1267,21 +1369,23 @@ function do_postgres_updates() {
list( $x,$y ) = explode( '=', $c );
$conf[$x] = $y;
}
- $newpath = array();
- if( $wgDBmwschema === 'mediawiki' ) {
- if (!array_key_exists( 'search_path', $conf ) or strpos( $conf['search_path'],$wgDBmwschema ) === false ) {
- echo "Adding in schema \"$wgDBmwschema\" to search_path for user \"$wgDBuser\"\n";
- $newpath[$wgDBmwschema] = 1;
- }
+ if( !array_key_exists( 'search_path', $conf ) ) {
+ $search_path = '';
+ }
+ else {
+ $search_path = $conf['search_path'];
}
- if( !array_key_exists( 'search_path', $conf ) or strpos( $conf['search_path'],$wgDBts2schema ) === false ) {
+ if( strpos( $search_path, $wgDBmwschema ) === false ) {
+ echo "Adding in schema \"$wgDBmwschema\" to search_path for user \"$wgDBuser\"\n";
+ $search_path = "$wgDBmwschema, $search_path";
+ }
+ if( strpos( $search_path, $wgDBts2schema ) === false ) {
echo "Adding in schema \"$wgDBts2schema\" to search_path for user \"$wgDBuser\"\n";
- $newpath[$wgDBts2schema] = 1;
+ $search_path = "$search_path, $wgDBts2schema";
}
- $searchpath = implode( ',', array_keys( $newpath ) );
- if( strlen( $searchpath ) ) {
- $wgDatabase->doQuery( "ALTER USER $wgDBuser SET search_path = $searchpath" );
- $wgDatabase->doQuery( "SET search_path = $searchpath" );
+ if( array_key_exists( 'search_path', $conf ) === false || $search_path != $conf['search_path'] ) {
+ $wgDatabase->doQuery( "ALTER USER $wgDBuser SET search_path = $search_path" );
+ $wgDatabase->doQuery( "SET search_path = $search_path" );
}
else {
$path = $conf['search_path'];
@@ -1310,22 +1414,27 @@ function do_postgres_updates() {
);
$newtables = array(
+ array("category", "patch-category.sql"),
array("mediawiki_version", "patch-mediawiki_version.sql"),
array("mwuser", "patch-mwuser.sql"),
array("pagecontent", "patch-pagecontent.sql"),
array("querycachetwo", "patch-querycachetwo.sql"),
+ array("page_props", "patch-page_props.sql"),
array("page_restrictions", "patch-page_restrictions.sql"),
array("profiling", "patch-profiling.sql"),
array("protected_titles", "patch-protected_titles.sql"),
array("redirect", "patch-redirect.sql"),
+ array("updatelog", "patch-updatelog.sql"),
);
$newcols = array(
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_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_deleted", "SMALLINT NOT NULL DEFAULT 0"),
@@ -1343,6 +1452,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"),
@@ -1352,6 +1462,7 @@ 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"),
);
@@ -1373,12 +1484,12 @@ 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", ""),
+ array("ipblocks", "ipb_deleted", "smallint", "ipb_deleted::smallint"),
array("math", "math_inputhash", "bytea", "decode(math_inputhash,'escape')"),
array("math", "math_outputhash", "bytea", "decode(math_outputhash,'escape')"),
array("mwuser", "user_token", "text", ""),
@@ -1397,6 +1508,7 @@ 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)"),
@@ -1602,3 +1714,4 @@ function do_postgres_updates() {
return;
}
+