function Tasks::connect

Same name in this branch
  1. 8.9.x core/lib/Drupal/Core/Database/Driver/sqlite/Install/Tasks.php \Drupal\Core\Database\Driver\sqlite\Install\Tasks::connect()
  2. 8.9.x core/lib/Drupal/Core/Database/Driver/pgsql/Install/Tasks.php \Drupal\Core\Database\Driver\pgsql\Install\Tasks::connect()
  3. 8.9.x core/lib/Drupal/Core/Database/Install/Tasks.php \Drupal\Core\Database\Install\Tasks::connect()
Same name and namespace in other branches
  1. 9 core/modules/sqlite/src/Driver/Database/sqlite/Install/Tasks.php \Drupal\sqlite\Driver\Database\sqlite\Install\Tasks::connect()
  2. 9 core/modules/mysql/src/Driver/Database/mysql/Install/Tasks.php \Drupal\mysql\Driver\Database\mysql\Install\Tasks::connect()
  3. 9 core/modules/pgsql/src/Driver/Database/pgsql/Install/Tasks.php \Drupal\pgsql\Driver\Database\pgsql\Install\Tasks::connect()
  4. 9 core/lib/Drupal/Core/Database/Install/Tasks.php \Drupal\Core\Database\Install\Tasks::connect()
  5. 10 core/modules/sqlite/src/Driver/Database/sqlite/Install/Tasks.php \Drupal\sqlite\Driver\Database\sqlite\Install\Tasks::connect()
  6. 10 core/modules/mysql/src/Driver/Database/mysql/Install/Tasks.php \Drupal\mysql\Driver\Database\mysql\Install\Tasks::connect()
  7. 10 core/modules/pgsql/src/Driver/Database/pgsql/Install/Tasks.php \Drupal\pgsql\Driver\Database\pgsql\Install\Tasks::connect()
  8. 10 core/lib/Drupal/Core/Database/Install/Tasks.php \Drupal\Core\Database\Install\Tasks::connect()
  9. 11.x core/modules/sqlite/src/Driver/Database/sqlite/Install/Tasks.php \Drupal\sqlite\Driver\Database\sqlite\Install\Tasks::connect()
  10. 11.x core/modules/mysql/src/Driver/Database/mysql/Install/Tasks.php \Drupal\mysql\Driver\Database\mysql\Install\Tasks::connect()
  11. 11.x core/modules/pgsql/src/Driver/Database/pgsql/Install/Tasks.php \Drupal\pgsql\Driver\Database\pgsql\Install\Tasks::connect()
  12. 11.x core/lib/Drupal/Core/Database/Install/Tasks.php \Drupal\Core\Database\Install\Tasks::connect()

Overrides Tasks::connect

File

core/lib/Drupal/Core/Database/Driver/mysql/Install/Tasks.php, line 63

Class

Tasks
Specifies installation tasks for MySQL and equivalent databases.

Namespace

Drupal\Core\Database\Driver\mysql\Install

Code

protected function connect() {
    try {
        // This doesn't actually test the connection.
        Database::setActiveConnection();
        // Now actually do a check.
        try {
            Database::getConnection();
        } catch (\Exception $e) {
            // Detect utf8mb4 incompatibility.
            if ($e->getCode() == Connection::UNSUPPORTED_CHARSET || $e->getCode() == Connection::SQLSTATE_SYNTAX_ERROR && $e->errorInfo[1] == Connection::UNKNOWN_CHARSET) {
                $this->fail(t('Your MySQL server and PHP MySQL driver must support utf8mb4 character encoding. Make sure to use a database system that supports this (such as MySQL/MariaDB/Percona 5.5.3 and up), and that the utf8mb4 character set is compiled in. See the <a href=":documentation" target="_blank">MySQL documentation</a> for more information.', [
                    ':documentation' => 'https://dev.mysql.com/doc/refman/5.0/en/cannot-initialize-character-set.html',
                ]));
                $info = Database::getConnectionInfo();
                $info_copy = $info;
                // Set a flag to fall back to utf8. Note: this flag should only be
                // used here and is for internal use only.
                $info_copy['default']['_dsn_utf8_fallback'] = TRUE;
                // In order to change the Database::$databaseInfo array, we need to
                // remove the active connection, then re-add it with the new info.
                Database::removeConnection('default');
                Database::addConnectionInfo('default', 'default', $info_copy['default']);
                // Connect with the new database info, using the utf8 character set so
                // that we can run the checkEngineVersion test.
                Database::getConnection();
                // Revert to the old settings.
                Database::removeConnection('default');
                Database::addConnectionInfo('default', 'default', $info['default']);
            }
            else {
                // Rethrow the exception.
                throw $e;
            }
        }
        $this->pass('Drupal can CONNECT to the database ok.');
    } catch (\Exception $e) {
        // Attempt to create the database if it is not found.
        if ($e->getCode() == Connection::DATABASE_NOT_FOUND) {
            // Remove the database string from connection info.
            $connection_info = Database::getConnectionInfo();
            $database = $connection_info['default']['database'];
            unset($connection_info['default']['database']);
            // In order to change the Database::$databaseInfo array, need to remove
            // the active connection, then re-add it with the new info.
            Database::removeConnection('default');
            Database::addConnectionInfo('default', 'default', $connection_info['default']);
            try {
                // Now, attempt the connection again; if it's successful, attempt to
                // create the database.
                Database::getConnection()->createDatabase($database);
                Database::closeConnection();
                // Now, restore the database config.
                Database::removeConnection('default');
                $connection_info['default']['database'] = $database;
                Database::addConnectionInfo('default', 'default', $connection_info['default']);
                // Check the database connection.
                Database::getConnection();
                $this->pass('Drupal can CONNECT to the database ok.');
            } catch (DatabaseNotFoundException $e) {
                // Still no dice; probably a permission issue. Raise the error to the
                // installer.
                $this->fail(t('Database %database not found. The server reports the following message when attempting to create the database: %error.', [
                    '%database' => $database,
                    '%error' => $e->getMessage(),
                ]));
            }
        }
        else {
            // Database connection failed for some other reason than the database
            // not existing.
            $this->fail(t('Failed to connect to your database server. The server reports the following message: %error.<ul><li>Is the database server running?</li><li>Does the database exist or does the database user have sufficient privileges to create the database?</li><li>Have you entered the correct database name?</li><li>Have you entered the correct username and password?</li><li>Have you entered the correct database hostname and port number?</li></ul>', [
                '%error' => $e->getMessage(),
            ]));
            return FALSE;
        }
    }
    return TRUE;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.