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;
+ }
}
// ----------------------------------------------------------------