From ac2fa1a4ae24b567afa5a711c92e2a949534adcd Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Thu, 7 Mar 2019 19:05:57 +0330 Subject: [PATCH] fix: crash when table destroyed and new query going to execute [skip ci] --- nut.pri | 6 ++++-- src/bulkinserter.cpp | 20 ++++++++++++++++++++ src/bulkinserter.h | 26 ++++++++++++++++++++++++++ src/database.cpp | 4 +++- src/table.cpp | 9 +++++++++ src/table.h | 1 + src/tableset.h | 11 +++++++++++ src/tablesetbase.cpp | 6 ++++++ src/tablesetbase_p.h | 1 + 9 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 src/bulkinserter.cpp create mode 100644 src/bulkinserter.h diff --git a/nut.pri b/nut.pri index 993bae4..b0f235b 100644 --- a/nut.pri +++ b/nut.pri @@ -39,7 +39,8 @@ HEADERS += \ $$PWD/src/phrases/phrasedata.h \ $$PWD/src/phrases/assignmentphrase.h \ $$PWD/src/phrases/numericphrase.h \ - $$PWD/src/phrases/datephrase.h + $$PWD/src/phrases/datephrase.h \ + $$PWD/src/bulkinserter.h SOURCES += \ $$PWD/src/generators/sqlgeneratorbase.cpp \ @@ -70,4 +71,5 @@ SOURCES += \ $$PWD/src/phrases/phrasedata.cpp \ $$PWD/src/phrases/assignmentphrase.cpp \ $$PWD/src/phrases/numericphrase.cpp \ - $$PWD/src/phrases/datephrase.cpp + $$PWD/src/phrases/datephrase.cpp \ + $$PWD/src/bulkinserter.cpp diff --git a/src/bulkinserter.cpp b/src/bulkinserter.cpp new file mode 100644 index 0000000..43bbc6d --- /dev/null +++ b/src/bulkinserter.cpp @@ -0,0 +1,20 @@ +#include "bulkinserter.h" +#include "phrases/phraselist.h" + +Nut::BulkInserter::BulkInserter(QString &className) +{ + +} + +void Nut::BulkInserter::setFields(const Nut::PhraseList &ph) +{ + +} + +void Nut::BulkInserter::insert(std::initializer_list vars) +{ + std::initializer_list::iterator it; // same as: const int* it + for (it = vars.begin(); it != vars.end(); ++it) + qDebug() << *it; +} + diff --git a/src/bulkinserter.h b/src/bulkinserter.h new file mode 100644 index 0000000..03d0dab --- /dev/null +++ b/src/bulkinserter.h @@ -0,0 +1,26 @@ +#ifndef BULKINSERTER_H +#define BULKINSERTER_H + +#include +#include +#include "defines.h" + +NUT_BEGIN_NAMESPACE + +class PhraseList; +class BulkInserter +{ +public: + BulkInserter(QString &className); + void setFields(const PhraseList &ph); + + void insert(std::initializer_list vars); + template + void insert(Args... args) { + insert({args...}); + } +}; + +NUT_END_NAMESPACE + +#endif // BULKINSERTER_H diff --git a/src/database.cpp b/src/database.cpp index aab0dde..ade2fb6 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -135,6 +135,8 @@ bool DatabasePrivate::updateDatabase() if (last == current) { qDebug("Databse is up-to-date"); + //TODO: crash without this and I don't know why! + changeLogs->clearChilds(); return true; } @@ -348,7 +350,7 @@ bool DatabasePrivate::putModelToDatabase() changeLog->setData(QJsonDocument(current.toJson()).toJson(QJsonDocument::Compact)); changeLog->setVersion(current.version()); changeLogs->append(changeLog); - q->saveChanges(); + q->saveChanges(true); changeLog->deleteLater(); return true; diff --git a/src/table.cpp b/src/table.cpp index 98514e7..3da6831 100644 --- a/src/table.cpp +++ b/src/table.cpp @@ -44,9 +44,18 @@ Table::Table(QObject *parent) : QObject(parent), d_ptr(new TablePrivate(this)) { Q_D(Table); + d->status = NewCreated; d->model = TableModel::findByClassName(metaObject()->className()); } +Table::~Table() +{ + Q_D(Table); + + if (d->parentTableSet) + d->parentTableSet->remove(this); +} + void Table::add(TableSetBase *t) { Q_D(Table); diff --git a/src/table.h b/src/table.h index a950f53..4d58fde 100644 --- a/src/table.h +++ b/src/table.h @@ -43,6 +43,7 @@ class NUT_EXPORT Table : public QObject public: explicit Table(QObject *parentTableSet = nullptr); + virtual ~Table(); enum Status{ NewCreated, diff --git a/src/tableset.h b/src/tableset.h index fd3d24d..5ae6525 100644 --- a/src/tableset.h +++ b/src/tableset.h @@ -29,12 +29,14 @@ #include "tablesetbase_p.h" #include "table.h" +#include "bulkinserter.h" NUT_BEGIN_NAMESPACE template class Query; +class BulkInserter; template class NUT_EXPORT TableSet : public TableSetBase { @@ -54,6 +56,7 @@ public: const T &operator[](int i) const; Query *query(bool autoDelete = true); + BulkInserter *bulkInserter(); }; template @@ -76,6 +79,14 @@ Q_OUTOFLINE_TEMPLATE Query *TableSet::query(bool autoDelete) return q; } +template +Q_OUTOFLINE_TEMPLATE BulkInserter *TableSet::bulkInserter() +{ + BulkInserter *bi = new BulkInserter(_childClassName); + return bi; + +} + template Q_OUTOFLINE_TEMPLATE int TableSet::length() const { diff --git a/src/tablesetbase.cpp b/src/tablesetbase.cpp index ea4f618..604fd0a 100644 --- a/src/tablesetbase.cpp +++ b/src/tablesetbase.cpp @@ -75,6 +75,12 @@ void TableSetBase::add(Table *t) } } +void TableSetBase::remove(Table *t) +{ + _tables.remove(t); + _tablesList.removeOne(t); +} + QString TableSetBase::childClassName() const { return _childClassName; diff --git a/src/tablesetbase_p.h b/src/tablesetbase_p.h index e379fe2..4967bbb 100644 --- a/src/tablesetbase_p.h +++ b/src/tablesetbase_p.h @@ -55,6 +55,7 @@ protected: private: void add(Table* t); + void remove(Table* t); friend class Table; friend class QueryBase;