Tasks.php

Same filename in this branch
  1. 9 core/modules/sqlite/src/Driver/Database/sqlite/Install/Tasks.php
  2. 9 core/modules/system/tests/modules/database_statement_monitoring_test/src/sqlite/Install/Tasks.php
  3. 9 core/modules/system/tests/modules/database_statement_monitoring_test/src/mysql/Install/Tasks.php
  4. 9 core/modules/system/tests/modules/database_statement_monitoring_test/src/pgsql/Install/Tasks.php
  5. 9 core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestMysql/Install/Tasks.php
  6. 9 core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestMysqlDeprecatedVersion/Install/Tasks.php
  7. 9 core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestPgsql/Install/Tasks.php
  8. 9 core/modules/pgsql/src/Driver/Database/pgsql/Install/Tasks.php
  9. 9 core/tests/fixtures/database_drivers/module/corefake/src/Driver/Database/corefake/Install/Tasks.php
  10. 9 core/tests/fixtures/database_drivers/module/corefake/src/Driver/Database/corefakeWithAllCustomClasses/Install/Tasks.php
  11. 9 core/tests/fixtures/database_drivers/core/corefake/Install/Tasks.php
  12. 9 core/tests/fixtures/database_drivers/custom/corefake/Install/Tasks.php
  13. 9 core/tests/fixtures/database_drivers/custom/fake/Install/Tasks.php
  14. 9 core/lib/Drupal/Core/Database/Driver/sqlite/Install/Tasks.php
  15. 9 core/lib/Drupal/Core/Database/Driver/mysql/Install/Tasks.php
  16. 9 core/lib/Drupal/Core/Database/Driver/pgsql/Install/Tasks.php
  17. 9 core/lib/Drupal/Core/Database/Install/Tasks.php
