Index: install.php
===================================================================
RCS file: /cvs/drupal/drupal/install.php,v
retrieving revision 1.134
diff -u -p -r1.134 install.php
--- install.php	1 Oct 2008 00:27:29 -0000	1.134
+++ install.php	1 Oct 2008 17:58:23 -0000
@@ -179,7 +179,7 @@ function install_verify_settings() {
   global $db_prefix, $databases;
 
   // Verify existing settings (if any).
-  if (!empty($databases)) {
+  if (class_exists('PDO') && !empty($databases)) {
     // We need this because we want to run form_get_errors.
     include_once DRUPAL_ROOT . '/includes/form.inc';
 
Index: includes/bootstrap.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/bootstrap.inc,v
retrieving revision 1.228
diff -u -p -r1.228 bootstrap.inc
--- includes/bootstrap.inc	20 Sep 2008 20:22:23 -0000	1.228
+++ includes/bootstrap.inc	1 Oct 2008 17:58:25 -0000
@@ -363,6 +363,12 @@ function conf_init() {
     }
   }
 
+  // If the $databases configuration array has not been populated, then
+  // an installation is required.
+  if (empty($databases)) {
+    _drupal_install_required();
+  }  
+
   if ($cookie_domain) {
     // If the user specifies the cookie domain, also use it for session name.
     $session_name = $cookie_domain;
@@ -1084,6 +1090,15 @@ function _drupal_bootstrap($phase) {
 }
 
 /**
+ * Send the user to the installer page.
+ */
+function _drupal_install_required() {
+  if (!function_exists('install_goto')) {
+    include_once DRUPAL_ROOT . '/includes/install.inc';
+    install_goto('install.php');
+  }  
+}
+/**
  * Enables use of the theme system without requiring database access.
  *
  * Loads and initializes the theme system for site installs, updates and when
Index: includes/install.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/install.inc,v
retrieving revision 1.72
diff -u -p -r1.72 install.inc
--- includes/install.inc	1 Oct 2008 00:27:29 -0000	1.72
+++ includes/install.inc	1 Oct 2008 17:58:25 -0000
@@ -205,6 +205,11 @@ function drupal_detect_baseurl($file = '
  */
 function drupal_detect_database_types() {
   $databases = array();
+  
+  // Initialize the database system if it has not been
+  // initialized yet. We do not initialize it earlier to make
+  // requirements check during the installation.
+  require_once DRUPAL_ROOT . '/includes/database/database.inc';  
 
   // We define a driver as a directory in /includes/database that in turn
   // contains a database.inc file.  That allows us to drop in additional drivers
Index: includes/theme.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/theme.inc,v
retrieving revision 1.437
diff -u -p -r1.437 theme.inc
--- includes/theme.inc	20 Sep 2008 20:22:23 -0000	1.437
+++ includes/theme.inc	1 Oct 2008 17:58:28 -0000
@@ -435,7 +435,7 @@ function list_themes($refresh = FALSE) {
     $themes = array();
     // Extract from the database only when it is available.
     // Also check that the site is not in the middle of an install or update.
-    if (db_is_active() && !defined('MAINTENANCE_MODE')) {
+    if (!defined('MAINTENANCE_MODE') && db_is_active()) {
       $result = db_query("SELECT * FROM {system} WHERE type = '%s'", 'theme');
       while ($theme = db_fetch_object($result)) {
         if (file_exists($theme->filename)) {
Index: includes/theme.maintenance.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/theme.maintenance.inc,v
retrieving revision 1.19
diff -u -p -r1.19 theme.maintenance.inc
--- includes/theme.maintenance.inc	1 Oct 2008 00:27:29 -0000	1.19
+++ includes/theme.maintenance.inc	1 Oct 2008 17:58:28 -0000
@@ -28,7 +28,6 @@ function _drupal_maintenance_theme() {
   require_once DRUPAL_ROOT . '/includes/unicode.inc';
   require_once DRUPAL_ROOT . '/includes/file.inc';
   require_once DRUPAL_ROOT . '/includes/module.inc';
-  require_once DRUPAL_ROOT . '/includes/database/database.inc';
   unicode_check();
 
   // Install and update pages are treated differently to prevent theming overrides.
@@ -36,6 +35,7 @@ function _drupal_maintenance_theme() {
     $theme = 'minnelli';
   }
   else {
+    require_once DRUPAL_ROOT . '/includes/database/database.inc';
     // Load module basics (needed for hook invokes).
     $module_list['system']['filename'] = 'modules/system/system.module';
     $module_list['filter']['filename'] = 'modules/filter/filter.module';
Index: includes/database/database.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database/database.inc,v
retrieving revision 1.10
diff -u -p -r1.10 database.inc
--- includes/database/database.inc	28 Sep 2008 21:52:08 -0000	1.10
+++ includes/database/database.inc	1 Oct 2008 17:58:30 -0000
@@ -353,7 +353,7 @@ abstract class DatabaseConnection extend
     }
     catch (PDOException $e) {
       if (!function_exists('module_implements')) {
-        _db_need_install();
+        _drupal_install_required();
       }
       if ($options['throw_exception']) {
         if ($query instanceof DatabaseStatement) {
@@ -754,9 +754,6 @@ abstract class Database {
   final protected static function parseConnectionInfo() {
     global $databases;
 
-    if (empty($databases)) {
-      _db_need_install();
-    }
     $databaseInfo = $databases;
 
     // If no database key is specified, default to default.
@@ -875,7 +872,7 @@ abstract class Database {
       // It is extremely rare that an exception will be generated here other
       // than when installing.  We therefore intercept it and try the installer,
       // passing on the exception otherwise.
-      _db_need_install();
+      _drupal_install_required();
       throw $e;
     }
   }
@@ -1861,13 +1858,6 @@ function db_result(DatabaseStatement $st
   return $statement->fetchField();
 }
 
-function _db_need_install() {
-  if (!function_exists('install_goto')) {
-    include_once DRUPAL_ROOT . '/includes/install.inc';
-    install_goto('install.php');
-  }
-}
-
 /**
  * Backward-compatibility utility.
  *
Index: includes/database/pgsql/database.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/database/pgsql/database.inc,v
retrieving revision 1.3
diff -u -p -r1.3 database.inc
--- includes/database/pgsql/database.inc	15 Sep 2008 20:48:07 -0000	1.3
+++ includes/database/pgsql/database.inc	1 Oct 2008 17:58:31 -0000
@@ -59,7 +59,7 @@ class DatabaseConnection_pgsql extends D
     }
     catch (PDOException $e) {
       if (!function_exists('module_implements')) {
-        _db_need_install();
+        _drupal_install_required();
       }
       //watchdog('database', var_export($e, TRUE) . $e->getMessage(), NULL, WATCHDOG_ERROR);
       if ($options['throw_exception']) {
Index: modules/system/system.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.install,v
retrieving revision 1.269
diff -u -p -r1.269 system.install
--- modules/system/system.install	27 Sep 2008 20:16:17 -0000	1.269
+++ modules/system/system.install	1 Oct 2008 17:58:35 -0000
@@ -92,6 +92,19 @@ function system_requirements($phase) {
     }
   }
 
+  // Test PDO library availablility.
+  $requirements['pdo'] = array(
+    'title' => $t('PDO library'),
+  );
+  if (class_exists('PDO') && method_exists('PDO', 'query') && class_exists('PDOStatement') && class_exists('PDOException')) {
+    $requirements['pdo']['value'] = $t('Enabled');
+  }
+  else {
+    $requirements['pdo']['value'] = $t('Disabled');
+    $requirements['pdo']['severity'] = REQUIREMENT_ERROR;
+    $requirements['pdo']['description'] = $t('Drupal requires the PDO library for database access. See the <a href="@pdo">PHP PDO installation page</a> for instructions on how to enable PDO.', array('@pdo' => 'http://us.php.net/manual/en/pdo.installation.php'));
+  }
+
   // Test DB version
   global $db_type;
   if (function_exists('db_status_report')) {
