This commit is contained in:
2025-08-05 18:33:19 +03:00
parent 06d92863ee
commit 3161fcf4dd
21 changed files with 1449 additions and 83 deletions

View File

@@ -5,7 +5,10 @@
namespace goodboyalex\php_db_components_pack\classes\tm_drivers;
use goodboyalex\php_db_components_pack\classes\DataBaseHeader;
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_db_components_pack\classes\DataBaseColumn;
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 PDO;
@@ -19,6 +22,20 @@
*/
final class MSSQLTableManager implements ITableManager
{
/**
* @var array $TypeConversation Массив типов.
*/
public array $TypeConversation {
get => [
DBType::INT->name => 'INT',
DBType::FLOAT->name => 'DECIMAL(p,s)',
DBType::STRING->name => 'NVARCHAR',
DBType::BOOL->name => 'BIT',
DBType::DATE->name => 'DATETIME',
DBType::ARRAY->name => 'XML'
];
}
/**
* @inheritDoc
*/
@@ -37,16 +54,104 @@
return $stmt->fetchColumn() === '1';
}
public function CreateTable (PDO $handle, string $tableName, DataBaseHeader $columns): bool
/**
* @inheritDoc
*/
public function CreateTable (PDO $handle, string $tableName, ObjectArray $columns): bool
{
// TODO: Implement CreateTable() method.
// Если таблица $tableName уже существует
if ($this->IsTableExist($handle, $tableName))
// - то прерываю
return false;
return false;
// Создаю массив столбцов
$colArray = [];
// Для каждого переданного столбца
foreach ($columns as $column)
// - конвертирую его в строку и добавляю в массив
$colArray[] = $this->ParseColumn($column);
// Конвертирую массив столбцов в строку
$columnsStr = implode(', ', $colArray);
// Создаю SQL запрос
$sql = "CREATE TABLE [$tableName] ($columnsStr)";
// Подготавливаю запрос
$stmt = $handle->prepare($sql);
// Выполняю запрос
$stmt->execute();
// Возвращаю, существует ли теперь таблица
return $this->IsTableExist($handle, $tableName);
}
public function DropTable (PDO $handle, string $tableName): bool
/**
* @inheritDoc
*/
public function ParseColumn (DataBaseColumn $column): string
{
// TODO: Implement DropTable() method.
return false;
// Получаю тип данных
$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';
// Получаю связанную таблицу
$fkDefinitionTable = $column->ForeignWith->Get(0);
// - и столбец в ней
$fkDefinitionKey = $column->ForeignWith->Get(1);
// Если связанная таблица и столбец определены
if (!($fkDefinitionTable == null || $fkDefinitionKey == null))
// - то добавляю REFERENCES
$result .= " REFERENCES $fkDefinitionTable($fkDefinitionKey)";
// Если заданы проверки
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 .= ' IDENTITY(1,1)';
// Вывожу результат
return $result;
}
}