jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/385493 )

Change subject: Check minimum database server version when running update.php
......................................................................


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
(cherry picked from commit 574ae4929e30700e29fef0e0d4f4824599205174)
---
M includes/installer/DatabaseInstaller.php
M includes/installer/Installer.php
M includes/installer/MssqlInstaller.php
M includes/installer/MysqlInstaller.php
M includes/installer/OracleInstaller.php
M includes/installer/PostgresInstaller.php
M includes/installer/SqliteInstaller.php
M maintenance/update.php
8 files changed, 68 insertions(+), 29 deletions(-)

Approvals:
  Legoktm: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/includes/installer/DatabaseInstaller.php 
b/includes/installer/DatabaseInstaller.php
index 6c56b3d..925d991 100644
--- a/includes/installer/DatabaseInstaller.php
+++ b/includes/installer/DatabaseInstaller.php
@@ -42,6 +42,16 @@
        public $parent;
 
        /**
+        * @var string Set by subclasses
+        */
+       public static $minimumVersion;
+
+       /**
+        * @var string Set by subclasses
+        */
+       protected static $notMiniumumVerisonMessage;
+
+       /**
         * The database connection.
         *
         * @var Database
@@ -63,6 +73,23 @@
        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'.
         */
        abstract public function getName();
diff --git a/includes/installer/Installer.php b/includes/installer/Installer.php
index 52be321..012b477 100644
--- a/includes/installer/Installer.php
+++ b/includes/installer/Installer.php
@@ -547,6 +547,17 @@
        }
 
        /**
+        * 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.
         *
         * @param mixed $type DB installer for which is needed, false to use 
default.
@@ -561,7 +572,7 @@
                $type = strtolower( $type );
 
                if ( !isset( $this->dbInstallers[$type] ) ) {
-                       $class = ucfirst( $type ) . 'Installer';
+                       $class = self::getDBInstallerClass( $type );
                        $this->dbInstallers[$type] = new $class( $this );
                }
 
diff --git a/includes/installer/MssqlInstaller.php 
b/includes/installer/MssqlInstaller.php
index d01f954..e462220 100644
--- a/includes/installer/MssqlInstaller.php
+++ b/includes/installer/MssqlInstaller.php
@@ -51,7 +51,8 @@
 
        // 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 @@
                $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() );
        }
 
        /**
diff --git a/includes/installer/MysqlInstaller.php 
b/includes/installer/MysqlInstaller.php
index c5dd4dc..ab5701a 100644
--- a/includes/installer/MysqlInstaller.php
+++ b/includes/installer/MysqlInstaller.php
@@ -51,7 +51,8 @@
 
        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 @@
                $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() );
        }
 
        /**
diff --git a/includes/installer/OracleInstaller.php 
b/includes/installer/OracleInstaller.php
index 14683d6..05f078f 100644
--- a/includes/installer/OracleInstaller.php
+++ b/includes/installer/OracleInstaller.php
@@ -21,6 +21,7 @@
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\DBConnectionError;
 
 /**
@@ -45,7 +46,8 @@
                '_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 @@
                }
 
                /**
-                * @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;
        }
diff --git a/includes/installer/PostgresInstaller.php 
b/includes/installer/PostgresInstaller.php
index 1a3fb10..129dbf8 100644
--- a/includes/installer/PostgresInstaller.php
+++ b/includes/installer/PostgresInstaller.php
@@ -46,7 +46,8 @@
                '_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 @@
 
                // 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' ) );
diff --git a/includes/installer/SqliteInstaller.php 
b/includes/installer/SqliteInstaller.php
index d60d801..d5909f4 100644
--- a/includes/installer/SqliteInstaller.php
+++ b/includes/installer/SqliteInstaller.php
@@ -33,7 +33,8 @@
  */
 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 @@
         * @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' );
diff --git a/maintenance/update.php b/maintenance/update.php
index 5f705ba..9f2fb92 100755
--- a/maintenance/update.php
+++ b/maintenance/update.php
@@ -145,6 +145,16 @@
                # 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 */

-- 
To view, visit https://gerrit.wikimedia.org/r/385493
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I47092c9557f4706a4dcb3a23150647e68af4317f
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: REL1_30
Gerrit-Owner: Legoktm <lego...@member.fsf.org>
Gerrit-Reviewer: Legoktm <lego...@member.fsf.org>
Gerrit-Reviewer: Parent5446 <tylerro...@gmail.com>
Gerrit-Reviewer: Skizzerz <skizz...@skizzerz.net>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to