ModuleDatabase

Package engine.modules
Inheritance class ModuleDatabase » Module » LsObject
Since 1.0
Source Code /engine/modules/database/Database.class.php
Модуль для работы с базой данных Создаёт объект БД библиотеки DbSimple Дмитрия Котерова Модуль используется в основном для создания коннекта к БД и передачи его в маппер

Protected Properties

Hide inherited properties

PropertyTypeDescriptionDefined By
aInstance array Массив инстанцируемых объектов БД, или проще говоря уникальных коннектов к БД ModuleDatabase
bIsInit bool Указывает на то, была ли проведенна инициализация модуля Module
oEngine Engine Объект ядра Module

Public Methods

Hide inherited methods

MethodDescriptionDefined 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

Hide inherited methods

MethodDescriptionDefined 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;
}

Проверяет существование таблицы