]> git.donarmstrong.com Git - roundcube.git/blobdiff - program/include/rcube_mdb2.php
Merge commit 'upstream/0.7'
[roundcube.git] / program / include / rcube_mdb2.php
index e44826e956980134b54eabce2e9f8d24ee38f2f2..f25acef4df04f6f14e2fa1c6ea7e22239e74e538 100644 (file)
@@ -16,7 +16,7 @@
  | Author: Lukas Kahwe Smith <smith@pooteeweet.org>                      |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_mdb2.php 4810 2011-05-27 11:02:51Z alec $
+ $Id: rcube_mdb2.php 5543 2011-12-05 07:24:36Z alec $
 
 */
 
  */
 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;
@@ -91,6 +91,8 @@ class rcube_mdb2
             $db_options['disable_smart_seqname'] = true;
             $db_options['seqname_format'] = '%s';
         }
+        $this->db_error     = false;
+        $this->db_error_msg = null;
 
         $dbh = MDB2::connect($dsn, $db_options);
 
@@ -122,30 +124,40 @@ 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);
 
+        // use write-master when read-only fails
+        if (!$this->db_connected && $mode == 'r') {
+            $mode = 'w';
+            $this->db_handle    = $this->dsn_connect($this->db_dsnw);
+            $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 +268,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 +292,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 +301,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 +451,7 @@ class rcube_mdb2
         if (!PEAR::isError($result = $this->db_handle->listTableFields($table))) {
             return $result;
         }
-        
+
         return null;
     }
 
@@ -530,7 +534,7 @@ class rcube_mdb2
      */
     function now()
     {
-        switch($this->db_provider) {
+        switch ($this->db_provider) {
             case 'mssql':
             case 'sqlsrv':
                 return "getdate()";