20250805
This commit is contained in:
@@ -5,9 +5,13 @@
|
||||
|
||||
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;
|
||||
use PDOException;
|
||||
|
||||
/**
|
||||
* Система менеджмента таблицами базы данных PostgreSQL.
|
||||
@@ -19,6 +23,20 @@
|
||||
*/
|
||||
final class PostgreSQLTableManager implements ITableManager
|
||||
{
|
||||
/**
|
||||
* @var array $TypeConversation Массив типов.
|
||||
*/
|
||||
public array $TypeConversation {
|
||||
get => [
|
||||
DBType::INT->name => 'INTEGER',
|
||||
DBType::FLOAT->name => 'NUMERIC',
|
||||
DBType::STRING->name => 'TEXT',
|
||||
DBType::BOOL->name => 'BOOL',
|
||||
DBType::DATE->name => 'TIMESTAMPTZ',
|
||||
DBType::ARRAY->name => 'JSONB'
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
@@ -41,16 +59,109 @@
|
||||
return $stmt->fetchColumn() === 'true';
|
||||
}
|
||||
|
||||
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)";
|
||||
|
||||
try {
|
||||
// Подготавливаю запрос
|
||||
$stmt = $handle->prepare($sql);
|
||||
|
||||
// Выполняю запрос
|
||||
$stmt->execute();
|
||||
|
||||
// Возвращаю, существует ли теперь таблица
|
||||
return $this->IsTableExist($handle, $tableName);
|
||||
}
|
||||
catch (PDOException) {
|
||||
// - в случае ошибки вывожу FALSE
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
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 .= ' SERIAL';
|
||||
|
||||
// Вывожу результат
|
||||
return $result;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user