Database/Concrete/MySQL.php
<?php
namespace Colibri\Database\Concrete;
use Colibri\Database\AbstractDb\Driver;
use Colibri\Database\Exception\SqlException;
/**
* Класс для работы с MySQL.
*/
class MySQL extends Driver
{
/** @var \Colibri\Database\Concrete\MySQL\Connection */
protected $connection;
/**
* Возвращает количество строк, затронутых запросом на изменение (insert, update, replace, delete, ...)
* Returns count of rows that query affected.
*
* @return int|string returns string if count > PHP_INT_MAX
*/
public function getAffectedRows()
{
return $this->connection->getAffectedRows();
}
/**
* Идентификатор последней добавленной записи.
* Returns the auto generated ID of last insert query.
*
* @return mixed
*/
public function lastInsertId()
{
return $this->connection->lastInsertId();
}
/**
* Соьирает шаблон запроса, подставляя значения из $arguments.
* Compile query template with specified $arguments array.
*
* @param string $tpl
* @param array $arguments
*
* @return string
*/
public static function getQueryTemplateArray($tpl, array $arguments)
{
$argNum = count($arguments);
for ($i = $argNum; $i > 0; $i--) {
$tpl = str_replace('%' . $i, $arguments[$i - 1], $tpl);
}
return $tpl;
}
/**
* Собирает шаблон запроса, подставляя значения из переданных в метод агргументов.
* Compile query template with passed into method arguments.
*
* @param string $template
* @param array $arguments
*
* @return string
*/
public static function getQueryTemplate($template, ...$arguments)
{
$strQuery = $template;
foreach ($arguments as $i => &$argument) {
$strQuery = str_replace('%' . $i, $argument, $strQuery);
}
return $strQuery;
}
/**
* Выполняет запрос, собранный из указанного шаблона, подставив значения из переданных в метод агргументов.
* Executes query template compiles with passed into method arguments.
*
* @param string $template
* @param array $arguments
*
* @throws \Colibri\Database\Exception\SqlException
*/
public function queryTemplate($template, ...$arguments)
{
$strQuery = self::getQueryTemplate($template, $arguments);
$this->connection->query($strQuery);
}
/**
* Открывает транзакцию.
* Starts database transaction.
*
* @throws \Colibri\Database\Exception\SqlException
*/
public function transactionStart()
{
$this->connection->query('START TRANSACTION;');
}
/**
* Откатывает транзакцию.
* Rolls back database transaction.
*
* @throws \Colibri\Database\Exception\SqlException
*/
public function transactionRollback()
{
$this->connection->query('ROLLBACK;');
}
/**
* "Комитит" транзакцию в БД.
* Commits database transaction.
*
* @throws \Colibri\Database\Exception\SqlException
*/
public function transactionCommit()
{
$this->connection->query('COMMIT;');
}
/**
* Возвращает информацию о внешних ключах таблицы.
* Returns table foreign keys info.
*
* @param string $tableName
*
* @return array fields: [TABLE_SCHEMA] ,TABLE_NAME, COLUMN_NAME
* refs to: [REFERENCED_TABLE_SCHEMA ], REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
*
* @throws SqlException
*/
public function getTableFKs($tableName)
{
return $this->connection
->query('SELECT * FROM `KEY_COLUMN_USAGE` WHERE `TABLE_NAME` = \'' . $tableName . '\' AND `REFERENCED_COLUMN_NAME` IS NOT NULL')
->fetchAll()
;
}
/**
* Выполняет несколько запросов внутри одной транзакции.
* Executes number of $queries within transaction.
*
* @param array $queries
*
* @throws \Colibri\Database\Exception\SqlException
*/
public function commit(array $queries)
{
$this->transactionStart();
$this->queries($queries, true);
$this->transactionCommit();
}
}