Catch write-errors on database (yet untested)

release-0.6
thomascube 14 years ago
parent ccc059fd70
commit 10ea10a317

@ -44,6 +44,7 @@ class rcube_mdb2
var $db_error_msg = ''; var $db_error_msg = '';
private $debug_mode = false; private $debug_mode = false;
private $write_failure = false;
private $a_query_results = array('dummy'); private $a_query_results = array('dummy');
private $last_res_id = 0; private $last_res_id = 0;
private $tables; private $tables;
@ -124,7 +125,7 @@ class rcube_mdb2
// Already connected // Already connected
if ($this->db_connected) { if ($this->db_connected) {
// connected to read-write db, current connection is ok // connected to read-write db, current connection is ok
if ($this->db_mode == 'w') if ($this->db_mode == 'w' && !$this->write_failure)
return; return;
// no replication, current connection is ok for read and write // no replication, current connection is ok for read and write
@ -188,6 +189,16 @@ class rcube_mdb2
} }
/**
* Is database replication configured?
* This returns true if dsnw != dsnr
*/
function is_replicated()
{
return !empty($this->db_dsnr) && $this->db_dsnw != $this->db_dsnr;
}
/** /**
* Execute a SQL query * Execute a SQL query
* *
@ -245,6 +256,10 @@ class rcube_mdb2
// Read or write ? // Read or write ?
$mode = (strtolower(substr(trim($query),0,6)) == 'select') ? 'r' : 'w'; $mode = (strtolower(substr(trim($query),0,6)) == 'select') ? 'r' : 'w';
// don't event attempt to connect if previous write-operation failed
if ($this->write_failure && $mode == 'w')
return false;
$this->db_connect($mode); $this->db_connect($mode);
// check connection before proceeding // check connection before proceeding
@ -278,6 +293,10 @@ class rcube_mdb2
} }
} }
// remember that write-operation failed
if ($mode == 'w' && ($result === false || PEAR::isError($result)))
$this->write_failure = true;
// add result, even if it's an error // add result, even if it's an error
return $this->_add_result($result); return $this->_add_result($result);
} }

Loading…
Cancel
Save