From 8f485469c7955fbf5b420ee0b6f043282965715b Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Tue, 24 Feb 2015 06:23:11 -0500
Subject: [PATCH] Add possibility to configure max_allowed_packet value for all database engines (#1490283)

---
 CHANGELOG                                |    1 +
 program/lib/Roundcube/rcube_db_mysql.php |    6 ++++++
 program/lib/Roundcube/rcube_db_pgsql.php |    4 +++-
 program/lib/Roundcube/rcube_db.php       |    2 +-
 config/defaults.inc.php                  |    6 ++++++
 5 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index ee4a81e..0640231 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,6 +3,7 @@
 
 - Plugin API: Add special onload() method to execute plugin actions before startup (session and GUI initialization)
 - Add possibility to print contact information (of a single contact)
+- Add possibility to configure max_allowed_packet value for all database engines (#1490283)
 - Fix refreshing of drafts list when sending a message which was saved in meantime (#1490238)
 - Fix saving/sending emoticon images when assets_dir is set
 - Fix PHP fatal error when visiting Vacation interface and there's no sieve script yet
diff --git a/config/defaults.inc.php b/config/defaults.inc.php
index 06ea9ec..edc5b32 100644
--- a/config/defaults.inc.php
+++ b/config/defaults.inc.php
@@ -51,6 +51,12 @@
 //    'cache_messages' => 'r',
 );
 
+// It is possible to specify database variable values e.g. some limits here.
+// Use them if your server is not MySQL or for better performance.
+// For example Roundcube uses max_allowed_packet value (in bytes)
+// which limits query size for database cache operations.
+$config['db_max_allowed_packet'] = 23423440;
+
 
 // ----------------------------------
 // LOGGING/DEBUGGING
diff --git a/program/lib/Roundcube/rcube_db.php b/program/lib/Roundcube/rcube_db.php
index ab7058f..2cacb30 100644
--- a/program/lib/Roundcube/rcube_db.php
+++ b/program/lib/Roundcube/rcube_db.php
@@ -357,7 +357,7 @@
     public function get_variable($varname, $default = null)
     {
         // to be implemented by driver class
-        return $default;
+        return rcube::get_instance()->config->get('db_' . $varname, $default);
     }
 
     /**
diff --git a/program/lib/Roundcube/rcube_db_mysql.php b/program/lib/Roundcube/rcube_db_mysql.php
index 067e94b..dd28c25 100644
--- a/program/lib/Roundcube/rcube_db_mysql.php
+++ b/program/lib/Roundcube/rcube_db_mysql.php
@@ -167,6 +167,12 @@
             return $this->variables[$varname];
         }
 
+        // configured value has higher prio
+        $conf_value = rcube::get_instance()->config->get('db_' . $varname);
+        if ($conf_value !== null) {
+            return $this->variables[$varname] = $conf_value;
+        }
+
         $result = $this->query('SHOW VARIABLES LIKE ?', $varname);
 
         while ($row = $this->fetch_array($result)) {
diff --git a/program/lib/Roundcube/rcube_db_pgsql.php b/program/lib/Roundcube/rcube_db_pgsql.php
index d33cdd8..ff41df2 100644
--- a/program/lib/Roundcube/rcube_db_pgsql.php
+++ b/program/lib/Roundcube/rcube_db_pgsql.php
@@ -139,9 +139,11 @@
         // There's a known case when max_allowed_packet is queried
         // PostgreSQL doesn't have such limit, return immediately
         if ($varname == 'max_allowed_packet') {
-            return $default;
+            return rcube::get_instance()->config->get('db_' . $varname, $default);
         }
 
+        $this->variables[$varname] = rcube::get_instance()->config->get('db_' . $varname);
+
         if (!isset($this->variables)) {
             $this->variables = array();
 

--
Gitblit v1.9.1