[ 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 */ public function IsTableExist (PDO $handle, string $tableName): bool { // Создаю SQL-запрос $sql = "SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME = UPPER(: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 \"$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'; // Получаю связанную таблицу $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; } }