Index: install.php =================================================================== RCS file: /cvs/drupal/drupal/install.php,v retrieving revision 1.108 diff -u -r1.108 install.php --- install.php 20 Dec 2007 08:26:42 -0000 1.108 +++ install.php 26 Dec 2007 14:43:28 -0000 @@ -322,6 +322,44 @@ '#description' => st('If more than one application will be sharing this database, enter a table prefix such as %prefix for your @drupal site here.', array('@drupal' => drupal_install_profile_name(), '%prefix' => $prefix)), ); + // Create database + $db_create = $_POST['db_create']; + + $form['create_database'] = array( + '#type' => 'fieldset', + '#title' => st('Create database'), + '#collapsible' => TRUE, + '#collapsed' => !$db_create, + '#description' => st("If database is not exists, you can create it. This is useful when you develop sites on your desktop."), + ); + + // Database master username + $form['create_database']['db_create'] = array( + '#type' => 'checkbox', + '#title' => st('Create new database'), + '#default_value' => $db_create, + '#description' => st("Check if you want to create new database"), + ); + + // Database master username + $form['create_database']['db_master_user'] = array( + '#type' => 'textfield', + '#title' => st('Database master username'), + '#default_value' => 'root', + '#size' => 45, + '#maxlength' => 45, + '#description' => st("Enter database master username, usually 'root'"), + ); + + // Database master password + $form['create_database']['db_master_pass'] = array( + '#type' => 'password', + '#title' => st('Database master password'), + '#size' => 45, + '#maxlength' => 45, + ); + + $form['save'] = array( '#type' => 'submit', '#value' => st('Save and continue'), @@ -341,7 +379,125 @@ */ function install_settings_form_validate($form, &$form_state) { global $db_url; - _install_settings_form_validate($form_state['values']['db_prefix'], $form_state['values']['db_type'], $form_state['values']['db_user'], $form_state['values']['db_pass'], $form_state['values']['db_host'], $form_state['values']['db_port'], $form_state['values']['db_path'], $form_state['values']['settings_file'], $form_state, $form); + if(_install_settings_form_create_database_validate($form_state['values']['db_create'], $form_state['values']['db_type'], $form_state['values']['db_master_user'], $form_state['values']['db_master_pass'], $form_state['values']['db_user'], $form_state['values']['db_pass'], $form_state['values']['db_host'], $form_state['values']['db_port'], $form_state['values']['db_path'])) + _install_settings_form_validate($form_state['values']['db_prefix'], $form_state['values']['db_type'], $form_state['values']['db_user'], $form_state['values']['db_pass'], $form_state['values']['db_host'], $form_state['values']['db_port'], $form_state['values']['db_path'], $form_state['values']['settings_file'], $form_state, $form); +} + +/** + * Create database before future validation + */ +function _install_settings_form_create_database_validate($db_create, $db_type, $db_master_user, $db_master_pass, $db_user, $db_pass, $db_host, $db_port, $db_path) +{ + global $db_url; + + if ($db_create) { + if (!$db_master_user) { + form_set_error('db_master_user', st('Master username is required')); + return; + } + + switch($db_type) + { + case 'mysql': + // Verify database connection + $connect_host = ($db_host ? $db_host : 'localhost') . ($db_port ? ":$db_port" : ''); + $conn = @mysql_connect($connect_host, $db_master_user, $db_master_pass); + if (!$conn) { + form_set_error('', st('Failed to connect to your MySQL database server by master. MySQL reports the following message: ') . mysql_error()); + break; + } + + // Get version of database + $result = @mysql_query("SHOW variables WHERE Variable_name='version'"); + if (!$result){ + form_set_error('', st('Failed get version of database. MySQL reports the following message: ' . mysql_error())); + mysql_close($conn); + break; + } + + $row = mysql_fetch_array($result); + $version = $row['Value']; + if (!$version) { + form_set_error('', st('Failed to get version of database')); + mysql_close($conn); + break; + } + + // Create databse + if (strcmp($version, "4.1") >= 0) + $utf8_suffix = " DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_general_ci'"; + $result = @mysql_query(sprintf("CREATE DATABASE IF NOT EXISTS `%s`" . $utf8_suffix, mysql_escape_string($db_path))); + if (!$result){ + form_set_error('', st('Failed to create database. MySQL reports the following message: ' . mysql_error())); + mysql_close($conn); + break; + } + + // Grant permissions + $result = @mysql_query(sprintf("GRANT ALL ON `%s`.* TO `%s`@'%%' IDENTIFIED BY '%s'", + mysql_escape_string($db_path), mysql_escape_string($db_user), mysql_escape_string($db_pass))); + if (!$result){ + form_set_error('', st('Failed to grant permissions. MySQL reports the following message: ' . mysql_error())); + mysql_close($conn); + break; + } + + mysql_close($conn); + return true; + + case 'mysqli': + // Verify database connection + $connect_host = ($db_host ? $db_host : 'localhost') . ($db_port ? ":$db_port" : ''); + $conn = @mysqli_connect($connect_host, $db_master_user, $db_master_pass); + if (!$conn) { + form_set_error('', st('Failed to connect to your MySQL database server by master. MySQL reports the following message: ') . mysqli_connect_error()); + break; + } + + // Get version of database + $result = @mysqli_query($conn, "SHOW variables WHERE Variable_name='version'"); + if (!$result){ + form_set_error('', st('Failed get version of database. MySQL reports the following message: ' . mysqli_error($conn))); + mysqli_close($conn); + break; + } + + $row = mysqli_fetch_array($result); + $version = $row['Value']; + if (!$version) { + form_set_error('', st('Failed to get version of database')); + mysqli_close($conn); + break; + } + + // Create databse + if (strcmp($version, "4.1") >= 0) + $utf8_suffix = " DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_general_ci'"; + $result = @mysqli_query($conn, sprintf("CREATE DATABASE IF NOT EXISTS `%s`" . $utf8_suffix, mysqli_escape_string($db_path))); + if (!$result){ + form_set_error('', st('Failed to create database. MySQL reports the following message: ' . mysqli_error($conn))); + mysqli_close($conn); + break; + } + + // Grant permissions + $result = @mysqli_query($conn, sprintf("GRANT ALL ON `%s`.* TO `%s`@'%%' IDENTIFIED BY '%s'", + mysqli_escape_string($db_path), mysqli_escape_string($db_user), mysqli_escape_string($db_pass))); + if (!$result){ + form_set_error('', st('Failed to grant permissions. MySQL reports the following message: ' . mysqli_error($conn))); + mysqli_close($conn); + break; + } + + mysqli_close($conn); + return true; + + default: + form_set_error('', 'Create database feature is not suported for this database type yet.'); + } + return false; + } + return true; } /**