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 <QPoint>
#include <QPointF> #include <QPointF>
#include <QTime>
#include <QDate>
#include <QDateTime>
#ifdef QT_GUI_LIB
#include <QPolygon>
#include <QPolygonF>
#endif
#include "sqlserializer.h"
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE
@ -74,20 +83,20 @@ QString MySqlGenerator::fieldType(FieldModel *field)
dbType = "TEXT"; dbType = "TEXT";
break; break;
case QMetaType::QPoint:
case QMetaType::QPointF:
dbType = "POINT";
break;
case QMetaType::QPolygon: case QMetaType::QPolygon:
case QMetaType::QPolygonF: case QMetaType::QPolygonF:
dbType = "POLYGON"; // dbType = "POLYGON";
break; // break;
case QMetaType::QUuid: case QMetaType::QUuid:
dbType = "VARCHAR(64)"; // dbType = "VARCHAR(64)";
break; // break;
case QMetaType::QPoint:
case QMetaType::QPointF:
// dbType = "POINT";
// break;
case QMetaType::QSize: case QMetaType::QSize:
case QMetaType::QSizeF: case QMetaType::QSizeF:
case QMetaType::QRect: case QMetaType::QRect:
@ -110,38 +119,146 @@ QString MySqlGenerator::fieldType(FieldModel *field)
dbType = QString(); dbType = QString();
} }
if(field->typeName == QStringLiteral("Nut::DbGeography")) // if(field->typeName == QStringLiteral("Nut::DbGeography"))
dbType = "GEOMETRY"; // dbType = "GEOMETRY";
return dbType; return dbType;
} }
QString MySqlGenerator::escapeValue(const QVariant &v) const QString MySqlGenerator::escapeValue(const QVariant &v) const
{ {
switch (v.type()) { if (v.type() == QVariant::Bool)
case QMetaType::QPoint: { return v.toBool() ? "1" : "0";
QPoint pt = v.toPoint();
return QString("GeomFromText('POINT(%1 %2)',0)").arg(pt.x()).arg(pt.y());
}
case QMetaType::QPointF: { if (v.type() == QVariant::Time)
QPointF pt = v.toPointF(); return "'" + v.toTime().toString("HH:mm:ss") + "'";
return QString("GeomFromText('POINT(%1 %2)',0)").arg(pt.x()).arg(pt.y());
}
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); return SqlGeneratorBase::escapeValue(v);
} // }
} }
QVariant MySqlGenerator::readValue(const QMetaType::Type &type, const QVariant &dbValue) 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); 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 //QString MySqlGenerator::phrase(const PhraseData *d) const
//{ //{
// if (d->operatorCond == PhraseData::Distance) { // if (d->operatorCond == PhraseData::Distance) {

View File

@ -35,7 +35,9 @@ public:
QString escapeValue(const QVariant &v) const; QString escapeValue(const QVariant &v) const;
QVariant readValue(const QMetaType::Type &type, const QVariant &dbValue); QVariant readValue(const QMetaType::Type &type, const QVariant &dbValue);
// QString phrase(const PhraseData *d) const; // 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 NUT_END_NAMESPACE

View File

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

View File

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