Nut/src/generators/mysqlgenerator.cpp

294 lines
8.5 KiB
C++
Raw Normal View History

2016-05-21 16:09:03 +08:00
/**************************************************************************
**
** This file is part of Nut project.
** https://github.com/HamedMasafi/Nut
**
** Nut is free software: you can redistribute it and/or modify
** it under the terms of the GNU Lesser General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** Nut is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public License
** along with Nut. If not, see <http://www.gnu.org/licenses/>.
**
**************************************************************************/
2016-05-12 14:08:58 +08:00
#include "mysqlgenerator.h"
2017-10-07 18:26:05 +08:00
#include "../tablemodel.h"
2016-05-12 14:08:58 +08:00
2017-06-12 00:50:43 +08:00
#include <QPoint>
#include <QPointF>
2019-02-13 22:53:42 +08:00
#include <QTime>
#include <QDate>
#include <QDateTime>
#ifdef QT_GUI_LIB
#include <QPolygon>
#include <QPolygonF>
#endif
#include "sqlserializer.h"
2017-06-12 00:50:43 +08:00
2017-02-01 18:01:21 +08:00
NUT_BEGIN_NAMESPACE
2016-05-12 14:08:58 +08:00
2016-05-24 14:47:37 +08:00
MySqlGenerator::MySqlGenerator(Database *parent) : SqlGeneratorBase(parent)
2016-05-12 14:08:58 +08:00
{
}
2016-05-21 16:09:03 +08:00
QString MySqlGenerator::fieldType(FieldModel *field)
2016-05-12 14:08:58 +08:00
{
QString dbType;
switch (field->type) {
2019-02-12 22:33:16 +08:00
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";
if(field->isAutoIncrement)
dbType += " AUTO_INCREMENT";
2016-05-21 16:09:03 +08:00
break;
2019-02-12 22:33:16 +08:00
case QMetaType::Long:
case QMetaType::ULong:
case QMetaType::LongLong:
case QMetaType::ULongLong:
return "BIGINT";
2016-05-21 16:09:03 +08:00
2019-02-12 22:33:16 +08:00
case QMetaType::Float:
return "FLOAT";
2016-05-21 16:09:03 +08:00
2019-02-10 22:14:25 +08:00
case QMetaType::Double:
2019-02-12 22:33:16 +08:00
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";
2016-05-12 14:08:58 +08:00
2019-02-10 22:14:25 +08:00
case QMetaType::QString:
2016-05-12 14:08:58 +08:00
if(field->length)
2017-07-24 16:27:52 +08:00
dbType = QString("VARCHAR(%1)").arg(field->length);
2016-05-12 14:08:58 +08:00
else
2017-07-24 16:27:52 +08:00
dbType = "TEXT";
2016-05-12 14:08:58 +08:00
break;
2019-02-10 22:14:25 +08:00
case QMetaType::QPolygon:
case QMetaType::QPolygonF:
2019-02-13 22:53:42 +08:00
// dbType = "POLYGON";
// break;
2019-02-10 22:14:25 +08:00
case QMetaType::QUuid:
2019-02-13 22:53:42 +08:00
// dbType = "VARCHAR(64)";
// break;
2017-07-24 16:27:52 +08:00
2019-02-13 22:53:42 +08:00
case QMetaType::QPoint:
case QMetaType::QPointF:
// dbType = "POINT";
// break;
2019-02-12 22:33:16 +08:00
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";
2016-05-12 14:08:58 +08:00
default:
qWarning("Type %s::%s(%d) is not supported",
qPrintable(field->name),
QMetaType::typeName(field->type),
field->type);
dbType = QString();
2016-05-12 14:08:58 +08:00
}
2016-05-21 16:09:03 +08:00
2019-02-13 22:53:42 +08:00
// if(field->typeName == QStringLiteral("Nut::DbGeography"))
// dbType = "GEOMETRY";
2016-05-21 16:09:03 +08:00
return dbType;
2016-05-12 14:08:58 +08:00
}
2017-06-12 00:50:43 +08:00
QString MySqlGenerator::escapeValue(const QVariant &v) const
{
2019-02-13 22:53:42 +08:00
if (v.type() == QVariant::Bool)
return v.toBool() ? "1" : "0";
2017-06-12 00:50:43 +08:00
2019-02-13 22:53:42 +08:00
if (v.type() == QVariant::Time)
return "'" + v.toTime().toString("HH:mm:ss") + "'";
2017-06-12 00:50:43 +08:00
2019-02-13 22:53:42 +08:00
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:
2017-06-12 00:50:43 +08:00
return SqlGeneratorBase::escapeValue(v);
2019-02-13 22:53:42 +08:00
// }
2017-06-12 00:50:43 +08:00
}
QVariant MySqlGenerator::unescapeValue(const QMetaType::Type &type, const QVariant &dbValue)
2017-06-12 00:50:43 +08:00
{
2019-02-13 22:53:42 +08:00
//#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::unescapeValue(type, dbValue);
2017-06-12 00:50:43 +08:00
}
2019-02-13 22:53:42 +08:00
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;
}
2018-02-17 23:44:39 +08:00
//QString MySqlGenerator::phrase(const PhraseData *d) const
//{
// if (d->operatorCond == PhraseData::Distance) {
// return QString("ST_Distance(%1, %2)")
// .arg(d->left->text)
// .arg(escapeValue(d->operand.toPointF()));
// }
// return SqlGeneratorBase::phrase(d);
//}
//QString MySqlGenerator::selectCommand(SqlGeneratorBase::AgregateType t,
// QString agregateArg,
// QString tableName,
// QList<WherePhrase> &wheres,
// QList<WherePhrase> &orders,
// QList<RelationModel*> joins,
// int skip, int take)
//{
// QString command = SqlGeneratorBase::selectCommand(t, agregateArg,
// tableName,
// wheres, orders,
// joins, skip, take);
// if (take != -1 && skip != -1)
// command.append(QString(" LIMIT %1 OFFSET %2")
// .arg(take)
// .arg(skip));
// return command;
//}
2018-01-11 00:18:49 +08:00
2017-02-01 18:01:21 +08:00
NUT_END_NAMESPACE