Same filename in other branches
  1. 8.9.x core/modules/system/tests/modules/database_statement_monitoring_test/src/sqlite/Install/Tasks.php
  2. 8.9.x core/modules/system/tests/modules/database_statement_monitoring_test/src/mysql/Install/Tasks.php
  3. 8.9.x core/modules/system/tests/modules/database_statement_monitoring_test/src/pgsql/Install/Tasks.php
  4. 8.9.x core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestMysql/Install/Tasks.php
  5. 8.9.x core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestMysqlDeprecatedVersion/Install/Tasks.php
  6. 8.9.x core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestPgsql/Install/Tasks.php
  7. 8.9.x core/tests/fixtures/database_drivers/module/corefake/src/Driver/Database/corefake/Install/Tasks.php
  8. 8.9.x core/tests/fixtures/database_drivers/core/corefake/Install/Tasks.php
  9. 8.9.x core/tests/fixtures/database_drivers/custom/corefake/Install/Tasks.php
  10. 8.9.x core/tests/fixtures/database_drivers/custom/fake/Install/Tasks.php
  11. 8.9.x core/lib/Drupal/Core/Database/Driver/sqlite/Install/Tasks.php
  12. 8.9.x core/lib/Drupal/Core/Database/Driver/mysql/Install/Tasks.php
  13. 8.9.x core/lib/Drupal/Core/Database/Driver/pgsql/Install/Tasks.php
  14. 8.9.x core/lib/Drupal/Core/Database/Install/Tasks.php
  15. 10 core/modules/sqlite/src/Driver/Database/sqlite/Install/Tasks.php
  16. 10 core/modules/mysql/src/Driver/Database/mysql/Install/Tasks.php
  17. 10 core/modules/system/tests/modules/database_statement_monitoring_test/src/sqlite/Install/Tasks.php
  18. 10 core/modules/system/tests/modules/database_statement_monitoring_test/src/mysql/Install/Tasks.php
  19. 10 core/modules/system/tests/modules/database_statement_monitoring_test/src/pgsql/Install/Tasks.php
  20. 10 core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestMysql/Install/Tasks.php
  21. 10 core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestMysqlDeprecatedVersion/Install/Tasks.php
  22. 10 core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestPgsql/Install/Tasks.php
  23. 10 core/modules/pgsql/src/Driver/Database/pgsql/Install/Tasks.php
  24. 10 core/tests/Drupal/Tests/Core/Database/fixtures/core/modules/driver_missing_dependency_test/src/Driver/Database/MissingDependency/Install/Tasks.php
  25. 10 core/tests/fixtures/database_drivers/module/core_fake/src/Driver/Database/CoreFake/Install/Tasks.php
  26. 10 core/tests/fixtures/database_drivers/module/core_fake/src/Driver/Database/CoreFakeWithAllCustomClasses/Install/Tasks.php
  27. 10 core/tests/fixtures/database_drivers/core/CoreFake/Install/Tasks.php
  28. 10 core/tests/fixtures/database_drivers/custom/CoreFake/Install/Tasks.php
  29. 10 core/tests/fixtures/database_drivers/custom/fake/Install/Tasks.php
  30. 10 core/lib/Drupal/Core/Database/Driver/sqlite/Install/Tasks.php
  31. 10 core/lib/Drupal/Core/Database/Driver/mysql/Install/Tasks.php
  32. 10 core/lib/Drupal/Core/Database/Driver/pgsql/Install/Tasks.php
  33. 10 core/lib/Drupal/Core/Database/Install/Tasks.php
  34. 11.x core/modules/sqlite/src/Driver/Database/sqlite/Install/Tasks.php
  35. 11.x core/modules/mysql/src/Driver/Database/mysql/Install/Tasks.php
  36. 11.x core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestMysql/Install/Tasks.php
  37. 11.x core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestMysqlDeprecatedVersion/Install/Tasks.php
  38. 11.x core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestPgsql/Install/Tasks.php
  39. 11.x core/modules/pgsql/src/Driver/Database/pgsql/Install/Tasks.php
  40. 11.x core/tests/Drupal/Tests/Core/Database/fixtures/core/modules/driver_missing_dependency_test/src/Driver/Database/MissingDependency/Install/Tasks.php
  41. 11.x core/tests/fixtures/database_drivers/module/core_fake/src/Driver/Database/CoreFake/Install/Tasks.php
  42. 11.x core/tests/fixtures/database_drivers/module/core_fake/src/Driver/Database/CoreFakeWithAllCustomClasses/Install/Tasks.php
  43. 11.x core/tests/fixtures/database_drivers/core/CoreFake/Install/Tasks.php
  44. 11.x core/tests/fixtures/database_drivers/custom/CoreFake/Install/Tasks.php
  45. 11.x core/tests/fixtures/database_drivers/custom/fake/Install/Tasks.php
  46. 11.x core/lib/Drupal/Core/Database/Install/Tasks.php

Namespace

Drupal\mysql\Driver\Database\mysql\Install

File

core/modules/mysql/src/Driver/Database/mysql/Install/Tasks.php

View source
<?php

namespace Drupal\mysql\Driver\Database\mysql\Install;

use Drupal\Core\Database\ConnectionNotDefinedException;
use Drupal\Core\Database\Database;
use Drupal\Core\Database\Install\Tasks as InstallTasks;
use Drupal\mysql\Driver\Database\mysql\Connection;
use Drupal\Core\Database\DatabaseNotFoundException;

/**
 * Specifies installation tasks for MySQL and equivalent databases.
 */
class Tasks extends InstallTasks {
    
    /**
     * Minimum required MySQL version.
     *
     * 5.7.8 is the minimum version that supports the JSON datatype.
     * @see https://dev.mysql.com/doc/refman/5.7/en/json.html
     */
    const MYSQL_MINIMUM_VERSION = '5.7.8';
    
    /**
     * Minimum required MariaDB version.
     *
     * 10.3.7 is the first stable (GA) release in the 10.3 series.
     * @see https://mariadb.com/kb/en/changes-improvements-in-mariadb-103/#list-of-all-mariadb-103-releases
     */
    const MARIADB_MINIMUM_VERSION = '10.3.7';
    
    /**
     * Minimum required MySQLnd version.
     */
    const MYSQLND_MINIMUM_VERSION = '5.0.9';
    
    /**
     * Minimum required libmysqlclient version.
     */
    const LIBMYSQLCLIENT_MINIMUM_VERSION = '5.5.3';
    
