Check minimum database server version when running update.php

If MediaWiki has increased the minimum database server version that is
required, check it when running update.php to ensure it is still
compatible. Previously this was only checked during the installer.

Bug: T162044
Change-Id: I47092c9557f4706a4dcb3a23150647e68af4317f
This commit is contained in:
Kunal Mehta 2017-10-02 22:14:33 -07:00
parent 6e067e5411
commit 574ae4929e
8 changed files with 68 additions and 29 deletions

View file

@ -41,6 +41,16 @@ abstract class DatabaseInstaller {
*/
public $parent;
/**
* @var string Set by subclasses
*/
public static $minimumVersion;
/**
* @var string Set by subclasses
*/
protected static $notMiniumumVerisonMessage;
/**
* The database connection.
*
@ -62,6 +72,23 @@ abstract class DatabaseInstaller {
*/
protected $globalNames = [];
/**
* Whether the provided version meets the necessary requirements for this type
*
* @param string $serverVersion Output of Database::getServerVersion()
* @return Status
* @since 1.30
*/
public static function meetsMinimumRequirement( $serverVersion ) {
if ( version_compare( $serverVersion, static::$minimumVersion ) < 0 ) {
return Status::newFatal(
static::$notMiniumumVerisonMessage, static::$minimumVersion, $serverVersion
);
}
return Status::newGood();
}
/**
* Return the internal name, e.g. 'mysql', or 'sqlite'.
*/

View file

@ -546,6 +546,17 @@ abstract class Installer {
return $this->compiledDBs;
}
/**
* Get the DatabaseInstaller class name for this type
*
* @param string $type database type ($wgDBtype)
* @return string Class name
* @since 1.30
*/
public static function getDBInstallerClass( $type ) {
return ucfirst( $type ) . 'Installer';
}
/**
* Get an instance of DatabaseInstaller for the specified DB type.
*
@ -561,7 +572,7 @@ abstract class Installer {
$type = strtolower( $type );
if ( !isset( $this->dbInstallers[$type] ) ) {
$class = ucfirst( $type ) . 'Installer';
$class = self::getDBInstallerClass( $type );
$this->dbInstallers[$type] = new $class( $this );
}

View file

@ -51,7 +51,8 @@ class MssqlInstaller extends DatabaseInstaller {
// SQL Server 2005 RTM
// @todo Are SQL Express version numbers different?)
public $minimumVersion = '9.00.1399';
public static $minimumVersion = '9.00.1399';
protected static $notMiniumumVerisonMessage = 'config-mssql-old';
// These are schema-level privs
// Note: the web user will be created will full permissions if possible, this permission
@ -191,12 +192,7 @@ class MssqlInstaller extends DatabaseInstaller {
$conn = $status->value;
// Check version
$version = $conn->getServerVersion();
if ( version_compare( $version, $this->minimumVersion ) < 0 ) {
return Status::newFatal( 'config-mssql-old', $this->minimumVersion, $version );
}
return $status;
return static::meetsMinimumRequirement( $conn->getServerVersion() );
}
/**

View file

@ -51,7 +51,8 @@ class MysqlInstaller extends DatabaseInstaller {
public $supportedEngines = [ 'InnoDB', 'MyISAM' ];
public $minimumVersion = '5.5.8';
public static $minimumVersion = '5.5.8';
protected static $notMiniumumVerisonMessage = 'config-mysql-old';
public $webUserPrivs = [
'DELETE',
@ -133,12 +134,7 @@ class MysqlInstaller extends DatabaseInstaller {
$conn = $status->value;
// Check version
$version = $conn->getServerVersion();
if ( version_compare( $version, $this->minimumVersion ) < 0 ) {
return Status::newFatal( 'config-mysql-old', $this->minimumVersion, $version );
}
return $status;
return static::meetsMinimumRequirement( $conn->getServerVersion() );
}
/**

View file

@ -21,6 +21,7 @@
* @ingroup Deployment
*/
use Wikimedia\Rdbms\Database;
use Wikimedia\Rdbms\DBConnectionError;
/**
@ -45,7 +46,8 @@ class OracleInstaller extends DatabaseInstaller {
'_InstallUser' => 'SYSTEM',
];
public $minimumVersion = '9.0.1'; // 9iR1
public static $minimumVersion = '9.0.1'; // 9iR1
protected static $notMiniumumVerisonMessage = 'config-oracle-old';
protected $connError = null;
@ -152,15 +154,12 @@ class OracleInstaller extends DatabaseInstaller {
}
/**
* @var $conn Database
* @var Database $conn
*/
$conn = $status->value;
// Check version
$version = $conn->getServerVersion();
if ( version_compare( $version, $this->minimumVersion ) < 0 ) {
return Status::newFatal( 'config-oracle-old', $this->minimumVersion, $version );
}
$status->merge( static::meetsMinimumRequirement( $conn->getServerVersion() ) );
return $status;
}

