From b9b80ebcf38aa104c226d7bd25b3c60347b7215c Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Sun, 11 Mar 2018 12:08:07 +0330 Subject: [PATCH 1/4] zc --- src/phrase.cpp | 265 +++++++++++++++++++++++++++++++++++-------------- src/phrase.h | 36 +++++-- src/query.h | 6 +- 3 files changed, 223 insertions(+), 84 deletions(-) diff --git a/src/phrase.cpp b/src/phrase.cpp index b91b939..a3885c1 100644 --- a/src/phrase.cpp +++ b/src/phrase.cpp @@ -29,42 +29,60 @@ NUT_BEGIN_NAMESPACE PhraseData::PhraseData() : className(""), fieldName(""), type(Field), operatorCond(NotAssign), - left(0), right(0), operand(QVariant::Invalid), isNot(false) + left(0), right(0), operand(QVariant::Invalid), isNot(false), parents(3) { } PhraseData::PhraseData(const char *className, const char *fieldName) : className(className), fieldName(fieldName), type(Field), operatorCond(NotAssign), - left(0), right(0), operand(QVariant::Invalid), isNot(false) + left(0), right(0), operand(QVariant::Invalid), isNot(false), parents(1) { } PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o) : className(0), fieldName(0), - type(WithoutOperand), operatorCond(o), left(new PhraseData(l)), right(0), isNot(false) -{ } + type(WithoutOperand), operatorCond(o), left(l), right(0), + isNot(false), parents(1) +{ + l->parents++; +} PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o, - const PhraseData *r) + PhraseData *r) : className(0), fieldName(0), - type(WithOther), operatorCond(o), left(new PhraseData(l)), right(new PhraseData(r)), isNot(false) -{ } + type(WithOther), operatorCond(o), + left(l), right(r), + isNot(false), parents(1) +{ + l->parents++; + r->parents++; +} PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o, QVariant r) : className(0), fieldName(0), - type(WithVariant), operatorCond(o), left(new PhraseData(l)), right(0), operand(r), isNot(false) + type(WithVariant), operatorCond(o), left(l), + right(0), operand(r), isNot(false), parents(1) { } -PhraseData::PhraseData(const PhraseData &other) : - left(other.left), right(other.right), operand(other.operand), - operatorCond(other.operatorCond), className(other.className), - fieldName(other.fieldName), type(other.type), isNot(other.isNot) -{ } +PhraseData *PhraseData::operator =(PhraseData *other) +{ + LOG(""); + other->parents++; + return other; +} -PhraseData::PhraseData(const PhraseData *other) : - left(other->left), right(other->right), operand(other->operand), - operatorCond(other->operatorCond), className(other->className), - fieldName(other->fieldName), type(other->type), isNot(other->isNot) -{ } +//PhraseData::PhraseData(const PhraseData &other) : +// left(other.left), right(other.right), operand(other.operand), +// operatorCond(other.operatorCond), className(other.className), +// fieldName(other.fieldName), type(other.type), isNot(other.isNot), +// parents(other.parents + 1) +//{ } + +//PhraseData::PhraseData(const PhraseData *other) : +// left(other->left), right(other->right), operand(other->operand), +// operatorCond(other->operatorCond), className(other->className), +// fieldName(other->fieldName), type(other->type), isNot(other->isNot), +// parents(other->parents + 1) +//{ } QString PhraseData::toString() const { @@ -81,13 +99,34 @@ PhraseData::~PhraseData() // if (left) // delete left; // } + +// if (right && !--right->parents) +// delete right; + +// if (left && !--left->parents) +// delete left; + LOG(""); } +void PhraseData::cleanUp() +{ + cleanUp(this); +} + +void PhraseData::cleanUp(PhraseData *d) +{ + if (d->left) + cleanUp(d->left); + if (d->right) + cleanUp(d->right); +} + AbstractFieldPhrase::AbstractFieldPhrase(PhraseData *d) : data(d) { } -AbstractFieldPhrase::AbstractFieldPhrase(const char *className, const char *fieldName) +AbstractFieldPhrase::AbstractFieldPhrase(const char *className, + const char *fieldName) :data(new PhraseData(className, fieldName)) { qDebug() <<"AbstractFieldPhrase created"<toString(); - data = new PhraseData(other.data); + qDebug() <<"Copy ctor"<toString()<parents; + data = other.data; + data->parents++; } AbstractFieldPhrase::AbstractFieldPhrase(AbstractFieldPhrase &&other) @@ -109,13 +149,15 @@ AbstractFieldPhrase::~AbstractFieldPhrase() { if (data) { LOG(data->toString()); + qDebug() << data->parents; } else { LOG(""); } if (data) { - delete data; - data = 0; + --data->parents; + if (data->parents <= 0) + delete data; } } @@ -130,9 +172,11 @@ ConditionalPhrase AbstractFieldPhrase::isNull() } -ConditionalPhrase AbstractFieldPhrase::operator ==(const ConditionalPhrase &other) +ConditionalPhrase AbstractFieldPhrase::operator ==(const ConditionalPhrase + &other) { - return ConditionalPhrase(this, PhraseData::Equal, const_cast(other)); + return ConditionalPhrase(this, PhraseData::Equal, + const_cast(other)); } #define AbstractFieldPhraseOperatorVariant(class, op, cond) \ @@ -159,7 +203,7 @@ AbstractFieldPhraseOperatorField(>=, PhraseData::GreaterEqual) AbstractFieldPhrase AbstractFieldPhrase::operator !() { - AbstractFieldPhrase f(new PhraseData(data)); + AbstractFieldPhrase f(data->className, data->fieldName); f.data->isNot = !data->isNot; return f; } @@ -187,54 +231,67 @@ PhraseList::PhraseList(const PhraseList &other) : isValid(true) PhraseList::PhraseList(const AbstractFieldPhrase &other) : isValid(true) { - data.append(new PhraseData(other.data)); + data.append(other.data); + incAllDataParents(); } -PhraseList::PhraseList(const AbstractFieldPhrase *left, const AbstractFieldPhrase &right) +PhraseList::PhraseList(const AbstractFieldPhrase *left, + const AbstractFieldPhrase &right) : isValid(true) { - data.append(new PhraseData(left->data)); - data.append(new PhraseData(right.data)); + data.append(left->data); + data.append(right.data); + incAllDataParents(); } PhraseList::PhraseList(PhraseList *left, PhraseList *right) : isValid(true) { - data = qMove(left->data + right->data); - left->data.clear(); - right->data.clear(); +// data = qMove(left->data + right->data); + data.append(left->data); + data.append(right->data); +// left->data.clear(); +// right->data.clear(); } PhraseList::PhraseList(PhraseList *left, const AbstractFieldPhrase *right) : isValid(true) { data = left->data; - data.append(new PhraseData(right->data)); + data.append(right->data); + incAllDataParents(); } PhraseList::~PhraseList() -{ - qDeleteAll(data); -// data.clear(); -} +{ } PhraseList PhraseList::operator |(const AbstractFieldPhrase &other) { return PhraseList(this, &other); } +void PhraseList::incAllDataParents() +{ +// foreach (PhraseData *d, data) +// d->parents++; +} + PhraseList PhraseList::operator |(PhraseList &other) { return PhraseList(this, &other); } AssignmentPhrase::AssignmentPhrase(PhraseData *d) : data(d) -{ } +{ + d->parents++; +} AssignmentPhrase::AssignmentPhrase(AbstractFieldPhrase *l, const QVariant r) { + data = new PhraseData(l->data, PhraseData::Equal, r); // l->data = 0; } -AssignmentPhrase::AssignmentPhrase(AbstractFieldPhrase *l, const AssignmentPhrase *r) +AssignmentPhrase::AssignmentPhrase(AbstractFieldPhrase *l, + const AssignmentPhrase *r) { data = new PhraseData(l->data, PhraseData::Equal, r->data); // l->data = 0; @@ -254,7 +311,8 @@ AssignmentPhrase::AssignmentPhrase(AssignmentPhrase *ph, const QVariant &v) AssignmentPhrase::~AssignmentPhrase() { if (data) - delete data; + if (!--data->parents) + delete data; } //AssignmentPhrase::AssignmentPhrase(AssignmentPhrase *l, const AssignmentPhrase *r) @@ -276,35 +334,52 @@ AssignmentPhraseList::AssignmentPhraseList() AssignmentPhraseList::AssignmentPhraseList(const AssignmentPhrase &l) { data.append(l.data); + incAllDataParents(); } -AssignmentPhraseList::AssignmentPhraseList(AssignmentPhraseList *l, const AssignmentPhrase *r) +AssignmentPhraseList::AssignmentPhraseList(AssignmentPhraseList *l, + const AssignmentPhrase *r) { data.append(l->data); data.append(r->data); + incAllDataParents(); } -AssignmentPhraseList::AssignmentPhraseList(AssignmentPhrase *l, const AssignmentPhrase *r) +AssignmentPhraseList::AssignmentPhraseList(AssignmentPhrase *l, + const AssignmentPhrase *r) { data.append(l->data); data.append(r->data); + incAllDataParents(); } -AssignmentPhraseList::AssignmentPhraseList(const AssignmentPhrase &r, const AssignmentPhrase &l) +AssignmentPhraseList::AssignmentPhraseList(const AssignmentPhrase &r, + const AssignmentPhrase &l) { data.append(l.data); data.append(r.data); + incAllDataParents(); } -AssignmentPhraseList AssignmentPhraseList::operator &(const AssignmentPhrase &ph) +AssignmentPhraseList AssignmentPhraseList::operator &(const AssignmentPhrase + &ph) { return AssignmentPhraseList(this, &ph); } AssignmentPhraseList::~AssignmentPhraseList() { + foreach (PhraseData *d, data) + if (!--d->parents) + delete d; // qDeleteAll(data); -// data.clear(); + // data.clear(); +} + +void AssignmentPhraseList::incAllDataParents() +{ + foreach (PhraseData *d, data) + d->parents++; } ConditionalPhrase::ConditionalPhrase() : data(0) @@ -313,7 +388,8 @@ ConditionalPhrase::ConditionalPhrase() : data(0) ConditionalPhrase::ConditionalPhrase(const ConditionalPhrase &other) { qDebug() << "************* ctor called:"; - this->data = new PhraseData(other.data); + data = other.data; + data->parents++; // const_cast(other).data = 0; } @@ -327,7 +403,8 @@ ConditionalPhrase::ConditionalPhrase(const ConditionalPhrase &&other) ConditionalPhrase::ConditionalPhrase(const PhraseData *data) { - this->data = new PhraseData(data); + this->data = const_cast(data); + this->data->parents++; } ConditionalPhrase::ConditionalPhrase(AbstractFieldPhrase *l, @@ -386,13 +463,17 @@ ConditionalPhrase::ConditionalPhrase(ConditionalPhrase *l, ConditionalPhrase::~ConditionalPhrase() { LOG(""); - if (data) - delete data; + if (data) { + data->cleanUp(); + if (!--data->parents) + delete data; + } } ConditionalPhrase &ConditionalPhrase::operator =(const ConditionalPhrase &other) { - this->data = new PhraseData(other.data); + data = other.data; + data->parents++; return *this; } @@ -419,33 +500,40 @@ ConditionalPhrase ConditionalPhrase::operator ==(const QVariant &other) //} #define DECLARE_CONDITIONALPHRASE_OPERATORS(op, cond) \ -ConditionalPhrase operator op(const ConditionalPhrase &l, const ConditionalPhrase &r) \ -{ \ - ConditionalPhrase p; \ - p.data = new PhraseData; \ - p.data->operatorCond = cond; \ - p.data->left = new PhraseData(l.data); \ - p.data->right = new PhraseData(r.data); \ - return p; \ -} \ -ConditionalPhrase operator op(const ConditionalPhrase &l, ConditionalPhrase &&r) \ -{ \ - ConditionalPhrase p; \ - p.data = new PhraseData; \ - p.data->operatorCond = cond; \ - p.data->left = new PhraseData(l.data); \ - p.data->right = r.data; \ - r.data = 0; \ - return p; \ -} \ -ConditionalPhrase operator op(ConditionalPhrase &&l, const ConditionalPhrase &r) \ +ConditionalPhrase operator op(const ConditionalPhrase &l, \ + const ConditionalPhrase &r) \ { \ ConditionalPhrase p; \ p.data = new PhraseData; \ p.data->operatorCond = cond; \ p.data->left = l.data; \ - l.data = 0; \ - p.data->right = new PhraseData(r.data); \ + p.data->right = r.data; \ + l.data->parents++; \ + r.data->parents++; \ + return p; \ +} \ +ConditionalPhrase operator op(const ConditionalPhrase &l, \ + ConditionalPhrase &&r) \ +{ \ + ConditionalPhrase p; \ + p.data = new PhraseData; \ + p.data->operatorCond = cond; \ + p.data->left = l.data; \ + p.data->right = r.data; \ + l.data->parents++; \ + r.data->parents++; \ + return p; \ +} \ +ConditionalPhrase operator op(ConditionalPhrase &&l, \ + const ConditionalPhrase &r) \ +{ \ + ConditionalPhrase p; \ + p.data = new PhraseData; \ + p.data->operatorCond = cond; \ + p.data->left = l.data; \ + p.data->right = r.data; \ + l.data->parents++; \ + r.data->parents++; \ return p; \ } \ ConditionalPhrase operator op(ConditionalPhrase &&l, ConditionalPhrase &&r) \ @@ -455,7 +543,8 @@ ConditionalPhrase operator op(ConditionalPhrase &&l, ConditionalPhrase &&r) \ p.data->operatorCond = cond; \ p.data->left = l.data; \ p.data->right = r.data; \ - l.data = r.data = 0; \ + l.data->parents++; \ + r.data->parents++; \ return p; \ } @@ -470,6 +559,34 @@ ConditionalPhrase ConditionalPhrase::operator !() return f; } +PhraseDataList::PhraseDataList() : QList() +{ + +} + +void PhraseDataList::append(PhraseData *d) +{ + d->parents++; + QList::append(d); +} + +void PhraseDataList::append(QList &dl) +{ + foreach (PhraseData *d, dl) + d->parents++; + QList::append(dl); +} + +PhraseDataList::~PhraseDataList() +{ + QList::iterator i; + for (i = begin(); i != end(); ++i) { + (*i)->cleanUp(); + if (!--(*i)->parents) + delete *i; + } +} + //AssignmentPhraseList operator &(const AssignmentPhrase &l, const AssignmentPhrase &r) //{ // return AssignmentPhraseList(l, r); diff --git a/src/phrase.h b/src/phrase.h index 6ebcf48..7cf6fff 100644 --- a/src/phrase.h +++ b/src/phrase.h @@ -92,24 +92,40 @@ public: Type type; - const PhraseData *left; - const PhraseData *right; + PhraseData *left; + PhraseData *right; QVariant operand; Condition operatorCond; bool isNot; + quint16 parents; PhraseData(); PhraseData(const char *className, const char *fieldName); PhraseData(PhraseData *l, Condition o); - PhraseData(PhraseData *l, Condition o, const PhraseData *r); + PhraseData(PhraseData *l, Condition o, PhraseData *r); PhraseData(PhraseData *l, Condition o, QVariant r); - explicit PhraseData(const PhraseData &other); - explicit PhraseData(const PhraseData *other); +// explicit PhraseData(const PhraseData &other); +// explicit PhraseData(const PhraseData *other); + + PhraseData *operator =(PhraseData *other); QString toString() const; ~PhraseData(); + + void cleanUp(); +private: + void cleanUp(PhraseData *d); +}; + +class PhraseDataList : public QList +{ +public: + PhraseDataList(); + void append(PhraseData *d); + void append(QList &dl); + virtual ~PhraseDataList(); }; class AssignmentPhraseList @@ -125,6 +141,9 @@ public: AssignmentPhraseList operator &(const AssignmentPhrase &ph); ~AssignmentPhraseList(); + +private: + void incAllDataParents(); }; class AssignmentPhrase @@ -151,7 +170,7 @@ public: class PhraseList{ public: bool isValid; - QList data; + PhraseDataList data; explicit PhraseList(); PhraseList(const PhraseList &other); PhraseList(const AbstractFieldPhrase &other); @@ -162,6 +181,9 @@ public: PhraseList operator |(PhraseList &other); PhraseList operator |(const AbstractFieldPhrase &other); + +private: + void incAllDataParents(); }; class ConditionalPhrase @@ -350,7 +372,7 @@ public: FieldPhrase operator !() { FieldPhrase f(data->className, data->fieldName); - f.data = new PhraseData(data); +// f.data = new PhraseData(data); f.data->isNot = !data->isNot; return f; } diff --git a/src/query.h b/src/query.h index 29a5031..b8d0d3a 100644 --- a/src/query.h +++ b/src/query.h @@ -139,7 +139,7 @@ Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) d->sql = d->database->sqlGenertor()->selectCommand( d->tableName, d->fieldPhrase, d->wherePhrase, d->orderPhrase, d->relations, d->skip, d->take); -qDebug() <sql; + QSqlQuery q = d->database->exec(d->sql); if (q.lastError().isValid()) { qDebug() << q.lastError().text(); @@ -307,7 +307,7 @@ Q_OUTOFLINE_TEMPLATE QList Query::select(const FieldPhrase f) d->wherePhrase, d->relations, d->skip, d->take); -qDebug() << d->sql; + QSqlQuery q = d->database->exec(d->sql); while (q.next()) { @@ -520,7 +520,7 @@ Q_OUTOFLINE_TEMPLATE int Query::update(const AssignmentPhraseList &ph) ph, d->wherePhrase); QSqlQuery q = d->database->exec(d->sql); -qDebug() << d->sql; + if (m_autoDelete) deleteLater(); return q.numRowsAffected(); From 9f712a55eafbf136b00f71bf955b181662d06ff2 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Sun, 11 Mar 2018 13:24:36 +0330 Subject: [PATCH 2/4] wip --- src/generators/sqlgeneratorbase.cpp | 4 ++- src/phrase.cpp | 55 ++++++++++++++++++++++------- src/phrase.h | 4 +++ 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/generators/sqlgeneratorbase.cpp b/src/generators/sqlgeneratorbase.cpp index 44efaec..ad64f94 100644 --- a/src/generators/sqlgeneratorbase.cpp +++ b/src/generators/sqlgeneratorbase.cpp @@ -931,7 +931,9 @@ SqlGeneratorBase::operatorString(const PhraseData::Condition &cond) const void SqlGeneratorBase::appendSkipTake(QString &sql, int skip, int take) { - + Q_UNUSED(sql); + Q_UNUSED(skip); + Q_UNUSED(take); } QString SqlGeneratorBase::createConditionalPhrase(const PhraseData *d) const diff --git a/src/phrase.cpp b/src/phrase.cpp index a3885c1..0c9f9bc 100644 --- a/src/phrase.cpp +++ b/src/phrase.cpp @@ -24,12 +24,12 @@ NUT_BEGIN_NAMESPACE -#define LOG(s) qDebug() << __func__ << s; +#define LOG(s) qDebug() << __func__ << s PhraseData::PhraseData() : className(""), fieldName(""), type(Field), operatorCond(NotAssign), - left(0), right(0), operand(QVariant::Invalid), isNot(false), parents(3) + left(0), right(0), operand(QVariant::Invalid), isNot(false), parents(1) { } PhraseData::PhraseData(const char *className, const char *fieldName) : @@ -70,6 +70,12 @@ PhraseData *PhraseData::operator =(PhraseData *other) return other; } +PhraseData &PhraseData::operator =(PhraseData &other) +{ + other.parents++; + return other; +} + //PhraseData::PhraseData(const PhraseData &other) : // left(other.left), right(other.right), operand(other.operand), // operatorCond(other.operatorCond), className(other.className), @@ -111,7 +117,7 @@ PhraseData::~PhraseData() void PhraseData::cleanUp() { - cleanUp(this); +// cleanUp(this); } void PhraseData::cleanUp(PhraseData *d) @@ -134,22 +140,22 @@ AbstractFieldPhrase::AbstractFieldPhrase(const char *className, AbstractFieldPhrase::AbstractFieldPhrase(const AbstractFieldPhrase &other) { - qDebug() <<"Copy ctor"<toString()<parents; data = other.data; data->parents++; + qDebug() <<"Copy ctor"<toString()<parents; } AbstractFieldPhrase::AbstractFieldPhrase(AbstractFieldPhrase &&other) { data = other.data; + data->parents++; other.data = 0; } AbstractFieldPhrase::~AbstractFieldPhrase() { if (data) { - LOG(data->toString()); - qDebug() << data->parents; + LOG(data->toString()) << data->parents; } else { LOG(""); } @@ -203,6 +209,7 @@ AbstractFieldPhraseOperatorField(>=, PhraseData::GreaterEqual) AbstractFieldPhrase AbstractFieldPhrase::operator !() { + AbstractFieldPhrase f(data->className, data->fieldName); f.data->isNot = !data->isNot; return f; @@ -225,10 +232,17 @@ PhraseList::PhraseList() : isValid(false) PhraseList::PhraseList(const PhraseList &other) : isValid(true) { + LOG(""); data = qMove(other.data); const_cast(other).data.clear(); } +PhraseList::PhraseList(PhraseList &&other) +{ + LOG(""); + data = other.data; +} + PhraseList::PhraseList(const AbstractFieldPhrase &other) : isValid(true) { data.append(other.data); @@ -256,13 +270,20 @@ PhraseList::PhraseList(PhraseList *left, PhraseList *right) : isValid(true) PhraseList::PhraseList(PhraseList *left, const AbstractFieldPhrase *right) : isValid(true) { - data = left->data; + data.append(left->data); data.append(right->data); incAllDataParents(); } PhraseList::~PhraseList() -{ } +{ + LOG(""); +} + +PhraseList &PhraseList::operator =(const PhraseData &other) +{ + return other; +} PhraseList PhraseList::operator |(const AbstractFieldPhrase &other) { return PhraseList(this, &other); @@ -564,6 +585,14 @@ PhraseDataList::PhraseDataList() : QList() } +PhraseDataList::PhraseDataList(const PhraseDataList &other) : QList() +{ + PhraseDataList &o = const_cast(other); + PhraseDataList::iterator i; + for (i = o.begin(); i != o.end(); ++i) + append(*i); +} + void PhraseDataList::append(PhraseData *d) { d->parents++; @@ -580,11 +609,11 @@ void PhraseDataList::append(QList &dl) PhraseDataList::~PhraseDataList() { QList::iterator i; - for (i = begin(); i != end(); ++i) { - (*i)->cleanUp(); - if (!--(*i)->parents) - delete *i; - } + for (i = begin(); i != end(); ++i) { + (*i)->cleanUp(); + if (!--(*i)->parents) + delete *i; + } } //AssignmentPhraseList operator &(const AssignmentPhrase &l, const AssignmentPhrase &r) diff --git a/src/phrase.h b/src/phrase.h index 7cf6fff..97e49d7 100644 --- a/src/phrase.h +++ b/src/phrase.h @@ -109,6 +109,7 @@ public: // explicit PhraseData(const PhraseData *other); PhraseData *operator =(PhraseData *other); + PhraseData &operator =(PhraseData &other); QString toString() const; @@ -123,6 +124,7 @@ class PhraseDataList : public QList { public: PhraseDataList(); + PhraseDataList(const PhraseDataList &other); void append(PhraseData *d); void append(QList &dl); virtual ~PhraseDataList(); @@ -173,12 +175,14 @@ public: PhraseDataList data; explicit PhraseList(); PhraseList(const PhraseList &other); + PhraseList(PhraseList &&other); PhraseList(const AbstractFieldPhrase &other); PhraseList(const AbstractFieldPhrase *left, const AbstractFieldPhrase &right); PhraseList(PhraseList *left, PhraseList *right); PhraseList(PhraseList *left, const AbstractFieldPhrase *right); virtual ~PhraseList(); + PhraseList &operator =(const PhraseData &other); PhraseList operator |(PhraseList &other); PhraseList operator |(const AbstractFieldPhrase &other); From 244778eb5015801d4daab9dff9050cdfbb86b5b0 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Sun, 11 Mar 2018 16:43:13 +0330 Subject: [PATCH 3/4] rc --- src/generators/sqlgeneratorbase_p.h | 2 +- src/phrase.cpp | 5 +++-- src/phrase.h | 2 +- src/query_p.h | 2 +- src/tablemodel.cpp | 6 ++++++ src/tablemodel.h | 1 + 6 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/generators/sqlgeneratorbase_p.h b/src/generators/sqlgeneratorbase_p.h index d0aa239..1c5d98f 100644 --- a/src/generators/sqlgeneratorbase_p.h +++ b/src/generators/sqlgeneratorbase_p.h @@ -34,7 +34,7 @@ struct FieldModel; class DatabaseModel; class TableModel; class Database; -class RelationModel; +struct RelationModel; class SqlGeneratorBase : public QObject { // Q_OBJECT diff --git a/src/phrase.cpp b/src/phrase.cpp index 0c9f9bc..274cdcc 100644 --- a/src/phrase.cpp +++ b/src/phrase.cpp @@ -280,9 +280,10 @@ PhraseList::~PhraseList() LOG(""); } -PhraseList &PhraseList::operator =(const PhraseData &other) +PhraseList &PhraseList::operator =(const PhraseList &other) { - return other; + data.append(const_cast(other).data); + return *this; } PhraseList PhraseList::operator |(const AbstractFieldPhrase &other) { diff --git a/src/phrase.h b/src/phrase.h index 97e49d7..c466d9d 100644 --- a/src/phrase.h +++ b/src/phrase.h @@ -182,7 +182,7 @@ public: PhraseList(PhraseList *left, const AbstractFieldPhrase *right); virtual ~PhraseList(); - PhraseList &operator =(const PhraseData &other); + PhraseList &operator =(const PhraseList &other); PhraseList operator |(PhraseList &other); PhraseList operator |(const AbstractFieldPhrase &other); diff --git a/src/query_p.h b/src/query_p.h index 1bb2b16..f7127cc 100644 --- a/src/query_p.h +++ b/src/query_p.h @@ -31,7 +31,7 @@ NUT_BEGIN_NAMESPACE class Database; class TableSetBase; class QueryBase; -class RelationModel; +struct RelationModel; class QueryPrivate{ QueryBase *q_ptr; Q_DECLARE_PUBLIC(QueryBase) diff --git a/src/tablemodel.cpp b/src/tablemodel.cpp index b42269a..b77c173 100644 --- a/src/tablemodel.cpp +++ b/src/tablemodel.cpp @@ -324,6 +324,12 @@ TableModel::TableModel(QJsonObject json, QString tableName) _allModels.insert(this); } +TableModel::~TableModel() +{ + qDeleteAll(_fields); + qDeleteAll(_foreignKeys); +} + QJsonObject TableModel::toJson() const { QJsonObject obj; diff --git a/src/tablemodel.h b/src/tablemodel.h index d504c78..3a4ec06 100644 --- a/src/tablemodel.h +++ b/src/tablemodel.h @@ -94,6 +94,7 @@ class TableModel public: explicit TableModel(int typeId, QString tableName = QString::null); explicit TableModel(QJsonObject json, QString tableName); + virtual ~TableModel(); QJsonObject toJson() const; From 23bc60e3cddbfadb0259712c2b583745a085740a Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Tue, 13 Mar 2018 11:29:11 +0330 Subject: [PATCH 4/4] zero copy ok for phrases --- src/database.cpp | 1 + src/databasemodel.cpp | 8 +++++++- src/query.h | 17 ----------------- test/basic/maintest.cpp | 11 ++++++++++- test/basic/maintest.h | 2 ++ 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/database.cpp b/src/database.cpp index 9d5983b..0e2518a 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -190,6 +190,7 @@ bool DatabasePrivate::getCurrectScheema() // TODO: change logs must not be in model int changeLogTypeId = qRegisterMetaType(); + currentModel.append( new TableModel(changeLogTypeId, __CHANGE_LOG_TABLE_NAME)); tables.insert(ChangeLogTable::staticMetaObject.className(), diff --git a/src/databasemodel.cpp b/src/databasemodel.cpp index b732f3d..0902b7d 100644 --- a/src/databasemodel.cpp +++ b/src/databasemodel.cpp @@ -229,7 +229,13 @@ DatabaseModel *DatabaseModel::modelByName(const QString &name) void DatabaseModel::deleteAllModels() { - qDeleteAll(_models.values()); + QMapIterator i(_models); + while (i.hasNext()) { + i.next(); +// cout << i.key() << ": " << i.value() << endl; + delete i.value(); + } +// qDeleteAll(_models.values()); _models.clear(); } diff --git a/src/query.h b/src/query.h index b8d0d3a..8ab8c54 100644 --- a/src/query.h +++ b/src/query.h @@ -73,9 +73,6 @@ public: Query *where(const ConditionalPhrase &ph); Query *setWhere(const ConditionalPhrase &ph); - Query *include(TableSetBase *t); - Query *include(Table *t); - //data selecting T *first(); QList toList(int count = -1); @@ -496,20 +493,6 @@ Q_OUTOFLINE_TEMPLATE Query *Query::orderBy(const PhraseList &ph) return this; } -template -Q_OUTOFLINE_TEMPLATE Query *Query::include(TableSetBase *t) -{ - Q_D(Query); - return this; -} - -template -Q_OUTOFLINE_TEMPLATE Query *Query::include(Table *t) -{ - Q_D(Query); - return this; -} - template Q_OUTOFLINE_TEMPLATE int Query::update(const AssignmentPhraseList &ph) { diff --git a/test/basic/maintest.cpp b/test/basic/maintest.cpp index a8a75be..74f5d14 100644 --- a/test/basic/maintest.cpp +++ b/test/basic/maintest.cpp @@ -209,7 +209,7 @@ void MainTest::testDate() db.postTable()->append(newPost); - db.saveChanges(); + db.saveChanges(true); auto q = db.postTable()->query() ->setWhere(Post::idField() == newPost->id()) @@ -269,4 +269,13 @@ void MainTest::emptyDatabase() QTEST_ASSERT(commentsCount == 6); } +void MainTest::cleanupTestCase() +{ + post->deleteLater(); + user->deleteLater(); + + qDeleteAll(TableModel::allModels()); + DatabaseModel::deleteAllModels(); +} + QTEST_MAIN(MainTest) diff --git a/test/basic/maintest.h b/test/basic/maintest.h index c79ce1a..67ec06b 100644 --- a/test/basic/maintest.h +++ b/test/basic/maintest.h @@ -39,6 +39,8 @@ private slots: void selectWithInvalidRelation(); void modifyPost(); void emptyDatabase(); + + void cleanupTestCase(); }; #endif // MAINTEST_H