From: jenkins-bot Date: Sat, 29 Oct 2016 01:31:01 +0000 (+0000) Subject: Merge "Postgres updater fixes to make update.php able to run" X-Git-Tag: 1.31.0-rc.0~5006 X-Git-Url: https://git.cyclocoop.org/%7B%24www_url%7Dadmin/compta/exercices/bilan.php?a=commitdiff_plain;h=31a3a94d20e2cd549c148019aa52af978d312623;hp=2118d5cb99042be136b0517cb8ac7ab8344a97e1;p=lhc%2Fweb%2Fwiklou.git Merge "Postgres updater fixes to make update.php able to run" --- diff --git a/includes/installer/PostgresUpdater.php b/includes/installer/PostgresUpdater.php index f3d2860144..790fbe7b31 100644 --- a/includes/installer/PostgresUpdater.php +++ b/includes/installer/PostgresUpdater.php @@ -975,7 +975,7 @@ END; protected function rebuildTextSearch() { if ( $this->updateRowExists( 'patch-textsearch_bug66650.sql' ) ) { $this->output( "...bug 66650 already fixed or not applicable.\n" ); - return true; + return; }; $this->applyPatch( 'patch-textsearch_bug66650.sql', false, 'Rebuilding text search for bug 66650' ); diff --git a/includes/libs/rdbms/database/Database.php b/includes/libs/rdbms/database/Database.php index ba63432996..ee4524fae8 100644 --- a/includes/libs/rdbms/database/Database.php +++ b/includes/libs/rdbms/database/Database.php @@ -1721,9 +1721,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } elseif ( count( $dbDetails ) == 2 ) { list( $database, $table ) = $dbDetails; # We don't want any prefix added in this case + $prefix = ''; # In dbs that support it, $database may actually be the schema # but that doesn't affect any of the functionality here - $prefix = ''; $schema = ''; } else { list( $table ) = $dbDetails; @@ -1745,29 +1745,35 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware # Quote $table and apply the prefix if not quoted. # $tableName might be empty if this is called from Database::replaceVars() $tableName = "{$prefix}{$table}"; - if ( $format == 'quoted' - && !$this->isQuotedIdentifier( $tableName ) && $tableName !== '' + if ( $format === 'quoted' + && !$this->isQuotedIdentifier( $tableName ) + && $tableName !== '' ) { $tableName = $this->addIdentifierQuotes( $tableName ); } - # Quote $schema and merge it with the table name if needed - if ( strlen( $schema ) ) { - if ( $format == 'quoted' && !$this->isQuotedIdentifier( $schema ) ) { - $schema = $this->addIdentifierQuotes( $schema ); - } - $tableName = $schema . '.' . $tableName; - } + # Quote $schema and $database and merge them with the table name if needed + $tableName = $this->prependDatabaseOrSchema( $schema, $tableName, $format ); + $tableName = $this->prependDatabaseOrSchema( $database, $tableName, $format ); + + return $tableName; + } - # Quote $database and merge it with the table name if needed - if ( $database !== '' ) { - if ( $format == 'quoted' && !$this->isQuotedIdentifier( $database ) ) { - $database = $this->addIdentifierQuotes( $database ); + /** + * @param string|null $namespace Database or schema + * @param string $relation Name of table, view, sequence, etc... + * @param string $format One of (raw, quoted) + * @return string Relation name with quoted and merged $namespace as needed + */ + private function prependDatabaseOrSchema( $namespace, $relation, $format ) { + if ( strlen( $namespace ) ) { + if ( $format === 'quoted' && !$this->isQuotedIdentifier( $namespace ) ) { + $namespace = $this->addIdentifierQuotes( $namespace ); } - $tableName = $database . '.' . $tableName; + $relation = $namespace . '.' . $relation; } - return $tableName; + return $relation; } public function tableNames() { diff --git a/includes/libs/rdbms/database/DatabasePostgres.php b/includes/libs/rdbms/database/DatabasePostgres.php index b72557a65e..7e40495d27 100644 --- a/includes/libs/rdbms/database/DatabasePostgres.php +++ b/includes/libs/rdbms/database/DatabasePostgres.php @@ -152,6 +152,8 @@ class DatabasePostgres extends Database { } $this->determineCoreSchema( $this->mSchema ); + // The schema to be used is now in the search path; no need for explicit qualification + $this->mSchema = null; return $this->mConn; } @@ -768,19 +770,33 @@ __INDEXATTR__; } function tableName( $name, $format = 'quoted' ) { - # Replace reserved words with better ones - switch ( $name ) { - case 'user': - return $this->realTableName( 'mwuser', $format ); - case 'text': - return $this->realTableName( 'pagecontent', $format ); - default: - return $this->realTableName( $name, $format ); + // Replace reserved words with better ones + $name = $this->remappedTableName( $name ); + + return parent::tableName( $name, $format ); + } + + /** + * @param string $name + * @return string Value of $name or remapped name if $name is a reserved keyword + * @TODO: dependency inject these... + */ + public function remappedTableName( $name ) { + if ( $name === 'user' ) { + return 'mwuser'; + } elseif ( $name === 'text' ) { + return 'pagecontent'; } + + return $name; } - /* Don't cheat on installer */ - function realTableName( $name, $format = 'quoted' ) { + /** + * @param string $name + * @param string $format + * @return string Qualified and encoded (if requested) table name + */ + public function realTableName( $name, $format = 'quoted' ) { return parent::tableName( $name, $format ); } @@ -1090,7 +1106,6 @@ __INDEXATTR__; if ( $schema === false ) { $schema = $this->getCoreSchema(); } - $table = $this->realTableName( $table, 'raw' ); $etable = $this->addQuotes( $table ); $eschema = $this->addQuotes( $schema ); $sql = "SELECT 1 FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n " diff --git a/includes/libs/rdbms/field/PostgresField.php b/includes/libs/rdbms/field/PostgresField.php index 36337e29bd..d34c125bb9 100644 --- a/includes/libs/rdbms/field/PostgresField.php +++ b/includes/libs/rdbms/field/PostgresField.php @@ -9,7 +9,7 @@ class PostgresField implements Field { * @param string $field * @return null|PostgresField */ - static function fromText( $db, $table, $field ) { + static function fromText( DatabasePostgres $db, $table, $field ) { $q = <<tableName( $table, 'raw' ); + $table = $db->remappedTableName( $table ); $res = $db->query( sprintf( $q, $db->addQuotes( $db->getCoreSchema() ),