View file

@ -46,7 +46,8 @@ class PostgresInstaller extends DatabaseInstaller {
'_InstallUser' => 'postgres',
];
public $minimumVersion = '8.3';
public static $minimumVersion = '8.3';
protected static $notMiniumumVerisonMessage = 'config-postgres-old';
public $maxRoleSearchDepth = 5;
protected $pgConns = [];
@ -124,8 +125,9 @@ class PostgresInstaller extends DatabaseInstaller {
// Check version
$version = $conn->getServerVersion();
if ( version_compare( $version, $this->minimumVersion ) < 0 ) {
return Status::newFatal( 'config-postgres-old', $this->minimumVersion, $version );
$status = static::meetsMinimumRequirement( $conn->getServerVersion() );
if ( !$status->isOK() ) {
return $status;
}
$this->setVar( 'wgDBuser', $this->getVar( '_InstallUser' ) );

View file

@ -33,7 +33,8 @@ use Wikimedia\Rdbms\DBConnectionError;
*/
class SqliteInstaller extends DatabaseInstaller {
public $minimumVersion = '3.3.7';
public static $minimumVersion = '3.3.7';
protected static $notMiniumumVerisonMessage = 'config-outdated-sqlite';
/**
* @var DatabaseSqlite
@ -58,12 +59,9 @@ class SqliteInstaller extends DatabaseInstaller {
* @return Status
*/
public function checkPrerequisites() {
$result = Status::newGood();
// Bail out if SQLite is too old
$db = DatabaseSqlite::newStandaloneInstance( ':memory:' );
if ( version_compare( $db->getServerVersion(), $this->minimumVersion, '<' ) ) {
$result->fatal( 'config-outdated-sqlite', $db->getServerVersion(), $this->minimumVersion );
}
$result = static::meetsMinimumRequirement( $db->getServerVersion() );
// Check for FTS3 full-text search module
if ( DatabaseSqlite::getFulltextSearchModule() != 'FTS3' ) {
$result->warning( 'config-no-fts3' );

View file

@ -145,6 +145,16 @@ class UpdateMediaWiki extends Maintenance {
# This will vomit up an error if there are permissions problems
$db = $this->getDB( DB_MASTER );
# Check to see whether the database server meets the minimum requirements
/** @var DatabaseInstaller $dbInstallerClass */
$dbInstallerClass = Installer::getDBInstallerClass( $db->getType() );
$status = $dbInstallerClass::meetsMinimumRequirement( $db->getServerVersion() );
if ( !$status->isOK() ) {
// This might output some wikitext like <strong> but it should be comprehensible
$text = $status->getWikiText();
$this->error( $text, 1 );
}
$this->output( "Going to run database updates for " . wfWikiID() . "\n" );
if ( $db->getType() === 'sqlite' ) {
/** @var IMaintainableDatabase|DatabaseSqlite $db */