From 1bce39539f7fe66057dbd30bd4a5af157b4e6784 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Mon, 11 Feb 2019 11:30:00 +0330 Subject: [PATCH] generators data types --- src/generators/postgresqlgenerator.cpp | 12 +- src/generators/postgresqlgenerator.h | 2 +- src/generators/sqlitegenerator.cpp | 7 + src/generators/sqlservergenerator.cpp | 77 +++++--- src/generators/sqlservergenerator.h | 2 +- test/tst_datatypes/tst_datatypes.cpp | 2 +- .../{maintest.h => tst_datatypes.h} | 1 - test/tst_datatypes/tst_datatypes.pro | 4 +- test/tst_generators/tst_generators.cpp | 174 ++++++++++-------- test/tst_generators/tst_generators.h | 27 +++ test/tst_generators/tst_generators.pro | 3 + 11 files changed, 205 insertions(+), 106 deletions(-) rename test/tst_datatypes/{maintest.h => tst_datatypes.h} (98%) create mode 100644 test/tst_generators/tst_generators.h diff --git a/src/generators/postgresqlgenerator.cpp b/src/generators/postgresqlgenerator.cpp index 7d75100..ab01305 100644 --- a/src/generators/postgresqlgenerator.cpp +++ b/src/generators/postgresqlgenerator.cpp @@ -39,6 +39,8 @@ QString PostgreSqlGenerator::fieldType(FieldModel *field) case QMetaType::Bool: dbType = "BOOLEAN"; break; + + case QMetaType::QBitArray: case QMetaType::QByteArray: dbType = "BYTEA"; break; @@ -75,14 +77,20 @@ QString PostgreSqlGenerator::fieldType(FieldModel *field) dbType = "INTEGER"; break; - case QMetaType::ULongLong: + case QMetaType::Long: + case QMetaType::ULong: case QMetaType::LongLong: + case QMetaType::ULongLong: if(field->isAutoIncrement) dbType = "BIGSERIAL"; else dbType = "BIGINT"; break; + case QMetaType::Char: + case QMetaType::QChar: + return "CHAR(1)"; + case QMetaType::QString: if(field->length) dbType = QString("VARCHAR(%1)").arg(field->length); @@ -121,6 +129,8 @@ QString PostgreSqlGenerator::fieldType(FieldModel *field) case QMetaType::QStringList: return "TEXT[]"; + case QMetaType::QSize: + case QMetaType::QSizeF: case QMetaType::QUrl: case QMetaType::QColor: return "TEXT"; diff --git a/src/generators/postgresqlgenerator.h b/src/generators/postgresqlgenerator.h index ecc1d46..ead181d 100644 --- a/src/generators/postgresqlgenerator.h +++ b/src/generators/postgresqlgenerator.h @@ -29,7 +29,7 @@ NUT_BEGIN_NAMESPACE class PostgreSqlGenerator : public SqlGeneratorBase { public: - explicit PostgreSqlGenerator(Database *parent); + explicit PostgreSqlGenerator(Database *parent = nullptr); QString fieldType(FieldModel *field); diff --git a/src/generators/sqlitegenerator.cpp b/src/generators/sqlitegenerator.cpp index 0436882..05b33d0 100644 --- a/src/generators/sqlitegenerator.cpp +++ b/src/generators/sqlitegenerator.cpp @@ -39,6 +39,7 @@ QString SqliteGenerator::fieldType(FieldModel *field) } switch (field->type) { case QMetaType::Bool: return "BOOLEAN"; + case QMetaType::QBitArray: case QMetaType::QByteArray: return "BLOB"; case QMetaType::QDate: return "DATE"; case QMetaType::QDateTime: return "DATETIME"; @@ -67,6 +68,12 @@ QString SqliteGenerator::fieldType(FieldModel *field) case QMetaType::QJsonDocument: case QMetaType::QPoint: case QMetaType::QPointF: + case QMetaType::QSize: + case QMetaType::QSizeF: + case QMetaType::QLine: + case QMetaType::QLineF: + case QMetaType::QRect: + case QMetaType::QRectF: case QMetaType::QPolygon: case QMetaType::QPolygonF: case QMetaType::QStringList: diff --git a/src/generators/sqlservergenerator.cpp b/src/generators/sqlservergenerator.cpp index 60237e5..cdf4a77 100644 --- a/src/generators/sqlservergenerator.cpp +++ b/src/generators/sqlservergenerator.cpp @@ -45,10 +45,44 @@ QString SqlServerGenerator::fieldType(FieldModel *field) QString dbType; switch (field->type) { - case QVariant::Bool: + case QMetaType::Bool: dbType = "BIT"; break; - case QVariant::ByteArray: + + case QMetaType::Char: + case QMetaType::QChar: + dbType = "CHAR(1)"; + break; + + case QMetaType::SChar: + case QMetaType::UChar: + return "tinyint"; + + case QMetaType::Short: + case QMetaType::UShort: + return "smallint"; + + case QMetaType::UInt: + case QMetaType::Int: + dbType = "INT"; + if (field->isAutoIncrement) + dbType += " IDENTITY(1,1)"; + break; + + case QMetaType::Long: + case QMetaType::ULong: + case QMetaType::LongLong: + case QMetaType::ULongLong: + return "bigint"; + + case QMetaType::Float: + return "FLOAT(24)"; + + case QMetaType::Double: + return "REAL"; + + case QMetaType::QBitArray: + case QMetaType::QByteArray: dbType = "VARBINARY"; if (field->length) @@ -56,42 +90,43 @@ QString SqlServerGenerator::fieldType(FieldModel *field) else dbType.append(" (MAX)"); break; - case QVariant::Date: + case QMetaType::QDate: dbType = "DATE"; break; - case QVariant::DateTime: + case QMetaType::QDateTime: dbType = "DATETIME"; break; - case QVariant::Time: + case QMetaType::QTime: dbType = "TIME"; break; - case QVariant::Double: - dbType = "REAL"; - break; - case QVariant::Int: - dbType = "INT"; - if (field->isAutoIncrement) - dbType += " IDENTITY(1,1)"; - break; - case QVariant::Point: - case QVariant::PointF: + case QMetaType::QPoint: + case QMetaType::QPointF: dbType = "GEOMETRY"; break; - case QVariant::String: + case QMetaType::QString: if (field->length) dbType = QString("NVARCHAR(%1)").arg(field->length); else dbType = "NVARCHAR(MAX)"; break; - case QVariant::Uuid: + case QMetaType::QUuid: dbType = "UNIQUEIDENTIFIER"; break; + case QMetaType::QColor: + case QMetaType::QStringList: + case QMetaType::QJsonArray: + case QMetaType::QJsonValue: + case QMetaType::QJsonObject: + case QMetaType::QJsonDocument: + case QMetaType::QUrl: + return "TEXT"; + default: - Q_UNREACHABLE(); +// Q_UNREACHABLE(); dbType = QString(); } @@ -120,13 +155,13 @@ QString SqlServerGenerator::diff(FieldModel *oldField, FieldModel *newField) QString SqlServerGenerator::escapeValue(const QVariant &v) const { - if (v.type() == QVariant::String || v.type() == QVariant::Char) + if (v.type() == QMetaType::QString || v.type() == QMetaType::QChar) return "N'" + v.toString() + "'"; - else if (v.type() == QVariant::Point) { + else if (v.type() == QMetaType::QPoint) { QPoint pt = v.toPoint(); return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg( pt.y()); - } else if (v.type() == QVariant::PointF) { + } else if (v.type() == QMetaType::QPointF) { QPointF pt = v.toPointF(); return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg( pt.y()); diff --git a/src/generators/sqlservergenerator.h b/src/generators/sqlservergenerator.h index 4ef2f7c..3907560 100644 --- a/src/generators/sqlservergenerator.h +++ b/src/generators/sqlservergenerator.h @@ -29,7 +29,7 @@ NUT_BEGIN_NAMESPACE class SqlServerGenerator : public SqlGeneratorBase { public: - explicit SqlServerGenerator(Database *parent = 0); + explicit SqlServerGenerator(Database *parent = nullptr); QString masterDatabaseName(QString databaseName); diff --git a/test/tst_datatypes/tst_datatypes.cpp b/test/tst_datatypes/tst_datatypes.cpp index 99825ca..0f403af 100644 --- a/test/tst_datatypes/tst_datatypes.cpp +++ b/test/tst_datatypes/tst_datatypes.cpp @@ -5,7 +5,7 @@ #include "consts.h" -#include "maintest.h" +#include "tst_datatypes.h" #include "query.h" #include "tableset.h" #include "tablemodel.h" diff --git a/test/tst_datatypes/maintest.h b/test/tst_datatypes/tst_datatypes.h similarity index 98% rename from test/tst_datatypes/maintest.h rename to test/tst_datatypes/tst_datatypes.h index 0945837..6d67786 100644 --- a/test/tst_datatypes/maintest.h +++ b/test/tst_datatypes/tst_datatypes.h @@ -59,7 +59,6 @@ signals: private slots: void initTestCase(); - void types(); void insert(); void retrive(); void cleanupTestCase(); diff --git a/test/tst_datatypes/tst_datatypes.pro b/test/tst_datatypes/tst_datatypes.pro index 1d7344b..4e331a8 100644 --- a/test/tst_datatypes/tst_datatypes.pro +++ b/test/tst_datatypes/tst_datatypes.pro @@ -14,6 +14,6 @@ SOURCES += \ tst_datatypes.cpp HEADERS += \ - maintest.h \ db.h \ - sampletable.h + sampletable.h \ + tst_datatypes.h diff --git a/test/tst_generators/tst_generators.cpp b/test/tst_generators/tst_generators.cpp index d6db7a1..ea1a16a 100644 --- a/test/tst_generators/tst_generators.cpp +++ b/test/tst_generators/tst_generators.cpp @@ -9,102 +9,120 @@ #include "generators/sqlitegenerator.h" #include "generators/sqlservergenerator.h" #include "generators/mysqlgenerator.h" -#include "generators/mysqlgenerator.h" +#include "generators/postgresqlgenerator.h" -class tst_generators : public QObject -{ - Q_OBJECT +#include "tst_generators.h" -public: - tst_generators(); - ~tst_generators(); - - void types(Nut::SqlGeneratorBase *g); - -private slots: - void test_sqlite(); - void test_sqlserver(); - void test_psql(); - void test_mysql(); - -}; - -tst_generators::tst_generators() +GeneratorsTest::GeneratorsTest(QObject *parent) : QObject(parent) { } -tst_generators::~tst_generators() -{ -} - -void tst_generators::types(Nut::SqlGeneratorBase *g) +void GeneratorsTest::types(Nut::SqlGeneratorBase *g) { QList types; types - << QMetaType::Bool - << QMetaType::Int - << QMetaType::UInt - << QMetaType::Double - << QMetaType::QChar - << QMetaType::QString - << QMetaType::QByteArray - << QMetaType::Long - << QMetaType::LongLong - << QMetaType::Short - << QMetaType::Char - << QMetaType::ULong - << QMetaType::ULongLong - << QMetaType::UShort - << QMetaType::SChar - << QMetaType::UChar - << QMetaType::Float - << QMetaType::QDate -// << QMetaType::QSize - << QMetaType::QTime -// << QMetaType::QPolygon -// << QMetaType::QPolygonF -// << QMetaType::QColor -// << QMetaType::QSizeF -// << QMetaType::QRectF -// << QMetaType::QLine -// << QMetaType::QStringList -// << QMetaType::QLineF -// << QMetaType::QRect -// << QMetaType::QPoint - << QMetaType::QUrl - << QMetaType::QDateTime -// << QMetaType::QPointF -// << QMetaType::QRegion -// << QMetaType::QBitArray -// << QMetaType::QImage -// << QMetaType::QPixmap -// << QMetaType::QLocale -// << QMetaType::QMatrix -// << QMetaType::QMatrix4x4 -// << QMetaType::QVector2D -// << QMetaType::QVector3D -// << QMetaType::QVector4D - << QMetaType::QJsonValue - << QMetaType::QJsonObject - << QMetaType::QJsonArray - << QMetaType::QJsonDocument - << QMetaType::QUuid -// << QMetaType::QByteArrayList - ; + << QMetaType::Bool + + << QMetaType::Char + << QMetaType::SChar + << QMetaType::UChar + << QMetaType::QChar + + << QMetaType::Short + << QMetaType::UShort + << QMetaType::Int + << QMetaType::UInt + << QMetaType::Long + << QMetaType::LongLong + << QMetaType::ULong + << QMetaType::ULongLong + + << QMetaType::Double + << QMetaType::Float + + << QMetaType::QString + << QMetaType::QStringList + + << QMetaType::QBitArray + << QMetaType::QByteArray + + << QMetaType::QDate + << QMetaType::QTime + << QMetaType::QDateTime + + << QMetaType::QUrl + << QMetaType::QColor + + << QMetaType::QPoint + << QMetaType::QPointF + << QMetaType::QPolygon + << QMetaType::QPolygonF + << QMetaType::QSize + << QMetaType::QSizeF + << QMetaType::QRect + << QMetaType::QRectF + << QMetaType::QLine + << QMetaType::QLineF + + // << QMetaType::QRegion + // << QMetaType::QImage + // << QMetaType::QPixmap + // << QMetaType::QLocale + // << QMetaType::QMatrix + // << QMetaType::QMatrix4x4 + // << QMetaType::QVector2D + // << QMetaType::QVector3D + // << QMetaType::QVector4D + << QMetaType::QJsonValue + << QMetaType::QJsonObject + << QMetaType::QJsonArray + << QMetaType::QJsonDocument + + << QMetaType::QUuid + // << QMetaType::QByteArrayList + ; Nut::FieldModel m; foreach (QMetaType::Type t, types) { m.type = t; QString fn = g->fieldType(&m); + + if (fn.isEmpty()) + qDebug() << "No rule for" << t << "(" << QMetaType::typeName(t) << ")"; Q_ASSERT(!fn.isEmpty()); } -// for (int i = 0; i < en.keyCount(); i++) - // qDebug() << en.value(i); } +void GeneratorsTest::test_sqlite() +{ + auto g = new Nut::SqliteGenerator; + types(g); + g->deleteLater(); +} -QTEST_APPLESS_MAIN(tst_generators) +void GeneratorsTest::test_sqlserver() +{ + auto g = new Nut::SqlServerGenerator; + types(g); + g->deleteLater(); +} -//#include "tst_tst_generators.moc" +void GeneratorsTest::test_psql() +{ + auto g = new Nut::PostgreSqlGenerator; + types(g); + g->deleteLater(); +} + +void GeneratorsTest::test_mysql() +{ + auto g = new Nut::MySqlGenerator; + types(g); + g->deleteLater(); +} + +QTEST_MAIN(GeneratorsTest) + +//#include "tst_GeneratorsTest.moc" diff --git a/test/tst_generators/tst_generators.h b/test/tst_generators/tst_generators.h new file mode 100644 index 0000000..6c5ea34 --- /dev/null +++ b/test/tst_generators/tst_generators.h @@ -0,0 +1,27 @@ +#ifndef TST_GENERATORS_H +#define TST_GENERATORS_H + +#include + +namespace Nut { +class SqlGeneratorBase; +} + +class GeneratorsTest : public QObject +{ + Q_OBJECT + +public: + explicit GeneratorsTest(QObject *parent = nullptr); + + void types(Nut::SqlGeneratorBase *g); + +private slots: + void test_sqlite(); + void test_psql(); + void test_sqlserver(); + void test_mysql(); + +}; + +#endif // TST_GENERATORS_H diff --git a/test/tst_generators/tst_generators.pro b/test/tst_generators/tst_generators.pro index 357518b..7cd9a4b 100644 --- a/test/tst_generators/tst_generators.pro +++ b/test/tst_generators/tst_generators.pro @@ -12,3 +12,6 @@ IMPORTPATH += $$OUT_PWD/../src/imports SOURCES += \ tst_generators.cpp + +HEADERS += \ + tst_generators.h