<?php
/**
 * IBSE
 *
 * Information Bot Service Engine
 *
 * @package        IBSE
 * @author        HSDN Team
 * @copyright    Copyright (c) 2006-2010, Information Networks Ltd.
 * @link        http://www.hsdn.org
 * @since        Version 4.0
 */

/**
 * IBAPI
 *
 * Information Bot Application Program Interface
 *
 * @package        IBSE
 * @author        HSDN Team
 * @copyright    Copyright (c) 2006-2010, Information Networks Ltd.
 * @since        Version 4.0
 */

// ------------------------------------------------------------------------

/**
 * Класс Database
 *
 * @category    Libraries
 * @author        HSDN Team
 */
class Database
{
    
/*
     * Пользователь БД
     *
     * @access    public
     */
    
public $user '';

    
/*
     * Пароль БД
     *
     * @access    public
     */
    
public $password '';

    
/*
     * Сервер БД
     *
     * @access    public
     */
    
public $server '';

    
/*
     * Имя БД
     *
     * @access    public
     */
    
public $dbname '';

    
/*
     * Кодировка БД
     *
     * @access    public
     */
    
public $charset '';

    
/*
     * Сравнение БД
     *
     * @access    public
     */
    
public $collation '';

    
/*
     * Идентификатор соединения
     *
     * @access    public
     */
    
public $db_connect_id NULL;

    
/*
     * Результат запроса
     *
     * @access    public
     */
    
public $query_result '';

    
/*
     * Ряды
     *
     * @access    public
     */
    
public $row = array();

    
/*
     * Количество запросов
     *
     * @access    public
     */
    
public $num_queries 0;


    
/**
     * Конструктор, инициализация и соединение с MySQL
     *
     * @access    public
     * @return    void
     */
    
public function __construct()
    {
        
$config Management::get_config('Database');

        
$this->server $config['server'];
        
$this->user $config['user'];
        
$this->password $config['password'];
        
$this->dbname $config['dbname'];
        
$this->charset $config['charset'];
        
$this->collation $config['collation'];

        
$this->connect();
    }

    
/**
     * Деструктор, закрытие соединения MySQL
     *
     * @access    public
     * @return    void
     */
    
public function __destruct()
    {
        
$this->close();
    }

    
/**
     * Переподключиться к БД
     *
     * @access    public
     * @param    bool
     * @return    mixed
     */
    
public function connect()
    {
        
$this->db_connect_id = @mysql_connect($this->server$this->user$this->password);

        if (!
$this->db_connect_id)
        {
            
$this->error();
        }

        if (
$this->dbname != '')
        {
            
$dbselect = @mysql_select_db($this->dbname);

            if (!
$dbselect)
            {
                @
mysql_close($this->db_connect_id);
                
$this->db_connect_id $dbselect;
            }

            if (
$this->charset != '' AND $this->collation != '')
            {
                @
mysql_query("SET NAMES '".$this->escape($this->charset)."' COLLATE '".$this->escape($this->collation)."'"$this->db_connect_id);
            }
        }

        return 
$this->db_connect_id;
    }

    
/**
     * Отсоединение от БД
     *
     * @access    public
     * @return    bool
     */
    
public function close()
    {
        if (!
$this->db_connect_id)
        {
            return 
FALSE;
        }

        if (
$this->query_result)
        {
            @
mysql_free_result($this->query_result);
        }

        return @
mysql_close($this->db_connect_id);
    }

    
/**
     * Переподключиться к БД
     *
     * @access    public
     * @return    mixed
     */
    
public function reconnect()
    {
        if (
$this->db_connect_id)
        {
            
$this->close();
        }

        return 
$this->connect();
    }

    
/**
     * Проверить соединение с БД
     *
     * @access    public
     * @return    bool
     */
    
public function ping()
    {
        if (!
$this->db_connect_id)
        {
            return 
FALSE;
        }
        
        return 
mysql_ping($this->db_connect_id);
    }

    
/**
     * SQL запрос
     *
     * @access    public
     * @param    string
     * @param    mixed
     * @return    mixed
     */
    
public function query($query ''$transaction FALSE)
    {
        unset(
$this->query_result);

        if (
$query != '')
        {
            
$this->num_queries++;
            
$this->query_result = @mysql_query($query$this->db_connect_id);
        }

        if (
$this->query_result)
        {
            unset(
$this->row[$this->query_result]);

            return 
$this->query_result;
        }

        return 
FALSE;
    }

    
/**
     * Количество рядов
     *
     * @access    public
     * @param    resource
     * @return    mixed
     */
    
public function num_rows($query_id 0)
    {
        if (!
$query_id)
        {
            
$query_id $this->query_result;
        }

        if (!
$query_id)
        {
            return 
FALSE;
        }
        
        return @
mysql_num_rows($query_id);
    }

    
/**
     * Число затронуиых прошлой операцией рядов
     *
     * @access    public
     * @return    mixed
     */
    
public function affected_rows()
    {
        if (!
$this->db_connect_id)
        {
            return 
FALSE;
        }

        return @
mysql_affected_rows($this->db_connect_id);
    }

    
/**
     * Количество полей результата запроса
     *
     * @access    public
     * @param    resource
     * @return    mixed
     */
    
public function num_fields($query_id 0)
    {
        if (!
$query_id)
        {
            
$query_id $this->query_result;
        }

        if (!
$query_id)
        {
            return 
FALSE;
        }
        
        return @
mysql_num_fields($query_id);
    }

    
/**
     * Название указанной колонки результата запроса
     *
     * @access    public
     * @param    int
     * @param    resource
     * @return    mixed
     */
    
public function field_name($offset$query_id 0)
    {
        if (!
$query_id)
        {
            
$query_id $this->query_result;
        }

        if (!
$query_id)
        {
            return 
FALSE;
        }

        return @
mysql_field_name($query_id$offset);
    }

    
/**
     * Тип указанной колонки результата запроса
     *
     * @access    public
     * @param    int
     * @param    resource
     * @return    mixed
     */
    
public function field_type($offset$query_id 0)
    {
        if (!
$query_id)
        {
            
$query_id $this->query_result;
        }

        if (!
$query_id)
        {
            return 
FALSE;
        }
        
        return @
mysql_field_type($query_id$offset);
    }

    
/**
     * Получить массив рядов
     *
     * @access    public
     * @param    resource
     * @return    mixed
     */
    
public function fetch_row($query_id 0)
    {
        if (!
$query_id)
        {
            
$query_id $this->query_result;
        }

        if (!
$query_id)
        {
            return 
FALSE;
        }

        
$this->row[$query_id] = @mysql_fetch_array($query_id);

        return 
$this->row[$query_id];
    }

    
/**
     * Получить объекты рядов
     *
     * @access    public
     * @param    resource
     * @return    mixed
     */
    
public function fetch_row_object($query_id 0)
    {
        if (!
$query_id)
        {
            
$query_id $this->query_result;
        }

        if (!
$query_id)
        {
            return 
FALSE;
        }

        
$this->row[$query_id] = @mysql_fetch_object($query_id);

        return 
$this->row[$query_id];
    }

    
/**
     * Получить поле
     *
     * @access    public
     * @param    mixed
     * @param    int
     * @param    resource
     * @return    mixed
     */
    
public function fetch_field($field$rownum 0$query_id 0)
    {
        if (!
$query_id)
        {
            
$query_id $this->query_result;
        }

        if (!
$query_id)
        {
            return 
FALSE;
        }

        return @
mysql_result($query_id$rownum$field);
    }

    
/**
     * Переместить внутренний указатель
     *
     * @access    public
     * @param    int
     * @param    resource
     * @return    mixed
     */
    
public function row_seek($rownum$query_id 0)
    {
        if (!
$query_id)
        {
            
$query_id $this->query_result;
        }

        if (!
$query_id)
        {
            return 
FALSE;
        }
        
        return @
mysql_data_seek($query_id$rownum);
    }

    
/**
     * Получить ID, сгенерированный при последнем INSERT-запросе
     *
     * @access    public
     * @return    mixed
     */
    
public function next_id()
    {
        if (!
$this->db_connect_id)
        {
            return 
FALSE;
        }

        return @
mysql_insert_id($this->db_connect_id);
    }

    
/**
     * Освободить память
     *
     * @access    public
     * @param    resource
     * @return    bool
     */
    
public function free_result($query_id 0)
    {
        if (!
$query_id)
        {
            
$query_id $this->query_result;
        }

        if (!
$query_id)
        {
            return 
FALSE;
        }
        
        unset(
$this->row[$query_id]);
        @
mysql_free_result($query_id);

        return 
TRUE;
    }

    
/**
     * Вывести ошибку
     *
     * @access    public
     * @param    resource
     * @return    array
     */
    
public function error($query_id 0)
    {
        if(
$this->db_connect_id)
        {
            
$result['message'] = @mysql_error($this->db_connect_id);
            
$result['code'] = @mysql_errno($this->db_connect_id);
        }
        else
        {
            
$result['message'] = @mysql_error();
            
$result['code'] = @mysql_errno();
        }

        if (
$result['code'] !== 0)
        {

            if (
method_exists('Exceptions''send_error'))
            {
                
Exceptions::send_error(0x4110$result);
            }

            return 
$result;
        }

        return 
FALSE;
    }

    
/**
     * Экранировать SQL спец-символы
     *
     * @access    public
     * @param    string
     * @return    string
     */
    
public function escape($msg)
    {
        if (!
$this->db_connect_id)
        {
            return @
mysql_real_escape_string($msg);
        }

        return @
mysql_real_escape_string($msg$this->db_connect_id);
    }
}

/* EOF Database.class.php */