Allow setting MySQL session variables via config
authorAaron Schulz <aschulz@wikimedia.org>
Fri, 24 Apr 2015 18:07:02 +0000 (11:07 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Fri, 24 Apr 2015 18:07:02 +0000 (11:07 -0700)
Change-Id: I39c7e0f5ffe53a3fb15da489f4dddc36af99a4b3

includes/db/Database.php
includes/db/DatabaseMysqlBase.php

index 8c1ebf9..605dc7c 100644 (file)
@@ -69,6 +69,8 @@ abstract class DatabaseBase implements IDatabase {
        protected $mLBInfo = array();
        protected $mDefaultBigSelects = null;
        protected $mSchemaVars = false;
+       /** @var array */
+       protected $mSessionVars = array();
 
        protected $preparedArgs;
 
@@ -813,6 +815,8 @@ abstract class DatabaseBase implements IDatabase {
                        }
                }
 
+               $this->mSessionVars = $params['variables'];
+
                /** Get the default table prefix*/
                if ( $tablePrefix == 'get from global' ) {
                        $this->mTablePrefix = $wgDBprefix;
@@ -926,6 +930,7 @@ abstract class DatabaseBase implements IDatabase {
                        $p['password'] = isset( $p['password'] ) ? $p['password'] : false;
                        $p['dbname'] = isset( $p['dbname'] ) ? $p['dbname'] : false;
                        $p['flags'] = isset( $p['flags'] ) ? $p['flags'] : 0;
+                       $p['variables'] = isset( $p['variables'] ) ? $p['variables'] : array();
                        $p['tablePrefix'] = isset( $p['tablePrefix'] ) ? $p['tablePrefix'] : 'get from global';
                        $p['schema'] = isset( $p['schema'] ) ? $p['schema'] : $defaultSchemas[$dbType];
                        $p['foreign'] = isset( $p['foreign'] ) ? $p['foreign'] : false;
index aac95a8..89d3456 100644 (file)
@@ -132,6 +132,15 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                if ( is_string( $wgSQLMode ) ) {
                        $set[] = 'sql_mode = ' . $this->addQuotes( $wgSQLMode );
                }
+               // Set any custom settings defined by site config
+               // (e.g. https://dev.mysql.com/doc/refman/4.1/en/innodb-parameters.html)
+               foreach ( $this->mSessionVars as $var => $val ) {
+                       // Escape strings but not numbers to avoid MySQL complaining
+                       if ( !is_int( $val ) && !is_float( $val ) ) {
+                               $val = $this->addQuotes( $val );
+                       }
+                       $set[] = $this->addIdentifierQuotes( $var ) . ' = ' . $val;
+               }
 
                if ( $set ) {
                        // Use doQuery() to avoid opening implicit transactions (DBO_TRX)