<?php
    /*
    Default values are "localhost", "root",
    database "test" and empty password.
    Change the MYSQL_TEST environment values
    if you want to use another configuration
    */

    $driver    = new mysqli_driver;
    $driver->report_mode = MYSQLI_REPORT_OFF;

    $host      = getenv("MYSQL_TEST_HOST")     ?: "127.0.0.1";
    $port      = getenv("MYSQL_TEST_PORT")     ?: 3306;
    $user      = getenv("MYSQL_TEST_USER")     ?: "root";
    $passwd    = getenv("MYSQL_TEST_PASSWD")   ?: "";
    $db        = getenv("MYSQL_TEST_DB")       ?: "test";
    $engine    = getenv("MYSQL_TEST_ENGINE")   ?: "InnoDB";
    $socket    = getenv("MYSQL_TEST_SOCKET")   ?: null;
    $skip_on_connect_failure  = getenv("MYSQL_TEST_SKIP_CONNECT_FAILURE") ?: true;
    $connect_flags = (int)getenv("MYSQL_TEST_CONNECT_FLAGS") ?: 0;
    if ($socket) {
        ini_set('mysqli.default_socket', $socket);
    }

    /* Development setting: test experimental features and/or feature requests that never worked before? */
    $TEST_EXPERIMENTAL = 1 == getenv("MYSQL_TEST_EXPERIMENTAL");

    if (!function_exists('sys_get_temp_dir')) {
        function sys_get_temp_dir() {

            if (!empty($_ENV['TMP']))
                return realpath( $_ENV['TMP'] );
            if (!empty($_ENV['TMPDIR']))
                return realpath( $_ENV['TMPDIR'] );
            if (!empty($_ENV['TEMP']))
                return realpath( $_ENV['TEMP'] );

            $temp_file = tempnam(md5(uniqid(rand(), TRUE)), '');
            if ($temp_file) {
                $temp_dir = realpath(dirname($temp_file));
                unlink($temp_file);
                return $temp_dir;
            }
            return FALSE;
        }
    }

    if (!function_exists('my_mysqli_connect')) {

        /**
        * Whenever possible, please use this wrapper to make testing of MYSQLI_CLIENT_COMPRESS (and potentially SSL) possible
        *
        * @param bool $enable_env_flags Enable setting of connection flags through 	env(MYSQL_TEST_CONNECT_FLAGS)?
        */
        function my_mysqli_connect($host, $user, $passwd, $db, $port, $socket, $enable_env_flags = true) {
            global $connect_flags;

            $flags = $enable_env_flags? $connect_flags:0;
            if ($flags !== 0) {
                $link = mysqli_init();
                if (!mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags))
                    $link = false;
            } else {
                $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket);
            }

            return $link;
        }

        /**
        * Whenever possible, please use this wrapper to make testing of MYSQLI_CLIENT_COMPRESS (and potentially SSL) possible
        *
        * @param bool $enable_env_flags Enable setting of connection flags through env(MYSQL_TEST_CONNECT_FLAGS)
        */
        function my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags = 0, $enable_env_flags = true) {
            global $connect_flags;

            if ($enable_env_flags)
                $flags = $flags | $connect_flags;

            return mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags);
        }

        class my_mysqli extends mysqli {
            public function __construct($host, $user, $passwd, $db, $port, $socket, $enable_env_flags = true) {
                global $connect_flags;

                $flags = ($enable_env_flags) ? $connect_flags : 0;

                if ($flags !== 0) {
                    parent::__construct();
                    $this->real_connect($host, $user, $passwd, $db, $port, $socket, $flags);
                } else {
                    parent::__construct($host, $user, $passwd, $db, $port, $socket);
                }
            }
        }

        function have_innodb($link) {
            if (($res = $link->query("SHOW VARIABLES LIKE 'have_innodb'"))
                && ($row = $res->fetch_row())
                && !empty($row)
            ) {
                return !($row[1] == 'DISABLED' || $row[1] == 'NO');
            }
            // MySQL 5.6.1+
            if ($res = $link->query('SHOW ENGINES')) {
                while ($row = $res->fetch_assoc()) {
                    if (!isset($row['Engine']) || !isset($row['Support'])) {
                        return false;
                    }

                    if (($row['Engine'] == 'InnoDB')
                        && (($row['Support'] == 'YES') || ($row['Support'] == 'DEFAULT'))
                    ) {
                        return true;
                    }
                }
            }
            return false;
        }

    } else {
        printf("skip Eeeek/BUG/FIXME - connect.inc included twice! skipif bug?\n");
    }

    function handle_catchable_fatal($errno, $error, $file, $line) {
        static $errcodes = array();
        if (empty($errcodes)) {
            $constants = get_defined_constants();
            foreach ($constants as $name => $value) {
                if (substr($name, 0, 2) == "E_")
                    $errcodes[$value] = $name;
            }
        }
        printf("[%s] %s in %s on line %s\n",
            (isset($errcodes[$errno])) ? $errcodes[$errno] : $errno,
             $error, $file, $line);

        return true;
    }
?>
