diff --git a/core/lib/Drupal/Core/Database/Database.php b/core/lib/Drupal/Core/Database/Database.php index 6a425de..221d708 100644 --- a/core/lib/Drupal/Core/Database/Database.php +++ b/core/lib/Drupal/Core/Database/Database.php @@ -411,6 +411,12 @@ abstract class Database { } } + public static function createDatabase($key = 'default', $target = 'default') { + self::$databaseInfo[$key][$target]['create_database'] = TRUE; + self::getConnection(); + self::$databaseInfo[$key][$target]['create_database'] = FALSE; + } + /** * Instructs the system to temporarily ignore a given key/target. * diff --git a/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php b/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php index fbbff42..fbf3688 100644 --- a/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php +++ b/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php @@ -47,7 +47,7 @@ class Connection extends DatabaseConnection { // Default to TCP connection on port 3306. $dsn = 'mysql:host=' . $connection_options['host'] . ';port=' . (empty($connection_options['port']) ? 3306 : $connection_options['port']); } - $dsn .= ';dbname=' . $connection_options['database']; + // Allow PDO options to be overridden. $connection_options += array( 'pdo' => array(), @@ -59,7 +59,22 @@ class Connection extends DatabaseConnection { PDO::ATTR_EMULATE_PREPARES => TRUE, ); - parent::__construct($dsn, $connection_options['username'], $connection_options['password'], $connection_options['pdo']); + if (!isset($connection_options['create_database'])) { + $dsn .= ';dbname=' . $connection_options['database']; + parent::__construct($dsn, $connection_options['username'], $connection_options['password'], $connection_options['pdo']); + } + else { + parent::__construct($dsn, $connection_options['username'], $connection_options['password'], $connection_options['pdo']); + try { + // @todo: Escape database names. Also, look for a more PDO-ish way to do + // this. + $this->exec('CREATE DATABASE ' . $connection_options['database']); + $this->exec('USE DATABASE ' . $connection_options['database']); + } + catch (DatabaseException $e) { + throw $e; + } + } // Force MySQL to use the UTF-8 character set. Also set the collation, if a // certain one has been set; otherwise, MySQL defaults to 'utf8_general_ci' diff --git a/core/lib/Drupal/Core/Database/Install/Tasks.php b/core/lib/Drupal/Core/Database/Install/Tasks.php index 5d34a62..d34de40 100644 --- a/core/lib/Drupal/Core/Database/Install/Tasks.php +++ b/core/lib/Drupal/Core/Database/Install/Tasks.php @@ -159,16 +159,22 @@ abstract class Tasks { * Check if we can connect to the database. */ protected function connect() { + // This doesn't actually test the connection. + db_set_active(); + try { - // This doesn't actually test the connection. - db_set_active(); // Now actually do a check. Database::getConnection(); $this->pass('Drupal can CONNECT to the database ok.'); } catch (Exception $e) { - $this->fail(st('Failed to connect to your database server. The server reports the following message: %error.', array('%error' => $e->getMessage()))); - return FALSE; + try { + Database::createDatabase(); + } + catch (Exception $e) { + $this->fail(st('Failed to connect to your database server. The server reports the following message: %error.', array('%error' => $e->getMessage()))); + return FALSE; + } } return TRUE; }