? sites/default/files ? sites/default/settings.php Index: install.php =================================================================== RCS file: /cvs/drupal/drupal/install.php,v retrieving revision 1.151 diff -u -p -r1.151 install.php --- install.php 22 Jan 2009 19:31:07 -0000 1.151 +++ install.php 1 Feb 2009 10:03:48 -0000 @@ -370,12 +370,12 @@ function _install_settings_form_validate form_set_value($form['_database'], $database, $form_state); } $class = "DatabaseInstaller_$driver"; - $test = new $class; + $db_installer = new $class; $databases = array('default' => array('default' => $database)); - $return = $test->test(); - if (!$return || $test->error) { - if (!empty($test->success)) { - form_set_error('db_type', st('In order for Drupal to work, and to continue with the installation process, you must resolve all permission issues reported above. We were able to verify that we have permission for the following commands: %commands. For more help with configuring your database server, see the Installation and upgrading handbook. If you are unsure what any of this means you should probably contact your hosting provider.', array('%commands' => implode($test->success, ', ')))); + $db_installer->runTasks(); + if (!empty($db_installer->error)) { + if (!empty($db_installer->success)) { + form_set_error('db_type', st('
In order for Drupal to work, and to continue with the installation process, you must resolve all issues reported below. We were able to do the following:
However, Drupal still needs to be able to complete the following:
For more help with configuring your database server, see the Installation and upgrading handbook. If you are unsure what any of this means you should probably contact your hosting provider.
', array('!successful_tasks' => implode($db_installer->success, 'Are you sure the configured username has the necessary %name permissions to create tables in the database?
', + 'fatal' => TRUE, + ), ), 'testInsert' => array( - 'query' => 'INSERT INTO drupal_install_test (id) VALUES (1)', - 'success' => 'INSERT', - 'message' => 'Failed to insert a value into a test table on your %name database server. We tried inserting a value with the command %query and %name reported the following error: %error.', + 'function' => 'runTestQuery', + 'params' => array( + 'query' => 'INSERT INTO drupal_install_test (id) VALUES (1)', + 'command' => 'INSERT', + 'fail' => 'Failed to INSERT a value into a test table on your %name database server. We tried inserting a value with the command %query and %name reported the following error: %error.', + ), ), 'testUpdate' => array( - 'query' => 'UPDATE drupal_install_test SET id = 2', - 'success' => 'UPDATE', - 'message' => 'Failed to update a value in a test table on your %name database server. We tried updating a value with the command %query and %name reported the following error: %error.', + 'function' => 'runTestQuery', + 'params' => array( + 'query' => 'UPDATE drupal_install_test SET id = 2', + 'command' => 'UPDATE', + 'fail' => 'Failed to UPDATE a value in a test table on your %name database server. We tried updating a value with the command %query and %name reported the following error: %error.', + ), ), 'testDelete' => array( - 'query' => 'DELETE FROM drupal_install_test', - 'success' => 'DELETE', - 'message' => 'Failed to delete a value from a test table on your %name database server. We tried deleting a value with the command %query and %name reported the following error: %error.', + 'function' => 'runTestQuery', + 'params' => array( + 'query' => 'DELETE FROM drupal_install_test', + 'command' => 'DELETE', + 'fail' => 'Failed to DELETE a value from a test table on your %name database server. We tried deleting a value with the command %query and %name reported the following error: %error.', + ), ), 'testDrop' => array( - 'query' => 'DROP TABLE drupal_install_test', - 'success' => 'DELETE', - 'message' => 'Failed to drop a test table from your %name database server. We tried dropping a table with the command %query and %name reported the following error %error.', + 'function' => 'runTestQuery', + 'params' => array( + 'query' => 'DROP TABLE drupal_install_test', + 'command' => 'DELETE', + 'fail' => 'Failed to DROP a test table from your %name database server. We tried dropping a table with the command %query and %name reported the following error %error.', + ), ), ); - public $error = FALSE; + /** + * Ensures the PDO driver is supported by version of PHP in use. + */ protected function hasPdoDriver() { return in_array($this->pdoDriver, PDO::getAvailableDrivers()); } + /** + * Check Drupal is installable on database. + */ public function installable() { - return $this->hasPdoDriver(); + return $this->hasPdoDriver() && empty($this->error); } abstract public function name(); - public function test() { - $return = $this->testConnect(); - if ($return === FALSE) { - return FALSE; - } - foreach ($this->tests as $test) { - $return = $this->runTestQuery($test['query'], $test['success'], $test['message'], !empty($tests['fatal'])); - if ($return === FALSE) { - return FALSE; + /** + * Run database specfic tasks to ensure Drupal can operate on database environment. + * + * Called at install to run tests against the database to + * make sure Drupal can install ok. Each test should append + * a message to the success or error array. + */ + public function runTasks() { + foreach ($this->tasks as $task) { + $return = null; + if (method_exists($this, $task['function'])) { + // Returning false is fatal. No other tasls can run. + if (FALSE === call_user_func_array(array($this, $task['function']),$task['params'])) { + return FALSE; + } + } + else { + drupal_set_message(st('Failed to run all tasks against the database server. The task \'%task\' wasn\'t found.', array('%task' => $task['function'])), 'error'); + $return = FALSE; } } - return $this->success; + return TRUE; } /** @@ -304,25 +359,25 @@ abstract class DatabaseInstaller { protected function testConnect() { try { db_set_active(); - $this->success[] = 'CONNECT'; + $this->success[] = 'CONNECT to the database ok.'; } catch (Exception $e) { - drupal_set_message(st('Failed to connect to your %name database server. %name reports the following message: %error.