generators data types

This commit is contained in:
Hamed Masafi 2019-02-11 11:30:00 +03:30
parent 6606f5c7ca
commit 1bce39539f
11 changed files with 205 additions and 106 deletions

View File

@ -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";

View File

@ -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);

View File

@ -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:

View File

@ -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());

View File

@ -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);

View File

@ -5,7 +5,7 @@
#include "consts.h"
#include "maintest.h"
#include "tst_datatypes.h"
#include "query.h"
#include "tableset.h"
#include "tablemodel.h"

View File

@ -59,7 +59,6 @@ signals:
private slots:
void initTestCase();
void types();
void insert();
void retrive();
void cleanupTestCase();

View File

@ -14,6 +14,6 @@ SOURCES += \
tst_datatypes.cpp
HEADERS += \
maintest.h \
db.h \
sampletable.h
sampletable.h \
tst_datatypes.h

View File

@ -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<QMetaType::Type> 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"

View File

@ -0,0 +1,27 @@
#ifndef TST_GENERATORS_H
#define TST_GENERATORS_H
#include <QObject>
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

View File

@ -12,3 +12,6 @@ IMPORTPATH += $$OUT_PWD/../src/imports
SOURCES += \
tst_generators.cpp
HEADERS += \
tst_generators.h