From 92d18cf32edab81ac77f547cfa718cf28a573c92 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Fri, 4 Oct 2013 13:50:12 +0200 Subject: New option to disable the use of already established dsnw connections for subsequent reads --- config/defaults.inc.php | 3 +++ program/lib/Roundcube/rcube_db.php | 15 ++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/config/defaults.inc.php b/config/defaults.inc.php index 874621d1d..66db040d3 100644 --- a/config/defaults.inc.php +++ b/config/defaults.inc.php @@ -30,6 +30,9 @@ $config['db_dsnw'] = 'mysql://roundcube:@localhost/roundcubemail'; // useful for database replication $config['db_dsnr'] = ''; +// Disable the use of already established dsnw connections for subsequent reads +$config['db_dsnw_noread'] = false; + // use persistent db-connections // beware this will not "always" work as expected // see: http://www.php.net/manual/en/features.persistent-connections.php diff --git a/program/lib/Roundcube/rcube_db.php b/program/lib/Roundcube/rcube_db.php index e66226ff5..2861a9197 100644 --- a/program/lib/Roundcube/rcube_db.php +++ b/program/lib/Roundcube/rcube_db.php @@ -32,6 +32,7 @@ class rcube_db protected $db_connected = false; // Already connected ? protected $db_mode; // Connection mode protected $dbh; // Connection handle + protected $dbhs = array(); protected $db_error = false; protected $db_error_msg = ''; @@ -97,6 +98,7 @@ class rcube_db $this->db_dsnw = $db_dsnw; $this->db_dsnr = $db_dsnr; $this->db_pconn = $pconn; + $this->db_dsnw_noread = rcube::get_instance()->config->get('db_dsnw_noread', false); $this->db_dsnw_array = self::parse_dsn($db_dsnw); $this->db_dsnr_array = self::parse_dsn($db_dsnr); @@ -113,6 +115,13 @@ class rcube_db $this->db_error = false; $this->db_error_msg = null; + // return existing handle + if ($this->dbhs[$mode]) { + $this->dbh = $this->dbhs[$mode]; + $this->db_mode = $mode; + return $this->dbh; + } + // Get database specific connection options $dsn_string = $this->dsn_string($dsn); $dsn_options = $this->dsn_options($dsn); @@ -147,6 +156,7 @@ class rcube_db } $this->dbh = $dbh; + $this->dbhs[$mode] = $dbh; $this->db_mode = $mode; $this->db_connected = true; $this->conn_configure($dsn, $dbh); @@ -190,14 +200,13 @@ class rcube_db // Already connected if ($this->db_connected) { - // connected to db with the same or "higher" mode - if ($this->db_mode == 'w' || $this->db_mode == $mode) { + // connected to db with the same or "higher" mode (if allowed) + if ($this->db_mode == $mode || $this->db_mode == 'w' && !$this->db_dsnw_noread) { return; } } $dsn = ($mode == 'r') ? $this->db_dsnr_array : $this->db_dsnw_array; - $this->dsn_connect($dsn, $mode); // use write-master when read-only fails -- cgit v1.2.3