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;
 }
 
 /**
