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;
|
||||
}
|
||||
}
|
@@ -42,4 +42,14 @@
|
||||
* Операция подсчета количества.
|
||||
*/
|
||||
case Count = 4;
|
||||
|
||||
/**
|
||||
* Операция создания таблицы в базе данных.
|
||||
*/
|
||||
case CreateTable = 5;
|
||||
|
||||
/**
|
||||
* Операция удаления таблицы в базе данных.
|
||||
*/
|
||||
case DropTable = 6;
|
||||
}
|
@@ -3,6 +3,11 @@
|
||||
namespace goodboyalex\php_db_components_pack\enums;
|
||||
|
||||
use goodboyalex\php_components_pack\traits\EnumExtensionsTrait;
|
||||
use goodboyalex\php_db_components_pack\classes\tm_drivers\MSSQLTableManager;
|
||||
use goodboyalex\php_db_components_pack\classes\tm_drivers\MySQLTableManager;
|
||||
use goodboyalex\php_db_components_pack\classes\tm_drivers\OracleDBTableManager;
|
||||
use goodboyalex\php_db_components_pack\classes\tm_drivers\PostgreSQLTableManager;
|
||||
use goodboyalex\php_db_components_pack\classes\tm_drivers\SQLiteTableManager;
|
||||
|
||||
/**
|
||||
* Перечисление типов в БД.
|
||||
@@ -46,4 +51,27 @@
|
||||
* Массив/объект.
|
||||
*/
|
||||
case ARRAY = 5;
|
||||
|
||||
/**
|
||||
* Переводит значение из типа DBType в тип, пригодный в СУБД.
|
||||
*
|
||||
* @param DBDriver $driver Тип драйвера СУБД.
|
||||
* @param DBType $value Тип данных.
|
||||
*
|
||||
* @return string SQL-тип.
|
||||
*/
|
||||
public static function ToSQLType (DBDriver $driver, DBType $value): string
|
||||
{
|
||||
// Получаю систему управления таблицами БД
|
||||
$dbDrv = match ($driver) {
|
||||
DBDriver::MySQL => new MySQLTableManager(),
|
||||
DBDriver::MSSQL => new MSSQLTableManager(),
|
||||
DBDriver::PostgreSQL => new PostgreSQLTableManager(),
|
||||
DBDriver::OracleDB => new OracleDBTableManager(),
|
||||
DBDriver::SQLite => new SQLiteTableManager()
|
||||
};
|
||||
|
||||
// Получаю тип
|
||||
return $dbDrv->TypeConversation[$value->GetValue()];
|
||||
}
|
||||
}
|
@@ -2,7 +2,8 @@
|
||||
|
||||
namespace goodboyalex\php_db_components_pack\interfaces;
|
||||
|
||||
use goodboyalex\php_db_components_pack\classes\DataBaseHeader;
|
||||
use goodboyalex\php_components_pack\classes\ObjectArray;
|
||||
use goodboyalex\php_db_components_pack\classes\DataBaseColumn;
|
||||
use PDO;
|
||||
|
||||
/**
|
||||
@@ -15,6 +16,13 @@
|
||||
*/
|
||||
interface ITableManager
|
||||
{
|
||||
/**
|
||||
* @var array $TypeConversation Таблица соответствий типов данных PHP и соответствующего драйвера СУБД.
|
||||
*/
|
||||
public array $TypeConversation {
|
||||
get;
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет существование таблицы в базе данных.
|
||||
*
|
||||
@@ -30,19 +38,18 @@
|
||||
*
|
||||
* @param PDO $handle Представляет соединение между PHP и сервером базы данных.
|
||||
* @param string $tableName Имя таблицы.
|
||||
* @param DataBaseHeader $columns Колонки таблицы.
|
||||
* @param ObjectArray $columns Колонки таблицы.
|
||||
*
|
||||
* @return bool Возвращает <code>true</code>, если таблица успешно создана, иначе возвращает <code>false</code>.
|
||||
*/
|
||||
public function CreateTable (PDO $handle, string $tableName, DataBaseHeader $columns): bool;
|
||||
public function CreateTable (PDO $handle, string $tableName, ObjectArray $columns): bool;
|
||||
|
||||
/**
|
||||
* Удаляет таблицу из базы данных.
|
||||
* Разбирает столбец для SQL-запроса создания.
|
||||
*
|
||||
* @param PDO $handle Представляет соединение между PHP и сервером базы данных.
|
||||
* @param string $tableName Имя таблицы.
|
||||
* @param DataBaseColumn $column Столбец таблицы.
|
||||
*
|
||||
* @return bool Возвращает <code>true</code>, если таблица успешно удалена, иначе возвращает <code>false</code>.
|
||||
* @return string SQL-представление столбца.
|
||||
*/
|
||||
public function DropTable (PDO $handle, string $tableName): bool;
|
||||
public function ParseColumn (DataBaseColumn $column): string;
|
||||
}
|
@@ -10,7 +10,7 @@
|
||||
* Модель параметров базы данных.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @package php_db_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.0
|
||||
*/
|
||||
|
@@ -21,7 +21,7 @@
|
||||
use goodboyalex\php_db_components_pack\attributes\PrimaryKey;
|
||||
use goodboyalex\php_db_components_pack\attributes\Unique;
|
||||
use goodboyalex\php_db_components_pack\classes\ConditionBuilder;
|
||||
use goodboyalex\php_db_components_pack\classes\DataBaseHeadItem;
|
||||
use goodboyalex\php_db_components_pack\classes\DataBaseColumn;
|
||||
use goodboyalex\php_db_components_pack\classes\DBItemProperty;
|
||||
use goodboyalex\php_db_components_pack\enums\DBOperation;
|
||||
use goodboyalex\php_db_components_pack\enums\DBType;
|
||||
@@ -219,7 +219,7 @@
|
||||
$isAutoIncrement = $aiAttr !== null;
|
||||
|
||||
// - создаю заголовок
|
||||
$columnHeader = new DataBaseHeadItem($fieldName, $dataType, $isNotNull, $isUnique, $isPrimary,
|
||||
$columnHeader = new DataBaseColumn($fieldName, $dataType, $isNotNull, $isUnique, $isPrimary,
|
||||
$foreignWith, $checkFunc, $default, $isAutoIncrement);
|
||||
|
||||
|
||||
|
@@ -6,12 +6,17 @@
|
||||
|
||||
namespace goodboyalex\php_db_components_pack\traits\Database;
|
||||
|
||||
use Exception;
|
||||
use goodboyalex\php_components_pack\classes\ObjectArray;
|
||||
use goodboyalex\php_db_components_pack\classes\DBItemProperty;
|
||||
use goodboyalex\php_db_components_pack\classes\tm_drivers\MSSQLTableManager;
|
||||
use goodboyalex\php_db_components_pack\classes\tm_drivers\MySQLTableManager;
|
||||
use goodboyalex\php_db_components_pack\classes\tm_drivers\OracleDBTableManager;
|
||||
use goodboyalex\php_db_components_pack\classes\tm_drivers\PostgreSQLTableManager;
|
||||
use goodboyalex\php_db_components_pack\classes\tm_drivers\SQLiteTableManager;
|
||||
use goodboyalex\php_db_components_pack\enums\DBDriver;
|
||||
use goodboyalex\php_db_components_pack\enums\DBOperation;
|
||||
use goodboyalex\php_db_components_pack\interfaces\IDBItem;
|
||||
use PDO;
|
||||
|
||||
/**
|
||||
@@ -46,4 +51,124 @@
|
||||
// Проверяю существование таблицы, вывожу результат
|
||||
return $dbDrv->isTableExist($this->DataBaseHandle, $tableName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Создаёт новую таблицу.
|
||||
*
|
||||
* @param string $tableName Имя таблицы.
|
||||
* @param string $dbItemClass Класс моделей, которых будет представлять эта таблица.
|
||||
*
|
||||
* @return bool Результат создания: <code>true</code>, если таблица создана и <code>false</code>, если
|
||||
* произошла ошибка.
|
||||
*/
|
||||
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 Результат удаления: <code>true</code> - таблица удалена, <code>false</code> - произошла
|
||||
* неизвестная ошибка при удалении.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
}
|
@@ -37,7 +37,7 @@
|
||||
$properties = self::GetProperties($item, DBOperation::Update);
|
||||
|
||||
// Получаю первичные ключи объекта
|
||||
$primaryKeys = $properties->GetRows(fn (DBItemProperty $property): bool => $property->IsPrimaryKey);
|
||||
$primaryKeys = $properties->GetRows(fn (DBItemProperty $property): bool => $property->Column->IsPrimaryKey);
|
||||
|
||||
// Создаю условие по первичным ключам (оно же и WHERE для обновления)
|
||||
$where = new ConditionBuilder();
|
||||
|
Reference in New Issue
Block a user