/**
 * Function called just after a connection to the MySQL database server has
 * been established. It sets the connection collation, and determins the
 * version of MySQL which is running.
 *
 * @param mixed   $link           mysql link resource|object
 * @param boolean $is_controluser whether link is for control user
 *
 * @return void
 */
function PMA_DBI_postConnect($link, $is_controluser = false)
{
    if ($is_controluser) {
        return;
    }
    if (!defined('PMA_MYSQL_INT_VERSION')) {
        if (PMA_Util::cacheExists('PMA_MYSQL_INT_VERSION', true)) {
            define('PMA_MYSQL_INT_VERSION', PMA_Util::cacheGet('PMA_MYSQL_INT_VERSION', true));
            define('PMA_MYSQL_MAJOR_VERSION', PMA_Util::cacheGet('PMA_MYSQL_MAJOR_VERSION', true));
            define('PMA_MYSQL_STR_VERSION', PMA_Util::cacheGet('PMA_MYSQL_STR_VERSION', true));
            define('PMA_MYSQL_VERSION_COMMENT', PMA_Util::cacheGet('PMA_MYSQL_VERSION_COMMENT', true));
            define('PMA_DRIZZLE', PMA_Util::cacheGet('PMA_DRIZZLE', true));
        } else {
            $version = PMA_DBI_fetch_single_row('SELECT @@version, @@version_comment', 'ASSOC', $link);
            if ($version) {
                $match = explode('.', $version['@@version']);
                define('PMA_MYSQL_MAJOR_VERSION', (int) $match[0]);
                define('PMA_MYSQL_INT_VERSION', (int) sprintf('%d%02d%02d', $match[0], $match[1], intval($match[2])));
                define('PMA_MYSQL_STR_VERSION', $version['@@version']);
                define('PMA_MYSQL_VERSION_COMMENT', $version['@@version_comment']);
            } else {
                define('PMA_MYSQL_INT_VERSION', 50015);
                define('PMA_MYSQL_MAJOR_VERSION', 5);
                define('PMA_MYSQL_STR_VERSION', '5.00.15');
                define('PMA_MYSQL_VERSION_COMMENT', '');
            }
            PMA_Util::cacheSet('PMA_MYSQL_INT_VERSION', PMA_MYSQL_INT_VERSION, true);
            PMA_Util::cacheSet('PMA_MYSQL_MAJOR_VERSION', PMA_MYSQL_MAJOR_VERSION, true);
            PMA_Util::cacheSet('PMA_MYSQL_STR_VERSION', PMA_MYSQL_STR_VERSION, true);
            PMA_Util::cacheSet('PMA_MYSQL_VERSION_COMMENT', PMA_MYSQL_VERSION_COMMENT, true);
            // Detect Drizzle - it does not support character sets
            $charset_result = PMA_DBI_get_variable('character_set_results', PMA_DBI_GETVAR_GLOBAL, $link);
            if ($charset_result) {
                define('PMA_DRIZZLE', false);
            } else {
                define('PMA_DRIZZLE', true);
            }
            PMA_Util::cacheSet('PMA_DRIZZLE', PMA_DRIZZLE, true);
        }
    }
    // Skip charsets for Drizzle
    if (!PMA_DRIZZLE) {
        if (!empty($GLOBALS['collation_connection'])) {
            PMA_DBI_query("SET CHARACTER SET 'utf8';", $link, PMA_DBI_QUERY_STORE);
            $set_collation_con_query = "SET collation_connection = '" . PMA_Util::sqlAddSlashes($GLOBALS['collation_connection']) . "';";
            PMA_DBI_query($set_collation_con_query, $link, PMA_DBI_QUERY_STORE);
        } else {
            PMA_DBI_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci';", $link, PMA_DBI_QUERY_STORE);
        }
    }
    // Cache plugin list for Drizzle
    if (PMA_DRIZZLE && !PMA_Util::cacheExists('drizzle_engines', true)) {
        $sql = "SELECT p.plugin_name, m.module_library\n            FROM data_dictionary.plugins p\n                JOIN data_dictionary.modules m USING (module_name)\n            WHERE p.plugin_type = 'StorageEngine'\n                AND p.plugin_name NOT IN ('FunctionEngine', 'schema')\n                AND p.is_active = 'YES'";
        $engines = PMA_DBI_fetch_result($sql, 'plugin_name', null, $link);
        PMA_Util::cacheSet('drizzle_engines', $engines, true);
    }
}
/**
 * @uses    ./libraries/charset_conversion.lib.php
 * @uses    PMA_DBI_QUERY_STORE
 * @uses    PMA_REMOVED_NON_UTF_8
 * @uses    PMA_MYSQL_INT_VERSION
 * @uses    PMA_MYSQL_STR_VERSION
 * @uses    PMA_DBI_GETVAR_SESSION
 * @uses    PMA_DBI_fetch_value()
 * @uses    PMA_DBI_query()
 * @uses    PMA_DBI_get_variable()
 * @uses    $GLOBALS['collation_connection']
 * @uses    $GLOBALS['charset_connection']
 * @uses    $GLOBALS['available_languages']
 * @uses    $GLOBALS['mysql_charset_map']
 * @uses    $GLOBALS['charset']
 * @uses    $GLOBALS['lang']
 * @uses    $GLOBALS['cfg']['Lang']
 * @uses    $GLOBALS['cfg']['ColumnTypes']
 * @uses    defined()
 * @uses    explode()
 * @uses    sprintf()
 * @uses    intval()
 * @uses    define()
 * @uses    defined()
 * @uses    substr()
 * @uses    count()
 * @param   mixed   $link   mysql link resource|object
 * @param   boolean $is_controluser
 */
