diff options
author | alecpl <alec@alec.pl> | 2011-11-07 11:03:45 +0000 |
---|---|---|
committer | alecpl <alec@alec.pl> | 2011-11-07 11:03:45 +0000 |
commit | aa546e17887931ccaf6390c2d6a31e028db70aaf (patch) | |
tree | c4e7435a3dd01d246db4e4a47090ea0f5ba402e4 /program/include/rcube_mdb2.php | |
parent | f2292c3a9513fd56c1d6ba0691612b935fafa4a3 (diff) |
- Fix handling of DB connection failures. Detect failure on connection level instead of on query level.
Fixes issue when one write query failed, next queries were not executed.
- Changed 'var' to 'public'.
Diffstat (limited to 'program/include/rcube_mdb2.php')
-rw-r--r-- | program/include/rcube_mdb2.php | 61 |
1 files changed, 28 insertions, 33 deletions
diff --git a/program/include/rcube_mdb2.php b/program/include/rcube_mdb2.php index b3976c37d..3b7a6129b 100644 --- a/program/include/rcube_mdb2.php +++ b/program/include/rcube_mdb2.php @@ -35,16 +35,16 @@ */ class rcube_mdb2 { - var $db_dsnw; // DSN for write operations - var $db_dsnr; // DSN for read operations - var $db_connected = false; // Already connected ? - var $db_mode = ''; // Connection mode - var $db_handle = 0; // Connection handle - var $db_error = false; - var $db_error_msg = ''; + public $db_dsnw; // DSN for write operations + public $db_dsnr; // DSN for read operations + public $db_connected = false; // Already connected ? + public $db_mode = ''; // Connection mode + public $db_handle = 0; // Connection handle + public $db_error = false; + public $db_error_msg = ''; private $debug_mode = false; - private $write_failure = false; + private $conn_failure = false; private $a_query_results = array('dummy'); private $last_res_id = 0; private $tables; @@ -58,7 +58,7 @@ class rcube_mdb2 */ function __construct($db_dsnw, $db_dsnr='', $pconn=false) { - if ($db_dsnr == '') + if (empty($db_dsnr)) $db_dsnr = $db_dsnw; $this->db_dsnw = $db_dsnw; @@ -122,30 +122,33 @@ class rcube_mdb2 */ function db_connect($mode) { + // previous connection failed, don't attempt to connect again + if ($this->conn_failure) { + return; + } + + // no replication + if ($this->db_dsnw == $this->db_dsnr) { + $mode = 'w'; + } + // Already connected if ($this->db_connected) { - // connected to read-write db, current connection is ok - if ($this->db_mode == 'w' && !$this->write_failure) - return; - - // no replication, current connection is ok for read and write - if (empty($this->db_dsnr) || $this->db_dsnw == $this->db_dsnr) { - $this->db_mode = 'w'; + // connected to db with the same or "higher" mode + if ($this->db_mode == 'w' || $this->db_mode == $mode) { return; } - - // Same mode, current connection is ok - if ($this->db_mode == $mode) - return; } $dsn = ($mode == 'r') ? $this->db_dsnr : $this->db_dsnw; - $this->db_handle = $this->dsn_connect($dsn); + $this->db_handle = $this->dsn_connect($dsn); $this->db_connected = !PEAR::isError($this->db_handle); if ($this->db_connected) - $this->db_mode = $mode; + $this->db_mode = $mode; + else + $this->conn_failure = true; } @@ -256,10 +259,6 @@ class rcube_mdb2 // Read or write ? $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); // check connection before proceeding @@ -284,7 +283,7 @@ class rcube_mdb2 raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, 'message' => $this->db_error_msg), true, false); - + $result = false; } else { @@ -293,10 +292,6 @@ 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 return $this->_add_result($result); } @@ -447,7 +442,7 @@ class rcube_mdb2 if (!PEAR::isError($result = $this->db_handle->listTableFields($table))) { return $result; } - + return null; } @@ -530,7 +525,7 @@ class rcube_mdb2 */ function now() { - switch($this->db_provider) { + switch ($this->db_provider) { case 'mssql': case 'sqlsrv': return "getdate()"; |