Commit 9ff9e5d0 authored by catch's avatar catch
Browse files

Issue #2010368 by fjgarlin, Pancho, poker10, daffie: Installer can't create...

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

(cherry picked from commit 0a8a9dcb)
parent 9c045ead
Loading
Loading
Loading
Loading
+26 −14
Original line number Diff line number Diff line
@@ -268,24 +268,36 @@ 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();
    $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.
      }
    else {
      $locale = 'en_US';
    }

    // Otherwise fall back to creating the database using the 'en_US' locales.
    if (!$db_created) {
      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'");
        $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());
      }
    }
  }

  public function mapConditionOperator($operator) {
    return static::$postgresqlConditionOperatorMap[$operator] ?? NULL;