2025-08-07 18:06:55 +03:00

153 lines
5.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* @noinspection SqlNoDataSourceInspection
*/
namespace goodboyalex\php_db_components_pack\classes\tm_drivers;
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_db_components_pack\enums\DBDriver;
use goodboyalex\php_db_components_pack\enums\DBType;
use goodboyalex\php_db_components_pack\interfaces\ITableManager;
use goodboyalex\php_db_components_pack\models\DataBaseColumn;
use PDO;
use PDOException;
/**
* Система менеджмента таблицами базы данных SQLite.
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @since 1.0
*/
final class SQLiteTableManager implements ITableManager
{
/**
* @var array $TypeConversation Массив типов.
*/
public array $TypeConversation {
get => [
DBType::INT->name => 'INTEGER',
DBType::FLOAT->name => 'REAL',
DBType::STRING->name => 'TEXT',
DBType::BOOL->name => 'BOOLEAN',
DBType::DATE->name => 'DATETIME',
DBType::ARRAY->name => 'TEXT'
];
}
/**
* @inheritDoc
*/
public function IsTableExist (PDO $handle, string $tableName): bool
{
// Создаю SQL-запрос
$sql = "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name=:tableName";
// Подготавливаю данные
$stmt = $handle->prepare($sql);
// Выполняю запрос
$stmt->execute(['tableName' => $tableName]);
// Получаю количество таблиц, если >0, то вывожу true, иначе - false
return $stmt->fetchColumn() > 0;
}
/**
* @inheritDoc
*/
public function CreateTable (PDO $handle, string $tableName, ObjectArray $columns): bool
{
// Если таблица $tableName уже существует
if ($this->IsTableExist($handle, $tableName))
// - то прерываю
return false;
// Создаю массив столбцов
$colArray = [];
// Для каждого переданного столбца
foreach ($columns as $column)
// - конвертирую его в строку и добавляю в массив
$colArray[] = $this->ParseColumn($column);
// Конвертирую массив столбцов в строку
$columnsStr = implode(', ', $colArray);
// Создаю SQL запрос
$sql = "CREATE TABLE IF NOT EXISTS \"$tableName\" ($columnsStr)";
try {
// Подготавливаю запрос
$stmt = $handle->prepare($sql);
// Выполняю запрос
$stmt->execute();
// Возвращаю, существует ли теперь таблица
return $this->IsTableExist($handle, $tableName);
}
catch (PDOException) {
// - в случае ошибки вывожу FALSE
return false;
}
}
/**
* @inheritDoc
*/
public function ParseColumn (DataBaseColumn $column): string
{
// Получаю тип данных
$dbType = $column->Type->Get(0);
// Получаю размер типа данных
$dbTypeSize = $column->Type->Get(1) ?? 0;
// Получаю SQL тип данных
$type = DBType::ToSQLType(DBDriver::MySQL, $dbType);
// Если тип данных - строка
if ($dbType == DBType::STRING)
// - то добавляю размер
$type .= '(' . ($dbTypeSize == 0 ? 'MAX' : $dbTypeSize) . ')';
// Формирую начало результата
$result = "$column->Name $type";
// Если должно быть ненулевое значение
if ($column->IsNotNull)
// - то добавляю NOT NULL
$result .= ' NOT NULL';
// Если должно быть уникальное значение
if ($column->IsUnique)
// - то добавляю UNIQUE
$result .= ' UNIQUE';
// Если это первичный ключ
if ($column->IsPrimaryKey)
// - то добавляю PRIMARY KEY
$result .= ' PRIMARY KEY';
// Если заданы проверки
if ($column->Check->Count() > 0)
// - то добавляю CHECK
$result .= " CHECK({$column->Check->Build()})";
// Если задано значение по умолчанию
if ($column->Default != null)
// - то добавляю DEFAULT
$result .= " DEFAULT '$column->Default'";
// Если это поле AutoIncrement
if ($column->IsAutoIncrement)
// - то добавляю AUTO_INCREMENT
$result .= ' AUTOINCREMENT';
// Вывожу результат
return $result;
}
}