<?php
/**
 * Make mysql_connect work like mysqli_connect for future php versions.
 *
 * @author Ivor Barhansky
 * @version 0.1
 */

// Make sure the MySQL extension is not loaded and there is no other drop in replacement active
if (!extension_loaded('mysql') && !function_exists('mysql_connect')) {
    // Validate if the MySQLi extension is present
    if (!extension_loaded('mysqli')) {
        trigger_error('The extension "MySQLi" is not available', E_USER_ERROR);
    }

    // The function name "getLinkIdentifier" will be used to return a valid link_indentifier, make it is available
    if (function_exists('getLinkIdentifier')) {
        trigger_error('The function name "getLinkIdentifier" is already defined, please change the function name', E_USER_ERROR);
    }

    // Define MySQL constants
    define('MYSQL_CLIENT_COMPRESS', MYSQLI_CLIENT_COMPRESS);
    define('MYSQL_CLIENT_IGNORE_SPACE', MYSQLI_CLIENT_IGNORE_SPACE);
    define('MYSQL_CLIENT_INTERACTIVE', MYSQLI_CLIENT_INTERACTIVE);
    define('MYSQL_CLIENT_SSL', MYSQLI_CLIENT_SSL);

    define('MYSQL_ASSOC', MYSQLI_ASSOC);
    define('MYSQL_NUM', MYSQLI_NUM);
    define('MYSQL_BOTH', MYSQLI_BOTH);

    // Will contain the link identifier
    $link = null;

    /**
     * Get the link identifier
     *
     * @param mysqli $mysqli
     * @return mysqli|null
     */
    function getLinkIdentifier(mysqli $mysqli = null)
    {
        if (!$mysqli) {
            global $link;
            $mysqli = $link;
        }

        return $mysqli;
    }

    /**
     * Open a connection to a MySQL Server
     *
     * @param $server
     * @param $username
     * @param $password
     * @return mysqli|null
     * @deprecated
     */
    function mysql_connect($server, $username, $password, $new_link = false, $client_flags = 0)
    {
        global $link;

        $link = mysqli_connect($server, $username, $password);
        return $link;
    }

    /**
     * Open a persistent connection to a MySQL server
     *
     * @param $server
     * @param $username
     * @param $password
     * @return mysqli|null
     * @deprecated
     */
    function mysql_pconnect($server, $username, $password, $new_link = false, $client_flags = 0)
    {
        global $link;

        $link = mysqli_connect('p:' . $server, $username, $password);
        return $link;
    }

    /**
     * @param $databaseName
     * @return bool
     * @deprecated
     */
    function mysql_select_db($databaseName)
    {
        global $link;

        return mysqli_select_db($link, $databaseName);
    }

    /**
     * @param $query
     * @param mysqli $mysqli
     * @return bool|mysqli_result
     * @deprecated
     */
    function mysql_query($query, mysqli $mysqli = null)
    {
        return getLinkIdentifier($mysqli)->query($query);
    }

    /**
     * @param $string
     * @param mysqli $mysqli
     * @return string
     * @deprecated
     */
    function mysql_real_escape_string($string, mysqli $mysqli = null)
    {
        return getLinkIdentifier($mysqli)->escape_string($string);
    }

    /**
     * @param mysqli_result $result
     * @return bool|array
     * @deprecated
     */
    function mysql_fetch_assoc(mysqli_result $result)
    {
        $result = $result->fetch_assoc();
        if ($result === null) {
            $result = false;
        }

        return $result;
    }

    /**
     * @param mysqli_result $result
     * @return object|stdClass
     */
    function mysql_fetch_object(mysqli_result $result)
    {
        $result = $result->fetch_object();
        if ($result === null) {
            $result = false;
        }

        return $result;
    }

    /**
     * @param mysqli_result $result
     * @return bool|int
     * @deprecated
     */
    function mysql_num_rows(mysqli_result $result)
    {
        $result = $result->num_rows;
        if ($result === null) {
            $result = false;
        }

        return $result;
    }

    /**
     * @param mysqli_result $result
     * @return bool|array
     */
    function mysql_fetch_row(mysqli_result $result)
    {
        $result = $result->fetch_row();
        if ($result === null) {
            $result = false;
        }

        return $result;
    }

    /**
     * @param mysqli $mysqli
     * @return int
     * @deprecated
     */
    function mysql_affected_rows(mysqli $mysqli = null)
    {
        return mysqli_affected_rows(getLinkIdentifier($mysqli));
    }

    /**
     * @return void
     */
    function mysql_client_encoding(mysqli $mysqli = null)
    {
        return mysqli_character_set_name(getLinkIdentifier($mysqli));
    }

    /**
     * @param mysqli $mysqli
     * @return bool
     * @deprecated
     */
    function mysql_close(mysqli $mysqli = null)
    {
        return mysqli_close(getLinkIdentifier($mysqli));
    }

    /**
     * @return bool
     */
    function mysql_create_db($database_name, mysqli $mysqli = null)
    {
        trigger_error('This function was deprecated in PHP 4.3.0 and is therefor not supported', E_USER_DEPRECATED);
        return false;
    }

    /**
     * @param mysqli $mysqli
     * @return int
     * @deprecated
     */
    function mysql_errno(mysqli $mysqli = null)
    {
        return mysqli_errno(getLinkIdentifier($mysqli));
    }

    /**
     * Not implemented
     *
     * @return null
     * @todo implement
     *
     */
    function mysql_db_name()
    {
        trigger_error('The function mysql_db_name() is not implemented', E_USER_WARNING);
        return false;
    }

    /**
     * @param mysqli $mysqli
     * @return string
     * @deprecated
     */
    function mysql_error(mysqli $mysqli = null)
    {
        return mysqli_error(getLinkIdentifier($mysqli));
    }

    /**
     * @param mysqli_result $result
     * @param $result_type
     * @return void
     * @deprecated
     */
    function mysql_fetch_array(mysqli_result $result, $result_type = MYSQL_BOTH)
    {
        return mysqli_fetch_array($result, $result_type);
    }

    /**
     * @param mysqli $mysqli
     * @return bool
     */
    function mysql_ping(mysqli $mysqli = null)
    {
        return mysqli_ping(getLinkIdentifier($mysqli));
    }

    /**
     * @param $query
     * @param mysqli $mysqli
     * @deprecated
     */
    function mysql_unbuffered_query($query, mysqli $mysqli = null)
    {
        return mysqli_query(getLinkIdentifier($mysqli), $query, MYSQLI_USE_RESULT);
    }

    /**
     * @return string
     * @deprecated
     */
    function mysql_get_client_info()
    {
        return mysqli_get_client_info();
    }

    /**
     * @param mysqli_result $result
     * @return void
     * @deprecated
     */
    function mysql_free_result(mysqli_result $result)
    {
        return mysqli_free_result($result);
    }

    /**
     * @param mysqli $mysqli
     * @return bool|mysqli_result
     */
    function mysql_list_dbs(mysqli $mysqli = null)
    {
        trigger_error('This function is deprecated. It is preferable to use mysql_query() to issue an SQL Query: SHOW DATABASES statement instead.', E_USER_DEPRECATED);

        return mysqli_query(getLinkIdentifier($mysqli), 'SHOW DATABASES');
    }

    /**
     * @param $database_name
     * @param $table_name
     * @param null $mysqli
     * @return bool|mysqli_result
     */
    function mysql_list_fields($database_name, $table_name, mysqli $mysqli = null)
    {
        trigger_error('This function is deprecated. It is preferable to use mysql_query() to issue an SQL SHOW COLUMNS FROM table [LIKE \'name\'] statement instead.', E_USER_DEPRECATED);

        $mysqli = getLinkIdentifier($mysqli);
        $db = mysqli_escape_string($mysqli, $database_name);
        $table = mysqli_escape_string($mysqli, $table_name);

        return mysqli_query($mysqli, sprintf('SHOW COLUMNS FROM %s.%s', $db, $table));
    }

    /**
     * @param mysqli $mysqli
     * @return bool|mysqli_result
     */
    function mysql_list_processes(mysqli $mysqli = null)
    {
        return mysqli_query(getLinkIdentifier($mysqli), 'SHOW PROCESSLIST');
    }

    /**
     * @param $charset
     * @param null $mysqli
     * @return bool
     */
    function mysql_set_charset($charset, mysqli $mysqli = null)
    {
        return mysqli_set_charset(getLinkIdentifier($mysqli), $charset);
    }

    /**
     * @param null $mysqli
     * @return bool|string
     */
    function mysql_info(mysqli $mysqli = null)
    {
        $result = mysqli_info(getLinkIdentifier($mysqli));
        if ($result === null) {
            $result = false;
        }

        return $result;
    }

    /**
     * Get current system status
     *
     * @param null $mysqli
     * @return bool|string
     */
    function mysql_stat(mysqli $mysqli = null)
    {
        return mysqli_stat(getLinkIdentifier($mysqli));
    }

    /**
     * Return the current thread ID
     *
     * @param null $mysqli
     * @return bool|string
     */
    function mysql_thread_id(mysqli $mysqli = null)
    {
        return mysqli_thread_id(getLinkIdentifier($mysqli));
    }

    /**
     * Get MySQL host info
     *
     * @param null $mysqli
     * @return bool|string
     */
    function mysql_get_host_info(mysqli $mysqli = null)
    {
        return mysqli_get_host_info(getLinkIdentifier($mysqli));
    }

    /**
     * Get MySQL protocol info
     *
     * @param null $mysqli
     * @return bool|string
     * @deprecated
     */
    function mysql_get_proto_info(mysqli $mysqli = null)
    {
        return mysqli_get_proto_info(getLinkIdentifier($mysqli));
    }

    /**
     * Get MySQL server info
     *
     * @param null $mysqli
     * @return bool|string
     */
    function mysql_get_server_info(mysqli $mysqli = null)
    {
        return mysqli_get_server_info(getLinkIdentifier($mysqli));
    }

    /**
     * Get table name of field
     *
     * @param $result
     * @param $i
     * @return bool
     */
    function mysql_tablename($result, $i)
    {
        trigger_error('Not implemented', E_USER_WARNING);
        return false;
    }

    /**
     * Get the ID generated in the last query
     *
     * @param null $mysqli
     * @return int|string
     * @deprecated
     */
    function mysql_insert_id(mysqli $mysqli = null)
    {
        return mysqli_insert_id(getLinkIdentifier($mysqli));
    }

    /**
     * Get result data
     *
     * @param $result
     * @param $row
     * @param int $field
     * @return mixed
     * @deprecated
     */
    function mysql_result($result, $row, $field = 0)
    {
        $result->data_seek($row);
        $row = $result->fetch_array();
        if (!isset($row[$field])) {
            return false;
        }

        return $row[$field];
    }

    /**
     * Get number of fields in result
     *
     * @param mysqli_result $result
     * @return int
     * @deprecated
     */
    function mysql_num_fields(mysqli_result $result)
    {
        return mysqli_num_fields($result);
    }

    /**
     * List tables in a MySQL database
     *
     * @param null $mysqli
     * @return bool|string
     */
    function mysql_list_tables($database_name, mysqli $mysqli = null)
    {
        trigger_error('This function is deprecated. It is preferable to use mysql_query() to issue an SQL SHOW TABLES [FROM db_name] [LIKE \'pattern\'] statement instead.', E_USER_DEPRECATED);

        $mysqli = getLinkIdentifier($mysqli);
        $db = mysqli_escape_string($mysqli, $database_name);

        return mysqli_query($mysqli, sprintf('SHOW TABLES FROM %s', $db));
    }

    /**
     *  Get column information from a result and return as an object
     *
     * @param mysqli_result $result
     * @param int $field_offset
     * @return bool|object
     * @deprecated
     */
    function mysql_fetch_field(mysqli_result $result, $field_offset = 0)
    {
        if ($field_offset) {
            mysqli_field_seek($result, $field_offset);
        }

        return mysqli_fetch_field($result);
    }

    /**
     * Returns the length of the specified field
     *
     * @param mysqli_result $result
     * @param int $field_offset
     * @return bool
     * @deprecated
     */
    function mysql_field_len(mysqli_result $result, $field_offset = 0)
    {
        trigger_error('This function is not implemented', E_USER_WARNING);
        return false;
    }

    /**
     * @return bool
     */
    function mysql_drop_db()
    {
        trigger_error('This function is deprecated since PHP 4.3.0 and therefore not implemented', E_USER_DEPRECATED);
        return false;
    }

    /**
     * Move internal result pointer
     *
     * @param mysqli_result $result
     * @param int $row_number
     * @return void
     */
    function mysql_data_seek(mysqli_result $result, $row_number = 0)
    {
        return mysqli_data_seek($result, $row_number);
    }

    /**
     * Get the name of the specified field in a result
     *
     * @param $result
     * @param $field_offset
     * @return bool
     */
    function mysql_field_name($result, $field_offset = 0)
    {
        $props = mysqli_fetch_field_direct($result, $field_offset);
        return is_object($props) ? $props->name : false;
    }

    /**
     * Get the length of each output in a result
     *
     * @param mysqli_result $result
     * @return array|bool
     */
    function mysql_fetch_lengths(mysqli_result $result)
    {
        return mysqli_fetch_lengths($result);
    }

    /**
     * Get the type of the specified field in a result
     * @param mysqli_result $result
     * @param $field_offset
     * @return string
     */
    function mysql_field_type(mysqli_result $result, $field_offset = 0)
    {
        $unknown = 'unknown';
        $info = mysqli_fetch_field_direct($result, $field_offset);
        if (empty($info->type)) {
            return $unknown;
        }

        switch ($info->type) {
            case MYSQLI_TYPE_FLOAT:
            case MYSQLI_TYPE_DOUBLE:
            case MYSQLI_TYPE_DECIMAL:
            case MYSQLI_TYPE_NEWDECIMAL:
                return 'real';

            case MYSQLI_TYPE_BIT:
                return 'bit';

            case MYSQLI_TYPE_TINY:
                return 'tinyint';

            case MYSQLI_TYPE_TIME:
                return 'time';

            case MYSQLI_TYPE_DATE:
                return 'date';

            case MYSQLI_TYPE_DATETIME:
                return 'datetime';

            case MYSQLI_TYPE_TIMESTAMP:
                return 'timestamp';

            case MYSQLI_TYPE_YEAR:
                return 'year';

            case MYSQLI_TYPE_STRING:
            case MYSQLI_TYPE_VAR_STRING:
                return 'string';

            case MYSQLI_TYPE_SHORT:
            case MYSQLI_TYPE_LONG:
            case MYSQLI_TYPE_LONGLONG:
            case MYSQLI_TYPE_INT24:
                return 'int';

            case MYSQLI_TYPE_CHAR:
                return 'char';

            case MYSQLI_TYPE_ENUM:
                return 'enum';

            case MYSQLI_TYPE_TINY_BLOB:
            case MYSQLI_TYPE_MEDIUM_BLOB:
            case MYSQLI_TYPE_LONG_BLOB:
            case MYSQLI_TYPE_BLOB:
                return 'blob';

            case MYSQLI_TYPE_NULL:
                return 'null';

            case MYSQLI_TYPE_NEWDATE:
            case MYSQLI_TYPE_INTERVAL:
            case MYSQLI_TYPE_SET:
            case MYSQLI_TYPE_GEOMETRY:
            default:
                return $unknown;
        }
    }

    /**
     * Get name of the table the specified field is in
     *
     * @param mysqli_result $result
     * @param $field_offset
     * @return bool
     */
    function mysql_field_table(mysqli_result $result, $field_offset = 0)
    {
        $info = mysqli_fetch_field_direct($result, $field_offset);
        if (empty($info->table)) {
            return false;
        }

        return $info->table;
    }

    /**
     * Get the flags associated with the specified field in a result
     *
     * @param mysqli_result $result
     * @param int $field_offset
     * @return bool
     * @todo implement
     *
     */
    function mysql_field_flags(mysqli_result $result, $field_offset = 0)
    {
        trigger_error('This function is not implemented', E_USER_WARNING);
        return false;
    }

    /**
     * Set result pointer to a specified field offset
     *
     * @param mysqli_result $result
     * @param int $field_offset
     * @return bool
     */
    function mysql_field_seek(mysqli_result $result, $field_offset = 0)
    {
        return mysqli_field_seek($result, $field_offset);
    }

    /**
     * Selects a database and executes a query on it
     *
     * @param $database
     * @param $query
     * @param mysqli $mysqli
     * @return bool
     * @todo implement
     *
     */
    function mysql_db_query($database, $query, mysqli $mysqli = null)
    {
        trigger_error('This function is deprecated since PHP 5.3.0 and therefore not implemented', E_USER_DEPRECATED);
        return false;
    }
}