From a9f7acf9d3045b08760ca83590bb4bbcd774a2a8 Mon Sep 17 00:00:00 2001 From: Greg Sabino Mullane Date: Fri, 28 Sep 2007 14:57:19 +0000 Subject: [PATCH] Postgres updating: Map bpchar to char Don't change default search_path if schema not 'mediawiki' in LocalSettings Clean up the output of updaters.inc Make sure we set search_path and others for current session when altering user. --- includes/DatabasePostgres.php | 1 + maintenance/updaters.inc | 133 +++++++++++++++++++--------------- 2 files changed, 76 insertions(+), 58 deletions(-) diff --git a/includes/DatabasePostgres.php b/includes/DatabasePostgres.php index 143443771f..085d9bc676 100644 --- a/includes/DatabasePostgres.php +++ b/includes/DatabasePostgres.php @@ -20,6 +20,7 @@ SELECT CASE WHEN typname = 'int2' THEN 'smallint' WHEN typname = 'int4' THEN 'integer' WHEN typname = 'int8' THEN 'bigint' +WHEN typname = 'bpchar' THEN 'char' ELSE typname END AS typname, attnotnull, attlen FROM pg_class, pg_namespace, pg_attribute, pg_type diff --git a/maintenance/updaters.inc b/maintenance/updaters.inc index 78cbdf0711..fe9328115f 100644 --- a/maintenance/updaters.inc +++ b/maintenance/updaters.inc @@ -1268,7 +1268,7 @@ function do_postgres_updates() { # Verify that this user is configured correctly $safeuser = $wgDatabase->addQuotes($wgDBuser); - $SQL = "SELECT array_to_string(useconfig,'*') FROM pg_user WHERE usename = $safeuser"; + $SQL = "SELECT array_to_string(useconfig,'*') FROM pg_catalog.pg_user WHERE usename = $safeuser"; $config = pg_fetch_result( $wgDatabase->doQuery( $SQL ), 0, 0 ); $conf = array(); foreach( explode( '*', $config ) as $c ) { @@ -1276,17 +1276,24 @@ function do_postgres_updates() { $conf[$x] = $y; } $newpath = array(); - if( !array_key_exists( 'search_path', $conf ) or strpos( $conf['search_path'],$wgDBmwschema ) === false ) { - print "Adding in schema \"$wgDBmwschema\" to search_path for user \"$wgDBuser\"\n"; - $newpath[$wgDBmwschema] = 1; + 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 ) or strpos( $conf['search_path'],$wgDBts2schema ) === false ) { - print "Adding in schema \"$wgDBts2schema\" to search_path for user \"$wgDBuser\"\n"; + echo "Adding in schema \"$wgDBts2schema\" to search_path for user \"$wgDBuser\"\n"; $newpath[$wgDBts2schema] = 1; } $searchpath = implode( ',', array_keys( $newpath ) ); if( strlen( $searchpath ) ) { $wgDatabase->doQuery( "ALTER USER $wgDBuser SET search_path = $searchpath" ); + $wgDatabase->doQuery( "SET search_path = $searchpath" ); + } + else { + $path = $conf['search_path']; + echo "... search_path for user \"$wgDBuser\" looks correct ($path)\n"; } $goodconf = array( 'client_min_messages' => 'error', @@ -1296,8 +1303,12 @@ function do_postgres_updates() { foreach( array_keys( $goodconf ) AS $key ) { $value = $goodconf[$key]; if( !array_key_exists( $key, $conf ) or $conf[$key] !== $value ) { - print "Setting $key to '$value' for user \"$wgDBuser\"\n"; + echo "Setting $key to '$value' for user \"$wgDBuser\"\n"; $wgDatabase->doQuery( "ALTER USER $wgDBuser SET $key = '$value'" ); + $wgDatabase->doQuery( "SET $key = '$value'" ); + } + else { + echo "... default value of \"$key\" is correctly set to \"$value\" for user \"$wgDBuser\"\n"; } } @@ -1317,6 +1328,7 @@ function do_postgres_updates() { ); $newcols = array( + array("archive", "ar_deleted", "INTEGER NOT NULL DEFAULT 0"), array("archive", "ar_len", "INTEGER"), array("archive", "ar_page_id", "INTEGER"), array("image", "img_sha1", "TEXT NOT NULL DEFAULT ''"), @@ -1390,58 +1402,51 @@ function do_postgres_updates() { foreach ($newsequences as $ns) { if ($wgDatabase->sequenceExists($ns)) { - echo "... sequence $ns already exists\n"; + echo "... sequence \"$ns\" already exists\n"; continue; } - echo "... create sequence $ns\n"; + echo "Creating sequence \"$ns\"\n"; $wgDatabase->query("CREATE SEQUENCE $ns"); } foreach ($newtables as $nt) { if ($wgDatabase->tableExists($nt[0])) { - echo "... table $nt[0] already exists\n"; + echo "... table \"$nt[0]\" already exists\n"; continue; } - echo "... create table $nt[0]\n"; + echo "Creating table \"$nt[0]\"\n"; dbsource(archive($nt[1])); } ## Needed before newcols if ($wgDatabase->tableExists("archive2")) { - echo "... convert archive2 back to normal archive table\n"; + echo "Converting \"archive2\" back to normal archive table\n"; if ($wgDatabase->ruleExists("archive", "archive_insert")) { - echo "... drop rule archive_insert\n"; + echo "Dropping rule \"archive_insert\"\n"; $wgDatabase->query("DROP RULE archive_insert ON archive"); } if ($wgDatabase->ruleExists("archive", "archive_delete")) { - echo "... drop rule archive_delete\n"; + echo "Dropping rule \"archive_delete\"\n"; $wgDatabase->query("DROP RULE archive_delete ON archive"); } - dbsource(archive("patch-remove-archive2.sql")); - } else - echo "... obsolete archive2 not present\n"; + } + else + echo "... obsolete table \"archive2\" does not exist\n"; foreach ($newcols as $nc) { $fi = $wgDatabase->fieldInfo($nc[0], $nc[1]); if (!is_null($fi)) { - echo "... column $nc[0].$nc[1] already exists\n"; + echo "... column \"$nc[0].$nc[1]\" already exists\n"; continue; } - echo "... add column $nc[0].$nc[1]\n"; + echo "Adding column \"$nc[0].$nc[1]\"\n"; $wgDatabase->query("ALTER TABLE $nc[0] ADD $nc[1] $nc[2]"); } - ## Needed before column changes - if (is_null($wgDatabase->fieldInfo("archive", "ar_deleted"))) { - echo "... add archive.ar_deleted\n"; - dbsource(archive("patch-archive-ar_deleted.sql")); - } else - echo "... archive.ar_deleted already exists\n"; - foreach ($typechanges as $tc) { $fi = $wgDatabase->fieldInfo($tc[0], $tc[1]); if (is_null($fi)) { @@ -1450,9 +1455,9 @@ function do_postgres_updates() { } if ($fi->type() === $tc[2]) - echo "... $tc[0].$tc[1] is already $tc[2]\n"; + echo "... column \"$tc[0].$tc[1]\" is already of type \"$tc[2]\"\n"; else { - echo "... change $tc[0].$tc[1] from {$fi->type()} to $tc[2]\n"; + echo "Changing column type of \"$tc[0].$tc[1]\" from \"{$fi->type()}\" to \"$tc[2]\"\n"; $sql = "ALTER TABLE $tc[0] ALTER $tc[1] TYPE $tc[2]"; if (strlen($tc[3])) { $sql .= " USING $tc[3]"; @@ -1463,65 +1468,78 @@ function do_postgres_updates() { } if ($wgDatabase->fieldInfo('oldimage','oi_deleted')->type() !== 'smallint') { - echo "... change oldimage.oi_deleted to smallint"; - $wgDatabase->query("ALTER TABLE oldimage ALTER oi_deleted DROP DEFAULT"); - $wgDatabase->query("ALTER TABLE oldimage ALTER oi_deleted TYPE SMALLINT USING (oi_deleted::smallint)"); - $wgDatabase->query("ALTER TABLE oldimage ALTER oi_deleted SET DEFAULT 0"); + echo "Changing \"oldimage.oi_deleted\" to type \"smallint\"\n"; + $wgDatabase->query( "ALTER TABLE oldimage ALTER oi_deleted DROP DEFAULT" ); + $wgDatabase->query( "ALTER TABLE oldimage ALTER oi_deleted TYPE SMALLINT USING (oi_deleted::smallint)" ); + $wgDatabase->query( "ALTER TABLE oldimage ALTER oi_deleted SET DEFAULT 0" ); } + else + echo "... column \"oldimage.oi_deleted\" is already of type \"smallint\"\n"; + foreach ($newindexes as $ni) { if (pg_index_exists($ni[0], $ni[1])) { - echo "... index $ni[1] on $ni[0] already exists\n"; + echo "... index \"$ni[1]\" on table \"$ni[0]\" already exists\n"; continue; } - $wgDatabase->query("CREATE INDEX $ni[1] ON $ni[0] $ni[2]"); - echo "create index $ni[1]\n"; + echo "Creating index \"$ni[1]\" on table \"$ni[0]\" $ni[2]\n"; + $wgDatabase->query( "CREATE INDEX $ni[1] ON $ni[0] $ni[2]" ); } foreach ($newrules as $nr) { if ($wgDatabase->ruleExists($nr[0], $nr[1])) { - echo "... rule $nr[1] on $nr[0] already exists\n"; + echo "... rule \"$nr[1]\" on table \"$nr[0]\" already exists\n"; continue; } + echo "Adding rule \"$nr[1]\" to table \"$nr[0]\"\n"; dbsource(archive($nr[2])); } if ($wgDatabase->hasConstraint("oldimage_oi_name_fkey")) { - echo "... change oldimage to CASCADE DELETE on image deletion\n"; - $wgDatabase->query("ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey"); - $wgDatabase->query("ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascade ". - "FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE"); + echo "Making foriegn key on table \"oldimage\" (to image) a cascade delete\n"; + $wgDatabase->query( "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey" ); + $wgDatabase->query( "ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascade ". + "FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE" ); } + else + echo "... table \"oldimage\" has correct cascade delete foreign key to image\n"; if (!$wgDatabase->triggerExists("page", "page_deleted")) { - echo "... create page_deleted trigger\n"; + echo "Adding function and trigger \"page_deleted\" to table \"page\"\n"; dbsource(archive('patch-page_deleted.sql')); } + else + echo "... table \"page\" has \"page_deleted\" trigger\n"; $fi = $wgDatabase->fieldInfo("recentchanges", "rc_cur_id"); if (!$fi->nullable()) { - echo "... remove NOT NULL constraint on recentchanges.rc_cur_id\n"; + echo "Removing NOT NULL constraint from \"recentchanges.rc_cur_id\"\n"; dbsource(archive('patch-rc_cur_id-not-null.sql')); } + else + echo "... column \"recentchanges.rc_cur_id\" has a NOT NULL constraint\n"; $pu = pg_describe_index("pagelink_unique"); if (!is_null($pu) && ($pu[0] != "pl_from" || $pu[1] != "pl_namespace" || $pu[2] != "pl_title")) { - echo "... dropping obsolete pagelink_unique index\n"; + echo "Dropping obsolete version of index \"pagelink_unique index\"\n"; $wgDatabase->query("DROP INDEX pagelink_unique"); $pu = null; - } else - echo "... obsolete pagelink_unique index not present\n"; + } + else + echo "... obsolete version of index \"pagelink_unique index\" does not exist\n"; if (is_null($pu)) { - echo "... adding new pagelink_unique index\n"; + echo "Creating index \"pagelink_unique index\"\n"; $wgDatabase->query("CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title)"); - } else - echo "... already have current pagelink_unique index\n"; + } + else + echo "... index \"pagelink_unique_index\" aready exists\n"; if (pg_fkey_deltype("revision_rev_user_fkey") == 'r') { - echo "... revision_rev_user_fkey is already ON DELETE RESTRICT\n"; - } else { - echo "... change revision_rev_user_fkey to ON DELETE RESTRICT\n"; + echo "... constraint \"revision_rev_user_fkey\" is ON DELETE RESTRICT\n"; + } + else { + echo "Changing constraint \"revision_rev_user_fkey\" to ON DELETE RESTRICT\n"; dbsource(archive('patch-revision_rev_user_fkey.sql')); } @@ -1529,30 +1547,29 @@ function do_postgres_updates() { # Add missing extension tables foreach ( $wgExtNewTables as $nt ) { if ($wgDatabase->tableExists($nt[0])) { - echo "... table $nt[0] already exists\n"; + echo "... table \"$nt[0]\" already exists\n"; continue; } - - echo "... create table $nt[0]\n"; + echo "Creating table \"$nt[0]\"\n"; dbsource($nt[1]); } # Add missing extension fields foreach ( $wgExtPGNewFields as $nc ) { $fi = $wgDatabase->fieldInfo($nc[0], $nc[1]); if (!is_null($fi)) { - echo "... column $nc[0].$nc[1] already exists\n"; + echo "... column \"$nc[0].$nc[1]\" already exists\n"; continue; } - - echo "... add column $nc[0].$nc[1]\n"; - $wgDatabase->query("ALTER TABLE $nc[0] ADD $nc[1] $nc[2]"); + echo "Adding column \"$nc[0].$nc[1]\"\n"; + $wgDatabase->query( "ALTER TABLE $nc[0] ADD $nc[1] $nc[2]" ); } # Add missing extension indexes foreach ( $wgExtNewIndexes as $ni ) { if (pg_index_exists($ni[0], $ni[1])) { - echo "... index $ni[1] on $ni[0] already exists\n"; + echo "... index \"$ni[1]\" on table \"$ni[0]\" already exists\n"; continue; } + echo "Creating index \"$ni[1]\" on table \"$ni[0]\"\n"; dbsource($ni[2]); } -- 2.20.1