174 lines
7.2 KiB
PHP
174 lines
7.2 KiB
PHP
<?php
|
||
|
||
/**
|
||
* @noinspection SqlNoDataSourceInspection
|
||
*/
|
||
|
||
namespace goodboyalex\php_db_components_pack\traits\Database;
|
||
|
||
use Exception;
|
||
use goodboyalex\php_components_pack\classes\ObjectArray;
|
||
use goodboyalex\php_db_components_pack\classes\DBItemProperty;
|
||
use goodboyalex\php_db_components_pack\classes\tm_drivers\MSSQLTableManager;
|
||
use goodboyalex\php_db_components_pack\classes\tm_drivers\MySQLTableManager;
|
||
use goodboyalex\php_db_components_pack\classes\tm_drivers\OracleDBTableManager;
|
||
use goodboyalex\php_db_components_pack\classes\tm_drivers\PostgreSQLTableManager;
|
||
use goodboyalex\php_db_components_pack\classes\tm_drivers\SQLiteTableManager;
|
||
use goodboyalex\php_db_components_pack\enums\DBDriver;
|
||
use goodboyalex\php_db_components_pack\enums\DBOperation;
|
||
use goodboyalex\php_db_components_pack\interfaces\IDBItem;
|
||
use PDO;
|
||
|
||
/**
|
||
* Трейт для управления таблицами базы данных.
|
||
*
|
||
* @author Александр Бабаев
|
||
* @package php_components_pack
|
||
* @version 1.0
|
||
* @since 1.0
|
||
* @see PDO
|
||
*/
|
||
trait DatabaseTableManagement
|
||
{
|
||
/**
|
||
* Проверяет, существует ли таблица.
|
||
*
|
||
* @param string $tableName Имя таблицы.
|
||
*
|
||
* @return bool Результат проверки: <code>true</code> - таблица существует, <code>false</code> - не существует.
|
||
*/
|
||
public function IsTableExist (string $tableName): bool
|
||
{
|
||
// Получаю систему управления таблицами БД
|
||
$dbDrv = match ($this->Config->Driver) {
|
||
DBDriver::MySQL => new MySQLTableManager(),
|
||
DBDriver::MSSQL => new MSSQLTableManager(),
|
||
DBDriver::PostgreSQL => new PostgreSQLTableManager(),
|
||
DBDriver::OracleDB => new OracleDBTableManager(),
|
||
DBDriver::SQLite => new SQLiteTableManager()
|
||
};
|
||
|
||
// Проверяю существование таблицы, вывожу результат
|
||
return $dbDrv->isTableExist($this->DataBaseHandle, $tableName);
|
||
}
|
||
|
||
/**
|
||
* Создаёт новую таблицу.
|
||
*
|
||
* @param string $tableName Имя таблицы.
|
||
* @param string $dbItemClass Класс моделей, которых будет представлять эта таблица.
|
||
*
|
||
* @return bool Результат создания: <code>true</code>, если таблица создана и <code>false</code>, если
|
||
* произошла ошибка.
|
||
*/
|
||
public function CreateTable (string $tableName, string $dbItemClass): bool
|
||
{
|
||
// Создаю экземпляр класса
|
||
$instance = new $dbItemClass();
|
||
|
||
// Проверяю, что он реализует интерфейс IDBItem
|
||
if (!$instance instanceof IDBItem)
|
||
// - если нет, ошибка
|
||
return false;
|
||
|
||
// Получаю свойства класса
|
||
$properties = self::GetProperties($instance, DBOperation::CreateTable);
|
||
|
||
// Создаю массив столбцов
|
||
$columns = new ObjectArray();
|
||
|
||
/**
|
||
* Для каждого свойства...
|
||
*
|
||
* @var DBItemProperty $property Свойство.
|
||
*/
|
||
foreach ($properties as $property)
|
||
// - добавляю его столбцы в массив столбцов
|
||
$columns->Add($property->Column);
|
||
|
||
// Получаю систему управления таблицами БД
|
||
$dbDrv = match ($this->Config->Driver) {
|
||
DBDriver::MySQL => new MySQLTableManager(),
|
||
DBDriver::MSSQL => new MSSQLTableManager(),
|
||
DBDriver::PostgreSQL => new PostgreSQLTableManager(),
|
||
DBDriver::OracleDB => new OracleDBTableManager(),
|
||
DBDriver::SQLite => new SQLiteTableManager()
|
||
};
|
||
|
||
try {
|
||
// Активирую транзакцию
|
||
$this->InitTransaction();
|
||
|
||
// Создаю таблицу и возвращаю результат
|
||
$result = $dbDrv->CreateTable($this->DataBaseHandle, $tableName, $columns);
|
||
|
||
// Отправляю данные в БД
|
||
$this->Commit();
|
||
|
||
// Возвращаю результат
|
||
return $result;
|
||
}
|
||
catch (Exception $exception) {
|
||
// - в случае ошибки, пытаюсь откатиться назад
|
||
$this->RollBack();
|
||
|
||
// - обрабатываю исключение
|
||
$this->HandleException($exception, false);
|
||
|
||
// - возвращаю провал
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Удаляет таблицу.
|
||
*
|
||
* @param string $tableName Имя удаляемой таблицы.
|
||
*
|
||
* @return bool Результат удаления: <code>true</code> - таблица удалена, <code>false</code> - произошла
|
||
* неизвестная ошибка при удалении.
|
||
*/
|
||
public function DropTable (string $tableName): bool
|
||
{
|
||
// Если таблицы не существует или она уже удалена
|
||
if (!$this->IsTableExist($tableName))
|
||
// - то возвращаем true
|
||
return true;
|
||
|
||
// SQL-запрос
|
||
$sql = "DROP TABLE dbo.`$tableName`";
|
||
|
||
// Инициализирую транзакцию
|
||
$this->InitTransaction();
|
||
|
||
// Выполняю SQL-запрос удаления
|
||
$result = $this->Execute($sql);
|
||
|
||
// Если неудачно
|
||
if ($result === false) {
|
||
// - то откатываю изменения
|
||
$this->RollBack();
|
||
|
||
// - возвращаю провал
|
||
return false;
|
||
}
|
||
|
||
try {
|
||
// Пытаюсь отправить изменения
|
||
$this->Commit();
|
||
}
|
||
catch (Exception $exception) {
|
||
// - в случае ошибки, откатываю изменения
|
||
$this->RollBack();
|
||
|
||
// - описываю ошибку
|
||
$this->HandleException($exception, false);
|
||
|
||
// - возвращаю провал
|
||
return false;
|
||
}
|
||
|
||
// Возвращаю, существует ли теперь таблица
|
||
return $this->IsTableExist($tableName);
|
||
}
|
||
} |