2021-01-07 10:26:51 -05:00
< ? php
declare ( strict_types = 1 );
/**
* @ copyright Copyright ( c ) 2021 Morris Jobke < hey @ morrisjobke . de >
*
2021-06-04 15:52:51 -04:00
* @ author Claas Augner < github @ caugner . de >
2021-01-07 10:26:51 -05:00
* @ author Morris Jobke < hey @ morrisjobke . de >
2021-06-04 15:52:51 -04:00
* @ author Vincent Petry < vincent @ nextcloud . com >
2021-01-07 10:26:51 -05:00
*
* @ license GNU AGPL version 3 or any later version
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
2021-06-04 15:52:51 -04:00
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
2021-01-07 10:26:51 -05:00
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < http :// www . gnu . org / licenses />.
*
*/
namespace OCA\Settings\SetupChecks ;
2021-01-12 03:39:18 -05:00
use Doctrine\DBAL\Platforms\MySQLPlatform ;
2021-01-07 10:26:51 -05:00
use Doctrine\DBAL\Platforms\OraclePlatform ;
2023-10-24 05:40:03 -04:00
use Doctrine\DBAL\Platforms\PostgreSQLPlatform ;
2021-01-07 10:26:51 -05:00
use Doctrine\DBAL\Platforms\SqlitePlatform ;
use OCP\IDBConnection ;
use OCP\IL10N ;
2023-11-16 05:48:04 -05:00
use OCP\IURLGenerator ;
2023-10-02 05:21:45 -04:00
use OCP\SetupCheck\ISetupCheck ;
use OCP\SetupCheck\SetupResult ;
2021-01-07 10:26:51 -05:00
2023-10-02 05:21:45 -04:00
class SupportedDatabase implements ISetupCheck {
public function __construct (
private IL10N $l10n ,
2023-11-16 05:48:04 -05:00
private IURLGenerator $urlGenerator ,
2023-10-02 05:21:45 -04:00
private IDBConnection $connection ,
) {
}
2021-01-07 10:26:51 -05:00
2023-10-02 05:21:45 -04:00
public function getCategory () : string {
return 'database' ;
2021-01-07 10:26:51 -05:00
}
2023-10-02 05:21:45 -04:00
public function getName () : string {
2023-10-24 05:40:03 -04:00
return $this -> l10n -> t ( 'Database version' );
2023-10-02 05:21:45 -04:00
}
2021-01-07 10:26:51 -05:00
2023-10-02 05:21:45 -04:00
public function run () : SetupResult {
2023-10-24 05:40:03 -04:00
$version = null ;
$databasePlatform = $this -> connection -> getDatabasePlatform ();
if ( $databasePlatform instanceof MySQLPlatform ) {
$result = $this -> connection -> prepare ( " SHOW VARIABLES LIKE 'version'; " );
$result -> execute ();
$row = $result -> fetch ();
$version = $row [ 'Value' ];
$versionlc = strtolower ( $version );
2021-01-07 10:26:51 -05:00
2023-10-24 05:40:03 -04:00
if ( str_contains ( $versionlc , 'mariadb' )) {
if ( version_compare ( $versionlc , '10.2' , '<' )) {
return SetupResult :: warning ( $this -> l10n -> t ( 'MariaDB version "%s" is used. Nextcloud 21 and higher do not support this version and require MariaDB 10.2 or higher.' , $version ));
2021-01-07 10:26:51 -05:00
}
2023-10-24 05:40:03 -04:00
} else {
if ( version_compare ( $versionlc , '8' , '<' )) {
return SetupResult :: warning ( $this -> l10n -> t ( 'MySQL version "%s" is used. Nextcloud 21 and higher do not support this version and require MySQL 8.0 or MariaDB 10.2 or higher.' , $version ));
2021-01-07 10:26:51 -05:00
}
2023-10-24 05:40:03 -04:00
}
} elseif ( $databasePlatform instanceof PostgreSQLPlatform ) {
$result = $this -> connection -> prepare ( 'SHOW server_version;' );
$result -> execute ();
$row = $result -> fetch ();
$version = $row [ 'server_version' ];
if ( version_compare ( strtolower ( $version ), '9.6' , '<' )) {
return SetupResult :: warning ( $this -> l10n -> t ( 'PostgreSQL version "%s" is used. Nextcloud 21 and higher do not support this version and require PostgreSQL 9.6 or higher.' , $version ));
}
} elseif ( $databasePlatform instanceof OraclePlatform ) {
$version = 'Oracle' ;
} elseif ( $databasePlatform instanceof SqlitePlatform ) {
2023-11-16 05:48:04 -05:00
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' )
);
2023-10-24 05:40:03 -04:00
} else {
2023-11-21 09:45:33 -05:00
return SetupResult :: error ( $this -> l10n -> t ( 'Unknown database platform' ));
2021-01-07 10:26:51 -05:00
}
2023-10-24 05:40:03 -04:00
return SetupResult :: success ( $version );
2021-01-07 10:26:51 -05:00
}
}