From 81f23a18741544efcd3323f4e93a83598b277d78 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Mon, 28 Jan 2019 11:23:34 +0330 Subject: [PATCH] sqlite primary key --- src/generators/sqlgeneratorbase.cpp | 16 ++++++++--- src/generators/sqlgeneratorbase_p.h | 2 ++ src/generators/sqlitegenerator.cpp | 44 +++++++++++++++++++---------- src/generators/sqlitegenerator.h | 2 ++ 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/src/generators/sqlgeneratorbase.cpp b/src/generators/sqlgeneratorbase.cpp index bfed8a4..03b3c6e 100644 --- a/src/generators/sqlgeneratorbase.cpp +++ b/src/generators/sqlgeneratorbase.cpp @@ -220,10 +220,11 @@ QString SqlGeneratorBase::diff(TableModel *oldTable, TableModel *newTable) .arg(newTable->name()) .arg(columnSql.join(",\n")); } else { - if (!newTable->primaryKey().isNull()) - columnSql << QString("CONSTRAINT pk_%1 PRIMARY KEY (%2)") - .arg(newTable->name()) - .arg(newTable->primaryKey()); + if (!newTable->primaryKey().isNull()) { + QString pkCon = primaryKeyConstraint(newTable); + if (!pkCon.isEmpty()) + columnSql << pkCon; + } sql = QString("CREATE TABLE %1 \n(%2)") .arg(newTable->name()) @@ -945,6 +946,13 @@ void SqlGeneratorBase::appendSkipTake(QString &sql, int skip, int take) Q_UNUSED(take); } +QString SqlGeneratorBase::primaryKeyConstraint(const TableModel *table) const +{ + return QString("CONSTRAINT pk_%1 PRIMARY KEY (%2)") + .arg(table->name()) + .arg(table->primaryKey()); +} + QString SqlGeneratorBase::createConditionalPhrase(const PhraseData *d) const { if (!d) diff --git a/src/generators/sqlgeneratorbase_p.h b/src/generators/sqlgeneratorbase_p.h index 35a545d..821ba40 100644 --- a/src/generators/sqlgeneratorbase_p.h +++ b/src/generators/sqlgeneratorbase_p.h @@ -128,6 +128,8 @@ public: virtual QString phrase(const PhraseData *d) const; virtual QString operatorString(const PhraseData::Condition &cond) const; virtual void appendSkipTake(QString &sql, int skip = -1, int take = -1); + virtual QString primaryKeyConstraint(const TableModel *table) const; + protected: QString createConditionalPhrase(const PhraseData *d) const; QString createFieldPhrase(const PhraseList &ph); diff --git a/src/generators/sqlitegenerator.cpp b/src/generators/sqlitegenerator.cpp index a4f80ca..8396e01 100644 --- a/src/generators/sqlitegenerator.cpp +++ b/src/generators/sqlitegenerator.cpp @@ -33,10 +33,12 @@ QString SqliteGenerator::fieldType(FieldModel *field) { QString ret = field->name + " "; QString dbType; - QString primaryKeyPerfix; - if (field->isPrimaryKey) - primaryKeyPerfix = " PRIMARY KEY"; - + if (field->isPrimaryKey) { + QString primaryKeyPerfix = " PRIMARY KEY"; + if (field->isAutoIncrement) + primaryKeyPerfix += " AUTOINCREMENT"; + return "INTEGER" + primaryKeyPerfix; + } switch (field->type) { case QMetaType::Bool: return "BOOLEAN"; case QMetaType::QByteArray: return "BLOB"; @@ -47,16 +49,16 @@ QString SqliteGenerator::fieldType(FieldModel *field) case QMetaType::Float: return "FLOAT"; case QMetaType::SChar: - case QMetaType::Char: return "TINYINT" + primaryKeyPerfix; - case QMetaType::UChar: return "TINYINT UNSIGNED" + primaryKeyPerfix; - case QMetaType::Short: return "SMALLINT" + primaryKeyPerfix; - case QMetaType::UShort: return "SMALLINT UNSIGNED" + primaryKeyPerfix; - case QMetaType::Int: return "INT" + primaryKeyPerfix; - case QMetaType::UInt: return "INT UNSIGNED" + primaryKeyPerfix; - case QMetaType::Long: return "MEDIUMINT" + primaryKeyPerfix; - case QMetaType::ULong: return "MEDIUMINT UNSIGNED" + primaryKeyPerfix; - case QMetaType::LongLong: return "BIGINT" + primaryKeyPerfix; - case QMetaType::ULongLong: return "BIGINT UNSIGNED" + primaryKeyPerfix; + case QMetaType::Char: return "TINYINT"; + case QMetaType::UChar: return "TINYINT UNSIGNED"; + case QMetaType::Short: return "SMALLINT"; + case QMetaType::UShort: return "SMALLINT UNSIGNED"; + case QMetaType::Int: return "INT"; + case QMetaType::UInt: return "INT UNSIGNED"; + case QMetaType::Long: return "MEDIUMINT"; + case QMetaType::ULong: return "MEDIUMINT UNSIGNED"; + case QMetaType::LongLong: return "BIGINT"; + case QMetaType::ULongLong: return "BIGINT UNSIGNED"; case QMetaType::QChar: return "NCHAR(1)"; @@ -87,7 +89,19 @@ void SqliteGenerator::appendSkipTake(QString &sql, int skip, int take) if (take != -1 && skip != -1) sql.append(QString(" LIMIT %1 OFFSET %2") .arg(take) - .arg(skip)); + .arg(skip)); +} + +QString SqliteGenerator::primaryKeyConstraint(const TableModel *table) const +{ + Q_UNUSED(table); + return QString(); +// QString sql = QString("CONSTRAINT pk_%1 PRIMARY KEY (%2)") +// .arg(table->name()) +// .arg(table->primaryKey()); +// if (table->field(table->primaryKey())->isAutoIncrement) +// sql += " AUTOINCREMENT"; +// return sql; } NUT_END_NAMESPACE diff --git a/src/generators/sqlitegenerator.h b/src/generators/sqlitegenerator.h index 36b5811..2769d58 100644 --- a/src/generators/sqlitegenerator.h +++ b/src/generators/sqlitegenerator.h @@ -34,6 +34,8 @@ public: QString fieldType(FieldModel *field); void appendSkipTake(QString &sql, int skip, int take); + + QString primaryKeyConstraint(const TableModel *table) const; }; NUT_END_NAMESPACE