From b3e23864ce70e5e12861a76815488f5bdcd16129 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Tue, 12 Feb 2019 18:03:16 +0330 Subject: [PATCH] postgres data types [skip ci] --- src/generators/mysqlgenerator.cpp | 63 +++++++++++++++++--------- src/generators/postgresqlgenerator.cpp | 58 ++++++++++++++++++++++++ src/generators/sqlgeneratorbase_p.h | 9 ++++ src/generators/sqlservergenerator.cpp | 8 ++++ test/tst_datatypes/tst_datatypes.cpp | 2 + 5 files changed, 118 insertions(+), 22 deletions(-) diff --git a/src/generators/mysqlgenerator.cpp b/src/generators/mysqlgenerator.cpp index 978dcfa..45aaf50 100644 --- a/src/generators/mysqlgenerator.cpp +++ b/src/generators/mysqlgenerator.cpp @@ -36,32 +36,37 @@ QString MySqlGenerator::fieldType(FieldModel *field) QString dbType; switch (field->type) { - case QMetaType::Bool: - dbType = "BOOLEAN"; - break; - case QMetaType::QByteArray: - dbType = "BLOB"; - break; - case QMetaType::QDateTime: - dbType = "DATETIME"; - break; - - case QMetaType::QDate: - dbType = "DATE"; - break; - - case QMetaType::QTime: - dbType = "TIME"; - break; - case QMetaType::Double: - dbType = "REAL"; - break; + case QMetaType::Bool: return "BOOLEAN"; + case QMetaType::Char: + case QMetaType::QChar: return "CHAR(1)"; + case QMetaType::SChar: + case QMetaType::UChar: return "TINYINT"; + case QMetaType::Short: + case QMetaType::UShort: return "SMALLINT"; + case QMetaType::UInt: case QMetaType::Int: - dbType = "INT(4)"; + dbType = "INT"; if(field->isAutoIncrement) dbType += " AUTO_INCREMENT"; - break; + case QMetaType::Long: + case QMetaType::ULong: + case QMetaType::LongLong: + case QMetaType::ULongLong: + return "BIGINT"; + + case QMetaType::Float: + return "FLOAT"; + + case QMetaType::Double: + return "REAL"; + + case QMetaType::QBitArray: return "VARBINARY"; + case QMetaType::QByteArray: return "BLOB"; + case QMetaType::QDate: return "DATE"; + case QMetaType::QTime: return "TIME"; + case QMetaType::QDateTime: return "DATETIME"; + case QMetaType::QString: if(field->length) dbType = QString("VARCHAR(%1)").arg(field->length); @@ -83,6 +88,20 @@ QString MySqlGenerator::fieldType(FieldModel *field) dbType = "VARCHAR(64)"; break; + case QMetaType::QSize: + case QMetaType::QSizeF: + case QMetaType::QRect: + case QMetaType::QRectF: + case QMetaType::QLine: + case QMetaType::QLineF: + case QMetaType::QColor: + case QMetaType::QUrl: + case QMetaType::QJsonArray: + case QMetaType::QJsonValue: + case QMetaType::QJsonObject: + case QMetaType::QJsonDocument: + case QMetaType::QStringList: return "TEXT"; + default: qWarning("Type %s::%s(%d) is not supported", qPrintable(field->name), diff --git a/src/generators/postgresqlgenerator.cpp b/src/generators/postgresqlgenerator.cpp index ab01305..2410605 100644 --- a/src/generators/postgresqlgenerator.cpp +++ b/src/generators/postgresqlgenerator.cpp @@ -19,6 +19,11 @@ **************************************************************************/ #include +#include +#ifdef QT_GUI_LIB +#include +#endif +#include #include "postgresqlgenerator.h" #include "../table.h" @@ -169,9 +174,54 @@ QString PostgreSqlGenerator::diff(FieldModel *oldField, FieldModel *newField) QString PostgreSqlGenerator::escapeValue(const QVariant &v) const { + if (v.type() == QVariant::Time) + return "'" + v.toTime().toString("HH:mm:ss") + "'"; + + if (v.type() == QVariant::Date) + return "'" + v.toDate().toString("yyyy-MM-dd") + "'"; + if (v.type() == QVariant::DateTime) return "'" + v.toDateTime().toString("yyyy-MM-dd HH:mm:ss") + "'"; + if (v.type() == QVariant::StringList) + return "'{" + v.toStringList().join(",") + "}'"; + + if (v.type() == QVariant::Point) { + QPoint pt = v.toPoint(); + return QString("'(%1, %2)'").arg(pt.x()).arg(pt.y()); + } + if (v.type() == QVariant::PointF) { + QPointF pt = v.toPointF(); + return QString("'(%1, %2)'").arg(pt.x()).arg(pt.y()); + } + +#ifdef QT_GUI_LIB + if (v.type() == QVariant::Polygon) { + QString ret; + QPoint pt; + QPolygon pol = v.value(); + for (int i = 0; i < pol.size(); ++i) { + pt = pol.at(i); + if (!ret.isEmpty()) + ret.append("),("); + ret.append(QString::number(pt.x()) + ", " + QString::number(pt.y())); + } + return "'((" + ret + "))'"; + } + if (v.type() == QVariant::PolygonF) { + QString ret; + QPointF pt; + QPolygonF pol = v.value(); + for (int i = 0; i < pol.size(); ++i) { + pt = pol.at(i); + if (!ret.isEmpty()) + ret.append("),("); + ret.append(QString::number(pt.x()) + ", " + QString::number(pt.y())); + } + return "'((" + ret + "))'"; + } +#endif + return SqlGeneratorBase::escapeValue(v); } @@ -180,6 +230,14 @@ QVariant PostgreSqlGenerator::readValue(const QMetaType::Type &type, const QVari if (type == QMetaType::QDateTime) return dbValue.toDateTime();// QDateTime::fromString(dbValue.toString(), "yyyy-MM-dd HH:mm:ss"); + if (type == QMetaType::QPoint) { + return SqlGeneratorBase::readValue(QMetaType::QPoint, dbValue.toString() + .replace("(", "").replace(")", "")); + } + if (type == QMetaType::QPointF) { + return SqlGeneratorBase::readValue(QMetaType::QPointF, dbValue.toString() + .replace("(", "").replace(")", "")); + } return SqlGeneratorBase::readValue(type, dbValue); } diff --git a/src/generators/sqlgeneratorbase_p.h b/src/generators/sqlgeneratorbase_p.h index 4819a7e..28253a4 100644 --- a/src/generators/sqlgeneratorbase_p.h +++ b/src/generators/sqlgeneratorbase_p.h @@ -64,6 +64,15 @@ public: explicit SqlGeneratorBase(Database *parent); virtual ~SqlGeneratorBase() = default; + virtual bool supportPrimaryKey(const QMetaType::Type &type) { + Q_UNUSED(type); + return true; + } + virtual bool supportAutoIncrement(const QMetaType::Type &type) { + Q_UNUSED(type); + return true; + } + virtual QString masterDatabaseName(QString databaseName); virtual QString createTable(TableModel *table); diff --git a/src/generators/sqlservergenerator.cpp b/src/generators/sqlservergenerator.cpp index cdf4a77..989755e 100644 --- a/src/generators/sqlservergenerator.cpp +++ b/src/generators/sqlservergenerator.cpp @@ -116,6 +116,14 @@ QString SqlServerGenerator::fieldType(FieldModel *field) dbType = "UNIQUEIDENTIFIER"; break; + case QMetaType::QPolygon: + case QMetaType::QPolygonF: + case QMetaType::QSize: + case QMetaType::QSizeF: + case QMetaType::QRect: + case QMetaType::QRectF: + case QMetaType::QLine: + case QMetaType::QLineF: case QMetaType::QColor: case QMetaType::QStringList: case QMetaType::QJsonArray: diff --git a/test/tst_datatypes/tst_datatypes.cpp b/test/tst_datatypes/tst_datatypes.cpp index 0f403af..96f7a12 100644 --- a/test/tst_datatypes/tst_datatypes.cpp +++ b/test/tst_datatypes/tst_datatypes.cpp @@ -74,6 +74,8 @@ void DataTypesTest::initTestCase() color = Qt::red; QTEST_ASSERT(ok); + + db.sampleTables()->query()->remove(); } void DataTypesTest::insert()