#851136: The registry autoloader needs to skip database classes or the database autoloader has no purpose.

From: Damien Tournoud <damien@commerceguys.com>


---
 bootstrap.inc         |   18 ++++++++++++++++++
 database/database.inc |    2 +-
 registry.inc          |    3 +++
 3 files changed, 22 insertions(+), 1 deletions(-)

diff --git includes/bootstrap.inc includes/bootstrap.inc
index 0842863..e6869e6 100644
--- includes/bootstrap.inc
+++ includes/bootstrap.inc
@@ -2694,10 +2694,28 @@ function drupal_autoload_class($class) {
 function _registry_check_code($type, $name = NULL) {
   static $lookup_cache, $cache_update_needed;
 
+  // Skip classes and interfaces that already exist.
   if ($type == 'class' && class_exists($name) || $type == 'interface' && interface_exists($name)) {
     return TRUE;
   }
 
+  // Skip classes that belong to the database layer.
+  static $database_classes = array(
+    'QueryPlaceholderInterface' => TRUE,
+    'QueryConditionInterface' => TRUE, 'DatabaseCondition' => TRUE,
+    'Query' => TRUE, 'DeleteQuery' => TRUE, 'InsertQuery' => TRUE, 'UpdateQuery' => TRUE, 'MergeQuery' => TRUE, 'TruncateQuery' => TRUE,
+    'QueryAlterableInterface' => TRUE,
+    'QueryAlterableInterface' => TRUE, 'SelectQueryInterface' => TRUE, 'SelectQuery' => TRUE, 'SelectQueryExtender' => TRUE,
+    'DatabaseConnection' => TRUE,
+    'DatabaseLog' => TRUE,
+    'DatabaseTransaction' => TRUE,
+    'DatabaseStatementPrefetch' => TRUE,
+    'DatabaseSchema' => TRUE,
+  );
+  if (($type == 'class' || $type == 'interface') && isset($database_classes[strtok($type, '_')])) {
+    return TRUE;
+  }
+
   if (!isset($lookup_cache)) {
     $lookup_cache = array();
     if ($cache = cache_get('lookup_cache', 'cache_bootstrap')) {
diff --git includes/database/database.inc includes/database/database.inc
index 933ceb2..eab4e75 100644
--- includes/database/database.inc
+++ includes/database/database.inc
@@ -2100,7 +2100,7 @@ function db_autoload($class) {
       'QueryAlterableInterface',
     ),
     'select.inc' => array('QueryAlterableInterface', 'SelectQueryInterface', 'SelectQuery', 'SelectQueryExtender'),
-    'database.inc' => array('DatabaseConnection'),
+    'database.inc' => array('DatabaseConnection', 'DatabaseTransaction'),
     'log.inc' => array('DatabaseLog'),
     'prefetch.inc' => array('DatabaseStatementPrefetch'),
     'schema.inc' => array('DatabaseSchema'),
diff --git includes/registry.inc includes/registry.inc
index 9b9a241..2854bd1 100644
--- includes/registry.inc
+++ includes/registry.inc
@@ -53,6 +53,9 @@ function _registry_update() {
     }
   }
   foreach (file_scan_directory('includes', '/\.inc$/') as $filename => $file) {
+    if (preg_match('@^includes/database/@', $filename)) {
+      continue;
+    }
     $files["$filename"] = array('module' => '', 'weight' => 0);
   }
 
