20250805
This commit is contained in:
@@ -6,12 +6,17 @@
|
||||
|
||||
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;
|
||||
|
||||
/**
|
||||
@@ -46,4 +51,124 @@
|
||||
// Проверяю существование таблицы, вывожу результат
|
||||
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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user