    /**
     * The PDO driver name for MySQL and equivalent databases.
     *
     * @var string
     */
    protected $pdoDriver = 'mysql';
    
    /**
     * Constructs a \Drupal\mysql\Driver\Database\mysql\Install\Tasks object.
     */
    public function __construct() {
        $this->tasks[] = [
            'arguments' => [],
            'function' => 'ensureInnoDbAvailable',
        ];
    }
    
    /**
     * {@inheritdoc}
     */
    public function name() {
        try {
            if (!$this->isConnectionActive() || !$this->getConnection() instanceof Connection) {
                throw new ConnectionNotDefinedException('The database connection is not active or not a MySql connection');
            }
            if ($this->getConnection()
                ->isMariaDb()) {
                return $this->t('MariaDB');
            }
            return $this->t('MySQL, Percona Server, or equivalent');
        } catch (ConnectionNotDefinedException $e) {
            return $this->t('MySQL, MariaDB, Percona Server, or equivalent');
        }
    }
    
    /**
     * {@inheritdoc}
     */
    public function minimumVersion() {
        if ($this->getConnection()
            ->isMariaDb()) {
            return static::MARIADB_MINIMUM_VERSION;
        }
        return static::MYSQL_MINIMUM_VERSION;
    }
    
    /**
     * {@inheritdoc}
     */
    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 a non-existent
                // database.
                $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;
    }
    
    /**
     * {@inheritdoc}
     */
    public function getFormOptions(array $database) {
        $form = parent::getFormOptions($database);
        if (empty($form['advanced_options']['port']['#default_value'])) {
            $form['advanced_options']['port']['#default_value'] = '3306';
        }
        return $form;
    }
    
    /**
     * Ensure that InnoDB is available.
     */
    public function ensureInnoDbAvailable() {
        $engines = Database::getConnection()->query('SHOW ENGINES')
            ->fetchAllKeyed();
        if (isset($engines['MyISAM']) && $engines['MyISAM'] == 'DEFAULT' && !isset($engines['InnoDB'])) {
            $this->fail(t('The MyISAM storage engine is not supported.'));
        }
    }
    
    /**
     * {@inheritdoc}
     */
    protected function checkEngineVersion() {
        parent::checkEngineVersion();
        // Ensure that the MySQL driver supports utf8mb4 encoding.
        $version = Database::getConnection()->clientVersion();
        if (FALSE !== strpos($version, 'mysqlnd')) {
            // The mysqlnd driver supports utf8mb4 starting at version 5.0.9.
            $version = preg_replace('/^\\D+([\\d.]+).*/', '$1', $version);
            if (version_compare($version, self::MYSQLND_MINIMUM_VERSION, '<')) {
                $this->fail(t("The MySQLnd driver version %version is less than the minimum required version. Upgrade to MySQLnd version %mysqlnd_minimum_version or up, or alternatively switch mysql drivers to libmysqlclient version %libmysqlclient_minimum_version or up.", [
                    '%version' => $version,
                    '%mysqlnd_minimum_version' => self::MYSQLND_MINIMUM_VERSION,
                    '%libmysqlclient_minimum_version' => self::LIBMYSQLCLIENT_MINIMUM_VERSION,
                ]));
            }
        }
        else {
            // The libmysqlclient driver supports utf8mb4 starting at version 5.5.3.
            if (version_compare($version, self::LIBMYSQLCLIENT_MINIMUM_VERSION, '<')) {
                $this->fail(t("The libmysqlclient driver version %version is less than the minimum required version. Upgrade to libmysqlclient version %libmysqlclient_minimum_version or up, or alternatively switch mysql drivers to MySQLnd version %mysqlnd_minimum_version or up.", [
                    '%version' => $version,
                    '%libmysqlclient_minimum_version' => self::LIBMYSQLCLIENT_MINIMUM_VERSION,
                    '%mysqlnd_minimum_version' => self::MYSQLND_MINIMUM_VERSION,
                ]));
            }
        }
    }

}

Classes

Title Deprecated Summary
Tasks Specifies installation tasks for MySQL and equivalent databases.

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