Index: includes/database.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database.inc,v retrieving revision 1.85 diff -u -p -r1.85 database.inc --- includes/database.inc 30 Nov 2007 12:19:10 -0000 1.85 +++ includes/database.inc 13 Dec 2007 22:51:03 -0000 @@ -146,11 +146,7 @@ function db_set_active($name = 'default' include_once $handler; } else { - drupal_maintenance_theme(); - drupal_set_title('Unsupported database type'); - print theme('maintenance_page', '
The database type '. theme('placeholder', $db_type) .' is unsupported. Please use either mysql for MySQL 3.x & 4.0.x databases, mysqli for MySQL 4.1.x+ databases, or pgsql for PostgreSQL databases. The database information is in your settings.php file.
For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.
'); - exit; + _db_error_page("The database type '". $db_type ."' is unsupported. Please use either 'mysql' or 'mysqli' for MySQL, or 'pgsql' for PostgreSQL databases."); } $db_conns[$name] = db_connect($connect_url); @@ -164,6 +160,33 @@ function db_set_active($name = 'default' } /** + * Helper function to show fatal database errors. + * + * Prints a themed maintenance page with the 'Site off-line' text, + * adding the provided error message in the case of 'display_errors' + * set to on. Ends the page request; no return. + * + * @param $error + * The error message to be appended if 'display_errors' is on. + */ +function _db_error_page($error = '') { + global $db_type; + drupal_maintenance_theme(); + drupal_set_header('HTTP/1.1 503 Service Unavailable'); + drupal_set_title('Site off-line'); + + $message = 'The site is currently not available due to technical problems. Please try again later. Thank you for your understanding.
'; + $message .= 'If you are the maintainer of this site, please check your database settings in the settings.php file and ensure that your hosting provider\'s database server is running. For more help, see the handbook, or contact your hosting provider.
The '. theme('placeholder', $db_type) .' error was: '. theme('placeholder', $error) .'.
'; + } + + print theme('maintenance_page', $message); + exit; +} + +/** * Returns a boolean depending on the availability of the database. */ function db_is_active() { Index: includes/database.mysql.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database.mysql.inc,v retrieving revision 1.84 diff -u -p -r1.84 database.mysql.inc --- includes/database.mysql.inc 8 Dec 2007 14:06:20 -0000 1.84 +++ includes/database.mysql.inc 13 Dec 2007 22:51:03 -0000 @@ -53,11 +53,7 @@ function db_connect($url) { // Check if MySQL support is present in PHP if (!function_exists('mysql_connect')) { - drupal_maintenance_theme(); - drupal_set_title('PHP MySQL support not enabled'); - print theme('maintenance_page', 'We were unable to use the MySQL database because the MySQL extension for PHP is not installed. Check your PHP.ini to see how you can enable it.
For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.
'); - exit; + _db_error_page('Unable to use the MySQL database because the MySQL extension for PHP is not installed. Check yourphp.ini to see how you can enable it.');
}
// Decode url-encoded information in the db connection string
@@ -84,37 +80,9 @@ function db_connect($url) {
// - 2 means CLIENT_FOUND_ROWS: return the number of found
// (matched) rows, not the number of affected rows.
$connection = @mysql_connect($url['host'], $url['user'], $url['pass'], TRUE, 2);
- if (!$connection) {
+ if (!$connection || !mysql_select_db(substr($url['path'], 1))) {
// Show error screen otherwise
- drupal_maintenance_theme();
- drupal_set_header('HTTP/1.1 503 Service Unavailable');
- drupal_set_title('Unable to connect to database server');
- print theme('maintenance_page', 'If you still have to install Drupal, proceed to the installation page.
-If you have already finished installing Drupal, this either means that the username and password information in your settings.php file is incorrect or that we can\'t connect to the MySQL database server. This could mean your hosting provider\'s database server is down.
The MySQL error was: '. theme('placeholder', mysql_error()) .'.
-Currently, the username is '. theme('placeholder', $url['user']) .' and the database server is '. theme('placeholder', $url['host']) .'.
-For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.
'); - exit; - } - - if (!mysql_select_db(substr($url['path'], 1))) { - drupal_maintenance_theme(); - drupal_set_title('Unable to select database'); - print theme('maintenance_page', 'We were able to connect to the MySQL database server (which means your username and password are okay) but not able to select the database.
-The MySQL error was: '. theme('placeholder', mysql_error($connection)) .'.
-Currently, the database is '. theme('placeholder', substr($url['path'], 1)) .'. The username is '. theme('placeholder', $url['user']) .' and the database server is '. theme('placeholder', $url['host']) .'.
-For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.
'); - exit; + _db_error_page(mysql_error()); } /* On MySQL 4.1 and later, force UTF-8 */ Index: includes/database.mysqli.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database.mysqli.inc,v retrieving revision 1.50 diff -u -p -r1.50 database.mysqli.inc --- includes/database.mysqli.inc 8 Dec 2007 14:06:20 -0000 1.50 +++ includes/database.mysqli.inc 13 Dec 2007 22:51:04 -0000 @@ -58,11 +58,7 @@ function db_version() { function db_connect($url) { // Check if MySQLi support is present in PHP if (!function_exists('mysqli_init') && !extension_loaded('mysqli')) { - drupal_maintenance_theme(); - drupal_set_title('PHP MySQLi support not enabled'); - print theme('maintenance_page', 'We were unable to use the MySQLi database because the MySQLi extension for PHP is not installed. Check your PHP.ini to see how you can enable it.
For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.
'); - exit; + _db_error_page('Unable to use the MySQLi database because the MySQLi extension for PHP is not installed. Check yourphp.ini to see how you can enable it.');
}
$url = parse_url($url);
@@ -85,37 +81,8 @@ function db_connect($url) {
$connection = mysqli_init();
@mysqli_real_connect($connection, $url['host'], $url['user'], $url['pass'], substr($url['path'], 1), $url['port'], NULL, MYSQLI_CLIENT_FOUND_ROWS);
- // Find all database connection errors and error 1045 for access denied for user account
- if (mysqli_connect_errno() >= 2000 || mysqli_connect_errno() == 1045) {
- drupal_maintenance_theme();
- drupal_set_header('HTTP/1.1 503 Service Unavailable');
- drupal_set_title('Unable to connect to database server');
- print theme('maintenance_page', 'If you still have to install Drupal, proceed to the installation page.
-If you have already finished installing Drupal, this either means that the username and password information in your settings.php file is incorrect or that we can\'t connect to the MySQL database server. This could mean your hosting provider\'s database server is down.
The MySQL error was: '. theme('placeholder', mysqli_connect_error()) .'.
-Currently, the username is '. theme('placeholder', $url['user']) .' and the database server is '. theme('placeholder', $url['host']) .'.
-settings.php configuration file in Drupal.For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.
'); - exit; - } - else if (mysqli_connect_errno() > 0) { - drupal_maintenance_theme(); - drupal_set_title('Unable to select database'); - print theme('maintenance_page', 'We were able to connect to the MySQL database server (which means your username and password are okay) but not able to select the database.
-The MySQL error was: '. theme('placeholder', mysqli_connect_error()) .'.
-Currently, the database is '. theme('placeholder', substr($url['path'], 1)) .'. The username is '. theme('placeholder', $url['user']) .' and the database server is '. theme('placeholder', $url['host']) .'.
-For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.
'); - exit; + if (mysqli_connect_errno() > 0) { + _db_error_page(mysqli_connect_error()); } /* Force UTF-8 */ Index: includes/database.pgsql.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database.pgsql.inc,v retrieving revision 1.63 diff -u -p -r1.63 database.pgsql.inc --- includes/database.pgsql.inc 17 Oct 2007 12:47:28 -0000 1.63 +++ includes/database.pgsql.inc 13 Dec 2007 22:51:05 -0000 @@ -47,11 +47,7 @@ function db_version() { function db_connect($url) { // Check if PostgreSQL support is present in PHP if (!function_exists('pg_connect')) { - drupal_maintenance_theme(); - drupal_set_title('PHP PostgreSQL support not enabled'); - print theme('maintenance_page', 'We were unable to use the PostgreSQL database because the PostgreSQL extension for PHP is not installed. Check your PHP.ini to see how you can enable it.
For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.
'); - exit; + _db_error_page('Unable to use the PostgreSQL database because the PostgreSQL extension for PHP is not installed. Check yourphp.ini to see how you can enable it.');
}
$url = parse_url($url);
@@ -82,21 +78,8 @@ function db_connect($url) {
$connection = @pg_connect($conn_string);
if (!$connection) {
- drupal_maintenance_theme();
- drupal_set_header('HTTP/1.1 503 Service Unavailable');
- drupal_set_title('Unable to connect to database');
- print theme('maintenance_page', 'If you still have to install Drupal, proceed to the installation page.
-If you have already finished installing Drupal, this either means that the username and password information in your settings.php file is incorrect or that we can\'t connect to the PostgreSQL database server. This could mean your hosting provider\'s database server is down.
The PostgreSQL error was: '. theme('placeholder', decode_entities($php_errormsg)) .'
-Currently, the database is '. theme('placeholder', substr($url['path'], 1)) .', the username is '. theme('placeholder', $url['user']) .', and the database server is '. theme('placeholder', $url['host']) .'.
-For more help, see the Installation and upgrading handbook. If you are unsure what these terms mean you should probably contact your hosting provider.
'); - exit; + require_once './includes/unicode.inc'; + _db_error_page(decode_entities($php_errormsg)); } // Restore error tracking setting