Issue #2010368 by fjgarlin, Pancho, poker10, daffie: Installer can't create new database on PostgreSQL

merge-requests/4443/merge
catch 2023-09-04 13:29:37 +01:00
parent 5404ebfb11
commit 0a8a9dcbe3
1 changed files with 25 additions and 13 deletions

View File

@ -286,22 +286,34 @@ class Connection extends DatabaseConnection implements SupportsTemporaryTablesIn
public function createDatabase($database) {
// Escape the database name.
$database = Database::getConnection()->escapeDatabase($database);
$db_created = FALSE;
// If the PECL intl extension is installed, use it to determine the proper
// locale. Otherwise, fall back to en_US.
if (class_exists('Locale')) {
$locale = \Locale::getDefault();
}
else {
$locale = 'en_US';
// Try to determine the proper locales for character classification and
// collation. If we could determine locales other than 'en_US', try creating
// the database with these first.
$ctype = setlocale(LC_CTYPE, 0);
$collate = setlocale(LC_COLLATE, 0);
if ($ctype && $collate) {
try {
$this->connection->exec("CREATE DATABASE $database WITH TEMPLATE template0 ENCODING='UTF8' LC_CTYPE='$ctype.UTF-8' LC_COLLATE='$collate.UTF-8'");
$db_created = TRUE;
}
catch (\Exception $e) {
// It might be that the server is remote and does not support the
// locale and collation of the webserver, so we will try again.
}
}
try {
// Create the database and set it as active.
$this->connection->exec("CREATE DATABASE $database WITH TEMPLATE template0 ENCODING='utf8' LC_CTYPE='$locale.utf8' LC_COLLATE='$locale.utf8'");
}
catch (\Exception $e) {
throw new DatabaseNotFoundException($e->getMessage());
// Otherwise fall back to creating the database using the 'en_US' locales.
if (!$db_created) {
try {
$this->connection->exec("CREATE DATABASE $database WITH TEMPLATE template0 ENCODING='UTF8' LC_CTYPE='en_US.UTF-8' LC_COLLATE='en_US.UTF-8'");
}
catch (\Exception $e) {
// If the database can't be created with the 'en_US' locale either,
// we're finally throwing an exception.
throw new DatabaseNotFoundException($e->getMessage());
}
}
}