From 4e614ace820166d83b4767983404f79b2ba44949 Mon Sep 17 00:00:00 2001
From: Angie Byron <webchick@24967.no-reply.drupal.org>
Date: Tue, 4 Aug 2009 05:36:57 +0000
Subject: [PATCH] #434350 by cpliakas and Crell: Add a method to explicitly
 close a database connection.

---
 includes/database/database.inc              | 37 +++++++++++++++++++++
 modules/simpletest/tests/database_test.test | 15 +++++++++
 2 files changed, 52 insertions(+)

diff --git a/includes/database/database.inc b/includes/database/database.inc
index 5063b4233ff0..a093fab4b4b8 100644
--- a/includes/database/database.inc
+++ b/includes/database/database.inc
@@ -1363,6 +1363,29 @@ final protected static function openConnection($key, $target) {
     }
   }
 
+  /**
+   * Closes a connection to the server specified by the given key and target.
+   *
+   * @param $target
+   *   The database target name.  Defaults to NULL meaning that all target
+   *   connections will be closed.
+   * @param $key
+   *   The database connection key. Defaults to NULL which means the active key.
+   */
+  public static function closeConnection($target = NULL, $key = NULL) {
+    // Gets the active conection by default.
+    if (!isset($key)) {
+      $key = self::$activeKey;
+    }
+    // To close the connection, we need to unset the static variable.
+    if (isset($target)) {
+      unset(self::$connections[$key][$target]);
+    }
+    else {
+      unset(self::$connections[$key]);
+    }
+  }
+
   /**
    * Instruct the system to temporarily ignore a given key/target.
    *
@@ -2071,6 +2094,20 @@ function db_driver() {
   return Database::getConnection()->driver();
 }
 
+/**
+ * Closes the active database connection.
+ *
+ * @param $options
+ *   An array of options to control which connection is closed.  Only the
+ *   target key has any meaning in this case.
+ */
+function db_close(array $options = array()) {
+  if (empty($options['target'])) {
+    $options['target'] = NULL;
+  }
+  Database::closeConnection($options['target']);
+}
+
 /**
  * @} End of "defgroup database".
  */
diff --git a/modules/simpletest/tests/database_test.test b/modules/simpletest/tests/database_test.test
index c354e9a8ed9b..6b5eb2d0b1ab 100644
--- a/modules/simpletest/tests/database_test.test
+++ b/modules/simpletest/tests/database_test.test
@@ -230,6 +230,21 @@ class DatabaseConnectionTestCase extends DatabaseTestCase {
 
     $this->assertIdentical($db1, $db2, t('Both targets refer to the same connection.'));
   }
+
+  /**
+   * Tests the closing of a database connection.
+   */
+  function testConnectionClosing() {
+    // Open the default target so we have an object to compare.
+    $db1 = Database::getConnection('default', 'default');
+
+    // Try to close the the default connection, then open a new one.
+    Database::closeConnection('default', 'default');
+    $db2 = Database::getConnection('default', 'default');
+
+    // Opening a connection after closing it should yield an object different than the original.
+    $this->assertNotIdentical($db1, $db2, t('Opening the default connection after it is closed returns a new object.'));
+  }
 }
 
 /**
-- 
GitLab