postgres data types [skip ci]

This commit is contained in:
Hamed Masafi 2019-02-12 18:03:16 +03:30
parent 1bce39539f
commit b3e23864ce
5 changed files with 118 additions and 22 deletions

View File

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

View File

@ -19,6 +19,11 @@
**************************************************************************/
#include <QDateTime>
#include <QPoint>
#ifdef QT_GUI_LIB
#include <QPolygon>
#endif
#include <QVariant>
#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<QPolygon>();
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<QPolygonF>();
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);
}

View File

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

View File

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

View File

@ -74,6 +74,8 @@ void DataTypesTest::initTestCase()
color = Qt::red;
QTEST_ASSERT(ok);
db.sampleTables()->query()->remove();
}
void DataTypesTest::insert()