<?php
/*
* @package LabCMS
* @copyright (c) 2006 Alexander Levin aka Loki (loki_angel@mail.ru)
* @support http://labcms.ru
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/

include_once dirname(__FILE__)."/DbSimple/Generic.php";
include_once dirname(__FILE__)."/DbSimple/Mysql.php";

class Db extends DbSimple_Generic
{
	public static $connected=null;
	private static $db;
	
	private function __construct()
	{
		// Подключаемся к БД.
		self::$db=parent::connect("mysql://".LabConfig::$cfg["mysql"]["dbuser"].":".LabConfig::$cfg["mysql"]["dbpasswd"]."@".LabConfig::$cfg["mysql"]["dblocation"]."/".LabConfig::$cfg["mysql"]["dbname"]);

		if (!LabConfig::$cfg['noDBErrorHandler']) self::$db->setErrorHandler(array('Db', 'databaseErrorHandler'));

		if (!self::$db->link) return false;

		if (!empty(LabConfig::$cfg['cache']))
		{
			include_once dirname(__FILE__)."/Cache/Generic.php";
			$cacher = new Cache_Generic(!empty(LabConfig::$cfg['use_memcached_db'])?'memcache':'file');
		}
		else $cacher=false;
		
		self::$db->setCacher($cacher);
		
		Db::_set_logger();
		
		//задаем префикс для таблиц
		self::$db->setIdentPrefix(LabConfig::$cfg["mysql"]["prefix"]);
		
		self::$connected=true;
	}
	
	private function __clone() {}
	
	public static function i()
	{
		return self::instance();
	}

	public static function instance()
	{
		if (self::$db === null)
		{
			new self;
		}
		return self::$db;
	}
	
	private static function _set_logger()
	{
		if (LabConfig::$cfg['debug_mode'] || LabVars::$allow_debug)
		{
			if (LabConfig::$cfg['debug_console'] && !in_array($_GET['data_type'], array('js', 'xml', 'json')))
			{
				new Debug_HackerConsole_Main(true);
				self::$db->setLogger(array('Db', 'myLogger_console'));
			}
			
			if (isset($_GET["debug"]))
			{
				if (!LabConfig::$cfg['debug_console'])
				{
					self::$db->setLogger(array('Db', 'myLogger'));
				}
			}
		}
	}
	
	static function databaseErrorHandler($message, $info)
	{
		if (!error_reporting()) return;
		if (LabConfig::$cfg['debug_mode'] || $_SESSION['user_info']['group_id']==1)
		{
			echo "SQL Error: $message<br><pre>"; print_r($info); echo "</pre>";
		}
		else
		{
			$subject="Произошла ошибка на сайте ".$_SERVER["SERVER_NAME"];
			$body="Добрый день, ".($_SERVER["HTTP_REFERER"]?"когда я перешел со страницы ".$_SERVER["HTTP_REFERER"].",":'')." По адресу http://".$_SERVER["SERVER_NAME"].$_SERVER['REDIRECT_URL']. " произошла ошибка. \r\nПрошу внести исправления.";
			$emails=explode(',',LabConfig::$cfg['admin_mail']);
			echo "Произошла ошибка при работе с БД. Убедительная просьба сообщить о ней <a href='mailto:".trim($emails[0])."?subject=".rawurlencode(iconv("UTF-8", "CP1251", $subject))."&body=".rawurlencode(iconv("UTF-8", "CP1251", $body))."'>администрации</a>. Спасибо!";
			if (LabConfig::$cfg['admin_mail'])
			{
				if (!file_exists(LAB_PATH_DATA.'/cache/mail_'.md5($info['code'].$info['context'])))
				{
					$mail=new Mailer(LabConfig::$cfg['admin_mail'], LabConfig::$cfg);
					$mail->From = 'bug@'.preg_replace('/^www\./i', '', $_SERVER["SERVER_NAME"]);
					$mail->FromName = "Ошибка сервера";
					$mail->Subject = $subject;
					$mail->Body    = $body."Error: $message\r\n".print_r($info, true);
					$mail->Send();
					file_put_contents(LAB_PATH_DATA.'/cache/mail_'.md5($info['code'].$info['context']), false);
				}
			}
		}
		exit();
	}
	
	static function myLogger_console($db, $sql)
	{
		Debug_HackerConsole_Main::out($sql, "sql", null, "");
	}

	static function myLogger($db, $sql)
	{
		echo "<xmp title=''>";
		print_r($sql);
		echo "</xmp>";
	}
	
	/**
	 * Парсинг sql
	 *
	 * @param string $url
	 * @return boolean
	 * @author Akira, Loki
	 */
	static function parse_mysql_dump($url, $display=true)
	{
		
		$file_content = file($url);
		$query = "";
		$all_ok=true;
		foreach($file_content as $key=>$sql_line)
		{
			$sql_line = trim($sql_line);
			if (($sql_line != "") && (mb_substr($sql_line, 0, 2) != "--") && (mb_substr($sql_line, 0, 1) != "#"))
			{
				$query .= $sql_line;
				if(preg_match('/;$/', $sql_line) || $key==(count($file_content)-1))
				{
					$result = self::instance()->query($query);
					if (!self::instance()->error['code'])
					{
						if ($display) echo " <span style='color:#00F'>";
					}
					else
					{
						if ($display) echo " <span style='color:#f00; font-weight:bold;'>Fail:";
						$all_ok=false;
					}
					if ($display) echo htmlspecialchars($query)."</span><br />";
					$query = "";
				}
			}
		}
		return $all_ok;
	}
}