20250805
This commit is contained in:
@@ -174,8 +174,6 @@
|
||||
$conditionItems[] = self::ParseCondition($key, [$condition]);
|
||||
}
|
||||
|
||||
//var_dump($conditionItems);
|
||||
|
||||
// Возвращаем группу условий
|
||||
return new ConditionGroup($operator, $conditionItems);
|
||||
}
|
||||
|
@@ -31,9 +31,9 @@
|
||||
public string $FieldName;
|
||||
|
||||
/**
|
||||
* @var DataBaseHeadItem $Column Информация об ячейке.
|
||||
* @var DataBaseColumn $Column Информация об ячейке.
|
||||
*/
|
||||
public DataBaseHeadItem $Column;
|
||||
public DataBaseColumn $Column;
|
||||
|
||||
/**
|
||||
* @var bool $IsIgnored Признак того, что свойство игнорируется при сохранении в / загрузке из БД.
|
||||
@@ -61,14 +61,14 @@
|
||||
* @param string $name Имя свойства.
|
||||
* @param mixed|null $value Значение свойства (ещё не конвертированное!).
|
||||
* @param string $fieldName Имя поля в таблице БД.
|
||||
* @param DataBaseHeadItem $column Информация об ячейке.
|
||||
* @param DataBaseColumn $column Информация об ячейке.
|
||||
* @param bool $isIgnored Признак того, что свойство игнорируется при сохранении в / загрузке из БД.
|
||||
* @param callable|null $ConvertToDB Конвертер значения свойства в значение поля БД.
|
||||
* @param Closure|null $ConvertFromDB Конвертер значения поля БД в значение свойства.
|
||||
* @param Closure|null $Compare Функция сравнения значений свойства.
|
||||
*/
|
||||
public function __construct (string $name = '', mixed $value = null, string $fieldName = '',
|
||||
DataBaseHeadItem $column = new DataBaseHeadItem(), bool $isIgnored = false, ?callable $ConvertToDB = null,
|
||||
DataBaseColumn $column = new DataBaseColumn(), bool $isIgnored = false, ?callable $ConvertToDB = null,
|
||||
?Closure $ConvertFromDB = null, ?Closure $Compare = null)
|
||||
{
|
||||
// Установка значений
|
||||
|
@@ -13,7 +13,7 @@
|
||||
* @version 1.0
|
||||
* @since 1.0
|
||||
*/
|
||||
final class DataBaseHeadItem
|
||||
final class DataBaseColumn
|
||||
{
|
||||
/**
|
||||
* @var string $Name Имя колонки.
|
@@ -1,29 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_db_components_pack\classes;
|
||||
|
||||
use goodboyalex\php_components_pack\classes\ObjectArray;
|
||||
|
||||
/**
|
||||
* Класс, описывающий структуру столбцов базы данных.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_db_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.0
|
||||
*/
|
||||
final class DataBaseHeader
|
||||
{
|
||||
/**
|
||||
* @var ObjectArray $Container Столбцы таблицы.
|
||||
*/
|
||||
private ObjectArray $Container;
|
||||
|
||||
/**
|
||||
* Конструктор.
|
||||
*/
|
||||
public function __construct ()
|
||||
{
|
||||
$this->Container = new ObjectArray();
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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 MySQLTableManager implements ITableManager
|
||||
{
|
||||
/**
|
||||
* @var array $TypeConversation Массив типов.
|
||||
*/
|
||||
public array $TypeConversation {
|
||||
get => [
|
||||
DBType::INT->name => 'INT',
|
||||
DBType::FLOAT->name => 'DECIMAL',
|
||||
DBType::STRING->name => 'VARCHAR',
|
||||
DBType::BOOL->name => 'BOOLEAN',
|
||||
DBType::DATE->name => 'TIMESTAMP',
|
||||
DBType::ARRAY->name => 'JSON'
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
@@ -38,16 +55,103 @@
|
||||
return $stmt->fetchColumn() > 0;
|
||||
}
|
||||
|
||||
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 .= ' AUTO_INCREMENT';
|
||||
|
||||
// Вывожу результат
|
||||
return $result;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
|
||||
/**
|
||||
* Система менеджмента таблицами базы данных Oracle DB.
|
||||
@@ -19,6 +23,20 @@
|
||||
*/
|
||||
final class OracleDBTableManager implements ITableManager
|
||||
{
|
||||
/**
|
||||
* @var array $TypeConversation Массив типов.
|
||||
*/
|
||||
public array $TypeConversation {
|
||||
get => [
|
||||
DBType::INT->name => 'NUMBER',
|
||||
DBType::FLOAT->name => 'FLOAT',
|
||||
DBType::STRING->name => 'NVARCHAR2',
|
||||
DBType::BOOL->name => 'NUMBER(1)',
|
||||
DBType::DATE->name => 'DATE',
|
||||
DBType::ARRAY->name => 'CLOB'
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
@@ -37,16 +55,109 @@
|
||||
return $stmt->fetchColumn() > 0;
|
||||
}
|
||||
|
||||
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 .= ' GENERATED BY DEFAULT AS IDENTITY';
|
||||
|
||||
// Вывожу результат
|
||||
return $result;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
|
||||
/**
|
||||
* Система менеджмента таблицами базы данных SQLite.
|
||||
@@ -19,6 +23,20 @@
|
||||
*/
|
||||
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
|
||||
*/
|
||||
@@ -37,16 +55,99 @@
|
||||
return $stmt->fetchColumn() > 0;
|
||||
}
|
||||
|
||||
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 IF NOT EXISTS \"$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';
|
||||
|
||||
// Если заданы проверки
|
||||
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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user