1 charset_converter.inc public DatabaseCharsetConverter::convertAllDatabases(array $databases)

Convert the MySQL Backdrop databases character set and collation.

Parameters

array $databases: The Backdrop database info array.

Throws

Exception

PDOException

File

core/includes/database/charset_converter.inc, line 83

Class

DatabaseCharsetConverter
Character set converter for database tables.

Code

public function convertAllDatabases(array $databases) {
  $success = FALSE;
  foreach ($databases as $database_key => $database_values) {
    foreach ($database_values as $target => $database) {
      // Do not update replica databases, they will have changes replicated
      // to them automatically. Only update mysql/mysqli-based connections.
      $no_driver = !isset($database['driver']);
      $no_mysql_driver = strpos($database['driver'], 'mysql') !== 0;
      if ($target === 'replica' || $no_driver || $no_mysql_driver) {
        continue;
      }

      // Connect to next database.
      $connection = Database::getConnection($target, $database_key);
      if ($this->charset == 'utf8mb4' && !$connection->utf8mb4IsSupported()) {
        // Intentionally no translation here in the event this is used
        // outside a full Backdrop bootstrap (e.g. a command line tool).
        throw new Exception('The ' . $database_key . ':' . $target . ' MySQL database does not support UTF8MB4! Ensure that the conditions listed in settings.php related to innodb_large_prefix, the server version, and the MySQL driver version are met. See https://docs.backdropcms.org/documentation/database-configuration for more information.');
      }
      // For each database:
      $this->setConnection($connection);
      $this->convertDatabase($database['database']);

      // Build the list of tables to convert.
      $like = '';
      if ($database['prefix']) {
        $like = ' LIKE "' . $database['prefix'] . '%"';
      }
      $tables = $connection->query('SHOW TABLES' . $like)->fetchAllKeyed();
      $this->convertTables($tables);

      $success = TRUE;
    }
  }
  return $success;
}