From 0a8a9dcbe3d502fcc02346efb7d06d90bfd88e89 Mon Sep 17 00:00:00 2001 From: catch <catch@35733.no-reply.drupal.org> Date: Mon, 4 Sep 2023 13:29:37 +0100 Subject: [PATCH] Issue #2010368 by fjgarlin, Pancho, poker10, daffie: Installer can't create new database on PostgreSQL --- .../src/Driver/Database/pgsql/Connection.php | 40 ++++++++++++------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/core/modules/pgsql/src/Driver/Database/pgsql/Connection.php b/core/modules/pgsql/src/Driver/Database/pgsql/Connection.php index 8a78723465cd..3cab209a0d48 100644 --- a/core/modules/pgsql/src/Driver/Database/pgsql/Connection.php +++ b/core/modules/pgsql/src/Driver/Database/pgsql/Connection.php @@ -286,22 +286,34 @@ public function databaseType() { public function createDatabase($database) { // Escape the database name. $database = Database::getConnection()->escapeDatabase($database); - - // 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'; + $db_created = FALSE; + + // 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()); + } } } -- GitLab