true - таблица существует, false
- не существует.
*/
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 Результат создания: true
, если таблица создана и false
, если
* произошла ошибка.
*/
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 Результат удаления: true
- таблица удалена, false
- произошла
* неизвестная ошибка при удалении.
*/
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);
}
}