where phrase

This commit is contained in:
blackdal 2017-06-11 21:20:43 +04:30
parent 37915378b1
commit cf9fcde6d5
8 changed files with 104 additions and 4 deletions

View File

@ -133,7 +133,7 @@ bool DatabasePrivate::updateDatabase()
}
bool ok = db.commit();
if (ok) {
if (db.lastError().type() == QSqlError::NoError) {
storeScheemaInDB();
q->databaseUpdated(last.versionMajor(), last.versionMinor(),

View File

@ -104,7 +104,7 @@ public: \
#define NUT_PRIMARY_AUTO_INCREMENT(x) NUT_PRIMARY_KEY(x) \
NUT_AUTO_INCREMENT(x)
#define NUT_UNIQUE(x) Q_CLASSINFO(QT_STRINGIFY(__nut_NAME_PERFIX #x " " __nut_UNIQUE), #x)
#define NUT_LEN(x, n) Q_CLASSINFO(QT_STRINGIFY(__nut_NAME_PERFIX #x " " __nut_LEN), #n)
#define NUT_LEN(field, len) Q_CLASSINFO(QT_STRINGIFY(__nut_NAME_PERFIX #field " " __nut_LEN), #len)
#define NUT_DEFAULT_VALUE(x, n) Q_CLASSINFO(QT_STRINGIFY(__nut_NAME_PERFIX #x " " __nut_DEFAULT_VALUE), #n)
#define NUT_NOT_NULL(x) Q_CLASSINFO(QT_STRINGIFY(__nut_NAME_PERFIX #x " " __nut_NOT_NULL), "1")

View File

@ -21,6 +21,9 @@
#include "mysqlgenerator.h"
#include "tablemodel.h"
#include <QPoint>
#include <QPointF>
NUT_BEGIN_NAMESPACE
MySqlGenerator::MySqlGenerator(Database *parent) : SqlGeneratorBase(parent)
@ -90,4 +93,40 @@ QString MySqlGenerator::fieldType(FieldModel *field)
return dbType;
}
QString MySqlGenerator::escapeValue(const QVariant &v) const
{
switch (v.type()) {
case QVariant::Point: {
QPoint pt = v.toPoint();
return QString("GeomFromText('POINT(%1 %2)',0)").arg(pt.x()).arg(pt.y());
}
case QVariant::PointF: {
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 QVariant::Type &type, const QVariant &dbValue)
{
if (type == QVariant::PointF) {
qDebug() << "QVariant::PointF" << dbValue;
}
}
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);
}
NUT_END_NAMESPACE

View File

@ -32,7 +32,9 @@ public:
MySqlGenerator(Database *parent = 0);
QString fieldType(FieldModel *field);
QString escapeValue(const QVariant &v) const;
QVariant readValue(const QVariant::Type &type, const QVariant &dbValue);
QString phrase(const PhraseData *d) const;
};
NUT_END_NAMESPACE

View File

@ -25,6 +25,7 @@
#include <QtCore/QDebug>
#include <QtCore/QScopedPointer>
#include <QtCore/QRegularExpression>
#include <QtCore/QMetaObject>
#include "query_p.h"
#include "database.h"
@ -118,6 +119,7 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
d->orderPhrases,
d->tableName,
d->joinClassName);
qDebug() << sql;
QSqlQuery q = d->database->exec(sql);
// QString pk = TableModel::findByName(d->tableName)->primaryKey();
@ -145,9 +147,13 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
while (q.next()) {
if(lastPkValue != q.value(pk)){
T *t = new T();
foreach (QString field, masterFields)
t->setProperty(field.toLatin1().data(), q.value(field));
// for (int i = 0; i < t->metaObject()->propertyCount(); i++) {
// const QMetaProperty p = t->metaObject()->property(i);
// p.write(t, d->database->sqlGenertor()->readValue(p.type(), q.value(p.name())));
// }
t->setTableSet(d->tableSet);
t->setStatus(Table::FeatchedFromDB);

View File

@ -499,6 +499,11 @@ QString SqlGeneratorBase::escapeValue(const QVariant &v)const
return "";
}
QVariant SqlGeneratorBase::readValue(const QVariant::Type &type, const QVariant &dbValue)
{
return dbValue;
}
QString SqlGeneratorBase::phraseOrder(const PhraseData *d) const
{

View File

@ -95,6 +95,7 @@ public:
virtual QString updateCommand(WherePhrase &phrase, QList<WherePhrase> &wheres, QString tableName);
virtual QString escapeValue(const QVariant &v) const;
virtual QVariant readValue(const QVariant::Type &type, const QVariant &dbValue);
virtual QString phrase(const PhraseData *d) const;
virtual QString phraseUpdate(const PhraseData *d) const;
virtual QString operatorString(const PhraseData::Condition &cond) const;

View File

@ -27,6 +27,7 @@
#include <QDate>
#include <QDateTime>
#include <QTime>
#include <QPoint>
#include <QSharedPointer>
#include "defines.h"
#include "dbgeography.h"
@ -146,7 +147,9 @@ class FieldPhrase: public WherePhrase{
public:
FieldPhrase(const char *className, const char* s);
WherePhrase operator =(const WherePhrase &other);
WherePhrase operator =(const QVariant &other);
WherePhrase operator +(const QVariant &other);
WherePhrase operator !();
WherePhrase isNull();
@ -168,6 +171,18 @@ Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase<T>::operator =(const QVariant &othe
return WherePhrase(this, PhraseData::Set, other);
}
template<typename T>
Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase<T>::operator =(const WherePhrase &other)
{
return WherePhrase(this, PhraseData::Set, &other);
}
template<typename T>
Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase<T>::operator+(const QVariant &other)
{
return WherePhrase(this, PhraseData::Add, other);
}
template<typename T>
Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase<T>::operator !()
{
@ -220,6 +235,38 @@ public:
}
};
// Custom types
template<>
class FieldPhrase<QPoint>: public WherePhrase {
public:
FieldPhrase(const char *className, const char* s) : WherePhrase(className, s){
}
WherePhrase distance(const QPoint &geo) {
return WherePhrase(this, PhraseData::Distance, QVariant::fromValue(geo));
}
WherePhrase operator =(const QPoint &other) {
return WherePhrase(this, PhraseData::Set, other);
}
};
// Custom types
template<>
class FieldPhrase<QPointF>: public WherePhrase {
public:
FieldPhrase(const char *className, const char* s) : WherePhrase(className, s){
}
WherePhrase distance(const QPointF &geo) {
return WherePhrase(this, PhraseData::Distance, QVariant::fromValue(geo));
}
WherePhrase operator =(const QPointF &other) {
return WherePhrase(this, PhraseData::Set, other);
}
};
template<>
class FieldPhrase<bool>: public WherePhrase{
public: