[ 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 */ public function IsTableExist (PDO $handle, string $tableName): bool { // Создаю SQL-запрос $sql = "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name=: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 IF NOT EXISTS \"$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'; // Если заданы проверки 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; } }