ModuleDatabase
Package | engine.modules |
---|---|
Inheritance | class ModuleDatabase » Module » LsObject |
Since | 1.0 |
Source Code | /engine/modules/database/Database.class.php |
Модуль для работы с базой данных
Создаёт объект БД библиотеки DbSimple Дмитрия Котерова
Модуль используется в основном для создания коннекта к БД и передачи его в маппер
Protected Properties
Property | Type | Description | Defined By |
---|---|---|---|
aInstance | array | Массив инстанцируемых объектов БД, или проще говоря уникальных коннектов к БД | ModuleDatabase |
bIsInit | bool | Указывает на то, была ли проведенна инициализация модуля | Module |
oEngine | Engine | Объект ядра | Module |
Public Methods
Method | Description | Defined By |
---|---|---|
ExportSQL() | Экспорт SQL дампа в БД | ModuleDatabase |
ExportSQLQuery() | Экспорт SQL в БД | ModuleDatabase |
GetConnect() | Получает объект БД | ModuleDatabase |
GetStats() | Возвращает статистику использования БД - время и количество запросов | ModuleDatabase |
Init() | Инициализация модуля | ModuleDatabase |
SetInit() | Помечает модуль как инициализированный | Module |
Shutdown() | Метод срабатывает при завершении работы ядра | Module |
__call() | Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля | Module |
__construct() | При создании модуля передаем объект ядра | Module |
addEnumType() | Доавляет новый тип в поле таблицы с типом enum | ModuleDatabase |
isFieldExists() | Проверяет существование поля в таблице | ModuleDatabase |
isInit() | Возвращает значение флага инициализации модуля | Module |
isTableExists() | Проверяет существование таблицы | ModuleDatabase |
Protected Methods
Method | Description | Defined By |
---|---|---|
__clone() | Блокируем копирование/клонирование объекта | Module |
Property Details
aInstance
property
protected array $aInstance;
Массив инстанцируемых объектов БД, или проще говоря уникальных коннектов к БД
Method Details
ExportSQL()
method
public array ExportSQL(string $sFilePath, array|null $aConfig=NULL)
| ||
$sFilePath | string | Полный путь до файла SQL |
$aConfig | array|null | Конфиг подключения к БД |
{return} | array |
Source Code: /engine/modules/database/Database.class.php#121 (show)
public function ExportSQL($sFilePath,$aConfig=null) {
if(!is_file($sFilePath)){
return array('result'=>false,'errors'=>array("cant find file '$sFilePath'"));
}elseif(!is_readable($sFilePath)){
return array('result'=>false,'errors'=>array("cant read file '$sFilePath'"));
}
$sFileQuery = file_get_contents($sFilePath);
return $this->ExportSQLQuery($sFileQuery,$aConfig);
}
Экспорт SQL дампа в БД
See Also
ExportSQLQuery()
method
public array ExportSQLQuery(string $sFileQuery, array|null $aConfig=NULL)
| ||
$sFileQuery | string | Строка с SQL запросом |
$aConfig | array|null | Конфиг подключения к БД |
{return} | array | Возвращает массив вида array('result'=>bool,'errors'=>array()) |
Source Code: /engine/modules/database/Database.class.php#138 (show)
public function ExportSQLQuery($sFileQuery,$aConfig=null) {
/**
* Замена префикса таблиц
*/
$sFileQuery = str_replace('prefix_', Config::Get('db.table.prefix'), $sFileQuery);
/**
* Массивы запросов и пустой контейнер для сбора ошибок
*/
$aErrors = array();
$aQuery=explode(';',$sFileQuery);
/**
* Выполняем запросы по очереди
*/
foreach($aQuery as $sQuery){
$sQuery = trim($sQuery);
/**
* Заменяем движек, если таковой указан в запросе
*/
if(Config::Get('db.tables.engine')!='InnoDB') $sQuery=str_ireplace('ENGINE=InnoDB', "ENGINE=".Config::Get('db.tables.engine'),$sQuery);
if($sQuery!='') {
$bResult=$this->GetConnect($aConfig)->query($sQuery);
if($bResult===false) $aErrors[] = mysql_error();
}
}
/**
* Возвращаем результат выполнения, взависимости от количества ошибок
*/
if(count($aErrors)==0) {
return array('result'=>true,'errors'=>null);
}
return array('result'=>false,'errors'=>$aErrors);
}
Экспорт SQL в БД
GetConnect()
method
public DbSimple_Generic_Database GetConnect(array|null $aConfig=NULL)
| ||
$aConfig | array|null | - конфиг подключения к БД(хост, логин, пароль, тип бд, имя бд), если null, то используются параметры из конфига Config::Get('db.params') |
{return} | DbSimple_Generic_Database | DbSimple |
Source Code: /engine/modules/database/Database.class.php#51 (show)
public function GetConnect($aConfig=null) {
/**
* Если конфиг не передан то используем главный конфиг БД из config.php
*/
if (is_null($aConfig)) {
$aConfig = Config::Get('db.params');
}
$sDSN=$aConfig['type'].'wrapper://'.$aConfig['user'].':'.$aConfig['pass'].'@'.$aConfig['host'].':'.$aConfig['port'].'/'.$aConfig['dbname'];
/**
* Создаём хеш подключения, уникальный для каждого конфига
*/
$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')) {
$oDbSimple->setLogger('databaseLogger');
}
/**
* Устанавливаем настройки соединения, по хорошему этого здесь не должно быть :)
* считайте это костылём
*/
$oDbSimple->query("set character_set_client='utf8', character_set_results='utf8', collation_connection='utf8_bin' ");
/**
* Сохраняем коннект
*/
$this->aInstance[$sDSNKey]=$oDbSimple;
/**
* Возвращаем коннект
*/
return $oDbSimple;
}
}
Получает объект БД
GetStats()
method
public array GetStats()
| ||
{return} | array |
Source Code: /engine/modules/database/Database.class.php#103 (show)
public function GetStats() {
$aQueryStats=array('time'=>0,'count'=>-1); // не считаем тот самый костыльный запрос, который устанавливает настройки DB соединения
foreach ($this->aInstance as $oDb) {
$aStats=$oDb->_statistics;
$aQueryStats['time']+=$aStats['time'];
$aQueryStats['count']+=$aStats['count'];
}
$aQueryStats['time']=round($aQueryStats['time'],3);
return $aQueryStats;
}
Возвращает статистику использования БД - время и количество запросов
Init()
method
public void Init()
|
Source Code: /engine/modules/database/Database.class.php#42 (show)
public function Init() {
}
Инициализация модуля
addEnumType()
method
public void addEnumType(string $sTableName, string $sFieldName, string $sType, array|null $aConfig=NULL)
| ||
$sTableName | string | Название таблицы, необходимо перед именем таблицы добавлять "prefix_", это позволит учитывать произвольный префикс таблиц у пользователя |
$sFieldName | string | Название поля в таблице |
$sType | string | Название типа |
$aConfig | array|null | Конфиг подключения к БД |
Source Code: /engine/modules/database/Database.class.php#215 (show)
public function addEnumType($sTableName,$sFieldName,$sType,$aConfig=null) {
$sTableName = str_replace('prefix_', Config::Get('db.table.prefix'), $sTableName);
$sQuery="SHOW COLUMNS FROM `{$sTableName}`";
if ($aRows=$this->GetConnect($aConfig)->select($sQuery)) {
foreach ($aRows as $aRow){
if ($aRow['Field'] == $sFieldName) break;
}
if (strpos($aRow['Type'], "'{$sType}'") === FALSE) {
$aRow['Type'] =str_ireplace('enum(', "enum('{$sType}',", $aRow['Type']);
$sQuery="ALTER TABLE `{$sTableName}` MODIFY `{$sFieldName}` ".$aRow['Type'];
$sQuery.= ($aRow['Null']=='NO') ? ' NOT NULL ' : ' NULL ';
$sQuery.= is_null($aRow['Default']) ? ' DEFAULT NULL ' : " DEFAULT '{$aRow['Default']}' ";
$this->GetConnect($aConfig)->select($sQuery);
}
}
}
Доавляет новый тип в поле таблицы с типом enum
isFieldExists()
method
public bool isFieldExists(string $sTableName, string $sFieldName, array|null $aConfig=NULL)
| ||
$sTableName | string | Название таблицы, необходимо перед именем таблицы добавлять "prefix_", это позволит учитывать произвольный префикс таблиц у пользователя |
$sFieldName | string | Название поля в таблице |
$aConfig | array|null | Конфиг подключения к БД |
{return} | bool |
Source Code: /engine/modules/database/Database.class.php#195 (show)
public function isFieldExists($sTableName,$sFieldName,$aConfig=null) {
$sTableName = str_replace('prefix_', Config::Get('db.table.prefix'), $sTableName);
$sQuery="SHOW FIELDS FROM `{$sTableName}`";
if ($aRows=$this->GetConnect($aConfig)->select($sQuery)) {
foreach ($aRows as $aRow){
if ($aRow['Field'] == $sFieldName){
return true;
}
}
}
return false;
}
Проверяет существование поля в таблице
isTableExists()
method
public bool isTableExists(string $sTableName, array|null $aConfig=NULL)
| ||
$sTableName | string | Название таблицы, необходимо перед именем таблицы добавлять "prefix_", это позволит учитывать произвольный префикс таблиц у пользователя |
$aConfig | array|null | Конфиг подключения к БД |
{return} | bool |
Source Code: /engine/modules/database/Database.class.php#179 (show)
public function isTableExists($sTableName,$aConfig=null) {
$sTableName = str_replace('prefix_', Config::Get('db.table.prefix'), $sTableName);
$sQuery="SHOW TABLES LIKE '{$sTableName}'";
if ($aRows=$this->GetConnect($aConfig)->select($sQuery)) {
return true;
}
return false;
}
Проверяет существование таблицы