<?php
/**
 * Класс соединяется с базой данных MySQL и позволяет после работать с ней
 * через интерфейс i_mr_sqldb. Для описания функций см. интерфейс.
 * Данные для соединения должны храниться в разделе [mrdb] файла mr.ini
 * *
 * [mr_db]
 * host -- хост для базы данных
 * user -- пользователь СУБД
 * password = пароль
 * database = имя БД
 * *
 * Используемые модули:
 * mr_core
 * *
 * (c) Дмитрий Куринский, 2006.
 * Пространство имён: xmlns:mr=http://www.mirari.ru
 */
    
class mr_db implements i_mr_inii_mr_sqldb{

 static private 
$connected=false$queries=0$time=0;

/**
 * Функция инициации
 */
 
static public function set_ini_array($ini)
 {
  
$timest = (double)mr_core::timedef();
  @
mysql_connect($ini["host"], $ini["user"], $ini["password"]);
  @
mysql_select_db($ini["database"]);
  if(
mysql_errno())
  {
   
mr_core::log("Невозможно соединиться с базой данных: ".mysql_error());
  } else {
   
mr_core::log("Соединение с базой данных успешно установлено");
   
mysql_query("set character_set_client='cp1251'");
   
mysql_query("set character_set_results='cp1251'");
   
mysql_query("set collation_connection='cp1251_general_ci'");
   
self::$connected true;
  }
  
self::$time += (double)mr_core::timedef() - $timest;
 }

/**
 * Производит стандартный запрос к БД
 */
 
static public function query($q)
 {
  
$timest = (double)mr_core::timedef();
  
self::$queries++;
  
$r self::$connected ? @mysql_query($q) : false;
  
self::$time += (double)mr_core::timedef() - $timest;
  return 
$r;
 }

/**
 * Количество запросов к БД за эту сессию
 */
 
static public function queries()
 {
  return 
self::$queries;
 }

/**
 * Время на mr_db::query
 */
 
static public function time()
 {
  return 
self::$time;
 }

/**
 * Возвращает строку или поле из результата или sql-строки
 * $arg: результат SQL-запроса или строка нового запроса
 * $mode: константа режима вывода
 */
 
static public function fetch($arg$mode=self::assoc)
 {
  if(!
self::$connected) return false;
  if(
is_string($arg)) $arg self::query($arg);
  if(
$arg) switch($mode)
  {
   case 
self::assoc:
    return 
mysql_fetch_assoc($arg);
   break;
   case 
self::num:
    return 
mysql_fetch_array($arg);
   break;
   case 
self::obj:
    return 
mysql_fetch_object($arg);
   break;
   case 
self::get:
    
$f mysql_fetch_array($arg);
    return 
$f[0];
   break;
   default:
    
mr_core::log("Неверный параметр для mr_db::fetch: '$mode'");
  } else return 
self::error();
 }

/**
 * Возвращает последнее сообщение об ошибке
 */
 
static public function error()
 {
  return 
mysql_error();
 }

/**
 * Возвращает количество строк, затронутых последним запросом
 */
 
static public function affected_rows()
 {
  return (int)@
mysql_affected_rows();
 }

/**
 * Возвращает последний id, сгенерированный базой данных при вставке строки
 */
 
static public function insert_id()
 {
  return 
mysql_insert_id();
 }

/**
 * Возвращает количество строк, возвращённых в результате SQL-запроса
 */
 
static public function num_rows($r)
 {
  return (int)@
mysql_num_rows($r);
 }

/**
 * Возвращает состояние соединения с СУБД
 */
 
static public function connected()
 {
  return 
self::$connected;
 }
    }
?>