<?php

/**
 * MobileCMS
 *
 * Open source content management system for mobile sites
 *
 * @author MobileCMS Team <support@mobilecms.pro>
 * @copyright Copyright (c) 2011-2019, MobileCMS Team
 * @link https://mobilecms.pro Official site
 * @license MIT license
 */
defined('IN_SYSTEM') or die('<b>403<br />Запрет доступа!</b>');

/**
 * Класс для работы с MySQL
 */
class MySQL {

    /**
     * Ссылка соединения
     */
    public $db_link;

    /**
     * Режим отладки
     */
    public $debugging = true;

    /**
     * Запросы
     */
    public $list_queries = array();

    /**
     * Соединение с базой
     */
    public function connect() {
        $this->db_link = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_BASE, 3306) or
                $this->error("Не возможно подключиться к MySQL серверу");
    }

    /**
     * Выполнение запроса к базе
     */
    public function query($query) {
        $query = $this->replace($query);

        # Засекаем время выполнения запроса
        $start_time = microtime(true);

        # Выполняем запрос
        $result = mysqli_query($this->db_link, $query) or
                $this->error($query . PHP_EOL . mysqli_error($this->db_link));

        # Получаем время по окончанию запроса
        $end_time = microtime(true);

        # Высчитываем время на запрос
        $query_time = $end_time - $start_time;

        $this->list_queries[] = array(
            'query' => $query,
            'time' => $query_time
        );

        return $result;
    }

    /**
     * Получение одной ячейки
     */
    public function get_one($query) {
        $result = $this->query($query);
        if ($row = mysqli_fetch_row($result)) {
            return stripslashes($row[0]);
        }
        return FALSE;
    }

    /**
     * Получение строки
     */
    public function get_row($query, $restype = MYSQLI_ASSOC) {
        $result = $this->query($query);
        if ($row = mysqli_fetch_array($result, $restype)) {
            return array_map('stripslashes', $row);
        }
        return FALSE;
    }

    /**
     * Получение нескольких строк
     */
    public function get_array($query) {
        $data = array();
        $result = $this->query($query);
        while ($row = $this->fetch_array($result)) {
            $data[] = array_map('stripslashes', $row);
        }
        return $data;
    }

    /**
     * Закрытие соединения
     */
    public function close() {
        if ($this->db_link) {
            mysqli_close($this->db_link);
        }
        $this->db_link = NULL;
    }

    /**
     * Кодировка БД
     */
    public function charset($charset) {
        mysqli_set_charset($this->db_link, $charset);
    }

    /**
     * Последний вставленный id
     */
    public function insert_id() {
        return mysqli_insert_id($this->db_link);
    }

    /**
     * Аналог mysql_fetch_array()
     */
    public function fetch_array($result) {
        return mysqli_fetch_array($result);
    }

    /**
     * Аналог mysql_num_rows()
     */
    public function num_rows($result) {
        return mysqli_num_rows($result);
    }

    /**
     * Замена префикса
     */
    protected function replace($query) {
        return str_replace('#__', DB_PREFIX, $query);
    }

    /**
     * Вывод ошибки и завершение работы
     * @param string $error
     */
    protected function error($error) {
        if ($this->debugging) {
            print "<pre>" . $error . "</pre>";
        }
        exit;
    }

}
