/**
* PostgreSQL-specific updater.
*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
* @file
* @ingroup Deployment
*/
array( 'renameIndex', 'mwuser', 'user_user_name_key', 'mwuser_user_name_key' ),
array( 'renameIndex', 'pagecontent','text_pkey', 'pagecontent_pkey' ),
- # new sequences
- array( 'addSequence', 'logging_log_id_seq' ),
- array( 'addSequence', 'page_restrictions_pr_id_seq' ),
-
# renamed sequences
array( 'renameSequence', 'ipblocks_ipb_id_val', 'ipblocks_ipb_id_seq' ),
array( 'renameSequence', 'rev_rev_id_val', 'revision_rev_id_seq' ),
array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
array( 'addTable', 'user_former_groups','patch-user_former_groups.sql' ),
array( 'addTable', 'config', 'patch-config.sql' ),
- array( 'addTable', 'external_user','patch-external_user.sql' ),
+ array( 'addTable', 'external_user', 'patch-external_user.sql' ),
# Needed before new field
array( 'convertArchive2' ),
array( 'addPgField', 'ipblocks', 'ipb_create_account', 'SMALLINT NOT NULL DEFAULT 1' ),
array( 'addPgField', 'ipblocks', 'ipb_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
array( 'addPgField', 'ipblocks', 'ipb_enable_autoblock', 'SMALLINT NOT NULL DEFAULT 1' ),
+ array( 'addPgField', 'ipblocks', 'ipb_parent_block_id', 'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ),
array( 'addPgField', 'filearchive', 'fa_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
array( 'addPgField', 'logging', 'log_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
array( 'addPgField', 'logging', 'log_id', "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')" ),
array( 'changeField', 'image', 'img_size', 'integer', '' ),
array( 'changeField', 'image', 'img_width', 'integer', '' ),
array( 'changeField', 'image', 'img_height', 'integer', '' ),
- array( 'changeField', 'interwiki', 'iw_local', 'smallint', 'iw_local::smallint DEFAULT 0' ),
+ array( 'changeField', 'interwiki', 'iw_local', 'smallint', 'iw_local::smallint' ),
array( 'changeField', 'interwiki', 'iw_trans', 'smallint', 'iw_trans::smallint DEFAULT 0' ),
array( 'changeField', 'ipblocks', 'ipb_auto', 'smallint', 'ipb_auto::smallint DEFAULT 0' ),
array( 'changeField', 'ipblocks', 'ipb_anon_only', 'smallint', "CASE WHEN ipb_anon_only=' ' THEN 0 ELSE ipb_anon_only::smallint END DEFAULT 0" ),
array( 'changeNullableField', 'oldimage', 'oi_timestamp', 'NULL' ),
array( 'changeNullableField', 'oldimage', 'oi_major_mime', 'NULL' ),
array( 'changeNullableField', 'oldimage', 'oi_minor_mime', 'NULL' ),
- array( 'setDefault', 'image', 'img_metadata', '\'\x\'::bytea'),
array( 'changeNullableField', 'image', 'img_metadata', 'NOT NULL'),
- array( 'setDefault', 'filearchive', 'fa_metadata', '\'\x\'::bytea'),
array( 'changeNullableField', 'filearchive', 'fa_metadata', 'NOT NULL'),
array( 'changeNullableField', 'recentchanges', 'rc_cur_id', 'NULL' ),
# New indexes
array( 'addPgIndex', 'archive', 'archive_user_text', '(ar_user_text)' ),
array( 'addPgIndex', 'image', 'img_sha1', '(img_sha1)' ),
+ array( 'addPgIndex', 'ipblocks', 'ipb_parent_block_id', '(ipb_parent_block_id)' ),
array( 'addPgIndex', 'oldimage', 'oi_sha1', '(oi_sha1)' ),
array( 'addPgIndex', 'page', 'page_mediawiki_title', '(page_title) WHERE page_namespace = 8' ),
array( 'addPgIndex', 'pagelinks', 'pagelinks_title', '(pl_title)' ),
array( 'changeFkeyDeferrable', 'imagelinks', 'il_from', 'page(page_id) ON DELETE CASCADE' ),
array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_by', 'mwuser(user_id) ON DELETE CASCADE' ),
array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+ array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_parent_block_id', 'ipblocks(ipb_id) ON DELETE SET NULL' ),
array( 'changeFkeyDeferrable', 'langlinks', 'll_from', 'page(page_id) ON DELETE CASCADE' ),
array( 'changeFkeyDeferrable', 'logging', 'log_user', 'mwuser(user_id) ON DELETE SET NULL' ),
array( 'changeFkeyDeferrable', 'oldimage', 'oi_name', 'image(img_name) ON DELETE CASCADE ON UPDATE CASCADE' ),
if ( $this->db->indexExists( $table, $index ) ) {
$this->output( "...index '$index' on table '$table' already exists\n" );
} else {
- $this->output( "Creating index '$index' on table '$table'\n" );
if ( preg_match( '/^\(/', $type ) ) {
+ $this->output( "Creating index '$index' on table '$table'\n" );
$this->db->query( "CREATE INDEX $index ON $table $type" );
} else {
- $this->applyPatch( $type, true );
+ $this->applyPatch( $type, true, "Creating index '$index' on table '$table'" );
}
}
}
protected function convertArchive2() {
if ( $this->db->tableExists( "archive2" ) ) {
- $this->output( "Converting 'archive2' back to normal archive table\n" );
if ( $this->db->ruleExists( 'archive', 'archive_insert' ) ) {
$this->output( "Dropping rule 'archive_insert'\n" );
$this->db->query( 'DROP RULE archive_insert ON archive' );
$this->output( "Dropping rule 'archive_delete'\n" );
$this->db->query( 'DROP RULE archive_delete ON archive' );
}
- $this->applyPatch( 'patch-remove-archive2.sql' );
+ $this->applyPatch( 'patch-remove-archive2.sql', false, "Converting 'archive2' back to normal archive table" );
} else {
$this->output( "...obsolete table 'archive2' does not exist\n" );
}
protected function checkPageDeletedTrigger() {
if ( !$this->db->triggerExists( 'page', 'page_deleted' ) ) {
- $this->output( "Adding function and trigger 'page_deleted' to table 'page'\n" );
- $this->applyPatch( 'patch-page_deleted.sql' );
+ $this->applyPatch( 'patch-page_deleted.sql', false, "Adding function and trigger 'page_deleted' to table 'page'" );
} else {
$this->output( "...table 'page' has 'page_deleted' trigger\n" );
}
}
- protected function dropIndex( $table, $index ) {
+ protected function dropIndex( $table, $index, $patch = '', $fullpath = false ) {
if ( $this->db->indexExists( $table, $index ) ) {
$this->output( "Dropping obsolete index '$index'\n" );
$this->db->query( "DROP INDEX \"". $index ."\"" );
if ( $this->fkeyDeltype( 'revision_rev_user_fkey' ) == 'r' ) {
$this->output( "...constraint 'revision_rev_user_fkey' is ON DELETE RESTRICT\n" );
} else {
- $this->output( "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT\n" );
- $this->applyPatch( 'patch-revision_rev_user_fkey.sql' );
+ $this->applyPatch( 'patch-revision_rev_user_fkey.sql', false, "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT" );
}
}
protected function checkIwlPrefix() {
if ( $this->db->indexExists( 'iwlinks', 'iwl_prefix' ) ) {
- $this->output( "Replacing index 'iwl_prefix' with 'iwl_prefix_from_title'...\n" );
- $this->applyPatch( 'patch-rename-iwl_prefix.sql' );
+ $this->applyPatch( 'patch-rename-iwl_prefix.sql', false, "Replacing index 'iwl_prefix' with 'iwl_prefix_from_title'" );
}
}
protected function addInterwikiType() {
- $this->output( "Refreshing add_interwiki()...\n" );
- $this->applyPatch( 'patch-add_interwiki.sql' );
+ $this->applyPatch( 'patch-add_interwiki.sql', false, "Refreshing add_interwiki()" );
}
protected function tsearchFixes() {
# Tweak the page_title tsearch2 trigger to filter out slashes
# This is create or replace, so harmless to call if not needed
- $this->output( "Refreshing ts2_page_title()...\n" );
- $this->applyPatch( 'patch-ts2pagetitle.sql' );
+ $this->applyPatch( 'patch-ts2pagetitle.sql', false, "Refreshing ts2_page_title()" );
# If the server is 8.3 or higher, rewrite the tsearch2 triggers
# in case they have the old 'default' versions
# Gather version numbers in case we need them
if ( $this->db->getServerVersion() >= 8.3 ) {
- $this->output( "Rewriting tsearch2 triggers...\n" );
- $this->applyPatch( 'patch-tsearch2funcs.sql' );
+ $this->applyPatch( 'patch-tsearch2funcs.sql', false, "Rewriting tsearch2 triggers" );
}
}
}