function PMA_DBI_postConnect($link, $is_controluser = false)
{
    if (!defined('PMA_MYSQL_INT_VERSION')) {
        $mysql_version = PMA_DBI_fetch_value('SELECT VERSION()', 0, 0, $link, PMA_DBI_QUERY_STORE);
        if ($mysql_version) {
            $match = explode('.', $mysql_version);
            define('PMA_MYSQL_INT_VERSION', (int) sprintf('%d%02d%02d', $match[0], $match[1], intval($match[2])));
            define('PMA_MYSQL_STR_VERSION', $mysql_version);
            unset($mysql_version, $match);
        } else {
            define('PMA_MYSQL_INT_VERSION', 32332);
            define('PMA_MYSQL_STR_VERSION', '3.23.32');
        }
    }
    if (!defined('PMA_ENGINE_KEYWORD')) {
        if (PMA_MYSQL_INT_VERSION >= 40102) {
            define('PMA_ENGINE_KEYWORD', 'ENGINE');
        } else {
            define('PMA_ENGINE_KEYWORD', 'TYPE');
        }
    }
    if (PMA_MYSQL_INT_VERSION >= 40100) {
        // If $lang is defined and we are on MySQL >= 4.1.x,
        // we auto-switch the lang to its UTF-8 version (if it exists and user
        // didn't force language)
        if (!empty($GLOBALS['lang']) && substr($GLOBALS['lang'], -5) != 'utf-8' && !isset($GLOBALS['cfg']['Lang'])) {
            $lang_utf_8_version = substr($GLOBALS['lang'], 0, strpos($GLOBALS['lang'], '-')) . '-utf-8';
            if (!empty($GLOBALS['available_languages'][$lang_utf_8_version])) {
                $GLOBALS['lang'] = $lang_utf_8_version;
                $GLOBALS['charset'] = 'utf-8';
                define('PMA_LANG_RELOAD', 1);
            }
        }
        // and we remove the non-UTF-8 choices to avoid confusion
        // (unless there is a forced language)
        if (!defined('PMA_REMOVED_NON_UTF_8') && !isset($GLOBALS['cfg']['Lang'])) {
            foreach ($GLOBALS['available_languages'] as $each_lang => $dummy) {
                if (substr($each_lang, -5) != 'utf-8') {
                    unset($GLOBALS['available_languages'][$each_lang]);
                }
            }
            define('PMA_REMOVED_NON_UTF_8', 1);
        }
        $mysql_charset = $GLOBALS['mysql_charset_map'][$GLOBALS['charset']];
        if ($is_controluser || empty($GLOBALS['collation_connection']) || (strpos($GLOBALS['collation_connection'], '_') ? substr($GLOBALS['collation_connection'], 0, strpos($GLOBALS['collation_connection'], '_')) : $GLOBALS['collation_connection']) == $mysql_charset) {
            PMA_DBI_query('SET NAMES ' . $mysql_charset . ';', $link, PMA_DBI_QUERY_STORE);
        } else {
            PMA_DBI_query('SET CHARACTER SET ' . $mysql_charset . ';', $link, PMA_DBI_QUERY_STORE);
        }
        if (!empty($GLOBALS['collation_connection'])) {
            PMA_DBI_query('SET collation_connection = \'' . $GLOBALS['collation_connection'] . '\';', $link, PMA_DBI_QUERY_STORE);
        }
        if (!$is_controluser) {
            $GLOBALS['collation_connection'] = PMA_DBI_get_variable('collation_connection', PMA_DBI_GETVAR_SESSION, $link);
            $GLOBALS['charset_connection'] = PMA_DBI_get_variable('character_set_connection', PMA_DBI_GETVAR_SESSION, $link);
        }
        // Add some field types to the list, this needs to be done once per session!
        if (!in_array('BINARY', $GLOBALS['cfg']['ColumnTypes'])) {
            $GLOBALS['cfg']['ColumnTypes'][] = 'BINARY';
        }
        if (!in_array('VARBINARY', $GLOBALS['cfg']['ColumnTypes'])) {
            $GLOBALS['cfg']['ColumnTypes'][] = 'VARBINARY';
        }
    } else {
        require_once './libraries/charset_conversion.lib.php';
    }
}
function PMA_DBI_postConnect($link)
{
    global $collation_connection, $charset_connection;
    if (!defined('PMA_MYSQL_INT_VERSION')) {
        $result = PMA_DBI_query('SELECT VERSION() AS version', $link, PMA_DBI_QUERY_STORE);
        if ($result != FALSE && @PMA_DBI_num_rows($result) > 0) {
            $row = PMA_DBI_fetch_row($result);
            $match = explode('.', $row[0]);
            PMA_DBI_free_result($result);
        }
        if (!isset($row)) {
            define('PMA_MYSQL_INT_VERSION', 32332);
            define('PMA_MYSQL_STR_VERSION', '3.23.32');
        } else {
            define('PMA_MYSQL_INT_VERSION', (int) sprintf('%d%02d%02d', $match[0], $match[1], intval($match[2])));
            define('PMA_MYSQL_STR_VERSION', $row[0]);
            unset($result, $row, $match);
        }
    }
    if (PMA_MYSQL_INT_VERSION >= 40100) {
        // If $lang is defined and we are on MySQL >= 4.1.x,
        // we auto-switch the lang to its UTF-8 version (if it exists)
        if (!empty($GLOBALS['lang']) && substr($GLOBALS['lang'], -5) != 'utf-8') {
            $lang_utf_8_version = substr($GLOBALS['lang'], 0, strpos($GLOBALS['lang'], '-')) . '-utf-8';
            if (!empty($GLOBALS['available_languages'][$lang_utf_8_version])) {
                $GLOBALS['lang'] = $lang_utf_8_version;
                $GLOBALS['charset'] = $charset = 'utf-8';
            }
        }
        // and we remove the non-UTF-8 choices to avoid confusion
        if (!defined('PMA_REMOVED_NON_UTF_8')) {
            $tmp_available_languages = $GLOBALS['available_languages'];
            $GLOBALS['available_languages'] = array();
            foreach ($tmp_available_languages as $tmp_lang => $tmp_lang_data) {
                if (substr($tmp_lang, -5) == 'utf-8') {
                    $GLOBALS['available_languages'][$tmp_lang] = $tmp_lang_data;
                }
            }
            // end foreach
            unset($tmp_lang, $tmp_lang_data, $tmp_available_languages);
            define('PMA_REMOVED_NON_UTF_8', 1);
        }
        $mysql_charset = $GLOBALS['mysql_charset_map'][$GLOBALS['charset']];
        if (empty($collation_connection) || (strpos($collation_connection, '_') ? substr($collation_connection, 0, strpos($collation_connection, '_')) : $collation_connection) == $mysql_charset) {
            PMA_DBI_query('SET NAMES ' . $mysql_charset . ';', $link, PMA_DBI_QUERY_STORE);
        } else {
            PMA_DBI_query('SET CHARACTER SET ' . $mysql_charset . ';', $link, PMA_DBI_QUERY_STORE);
        }
        if (!empty($collation_connection)) {
            PMA_DBI_query('SET collation_connection = \'' . $collation_connection . '\';', $link, PMA_DBI_QUERY_STORE);
        }
        $collation_connection = PMA_DBI_get_variable('collation_connection', PMA_DBI_GETVAR_SESSION, $link);
        $charset_connection = PMA_DBI_get_variable('character_set_connection', PMA_DBI_GETVAR_SESSION, $link);
        // Add some field types to the list
        // (we pass twice here; feel free to code something better :)
        if (!defined('PMA_ADDED_FIELD_TYPES')) {
            $GLOBALS['cfg']['ColumnTypes'][] = 'BINARY';
            $GLOBALS['cfg']['ColumnTypes'][] = 'VARBINARY';
            define('PMA_ADDED_FIELD_TYPES', 1);
        }
    } else {
        require_once './libraries/charset_conversion.lib.php';
    }
}