mysql passed datatypes test

This commit is contained in:
Hamed Masafi 2019-02-13 18:23:42 +03:30
parent 0f32f7af9a
commit ee82e97777
4 changed files with 149 additions and 30 deletions

View File

@ -23,6 +23,15 @@
#include <QPoint>
#include <QPointF>
#include <QTime>
#include <QDate>
#include <QDateTime>
#ifdef QT_GUI_LIB
#include <QPolygon>
#include <QPolygonF>
#endif
#include "sqlserializer.h"
NUT_BEGIN_NAMESPACE
@ -74,20 +83,20 @@ QString MySqlGenerator::fieldType(FieldModel *field)
dbType = "TEXT";
break;
case QMetaType::QPoint:
case QMetaType::QPointF:
dbType = "POINT";
break;
case QMetaType::QPolygon:
case QMetaType::QPolygonF:
dbType = "POLYGON";
break;
// dbType = "POLYGON";
// break;
case QMetaType::QUuid:
dbType = "VARCHAR(64)";
break;
// dbType = "VARCHAR(64)";
// break;
case QMetaType::QPoint:
case QMetaType::QPointF:
// dbType = "POINT";
// break;
case QMetaType::QSize:
case QMetaType::QSizeF:
case QMetaType::QRect:
@ -110,38 +119,146 @@ QString MySqlGenerator::fieldType(FieldModel *field)
dbType = QString();
}
if(field->typeName == QStringLiteral("Nut::DbGeography"))
dbType = "GEOMETRY";
// if(field->typeName == QStringLiteral("Nut::DbGeography"))
// dbType = "GEOMETRY";
return dbType;
}
QString MySqlGenerator::escapeValue(const QVariant &v) const
{
switch (v.type()) {
case QMetaType::QPoint: {
QPoint pt = v.toPoint();
return QString("GeomFromText('POINT(%1 %2)',0)").arg(pt.x()).arg(pt.y());
}
if (v.type() == QVariant::Bool)
return v.toBool() ? "1" : "0";
case QMetaType::QPointF: {
QPointF pt = v.toPointF();
return QString("GeomFromText('POINT(%1 %2)',0)").arg(pt.x()).arg(pt.y());
}
if (v.type() == QVariant::Time)
return "'" + v.toTime().toString("HH:mm:ss") + "'";
default:
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") + "'";
//#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 "GeomFromText('POLYGON(" + 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 "GeomFromText('POLYGON(" + ret + "))')";
// }
//#endif
// switch (v.type()) {
// case QMetaType::QPoint: {
// QPoint pt = v.toPoint();
// return QString("GeomFromText('POINT(%1 %2)',0)").arg(pt.x()).arg(pt.y());
// }
// case QMetaType::QPointF: {
// QPointF pt = v.toPointF();
// return QString("GeomFromText('POINT(%1 %2)',0)").arg(pt.x()).arg(pt.y());
// }
// default:
return SqlGeneratorBase::escapeValue(v);
}
// }
}
QVariant MySqlGenerator::readValue(const QMetaType::Type &type, const QVariant &dbValue)
{
if (type == QMetaType::QPointF) {
qDebug() << "QVariant::PointF" << dbValue;
}
//#ifdef QT_GUI_LIB
// if (type == QMetaType::QPolygon) {
// qDebug() << "p=" << dbValue;
// QString p;
// QString ref = dbValue.toString();
// QPolygon pol;
// if (!readInsideParentese(ref, p))
// return pol;
// QStringList parts = p.split(",");
// foreach (QString v, parts) {
// QList<int> l = _serializer->toListInt(p.trimmed(), " ");
// if (l.count() != 2)
// return QPolygon();
// pol.append(QPoint(l.at(0), l.at(1)));
// }
// return pol;
// }
// if (type == QMetaType::QPolygonF) {
// QString p;
// QString ref = dbValue.toString();
// QPolygonF pol;
// if (!readInsideParentese(ref, p))
// return pol;
// QStringList parts = p.split(",");
// foreach (QString v, parts) {
// QList<qreal> l = _serializer->toListReal(p.trimmed(), " ");
// if (l.count() != 2)
// return QPolygonF();
// pol.append(QPointF(l.at(0), l.at(1)));
// }
// return pol;
// }
//#endif
if (type == QMetaType::QDateTime)
return dbValue.toDateTime();
if (type == QMetaType::QTime)
return dbValue.toTime();
if (type == QMetaType::QDate)
return dbValue.toDate();
return SqlGeneratorBase::readValue(type, dbValue);
}
bool MySqlGenerator::readInsideParentese(QString &text, QString &out)
{
int start = -1;
int end = -1;
int pc = 0;
for (int i = 0; i < text.length(); ++i) {
QChar ch = text.at(i);
if (ch == '(') {
if (start == -1)
start = i;
pc++;
}
if (ch == ')') {
pc--;
if (!pc && end == -1)
end = i;
}
if (start != -1 && end != -1){
out = text.mid(start + 1, end - start - 1);
text = text.mid(end + 1);
return true;
}
}
return false;
}
//QString MySqlGenerator::phrase(const PhraseData *d) const
//{
// if (d->operatorCond == PhraseData::Distance) {

View File

@ -35,7 +35,9 @@ public:
QString escapeValue(const QVariant &v) const;
QVariant readValue(const QMetaType::Type &type, const QVariant &dbValue);
// QString phrase(const PhraseData *d) const;
// QString selectCommand(AgregateType t, QString agregateArg, QString tableName, QList<WherePhrase> &wheres, QList<WherePhrase> &orders, QList<RelationModel *> joins, int skip, int take);
// QString selectCommand(AgregateType t, QString agregateArg, QString tableName, QList<WherePhrase> &wheres, QList<WherePhrase> &orders, QList<RelationModel *> joins, int skip, int take);
private:
bool readInsideParentese(QString &text, QString &out);
};
NUT_END_NAMESPACE

View File

@ -8,11 +8,11 @@
.arg(timer.elapsed() / 1000.) \
.arg(__func__)
#define DRIVER "QPSQL"
#define DRIVER "QMYSQL"
#define DATABASE QString(metaObject()->className()).toLower() + "_db"
#define HOST "127.0.0.1"
#define USERNAME "postgres"
#define PASSWORD "856856"
#define HOST "localhost"
#define USERNAME "root"
#define PASSWORD ""
#ifdef Q_OS_LINUX
# define OS "Linux"

View File

@ -129,7 +129,7 @@ void DataTypesTest::retrive()
QList<SampleTable*> list = db.sampleTables()->query()->toList();
QTEST_ASSERT(list.count() == 1);
SampleTable *t = list.first();
qDebug() << time << t->f_time();
QTEST_ASSERT(t->f_int8() == n8);
QTEST_ASSERT(t->f_int16() == n16);
QTEST_ASSERT(t->f_int32() == n32);