diff options
Diffstat (limited to 'Plugins/SqlEnterpriseFormatter/formatcreatetable.cpp')
| -rw-r--r-- | Plugins/SqlEnterpriseFormatter/formatcreatetable.cpp | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/Plugins/SqlEnterpriseFormatter/formatcreatetable.cpp b/Plugins/SqlEnterpriseFormatter/formatcreatetable.cpp new file mode 100644 index 0000000..d37239a --- /dev/null +++ b/Plugins/SqlEnterpriseFormatter/formatcreatetable.cpp @@ -0,0 +1,224 @@ +#include "formatcolumntype.h" +#include "formatcreatetable.h" +#include "sqlenterpriseformatter.h" + +FormatCreateTable::FormatCreateTable(SqliteCreateTable* createTable) : + createTable(createTable) +{ +} + +void FormatCreateTable::formatInternal() +{ + withKeyword("CREATE"); + if (createTable->tempKw) + withKeyword("TEMP"); + else if (createTable->temporaryKw) + withKeyword("TEMPORARY"); + + withKeyword("TABLE"); + if (createTable->ifNotExistsKw) + withKeyword("IF").withKeyword("NOT").withKeyword("EXISTS"); + + if (dialect == Dialect::Sqlite3 && !createTable->database.isNull()) + withId(createTable->database).withIdDot(); + + withId(createTable->table); + + if (createTable->select) + withKeyword("AS").withStatement(createTable->select); + else + { + withParDefLeft(); + formatColumns(createTable->columns); + if (createTable->constraints.size() > 0) + withListComma().withStatementList(createTable->constraints); + + withParDefRight(); + + if (!createTable->withOutRowId.isNull()) + withKeyword("WITHOUT").withId("ROWID"); + } + + withSemicolon(); +} + +void FormatCreateTable::formatColumns(const QList<SqliteCreateTable::Column*>& columns) +{ + int maxColNameIndent = 0; + int maxColTypeIndent = 0; + FormatColumnType* formatColType = nullptr; + foreach (SqliteCreateTable::Column* stmt, columns) + { + maxColNameIndent = qMax(getColNameLength(stmt->name), maxColNameIndent); + + if (stmt->type) + { + + formatColType = getFormatStatement<FormatColumnType>(stmt->type); + maxColTypeIndent = qMax(formatColType->format().trimmed().length(), maxColTypeIndent); + delete formatColType; + } + } + + if (columns.size() > 1) + { + maxColNameIndent++; // for a single whitespace to line up with other columns + maxColTypeIndent++; // the same for constraints + } + + withStatementList(columns, "columns", ListSeparator::COMMA, [maxColNameIndent, maxColTypeIndent](FormatStatement* formatStmt) + { + FormatCreateTableColumn* colStmt = dynamic_cast<FormatCreateTableColumn*>(formatStmt); + if (colStmt) + { + colStmt->setColNameIndent(maxColNameIndent); + colStmt->setColTypeIndent(maxColTypeIndent); + } + }); +} + +int FormatCreateTable::getColNameLength(const QString& name) +{ + if (cfg->SqlEnterpriseFormatter.AlwaysUseNameWrapping.get()) + return wrapObjName(name, dialect, wrapper).length(); + else + return wrapObjIfNeeded(name, dialect, wrapper).length(); +} + +FormatCreateTableColumn::FormatCreateTableColumn(SqliteCreateTable::Column* column) : + column(column) +{ +} + +void FormatCreateTableColumn::setColNameIndent(int value) +{ + colNameIndent = value; +} + +void FormatCreateTableColumn::setColTypeIndent(int value) +{ + colTypeIndent = value; +} + +void FormatCreateTableColumn::formatInternal() +{ + ListSeparator sep = ListSeparator::NONE; + if (cfg->SqlEnterpriseFormatter.NlBetweenConstraints.get()) + sep = ListSeparator::NEW_LINE; + + withId(column->name).withIncrIndent(colNameIndent).withStatement(column->type).withIncrIndent(colTypeIndent) + .withStatementList(column->constraints, QString(), sep).withDecrIndent().withDecrIndent(); +} + + +FormatCreateTableColumnConstraint::FormatCreateTableColumnConstraint(SqliteCreateTable::Column::Constraint* constr) : + constr(constr) +{ +} + +void FormatCreateTableColumnConstraint::formatInternal() +{ + if (!constr->name.isNull()) + withKeyword("CONSTRAINT").withId(constr->name); + + switch (constr->type) + { + case SqliteCreateTable::Column::Constraint::PRIMARY_KEY: + { + withKeyword("PRIMARY").withKeyword("KEY").withSortOrder(constr->sortOrder).withConflict(constr->onConflict); + if (constr->autoincrKw) + withKeyword("AUTOINCREMENT"); + + break; + } + case SqliteCreateTable::Column::Constraint::NOT_NULL: + { + withKeyword("NOT").withKeyword("NULL").withConflict(constr->onConflict); + break; + } + case SqliteCreateTable::Column::Constraint::UNIQUE: + { + withKeyword("UNIQUE").withConflict(constr->onConflict); + break; + } + case SqliteCreateTable::Column::Constraint::CHECK: + { + withKeyword("CHECK").withParExprLeft().withStatement(constr->expr).withParExprRight().withConflict(constr->onConflict); + break; + } + case SqliteCreateTable::Column::Constraint::DEFAULT: + { + withKeyword("DEFAULT"); + if (!constr->id.isNull()) + withId(constr->id); + else if (!constr->ctime.isNull()) + withKeyword(constr->ctime); + else if (constr->expr) + withParExprLeft().withStatement(constr->expr).withParExprRight(); + else if (constr->literalNull) + withKeyword("NULL"); + else + withLiteral(constr->literalValue); + + break; + } + case SqliteCreateTable::Column::Constraint::COLLATE: + { + withKeyword("COLLATE").withId(constr->collationName); + break; + } + case SqliteCreateTable::Column::Constraint::FOREIGN_KEY: + { + withStatement(constr->foreignKey); + break; + } + case SqliteCreateTable::Column::Constraint::NULL_: + case SqliteCreateTable::Column::Constraint::NAME_ONLY: + case SqliteCreateTable::Column::Constraint::DEFERRABLE_ONLY: + break; + } +} + + +FormatCreateTableConstraint::FormatCreateTableConstraint(SqliteCreateTable::Constraint* constr) : + constr(constr) +{ +} + +void FormatCreateTableConstraint::formatInternal() +{ + if (!constr->name.isNull()) + withKeyword("CONSTRAINT").withId(constr->name); + + switch (constr->type) + { + case SqliteCreateTable::Constraint::PRIMARY_KEY: + { + withKeyword("PRIMARY").withKeyword("KEY").withParDefLeft().withStatementList(constr->indexedColumns).withParDefRight(); + + if (constr->autoincrKw) + withKeyword("AUTOINCREMENT"); + + withConflict(constr->onConflict); + break; + } + case SqliteCreateTable::Constraint::UNIQUE: + { + withKeyword("UNIQUE").withParDefLeft().withStatementList(constr->indexedColumns).withParDefRight().withConflict(constr->onConflict); + break; + } + case SqliteCreateTable::Constraint::CHECK: + { + withKeyword("CHECK").withParExprLeft().withStatement(constr->expr).withParExprRight().withConflict(constr->onConflict); + break; + } + case SqliteCreateTable::Constraint::FOREIGN_KEY: + { + withKeyword("FOREIGN").withKeyword("KEY").withParDefLeft().withStatementList(constr->indexedColumns) + .withParDefRight().withStatement(constr->foreignKey); + break; + } + case SqliteCreateTable::Constraint::NAME_ONLY: + break; + } +} |
