summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/database/database.inc37
-rw-r--r--modules/simpletest/tests/database_test.test15
2 files changed, 52 insertions, 0 deletions
diff --git a/includes/database/database.inc b/includes/database/database.inc
index 5063b4233..a093fab4b 100644
--- a/includes/database/database.inc
+++ b/includes/database/database.inc
@@ -1364,6 +1364,29 @@ abstract class Database {
}
/**
+ * 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.
*
* At times we need to temporarily disable slave queries. To do so,
@@ -2072,6 +2095,20 @@ function db_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 c354e9a8e..6b5eb2d0b 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.'));
+ }
}
/**