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(); bool ok = db.commit();
if (ok) { if (db.lastError().type() == QSqlError::NoError) {
storeScheemaInDB(); storeScheemaInDB();
q->databaseUpdated(last.versionMajor(), last.versionMinor(), q->databaseUpdated(last.versionMajor(), last.versionMinor(),

View File

@ -104,7 +104,7 @@ public: \
#define NUT_PRIMARY_AUTO_INCREMENT(x) NUT_PRIMARY_KEY(x) \ #define NUT_PRIMARY_AUTO_INCREMENT(x) NUT_PRIMARY_KEY(x) \
NUT_AUTO_INCREMENT(x) NUT_AUTO_INCREMENT(x)
#define NUT_UNIQUE(x) Q_CLASSINFO(QT_STRINGIFY(__nut_NAME_PERFIX #x " " __nut_UNIQUE), #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_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") #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 "mysqlgenerator.h"
#include "tablemodel.h" #include "tablemodel.h"
#include <QPoint>
#include <QPointF>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE
MySqlGenerator::MySqlGenerator(Database *parent) : SqlGeneratorBase(parent) MySqlGenerator::MySqlGenerator(Database *parent) : SqlGeneratorBase(parent)
@ -90,4 +93,40 @@ QString MySqlGenerator::fieldType(FieldModel *field)
return dbType; 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 NUT_END_NAMESPACE

View File

@ -32,7 +32,9 @@ public:
MySqlGenerator(Database *parent = 0); MySqlGenerator(Database *parent = 0);
QString fieldType(FieldModel *field); 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 NUT_END_NAMESPACE

View File

@ -25,6 +25,7 @@
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QScopedPointer> #include <QtCore/QScopedPointer>
#include <QtCore/QRegularExpression> #include <QtCore/QRegularExpression>
#include <QtCore/QMetaObject>
#include "query_p.h" #include "query_p.h"
#include "database.h" #include "database.h"
@ -118,6 +119,7 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
d->orderPhrases, d->orderPhrases,
d->tableName, d->tableName,
d->joinClassName); d->joinClassName);
qDebug() << sql;
QSqlQuery q = d->database->exec(sql); QSqlQuery q = d->database->exec(sql);
// QString pk = TableModel::findByName(d->tableName)->primaryKey(); // QString pk = TableModel::findByName(d->tableName)->primaryKey();
@ -145,9 +147,13 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
while (q.next()) { while (q.next()) {
if(lastPkValue != q.value(pk)){ if(lastPkValue != q.value(pk)){
T *t = new T(); T *t = new T();
foreach (QString field, masterFields) foreach (QString field, masterFields)
t->setProperty(field.toLatin1().data(), q.value(field)); 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->setTableSet(d->tableSet);
t->setStatus(Table::FeatchedFromDB); t->setStatus(Table::FeatchedFromDB);

View File

@ -499,6 +499,11 @@ QString SqlGeneratorBase::escapeValue(const QVariant &v)const
return ""; return "";
} }
QVariant SqlGeneratorBase::readValue(const QVariant::Type &type, const QVariant &dbValue)
{
return dbValue;
}
QString SqlGeneratorBase::phraseOrder(const PhraseData *d) const 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 updateCommand(WherePhrase &phrase, QList<WherePhrase> &wheres, QString tableName);
virtual QString escapeValue(const QVariant &v) const; 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 phrase(const PhraseData *d) const;
virtual QString phraseUpdate(const PhraseData *d) const; virtual QString phraseUpdate(const PhraseData *d) const;
virtual QString operatorString(const PhraseData::Condition &cond) const; virtual QString operatorString(const PhraseData::Condition &cond) const;

View File

@ -27,6 +27,7 @@
#include <QDate> #include <QDate>
#include <QDateTime> #include <QDateTime>
#include <QTime> #include <QTime>
#include <QPoint>
#include <QSharedPointer> #include <QSharedPointer>
#include "defines.h" #include "defines.h"
#include "dbgeography.h" #include "dbgeography.h"
@ -146,7 +147,9 @@ class FieldPhrase: public WherePhrase{
public: public:
FieldPhrase(const char *className, const char* s); FieldPhrase(const char *className, const char* s);
WherePhrase operator =(const WherePhrase &other);
WherePhrase operator =(const QVariant &other); WherePhrase operator =(const QVariant &other);
WherePhrase operator +(const QVariant &other);
WherePhrase operator !(); WherePhrase operator !();
WherePhrase isNull(); WherePhrase isNull();
@ -168,6 +171,18 @@ Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase<T>::operator =(const QVariant &othe
return WherePhrase(this, PhraseData::Set, other); 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> template<typename T>
Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase<T>::operator !() 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<> template<>
class FieldPhrase<bool>: public WherePhrase{ class FieldPhrase<bool>: public WherePhrase{
public: public: