Tasks.php

Same filename in this branch
  1. 11.x core/modules/sqlite/src/Driver/Database/sqlite/Install/Tasks.php
  2. 11.x core/modules/system/tests/modules/driver_test/src/Driver/Database/DriverTestMysql/Install/Tasks.php
  3. 11.x core/modules/system/tests/modules/driver_test/src/Driver/Database/DriverTestMysqlDeprecatedVersion/Install/Tasks.php
  4. 11.x core/modules/system/tests/modules/driver_test/src/Driver/Database/DriverTestPgsql/Install/Tasks.php
  5. 11.x core/modules/pgsql/src/Driver/Database/pgsql/Install/Tasks.php
  6. 11.x core/tests/Drupal/Tests/Core/Database/fixtures/core/modules/driver_missing_dependency_test/src/Driver/Database/MissingDependency/Install/Tasks.php
  7. 11.x core/tests/fixtures/database_drivers/module/core_fake/src/Driver/Database/CoreFake/Install/Tasks.php
  8. 11.x core/tests/fixtures/database_drivers/module/core_fake/src/Driver/Database/CoreFakeWithAllCustomClasses/Install/Tasks.php
  9. 11.x core/tests/fixtures/database_drivers/core/CoreFake/Install/Tasks.php
  10. 11.x core/tests/fixtures/database_drivers/custom/CoreFake/Install/Tasks.php
  11. 11.x core/tests/fixtures/database_drivers/custom/fake/Install/Tasks.php
  12. 11.x core/lib/Drupal/Core/Database/Install/Tasks.php
Same filename in other branches
  1. 9 core/modules/sqlite/src/Driver/Database/sqlite/Install/Tasks.php
  2. 9 core/modules/mysql/src/Driver/Database/mysql/Install/Tasks.php
  3. 9 core/modules/system/tests/modules/database_statement_monitoring_test/src/sqlite/Install/Tasks.php
  4. 9 core/modules/system/tests/modules/database_statement_monitoring_test/src/mysql/Install/Tasks.php
  5. 9 core/modules/system/tests/modules/database_statement_monitoring_test/src/pgsql/Install/Tasks.php
  6. 9 core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestMysql/Install/Tasks.php
  7. 9 core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestMysqlDeprecatedVersion/Install/Tasks.php
  8. 9 core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestPgsql/Install/Tasks.php
  9. 9 core/modules/pgsql/src/Driver/Database/pgsql/Install/Tasks.php
  10. 9 core/tests/fixtures/database_drivers/module/corefake/src/Driver/Database/corefake/Install/Tasks.php
  11. 9 core/tests/fixtures/database_drivers/module/corefake/src/Driver/Database/corefakeWithAllCustomClasses/Install/Tasks.php
  12. 9 core/tests/fixtures/database_drivers/core/corefake/Install/Tasks.php
  13. 9 core/tests/fixtures/database_drivers/custom/corefake/Install/Tasks.php
  14. 9 core/tests/fixtures/database_drivers/custom/fake/Install/Tasks.php
  15. 9 core/lib/Drupal/Core/Database/Driver/sqlite/Install/Tasks.php
  16. 9 core/lib/Drupal/Core/Database/Driver/mysql/Install/Tasks.php
  17. 9 core/lib/Drupal/Core/Database/Driver/pgsql/Install/Tasks.php
  18. 9 core/lib/Drupal/Core/Database/Install/Tasks.php
  19. 8.9.x core/modules/system/tests/modules/database_statement_monitoring_test/src/sqlite/Install/Tasks.php
  20. 8.9.x core/modules/system/tests/modules/database_statement_monitoring_test/src/mysql/Install/Tasks.php
  21. 8.9.x core/modules/system/tests/modules/database_statement_monitoring_test/src/pgsql/Install/Tasks.php
  22. 8.9.x core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestMysql/Install/Tasks.php
  23. 8.9.x core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestMysqlDeprecatedVersion/Install/Tasks.php
  24. 8.9.x core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestPgsql/Install/Tasks.php
  25. 8.9.x core/tests/fixtures/database_drivers/module/corefake/src/Driver/Database/corefake/Install/Tasks.php
  26. 8.9.x core/tests/fixtures/database_drivers/core/corefake/Install/Tasks.php
  27. 8.9.x core/tests/fixtures/database_drivers/custom/corefake/Install/Tasks.php
  28. 8.9.x core/tests/fixtures/database_drivers/custom/fake/Install/Tasks.php
  29. 8.9.x core/lib/Drupal/Core/Database/Driver/sqlite/Install/Tasks.php
  30. 8.9.x core/lib/Drupal/Core/Database/Driver/mysql/Install/Tasks.php
  31. 8.9.x core/lib/Drupal/Core/Database/Driver/pgsql/Install/Tasks.php
  32. 8.9.x core/lib/Drupal/Core/Database/Install/Tasks.php
  33. 10 core/modules/sqlite/src/Driver/Database/sqlite/Install/Tasks.php
  34. 10 core/modules/mysql/src/Driver/Database/mysql/Install/Tasks.php
  35. 10 core/modules/system/tests/modules/database_statement_monitoring_test/src/sqlite/Install/Tasks.php
  36. 10 core/modules/system/tests/modules/database_statement_monitoring_test/src/mysql/Install/Tasks.php
  37. 10 core/modules/system/tests/modules/database_statement_monitoring_test/src/pgsql/Install/Tasks.php
  38. 10 core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestMysql/Install/Tasks.php
  39. 10 core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestMysqlDeprecatedVersion/Install/Tasks.php
  40. 10 core/modules/system/tests/modules/driver_test/src/Driver/Database/DrivertestPgsql/Install/Tasks.php
  41. 10 core/modules/pgsql/src/Driver/Database/pgsql/Install/Tasks.php
  42. 10 core/tests/Drupal/Tests/Core/Database/fixtures/core/modules/driver_missing_dependency_test/src/Driver/Database/MissingDependency/Install/Tasks.php
  43. 10 core/tests/fixtures/database_drivers/module/core_fake/src/Driver/Database/CoreFake/Install/Tasks.php
  44. 10 core/tests/fixtures/database_drivers/module/core_fake/src/Driver/Database/CoreFakeWithAllCustomClasses/Install/Tasks.php
  45. 10 core/tests/fixtures/database_drivers/core/CoreFake/Install/Tasks.php
  46. 10 core/tests/fixtures/database_drivers/custom/CoreFake/Install/Tasks.php
  47. 10 core/tests/fixtures/database_drivers/custom/fake/Install/Tasks.php
  48. 10 core/lib/Drupal/Core/Database/Driver/sqlite/Install/Tasks.php
  49. 10 core/lib/Drupal/Core/Database/Driver/mysql/Install/Tasks.php
  50. 10 core/lib/Drupal/Core/Database/Driver/pgsql/Install/Tasks.php
  51. 10 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.
     */
    const MYSQL_MINIMUM_VERSION = '8.0';
    
    /**
     * Minimum required MariaDB version.
     */
    const MARIADB_MINIMUM_VERSION = '10.6';
    
    /**
     * 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) {
            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.
            Database::getConnection();
            $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';
        }
        $form['advanced_options']['isolation_level'] = [
            '#type' => 'select',
            '#title' => $this->t('Transaction isolation level'),
            '#options' => [
                'READ COMMITTED' => $this->t('READ COMMITTED'),
                'REPEATABLE READ' => $this->t('REPEATABLE READ'),
                '' => $this->t('Use database default'),
            ],
            '#default_value' => $database['isolation_level'] ?? 'READ COMMITTED',
            '#description' => $this->t('The recommended database transaction level for Drupal is "READ COMMITTED". For more information, see the <a href=":performance_doc">setting MySQL transaction isolation level</a> page.', [
                ':performance_doc' => 'https://www.drupal.org/docs/system-requirements/setting-the-mysql-transaction-isolation-level',
            ]),
        ];
        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.'));
        }
    }

}

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.