Files
Git'Fellow 4920bd1725 refactor: add PHP 8.3 types to BC-safe class constants
PHP 8.3 allows class constants to declare a type. Adopt it where doing so
cannot break third-party apps.

Typing an inheritable constant is a hard BC break: a subclass that
redeclares it untyped fails to load with "Type of C::FOO must be
compatible with P::FOO of type string". Changes are therefore limited to
constants that cannot be redeclared by a subclass:

  - private const (not inherited)
  - final public/protected const
  - constants declared in a final class or an enum

Interface constants, trait constants, and public/protected constants in
non-final (including abstract) classes are left untyped, as is all of
lib/public (OCP) and lib/unstable (NCU).

One review-requested exception: the public OBJECT_PREFIX/OBJECT_SUFFIX
constants of the app-internal CalDAV import helpers (TextImporter,
XmlImporter) are typed as well; these classes are not public API and
have no subclasses.

Only string, int and array are used. float is avoided because it would
silently coerce an int literal and change === comparisons. No constant
name or value is modified: every changed line adds only the type token,
so runtime behaviour is unchanged.

Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-08-11 13:52:52 +01:00

150 lines
5.6 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Settings\SetupChecks;
use OCP\IDBConnection;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\SetupCheck\ISetupCheck;
use OCP\SetupCheck\SetupResult;
class SupportedDatabase implements ISetupCheck {
private const string MIN_MARIADB = '10.11';
private const string MAX_MARIADB = '12.3';
private const string MIN_MYSQL = '8.4';
private const string MAX_MYSQL = '9.7';
private const string MIN_POSTGRES = '14';
private const string MAX_POSTGRES = '18';
private const string MIN_ORACLE = '12.2';
private const string MAX_ORACLE = '26';
public function __construct(
private IL10N $l10n,
private IURLGenerator $urlGenerator,
private IDBConnection $connection,
) {
}
#[\Override]
public function getCategory(): string {
return 'database';
}
#[\Override]
public function getName(): string {
return $this->l10n->t('Database version');
}
#[\Override]
public function run(): SetupResult {
$databasePlatform = $this->connection->getDatabaseProvider();
if ($databasePlatform === IDBConnection::PLATFORM_MYSQL || $databasePlatform === IDBConnection::PLATFORM_MARIADB) {
$statement = $this->connection->prepare("SHOW VARIABLES LIKE 'version';");
$result = $statement->execute();
$row = $result->fetchAssociative();
$version = $row['Value'];
$versionlc = strtolower($version);
// we only care about X.Y not X.Y.Z differences
[$major, $minor, ] = explode('.', $versionlc);
$versionConcern = $major . '.' . $minor;
if (str_contains($versionlc, 'mariadb')) {
if (version_compare($versionConcern, '10.6', '=')) {
return SetupResult::info(
$this->l10n->t(
'MariaDB version 10.6 detected, this version is end-of-life and only supported as part of Ubuntu 22.04. MariaDB >=%1$s and <=%2$s is suggested for best performance, stability and functionality with this version of Nextcloud.',
[
self::MIN_MARIADB,
self::MAX_MARIADB,
]
),
);
} elseif (version_compare($versionConcern, self::MIN_MARIADB, '<') || version_compare($versionConcern, self::MAX_MARIADB, '>')) {
return SetupResult::warning(
$this->l10n->t(
'MariaDB version "%1$s" detected. MariaDB >=%2$s and <=%3$s is suggested for best performance, stability and functionality with this version of Nextcloud.',
[
$version,
self::MIN_MARIADB,
self::MAX_MARIADB,
],
),
);
}
} else {
if (version_compare($versionConcern, self::MIN_MYSQL, '<') || version_compare($versionConcern, self::MAX_MYSQL, '>')) {
return SetupResult::warning(
$this->l10n->t(
'MySQL version "%1$s" detected. MySQL >=%2$s and <=%3$s is suggested for best performance, stability and functionality with this version of Nextcloud.',
[
$version,
self::MIN_MYSQL,
self::MAX_MYSQL,
],
),
);
}
}
} elseif ($databasePlatform === IDBConnection::PLATFORM_POSTGRES) {
$statement = $this->connection->prepare('SHOW server_version;');
$result = $statement->execute();
$row = $result->fetchAssociative();
$version = $row['server_version'];
$versionlc = strtolower($version);
// we only care about X not X.Y or X.Y.Z differences
[$major, ] = explode('.', $versionlc);
$versionConcern = $major;
if (version_compare($versionConcern, self::MIN_POSTGRES, '<') || version_compare($versionConcern, self::MAX_POSTGRES, '>')) {
return SetupResult::warning(
$this->l10n->t(
'PostgreSQL version "%1$s" detected. PostgreSQL >=%2$s and <=%3$s is suggested for best performance, stability and functionality with this version of Nextcloud.',
[
$version,
self::MIN_POSTGRES,
self::MAX_POSTGRES,
])
);
}
} elseif ($databasePlatform === IDBConnection::PLATFORM_ORACLE) {
$result = $this->connection->executeQuery('SELECT VERSION FROM PRODUCT_COMPONENT_VERSION');
$version = $result->fetchOne();
$result->closeCursor();
$versionLower = strtolower($version);
// we only care about X.Y not X.Y.Z differences
[$major, $minor, ] = explode('.', $versionLower);
$versionConcern = $major . '.' . $minor;
if (version_compare($versionConcern, self::MIN_ORACLE, '<') || version_compare($versionConcern, self::MAX_ORACLE, '>')) {
$extendedWarning = '';
if (version_compare($versionConcern, self::MIN_ORACLE, '<')) {
$extendedWarning = "\n" . $this->l10n->t('Nextcloud %d does not support your current version, so be sure to update the database before updating your Nextcloud Server.', [33]);
}
return SetupResult::warning(
$this->l10n->t(
'Oracle version "%1$s" detected. Oracle >=%2$s and <=%3$s is suggested for best performance, stability and functionality with this version of Nextcloud.',
[
$version,
self::MIN_ORACLE,
self::MAX_ORACLE,
])
. $extendedWarning
);
}
} elseif ($databasePlatform === IDBConnection::PLATFORM_SQLITE) {
return SetupResult::warning(
$this->l10n->t('SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend. This is particularly recommended when using the desktop client for file synchronisation. To migrate to another database use the command line tool: "occ db:convert-type".'),
$this->urlGenerator->linkToDocs('admin-db-conversion')
);
} else {
return SetupResult::error($this->l10n->t('Unknown database platform'));
}
return SetupResult::success($version);
}
}