X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Finstaller%2FPostgresUpdater.php;h=0475fe4078ab2fd985f601fe129d332bd67c3541;hb=5ba7fb251e0ac09f3171f41320c2c1b60b8b983c;hp=d8db6a2d9d9be1e24c92f562d995148c7aa883a2;hpb=85ac1b5d7c7ca50a93f2d16639cdde2f46bc133e;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/installer/PostgresUpdater.php b/includes/installer/PostgresUpdater.php index d8db6a2d9d..0475fe4078 100644 --- a/includes/installer/PostgresUpdater.php +++ b/includes/installer/PostgresUpdater.php @@ -454,7 +454,33 @@ class PostgresUpdater extends DatabaseUpdater { [ 'addPgIndex', 'user_groups', 'user_groups_expiry', '( ug_expiry )' ], // 1.30 - [ 'modifyField', 'image', 'img_media_type', 'patch-add-3d.sql' ], + [ 'addPgEnumValue', 'media_type', '3D' ], + [ 'setDefault', 'revision', 'rev_comment', '' ], + [ 'changeNullableField', 'revision', 'rev_comment', 'NOT NULL', true ], + [ 'setDefault', 'archive', 'ar_comment', '' ], + [ 'changeNullableField', 'archive', 'ar_comment', 'NOT NULL', true ], + [ 'addPgField', 'archive', 'ar_comment_id', 'INTEGER NOT NULL DEFAULT 0' ], + [ 'setDefault', 'ipblocks', 'ipb_reason', '' ], + [ 'addPgField', 'ipblocks', 'ipb_reason_id', 'INTEGER NOT NULL DEFAULT 0' ], + [ 'setDefault', 'image', 'img_description', '' ], + [ 'setDefault', 'oldimage', 'oi_description', '' ], + [ 'changeNullableField', 'oldimage', 'oi_description', 'NOT NULL', true ], + [ 'addPgField', 'oldimage', 'oi_description_id', 'INTEGER NOT NULL DEFAULT 0' ], + [ 'setDefault', 'filearchive', 'fa_deleted_reason', '' ], + [ 'changeNullableField', 'filearchive', 'fa_deleted_reason', 'NOT NULL', true ], + [ 'addPgField', 'filearchive', 'fa_deleted_reason_id', 'INTEGER NOT NULL DEFAULT 0' ], + [ 'setDefault', 'filearchive', 'fa_description', '' ], + [ 'addPgField', 'filearchive', 'fa_description_id', 'INTEGER NOT NULL DEFAULT 0' ], + [ 'setDefault', 'recentchanges', 'rc_comment', '' ], + [ 'changeNullableField', 'recentchanges', 'rc_comment', 'NOT NULL', true ], + [ 'addPgField', 'recentchanges', 'rc_comment_id', 'INTEGER NOT NULL DEFAULT 0' ], + [ 'setDefault', 'logging', 'log_comment', '' ], + [ 'changeNullableField', 'logging', 'log_comment', 'NOT NULL', true ], + [ 'addPgField', 'logging', 'log_comment_id', 'INTEGER NOT NULL DEFAULT 0' ], + [ 'setDefault', 'protected_titles', 'pt_reason', '' ], + [ 'changeNullableField', 'protected_titles', 'pt_reason', 'NOT NULL', true ], + [ 'addPgField', 'protected_titles', 'pt_reason_id', 'INTEGER NOT NULL DEFAULT 0' ], + [ 'addTable', 'comment', 'patch-comment-table.sql' ], ]; } @@ -757,11 +783,12 @@ END; $info = $this->db->fieldInfo( $table, $field ); if ( $info->defaultValue() !== $default ) { $this->output( "Changing '$table.$field' default value\n" ); - $this->db->query( "ALTER TABLE $table ALTER $field SET DEFAULT " . $default ); + $this->db->query( "ALTER TABLE $table ALTER $field SET DEFAULT " + . $this->db->addQuotes( $default ) ); } } - protected function changeNullableField( $table, $field, $null ) { + protected function changeNullableField( $table, $field, $null, $update = false ) { $fi = $this->db->fieldInfo( $table, $field ); if ( is_null( $fi ) ) { $this->output( "...ERROR: expected column $table.$field to exist\n" ); @@ -771,6 +798,9 @@ END; # # It's NULL - does it need to be NOT NULL? if ( 'NOT NULL' === $null ) { $this->output( "Changing '$table.$field' to not allow NULLs\n" ); + if ( $update ) { + $this->db->query( "UPDATE $table SET $field = DEFAULT WHERE $field IS NULL" ); + } $this->db->query( "ALTER TABLE $table ALTER $field SET NOT NULL" ); } else { $this->output( "...column '$table.$field' is already set as NULL\n" ); @@ -808,6 +838,46 @@ END; } } + /** + * Add a value to an existing PostgreSQL enum type + * @since 1.31 + * @param string $type Type name. Must be in the core schema. + * @param string $value Value to add. + */ + public function addPgEnumValue( $type, $value ) { + $row = $this->db->selectRow( + [ + 't' => 'pg_catalog.pg_type', + 'n' => 'pg_catalog.pg_namespace', + 'e' => 'pg_catalog.pg_enum', + ], + [ 't.typname', 't.typtype', 'e.enumlabel' ], + [ + 't.typname' => $type, + 'n.nspname' => $this->db->getCoreSchema(), + ], + __METHOD__, + [], + [ + 'n' => [ 'JOIN', 't.typnamespace = n.oid' ], + 'e' => [ 'LEFT JOIN', [ 'e.enumtypid = t.oid', 'e.enumlabel' => $value ] ], + ] + ); + + if ( !$row ) { + $this->output( "...Type $type does not exist, skipping modify enum.\n" ); + } elseif ( $row->typtype !== 'e' ) { + $this->output( "...Type $type does not seem to be an enum, skipping modify enum.\n" ); + } elseif ( $row->enumlabel === $value ) { + $this->output( "...Enum type $type already contains value '$value'.\n" ); + } else { + $this->output( "...Adding value '$value' to enum type $type.\n" ); + $etype = $this->db->addIdentifierQuotes( $type ); + $evalue = $this->db->addQuotes( $value ); + $this->db->query( "ALTER TYPE $etype ADD VALUE $evalue" ); + } + } + protected function dropFkey( $table, $field ) { $fi = $this->db->fieldInfo( $table, $field ); if ( is_null( $fi ) ) {