1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-18 06:14:26 +03:00
ifhub.club/engine/modules/database/Database.class.php

165 lines
5.2 KiB
PHP
Raw Normal View History

<?php
2008-09-21 09:36:57 +03:00
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
require_once(Config::Get('path.root.engine').'/lib/external/DbSimple/Generic.php');
2008-09-21 09:36:57 +03:00
/**
* Модуль для работы с базой данных
* Создаёт объект БД библиотеки DbSimple Дмитрия Котерова
*
*/
class ModuleDatabase extends Module {
2008-09-21 09:36:57 +03:00
/**
* Массив инстанцируемых объектов БД, или проще говоря уникальных коннектов к БД
*
* @var array
*/
protected $aInstance=array();
/**
* Инициализация модуля
*
*/
public function Init() {
}
/**
* Получает объект БД
*
* @param array $aConfig - конфиг подключения к БД(хост, логин, пароль, тип бд, имя бд)
* @return DbSimple
*/
public function GetConnect($aConfig=null) {
/**
* Если конфиг не передан то используем главный конфиг БД из config.php
2008-09-21 09:36:57 +03:00
*/
if (is_null($aConfig)) {
$aConfig = Config::Get('db.params');
2008-09-21 09:36:57 +03:00
}
2009-07-26 16:43:16 +03:00
$sDSN=$aConfig['type'].'wrapper://'.$aConfig['user'].':'.$aConfig['pass'].'@'.$aConfig['host'].':'.$aConfig['port'].'/'.$aConfig['dbname'];
2008-09-21 09:36:57 +03:00
/**
* Создаём хеш подключения, уникальный для каждого конфига
*/
$sDSNKey=md5($sDSN);
/**
* Проверяем создавали ли уже коннект с такими параметрами подключения(DSN)
*/
if (isset($this->aInstance[$sDSNKey])) {
return $this->aInstance[$sDSNKey];
} else {
/**
* Если такого коннекта еще не было то создаём его
*/
$oDbSimple=DbSimple_Generic::connect($sDSN);
/**
* Устанавливаем хук на перехват ошибок при работе с БД
*/
$oDbSimple->setErrorHandler('databaseErrorHandler');
/**
* Если нужно логировать все SQL запросы то подключаем логгер
*/
if (Config::Get('sys.logs.sql_query')) {
2008-09-21 09:36:57 +03:00
$oDbSimple->setLogger('databaseLogger');
}
/**
* Устанавливаем настройки соединения, по хорошему этого здесь не должно быть :)
* считайте это костылём
*/
$oDbSimple->query("set character_set_client='utf8'");
$oDbSimple->query("set character_set_results='utf8'");
$oDbSimple->query("set collation_connection='utf8_bin'");
/**
* Сохраняем коннект
*/
$this->aInstance[$sDSNKey]=$oDbSimple;
/**
* Возвращаем коннект
*/
return $oDbSimple;
}
}
public function GetStats() {
$aQueryStats=array('time'=>0,'count'=>-3);
foreach ($this->aInstance as $oDb) {
$aStats=$oDb->_statistics;
$aQueryStats['time']+=$aStats['time'];
$aQueryStats['count']+=$aStats['count'];
}
$aQueryStats['time']=round($aQueryStats['time'],3);
return $aQueryStats;
}
}
/**
* Функция хука для перехвата SQL ошибок
*
* @param string $message
* @param unknown_type $info
*/
function databaseErrorHandler($message, $info) {
/**
* Записываем информацию об ошибке в переменную $msg
2010-01-06 22:53:38 +02:00
*/
$msg="SQL Error: $message<br>\n";
$msg.=print_r($info,true);
2008-09-21 09:36:57 +03:00
/**
* Если нужно логировать SQL ошибке то пишем их в лог
*/
if (Config::Get('sys.logs.sql_error')) {
2008-09-21 09:36:57 +03:00
/**
* Получаем ядро
*/
$oEngine=Engine::getInstance();
/**
* Меняем имя файла лога на нужное, записываем в него ошибку и меняем имя обратно :)
*/
$sOldName=$oEngine->Logger_GetFileName();
$oEngine->Logger_SetFileName(Config::Get('sys.logs.sql_error_file'));
2008-09-21 09:36:57 +03:00
$oEngine->Logger_Error($msg);
$oEngine->Logger_SetFileName($sOldName);
}
/**
* Если стоит вывод ошибок то выводим ошибку на экран(браузер)
*/
if (error_reporting()) {
exit($msg);
}
}
/**
* Функция логгирования SQL запросов
*
* @param object $db
* @param unknown_type $sql
*/
function databaseLogger($db, $sql) {
/**
* Получаем информацию о запросе и сохраняем её в переменной $msg
*/
2010-01-06 22:53:38 +02:00
$caller = $db->findLibraryCaller();
$msg=print_r($sql,true);
2008-09-21 09:36:57 +03:00
/**
* Получаем ядро и сохраняем в логе SQL запрос
*/
$oEngine=Engine::getInstance();
$sOldName=$oEngine->Logger_GetFileName();
$oEngine->Logger_SetFileName(Config::Get('sys.logs.sql_query_file'));
2008-09-21 09:36:57 +03:00
$oEngine->Logger_Debug($msg);
$oEngine->Logger_SetFileName($sOldName);
2008-09-21 09:36:57 +03:00
}
?>