diff --git a/installation/src/Model/SetupModel.php b/installation/src/Model/SetupModel.php index 9c392445b552a..c9a68d21e4d47 100644 --- a/installation/src/Model/SetupModel.php +++ b/installation/src/Model/SetupModel.php @@ -28,6 +28,33 @@ */ class SetupModel extends BaseInstallationModel { + /** + * The minimum database server version for MariaDB databases as required by the CMS. + * This is not necessarily equal to what the database driver requires. + * + * @var string + * @since 4.0.0 + */ + protected static $dbMinimumMariaDb = '10.1'; + + /** + * The minimum database server version for MySQL databases as required by the CMS. + * This is not necessarily equal to what the database driver requires. + * + * @var string + * @since 4.0.0 + */ + protected static $dbMinimumMySql = '5.6'; + + /** + * The minimum database server version for PostgreSQL databases as required by the CMS. + * This is not necessarily equal to what the database driver requires. + * + * @var string + * @since 4.0.0 + */ + protected static $dbMinimumPostgreSql = '11.0'; + /** * Get the current setup options from the session. * @@ -527,6 +554,66 @@ public function validateDbConnection() return false; } + $dbVersion = $db->getVersion(); + + // Get minimum database version required by the database driver + $minDbVersionRequired = $db->getMinimum(); + + // Get minimum database version required by the CMS + if (in_array($options->db_type, ['mysql', 'mysqli'])) + { + if ($db->isMariaDb()) + { + $minDbVersionCms = self::$dbMinimumMariaDb; + } + else + { + $minDbVersionCms = self::$dbMinimumMySql; + } + } + else + { + $minDbVersionCms = self::$dbMinimumPostgreSql; + } + + // Use most restrictive minimum database version requirement + if (version_compare($minDbVersionCms, $minDbVersionRequired) > 0) + { + $minDbVersionRequired = $minDbVersionCms; + } + + // Check minimum database version + if (version_compare($dbVersion, $minDbVersionRequired) < 0) + { + if (in_array($options->db_type, ['mysql', 'mysqli']) && $db->isMariaDb()) + { + Factory::getApplication()->enqueueMessage( + Text::sprintf( + 'INSTL_DATABASE_INVALID_MARIADB_VERSION', + $minDbVersionRequired, + $dbVersion + ), + 'error' + ); + } + else + { + Factory::getApplication()->enqueueMessage( + Text::sprintf( + 'INSTL_DATABASE_INVALID_' . strtoupper($options->db_type) . '_VERSION', + $minDbVersionRequired, + $dbVersion + ), + 'error' + ); + } + + $db->disconnect(); + + return false; + } + + // Check database connection encryption if ($options->db_encryption !== 0 && empty($db->getConnectionEncryption())) { if ($db->isConnectionEncryptionSupported())