diff --git a/includes/database/database.inc b/includes/database/database.inc index 5063b4233ff092116a568a683703c969d1dfcead..a093fab4b4b8359a2cb8372b198afd4d80f1f3eb 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 c354e9a8ed9b52e65f8ebe10eea6c6c88353a0de..6b5eb2d0b1ab38dec140f4ecc0e8990564a3ce6a 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.')); + } } /**