The DB_driver can now use failover databases if specified

The DB_driver can now use failover databases if specified.
If the main connection shouldn't connect for some reason the DB_driver will now try to connect to specified connections in the failover config.

Example config:
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = '';
$db['default']['password'] = '';
$db['default']['database'] = '';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
$db['default']['failover'] = array();

$db['default']['failover'][0]['hostname'] = 'localhost1';
$db['default']['failover'][0]['username'] = '';
$db['default']['failover'][0]['password'] = '';
$db['default']['failover'][0]['database'] = '';
$db['default']['failover'][0]['dbdriver'] = 'mysql';
$db['default']['failover'][0]['dbprefix'] = '';
$db['default']['failover'][0]['pconnect'] = TRUE;
$db['default']['failover'][0]['db_debug'] = TRUE;
$db['default']['failover'][0]['cache_on'] = FALSE;
$db['default']['failover'][0]['cachedir'] = '';
$db['default']['failover'][0]['char_set'] = 'utf8';
$db['default']['failover'][0]['dbcollat'] = 'utf8_general_ci';
$db['default']['failover'][0]['swap_pre'] = '';
$db['default']['failover'][0]['autoinit'] = TRUE;
$db['default']['failover'][0]['stricton'] = FALSE;
$db['default']['failover'][0]['failover'] = array();

$db['default']['failover'][1]['hostname'] = 'localhost2';
$db['default']['failover'][1]['username'] = '';
$db['default']['failover'][1]['password'] = '';
$db['default']['failover'][1]['database'] = '';
$db['default']['failover'][1]['dbdriver'] = 'mysql';
$db['default']['failover'][1]['dbprefix'] = '';
$db['default']['failover'][1]['pconnect'] = TRUE;
$db['default']['failover'][1]['db_debug'] = TRUE;
$db['default']['failover'][1]['cache_on'] = FALSE;
$db['default']['failover'][1]['cachedir'] = '';
$db['default']['failover'][1]['char_set'] = 'utf8';
$db['default']['failover'][1]['dbcollat'] = 'utf8_general_ci';
$db['default']['failover'][1]['swap_pre'] = '';
$db['default']['failover'][1]['autoinit'] = TRUE;
$db['default']['failover'][1]['stricton'] = FALSE;
$db['default']['failover'][1]['failover'] = array();

Signed-off-by: Felix Balfoort <fhjbalfoort@gmail.com>
diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
index cc40ba4..c2d57a8 100644
--- a/system/database/DB_driver.php
+++ b/system/database/DB_driver.php
@@ -126,16 +126,43 @@
 		// Connect to the database and set the connection ID
 		$this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect();
 
-		// No connection resource?  Throw an error
+		// No connection resource?  Check if there is a failover else throw an error
 		if ( ! $this->conn_id)
 		{
-			log_message('error', 'Unable to connect to the database');
-
-			if ($this->db_debug)
+			// Check if there is a failover set
+			if ( ! empty($this->failover) && is_array($this->failover))
 			{
-				$this->display_error('db_unable_to_connect');
+				// Go over all the failovers
+				foreach ($this->failover as $failover)
+				{
+					// Replace the current settings with those of the failover
+					foreach ($failover as $key => $val)
+					{
+						$this->$key = $val;
+					}
+
+					// Try to connect
+					$this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect();
+
+					// If a connection is made break the foreach loop
+					if ($this->conn_id)
+					{
+						break;
+					}
+				}
 			}
-			return FALSE;
+
+			// We still don't have a connection?
+			if ( ! $this->conn_id)
+			{
+				log_message('error', 'Unable to connect to the database');
+
+				if ($this->db_debug)
+				{
+					$this->display_error('db_unable_to_connect');
+				}
+				return FALSE;
+			}
 		}
 
 		// ----------------------------------------------------------------