From d39c6aee37a3dbec26e17c74043fe2ed1742eb0d Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Mon, 10 Aug 2020 11:12:06 +0430 Subject: [PATCH 01/13] movable query --- src/nut/query.h | 160 +++++++++++++++++++++++++++++++----------------- 1 file changed, 104 insertions(+), 56 deletions(-) diff --git a/src/nut/query.h b/src/nut/query.h index 8cf076d..fbd36da 100644 --- a/src/nut/query.h +++ b/src/nut/query.h @@ -48,34 +48,59 @@ NUT_BEGIN_NAMESPACE +struct NUT_EXPORT QueryData { + QString sql; + QString className; + QString tableName; + QString select; + Database *database; + AbstractTableSet *tableSet; + QStringList joins; + QList relations; + int skip; + int take; + PhraseList orderPhrase, fieldPhrase; + ConditionalPhrase wherePhrase; + + QueryData *clone() { + return new QueryData; + } +}; + template class Query : public AbstractQuery { + QueryData *d; bool m_autoDelete; public: explicit Query(Database *database, AbstractTableSet *tableSet, bool autoDelete); + Query (const Query &other); + Query (Query &&other); + ~Query(); + Query& operator=(const Query &q); + //ddl - Query *join(const QString &className); - Query *join(Table *c); + Query &join(const QString &className); + Query &join(Table *c); template - Query *join() + Query &join() { join(TABLE::staticMetaObject.className()); - return this; + return *this; } - // Query *orderBy(QString fieldName, QString type); - Query *skip(int n); - Query *take(int n); - Query *fields(const PhraseList &ph); - Query *orderBy(const PhraseList &ph); - Query *where(const ConditionalPhrase &ph); - Query *setWhere(const ConditionalPhrase &ph); + // Query &orderBy(QString fieldName, QString type); + Query &skip(int n); + Query &take(int n); + Query &fields(const PhraseList &ph); + Query &orderBy(const PhraseList &ph); + Query &where(const ConditionalPhrase &ph); + Query &setWhere(const ConditionalPhrase &ph); //data selecting Row first(); @@ -110,7 +135,7 @@ template template Q_OUTOFLINE_TEMPLATE QList Query::select(const std::function allocator) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); QList ret; d->joins.prepend(d->tableName); @@ -135,7 +160,7 @@ Q_OUTOFLINE_TEMPLATE QList Query::select(const std::function -//inline Query *createQuery(TableSet *tableSet) +//inline Query &createQuery(TableSet *tableSet) //{ // return tableSet->query(); //} @@ -143,9 +168,9 @@ Q_OUTOFLINE_TEMPLATE QList Query::select(const std::function Q_OUTOFLINE_TEMPLATE Query::Query(Database *database, AbstractTableSet *tableSet, bool autoDelete) - : AbstractQuery(database), m_autoDelete(autoDelete) + : AbstractQuery(database), d(new QueryData), m_autoDelete(autoDelete) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->database = database; d->tableSet = tableSet; @@ -156,17 +181,40 @@ Q_OUTOFLINE_TEMPLATE Query::Query(Database *database, AbstractTableSet *table ->name(); } +template +Q_OUTOFLINE_TEMPLATE Query::Query(const Query &other) { + d = other.d->clone(); +} + +template +Q_OUTOFLINE_TEMPLATE Query::Query(Query &&other) { + d = std::move(other.d); + other._data = nullptr; +} + template Q_OUTOFLINE_TEMPLATE Query::~Query() { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); delete d; } +template +Q_OUTOFLINE_TEMPLATE Query &Query::operator=(const Query &q) +{ + if (this != &q) + { + T *p = q._data ? q._data->detach() : nullptr; + delete d; + d = p; + } + return *this; +} + template Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); RowList returnList; d->select = QStringLiteral("*"); @@ -343,7 +391,7 @@ template template Q_OUTOFLINE_TEMPLATE QList Query::select(const FieldPhrase f) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); QList ret; d->joins.prepend(d->tableName); @@ -381,7 +429,7 @@ Q_OUTOFLINE_TEMPLATE Row Query::first() template Q_OUTOFLINE_TEMPLATE int Query::count() { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->joins.prepend(d->tableName); d->select = QStringLiteral("COUNT(*)"); @@ -401,7 +449,7 @@ Q_OUTOFLINE_TEMPLATE int Query::count() template Q_OUTOFLINE_TEMPLATE QVariant Query::max(const FieldPhrase &f) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->joins.prepend(d->tableName); d->sql = d->database->sqlGenerator()->selectCommand( @@ -419,7 +467,7 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::max(const FieldPhrase &f) template Q_OUTOFLINE_TEMPLATE QVariant Query::min(const FieldPhrase &f) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->joins.prepend(d->tableName); d->sql = d->database->sqlGenerator()->selectCommand( @@ -437,7 +485,7 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::min(const FieldPhrase &f) template Q_OUTOFLINE_TEMPLATE QVariant Query::sum(const FieldPhrase &f) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->joins.prepend(d->tableName); d->sql = d->database->sqlGenerator()->selectCommand( @@ -455,7 +503,7 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::sum(const FieldPhrase &f) template Q_OUTOFLINE_TEMPLATE QVariant Query::average(const FieldPhrase &f) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->joins.prepend(d->tableName); d->sql = d->database->sqlGenerator()->selectCommand( @@ -473,7 +521,7 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::average(const FieldPhrase &f) template Q_OUTOFLINE_TEMPLATE QVariant Query::insert(const AssignmentPhraseList &p) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->sql = d->database->sqlGenerator() ->insertCommand(d->tableName, p); QSqlQuery q = d->database->exec(d->sql); @@ -482,9 +530,9 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::insert(const AssignmentPhraseList &p) } template -Q_OUTOFLINE_TEMPLATE Query *Query::join(const QString &className) +Q_OUTOFLINE_TEMPLATE Query &Query::join(const QString &className) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); RelationModel *rel = d->database->model() .relationByClassNames(d->className, className); @@ -495,85 +543,85 @@ Q_OUTOFLINE_TEMPLATE Query *Query::join(const QString &className) if (!rel) { qDebug() << "No relation between" << d->className << "and" << className; - return this; + return *this; } d->relations.append(rel); d->joins.append(className); - return this; + return *this; } template -Q_OUTOFLINE_TEMPLATE Query *Query::join(Table *c) +Q_OUTOFLINE_TEMPLATE Query &Query::join(Table *c) { join(c->metaObject()->className()); - return this; + return *this; } template -Q_OUTOFLINE_TEMPLATE Query *Query::where(const ConditionalPhrase &ph) +Q_OUTOFLINE_TEMPLATE Query &Query::where(const ConditionalPhrase &ph) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); if (d->wherePhrase.data) d->wherePhrase = d->wherePhrase && ph; else d->wherePhrase = ph; - return this; + return *this; } template -Q_OUTOFLINE_TEMPLATE Query *Query::setWhere(const ConditionalPhrase &ph) +Q_OUTOFLINE_TEMPLATE Query &Query::setWhere(const ConditionalPhrase &ph) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->wherePhrase = ph; - return this; + return *this; } template -Q_OUTOFLINE_TEMPLATE Query *Query::skip(int n) +Q_OUTOFLINE_TEMPLATE Query &Query::skip(int n) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->skip = n; - return this; + return *this; } template -Q_OUTOFLINE_TEMPLATE Query *Query::take(int n) +Q_OUTOFLINE_TEMPLATE Query &Query::take(int n) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->take = n; - return this; + return *this; } template -Q_OUTOFLINE_TEMPLATE Query *Query::fields(const PhraseList &ph) +Q_OUTOFLINE_TEMPLATE Query &Query::fields(const PhraseList &ph) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->fieldPhrase = ph; - return this; + return *this; } //template -//Q_OUTOFLINE_TEMPLATE Query *Query::orderBy(QString fieldName, +//Q_OUTOFLINE_TEMPLATE Query &Query::orderBy(QString fieldName, // QString type) //{ -// Q_D(AbstractQuery); +// //Q_D(AbstractQuery); // d->orderPhrases.append(fieldName, type); -// return this; +// return *this; //} template -Q_OUTOFLINE_TEMPLATE Query *Query::orderBy(const PhraseList &ph) +Q_OUTOFLINE_TEMPLATE Query &Query::orderBy(const PhraseList &ph) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->orderPhrase = ph; - return this; + return *this; } template Q_OUTOFLINE_TEMPLATE int Query::update(const AssignmentPhraseList &ph) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->sql = d->database->sqlGenerator()->updateCommand( d->tableName, @@ -590,7 +638,7 @@ Q_OUTOFLINE_TEMPLATE int Query::update(const AssignmentPhraseList &ph) template Q_OUTOFLINE_TEMPLATE int Query::remove() { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->sql = d->database->sqlGenerator()->deleteCommand( d->tableName, d->wherePhrase); @@ -612,7 +660,7 @@ Q_OUTOFLINE_TEMPLATE QSqlQueryModel *Query::toModel() template Q_OUTOFLINE_TEMPLATE void Query::toModel(QSqlQueryModel *model) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->sql = d->database->sqlGenerator()->selectCommand( d->tableName, @@ -649,7 +697,7 @@ Q_OUTOFLINE_TEMPLATE void Query::toModel(QSqlQueryModel *model) template Q_OUTOFLINE_TEMPLATE void Query::toModel(SqlModel *model) { - Q_D(AbstractQuery); + //Q_D(AbstractQuery); d->sql = d->database->sqlGenerator()->selectCommand( d->tableName, @@ -686,7 +734,7 @@ Q_OUTOFLINE_TEMPLATE void Query::toModel(SqlModel *model) template Q_OUTOFLINE_TEMPLATE QString Query::sqlCommand() const { - Q_D(const AbstractQuery); + //Q_D(const AbstractQuery); return d->sql; } From 9a10c53beeaa8f16aa83c0ce1d3237bb9ae4fa8c Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Mon, 10 Aug 2020 12:21:43 +0430 Subject: [PATCH 02/13] :-( --- src/nut/3rdparty/serializer | 2 +- src/nut/database.cpp | 2 +- src/nut/query.h | 22 ++++-- src/nut/tableset.h | 8 +-- tests/auto/tst_basic/tst_basic.cpp | 84 +++++++++++----------- tests/auto/tst_datatypes/tst_datatypes.cpp | 10 +-- tests/auto/tst_datetime/tst_datetime.cpp | 50 ++++++------- tests/auto/tst_json/tst_json.cpp | 6 +- tests/auto/tst_quuid/tst_uuid.cpp | 4 +- tests/auto/tst_upgrades/tst_upgrades.cpp | 4 +- 10 files changed, 102 insertions(+), 90 deletions(-) diff --git a/src/nut/3rdparty/serializer b/src/nut/3rdparty/serializer index 2dc11b3..acbd689 160000 --- a/src/nut/3rdparty/serializer +++ b/src/nut/3rdparty/serializer @@ -1 +1 @@ -Subproject commit 2dc11b380a07424a4face3046cc6b5e50aefb700 +Subproject commit acbd68924feb9ee412b4d69bbf24cb3a3cffdfd6 diff --git a/src/nut/database.cpp b/src/nut/database.cpp index 205b895..de16341 100644 --- a/src/nut/database.cpp +++ b/src/nut/database.cpp @@ -281,7 +281,7 @@ bool DatabasePrivate::getCurrectSchema() DatabaseModel DatabasePrivate::getLastSchema() { Row u = changeLogs->query() - ->orderBy(!ChangeLogTable::idField()) + .orderBy(!ChangeLogTable::idField()) .first(); // DatabaseModel ret(q->metaObject()->className()); diff --git a/src/nut/query.h b/src/nut/query.h index fbd36da..d83fd16 100644 --- a/src/nut/query.h +++ b/src/nut/query.h @@ -63,7 +63,21 @@ struct NUT_EXPORT QueryData { ConditionalPhrase wherePhrase; QueryData *clone() { - return new QueryData; + auto r = new QueryData; + r->sql = sql; + r->className = className; + r->tableName = tableName; + r->select = select; + r->database = database; + r->tableSet = tableSet; + r->joins = joins; + r->relations = relations; + r->skip = skip; + r->take = take; + r->orderPhrase = orderPhrase; + r->fieldPhrase = fieldPhrase; + r->wherePhrase = wherePhrase; + return r; } }; @@ -189,7 +203,7 @@ Q_OUTOFLINE_TEMPLATE Query::Query(const Query &other) { template Q_OUTOFLINE_TEMPLATE Query::Query(Query &&other) { d = std::move(other.d); - other._data = nullptr; + other.d = nullptr; } template @@ -204,7 +218,7 @@ Q_OUTOFLINE_TEMPLATE Query &Query::operator=(const Query &q) { if (this != &q) { - T *p = q._data ? q._data->detach() : nullptr; + QueryData *p = q.d ? q.d->clone() : nullptr; delete d; d = p; } @@ -371,7 +385,7 @@ Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) } row->setStatus(Table::FetchedFromDB); - row->setParent(this); +// row->setParent(this); row->clear(); //set last created row diff --git a/src/nut/tableset.h b/src/nut/tableset.h index 6fb9c7c..8cd813a 100644 --- a/src/nut/tableset.h +++ b/src/nut/tableset.h @@ -63,7 +63,7 @@ public: Row at(int i) const; Row operator[](int i) const; - Query *query(bool autoDelete = true); + Query query(bool autoDelete = true); BulkInserter *bulkInserter(); }; @@ -80,11 +80,9 @@ Q_OUTOFLINE_TEMPLATE TableSet::TableSet(Table *parent) : AbstractTableSet(par } template -Q_OUTOFLINE_TEMPLATE Query *TableSet::query(bool autoDelete) +Q_OUTOFLINE_TEMPLATE Query TableSet::query(bool autoDelete) { - Query *q = new Query(data->database, this, autoDelete); - - return q; + return Query(data->database, this, autoDelete); } template diff --git a/tests/auto/tst_basic/tst_basic.cpp b/tests/auto/tst_basic/tst_basic.cpp index 7e1a7a2..a188f80 100644 --- a/tests/auto/tst_basic/tst_basic.cpp +++ b/tests/auto/tst_basic/tst_basic.cpp @@ -38,10 +38,10 @@ void BasicTest::initTestCase() bool ok = db.open(); QVERIFY(ok); - db.comments()->query()->remove(); - db.posts()->query()->remove(); - db.users()->query()->remove(); - db.scores()->query()->remove(); + db.comments()->query().remove(); + db.posts()->query().remove(); + db.users()->query().remove(); + db.scores()->query().remove(); } void BasicTest::dataSchema() @@ -97,7 +97,7 @@ void BasicTest::createPost() void BasicTest::createPost2() { //create post on the fly - QVariant postIdVar = db.posts()->query()->insert( + QVariant postIdVar = db.posts()->query().insert( (Post::titleField() = QStringLiteral("This is a sample")) & (Post::isPublicField() = true)); @@ -123,15 +123,15 @@ void BasicTest::createPost2() void BasicTest::updatePostOnTheFly() { auto c = db.posts()->query() - ->where(Post::idField() == postId) - ->update(Post::titleField() = QStringLiteral("New title")); + .where(Post::idField() == postId) + .update(Post::titleField() = QStringLiteral("New title")); QCOMPARE(c, 1); auto titles = db.posts() ->query() - ->where(Post::idField() == postId) - ->select(Post::titleField()); + .where(Post::idField() == postId) + .select(Post::titleField()); QCOMPARE(titles.count(), 1); QCOMPARE(titles.at(0), QStringLiteral("New title")); @@ -140,12 +140,12 @@ void BasicTest::updatePostOnTheFly() void BasicTest::selectPublicts() { auto q = db.posts()->query() - ->where(Post::isPublicField()) - ->count(); + .where(Post::isPublicField()) + .count(); auto q2 = db.posts()->query() - ->where(!Post::isPublicField()) - ->count(); + .where(!Post::isPublicField()) + .count(); QCOMPARE(q, 1); QCOMPARE(q2, 1); @@ -154,11 +154,11 @@ void BasicTest::selectPublicts() void BasicTest::selectPosts() { auto q = db.posts()->query() - ->join() - ->orderBy((!Post::saveDateField()) | Post::bodyField()) - ->setWhere(Post::idField() == postId); + .join() + .orderBy((!Post::saveDateField()) | Post::bodyField()) + .where(Post::idField() == postId); - auto posts = q->toList(); + auto posts = q.toList(); post = posts.at(0); post->setBody(QStringLiteral("")); @@ -179,9 +179,9 @@ void BasicTest::selectScoreAverage() bool ok; auto avg = db.scores() ->query() - ->join() - ->where(Post::idField() == postId) - ->average(Score::scoreField()) + .join() + .where(Post::idField() == postId) + .average(Score::scoreField()) .toInt(&ok); QVERIFY(ok); @@ -190,21 +190,21 @@ void BasicTest::selectScoreAverage() void BasicTest::selectScoreSum() { - auto sum = db.scores()->query()->sum(Score::scoreField()); + auto sum = db.scores()->query().sum(Score::scoreField()); QCOMPARE(sum, 20); } void BasicTest::selectScoreCount() { - auto count = db.scores()->query()->count(); + auto count = db.scores()->query().count(); QCOMPARE(count, 10); } void BasicTest::selectFirst() { auto posts = db.posts()->query() - ->orderBy(Post::idField()) - ->first(); + .orderBy(Post::idField()) + .first(); QVERIFY(posts != Q_NULLPTR); } @@ -212,15 +212,15 @@ void BasicTest::selectFirst() void BasicTest::selectPostsWithoutTitle() { auto q = db.posts()->query(); - q->setWhere(Post::titleField().isNull()); - auto count = q->count(); + q.where(Post::titleField().isNull()); + auto count = q.count(); QCOMPARE(count, 0); } void BasicTest::selectPostIds() { auto q = db.posts()->query(); - auto ids = q->select(Post::idField()); + auto ids = q.select(Post::idField()); QCOMPARE(ids.count(), 2); } @@ -240,9 +240,9 @@ void BasicTest::testDate() db.saveChanges(true); auto q = db.posts()->query() - ->setWhere(Post::idField() == newPost->id()) - ->orderBy(Post::idField()) - ->first(); + .where(Post::idField() == newPost->id()) + .orderBy(Post::idField()) + .first(); QCOMPARE(q->saveDate(), d); } @@ -250,8 +250,8 @@ void BasicTest::testDate() void BasicTest::testLimitedQuery() { auto q = db.comments()->query(); - auto comments = q->toList(2); - qDebug() << q->sqlCommand(); + auto comments = q.toList(2); + qDebug() << q.sqlCommand(); QCOMPARE(comments.length(), 2); } @@ -274,17 +274,17 @@ void BasicTest::join() void BasicTest::selectWithInvalidRelation() { auto q = db.posts()->query(); - q->join(QStringLiteral("Invalid_Class_Name")); - q->toList(); + q.join(QStringLiteral("Invalid_Class_Name")); + q.toList(); } void BasicTest::modifyPost() { auto q = db.posts()->query() - ->setWhere(Post::idField() == postId) - ->orderBy(Post::idField()); + .where(Post::idField() == postId) + .orderBy(Post::idField()); - Nut::Row post = q->first(); + Nut::Row post = q.first(); QTEST_ASSERT(post != nullptr); @@ -292,18 +292,18 @@ void BasicTest::modifyPost() db.saveChanges(); q = db.posts()->query() - ->setWhere(Post::idField() == postId) - ->orderBy(Post::idField()); + .where(Post::idField() == postId) + .orderBy(Post::idField()); - post = q->first(); + post = q.first(); PRINT(post->title()); QCOMPARE(post->title(), "new name"); } void BasicTest::emptyDatabase() { -// auto commentsCount = db.comments()->query()->remove(); -// auto postsCount = db.posts()->query()->remove(); +// auto commentsCount = db.comments()->query().remove(); +// auto postsCount = db.posts()->query().remove(); // QTEST_ASSERT(postsCount == 3); // QTEST_ASSERT(commentsCount == 6); } diff --git a/tests/auto/tst_datatypes/tst_datatypes.cpp b/tests/auto/tst_datatypes/tst_datatypes.cpp index a0503f6..293e940 100644 --- a/tests/auto/tst_datatypes/tst_datatypes.cpp +++ b/tests/auto/tst_datatypes/tst_datatypes.cpp @@ -80,7 +80,7 @@ void DataTypesTest::initTestCase() QTEST_ASSERT(ok); - db.sampleTables()->query()->remove(); + db.sampleTables()->query().remove(); } void DataTypesTest::insert() @@ -130,7 +130,7 @@ void DataTypesTest::insert() void DataTypesTest::retrive() { - Nut::RowList list = db.sampleTables()->query()->toList(); + Nut::RowList list = db.sampleTables()->query().toList(); QTEST_ASSERT(list.count() == 1); Nut::Row t = list.first(); @@ -179,8 +179,8 @@ void DataTypesTest::retrive() #define CHECK(name) \ c = db.sampleTables()->query() \ - ->where(SampleTable::f_ ## name ## Field() == f_ ## name) \ - ->count(); \ + .where(SampleTable::f_ ## name ## Field() == f_ ## name) \ + .count(); \ QTEST_ASSERT(c == 1); void DataTypesTest::check() @@ -224,7 +224,7 @@ void DataTypesTest::check() void DataTypesTest::cleanupTestCase() { - db.sampleTables()->query()->remove(); + db.sampleTables()->query().remove(); db.close(); PRINT_FORM(db); diff --git a/tests/auto/tst_datetime/tst_datetime.cpp b/tests/auto/tst_datetime/tst_datetime.cpp index 5f1fd53..212d3e1 100644 --- a/tests/auto/tst_datetime/tst_datetime.cpp +++ b/tests/auto/tst_datetime/tst_datetime.cpp @@ -32,7 +32,7 @@ void DateTimeTest::initTestCase() QTEST_ASSERT(db.open()); - db.sampleTables()->query()->remove(); + db.sampleTables()->query().remove(); } #define TEST_DATE(date, command, n) \ @@ -42,8 +42,8 @@ do { \ db.sampleTables()->append(s); \ db.saveChanges(); \ auto count = db.sampleTables()->query() \ - ->where(SampleTable::dField().command(n) == date.command(n)) \ - ->count(); \ + .where(SampleTable::dField().command(n) == date.command(n)) \ + .count(); \ QTEST_ASSERT(count); \ } while (false) @@ -54,8 +54,8 @@ do { \ db.sampleTables()->append(s); \ db.saveChanges(); \ auto count = db.sampleTables()->query() \ - ->where(SampleTable::tField().command(n) == time.addSecs(num)) \ - ->count(); \ + .where(SampleTable::tField().command(n) == time.addSecs(num)) \ + .count(); \ QTEST_ASSERT(count); \ } while (false) @@ -66,8 +66,8 @@ do { \ db.sampleTables()->append(s); \ db.saveChanges(); \ auto count = db.sampleTables()->query() \ - ->where(SampleTable::dtField().command(n) == datetime.command(n)) \ - ->count(); \ + .where(SampleTable::dtField().command(n) == datetime.command(n)) \ + .count(); \ QTEST_ASSERT(count); \ } while (false) @@ -78,8 +78,8 @@ do { \ db.sampleTables()->append(s); \ db.saveChanges(); \ auto count = db.sampleTables()->query() \ - ->where(SampleTable::dtField().command(n) == datetime.addSecs(num)) \ - ->count(); \ + .where(SampleTable::dtField().command(n) == datetime.addSecs(num)) \ + .count(); \ QTEST_ASSERT(count); \ } while (false) @@ -136,7 +136,7 @@ void DateTimeTest::dateTimeAdd() void DateTimeTest::datePart() { - db.sampleTables()->query()->remove(); + db.sampleTables()->query().remove(); QDate d = QDate::currentDate(); auto s = Nut::create(); @@ -146,18 +146,18 @@ void DateTimeTest::datePart() int count; - count = db.sampleTables()->query()->where(SampleTable::dField().year() == d.year())->count(); + count = db.sampleTables()->query().where(SampleTable::dField().year() == d.year()).count(); QTEST_ASSERT(count); - count = db.sampleTables()->query()->where(SampleTable::dField().month() == d.month())->count(); + count = db.sampleTables()->query().where(SampleTable::dField().month() == d.month()).count(); QTEST_ASSERT(count); - count = db.sampleTables()->query()->where(SampleTable::dField().day() == d.day())->count(); + count = db.sampleTables()->query().where(SampleTable::dField().day() == d.day()).count(); QTEST_ASSERT(count); } void DateTimeTest::timePart() { - db.sampleTables()->query()->remove(); + db.sampleTables()->query().remove(); QTime t = QTime::currentTime(); auto s = Nut::create(); @@ -167,17 +167,17 @@ void DateTimeTest::timePart() int count; - count = db.sampleTables()->query()->where(SampleTable::tField().hour() == t.hour())->count(); + count = db.sampleTables()->query().where(SampleTable::tField().hour() == t.hour()).count(); QTEST_ASSERT(count); - count = db.sampleTables()->query()->where(SampleTable::tField().minute() == t.minute())->count(); + count = db.sampleTables()->query().where(SampleTable::tField().minute() == t.minute()).count(); QTEST_ASSERT(count); - count = db.sampleTables()->query()->where(SampleTable::tField().second() == t.second())->count(); + count = db.sampleTables()->query().where(SampleTable::tField().second() == t.second()).count(); QTEST_ASSERT(count); } void DateTimeTest::dateTimePart() { - db.sampleTables()->query()->remove(); + db.sampleTables()->query().remove(); QDateTime dt = QDateTime::currentDateTime(); auto s = Nut::create(); @@ -187,24 +187,24 @@ void DateTimeTest::dateTimePart() int count; - count = db.sampleTables()->query()->where(SampleTable::dtField().year() == dt.date().year())->count(); + count = db.sampleTables()->query().where(SampleTable::dtField().year() == dt.date().year()).count(); QTEST_ASSERT(count); - count = db.sampleTables()->query()->where(SampleTable::dtField().month() == dt.date().month())->count(); + count = db.sampleTables()->query().where(SampleTable::dtField().month() == dt.date().month()).count(); QTEST_ASSERT(count); - count = db.sampleTables()->query()->where(SampleTable::dtField().day() == dt.date().day())->count(); + count = db.sampleTables()->query().where(SampleTable::dtField().day() == dt.date().day()).count(); QTEST_ASSERT(count); - count = db.sampleTables()->query()->where(SampleTable::dtField().hour() == dt.time().hour())->count(); + count = db.sampleTables()->query().where(SampleTable::dtField().hour() == dt.time().hour()).count(); QTEST_ASSERT(count); - count = db.sampleTables()->query()->where(SampleTable::dtField().minute() == dt.time().minute())->count(); + count = db.sampleTables()->query().where(SampleTable::dtField().minute() == dt.time().minute()).count(); QTEST_ASSERT(count); - count = db.sampleTables()->query()->where(SampleTable::dtField().second() == dt.time().second())->count(); + count = db.sampleTables()->query().where(SampleTable::dtField().second() == dt.time().second()).count(); QTEST_ASSERT(count); } void DateTimeTest::cleanupTestCase() { - db.sampleTables()->query()->remove(); + db.sampleTables()->query().remove(); db.close(); } diff --git a/tests/auto/tst_json/tst_json.cpp b/tests/auto/tst_json/tst_json.cpp index 8724d63..0f9f6ef 100644 --- a/tests/auto/tst_json/tst_json.cpp +++ b/tests/auto/tst_json/tst_json.cpp @@ -49,9 +49,9 @@ void TestJson::store() int id = t->id(); auto newObj = db.sampleTable()->query() - ->where(Table::idField() == id) - ->orderBy(Table::idField()) - ->first(); + .where(Table::idField() == id) + .orderBy(Table::idField()) + .first(); Q_ASSERT(newObj != nullptr); Q_ASSERT(newObj->doc() == t->doc()); diff --git a/tests/auto/tst_quuid/tst_uuid.cpp b/tests/auto/tst_quuid/tst_uuid.cpp index 21dadae..e77b39b 100644 --- a/tests/auto/tst_quuid/tst_uuid.cpp +++ b/tests/auto/tst_quuid/tst_uuid.cpp @@ -32,7 +32,7 @@ void UuidTest::initTestCase() bool ok = db.open(); - db.tests()->query()->remove(); + db.tests()->query().remove(); uuid = QUuid::createUuid(); QTEST_ASSERT(ok); @@ -54,7 +54,7 @@ void UuidTest::save() void UuidTest::restore() { TIC(); - auto test = db.tests()->query()->first(); + auto test = db.tests()->query().first(); TOC(); QTEST_ASSERT(!test->id().isNull()); QTEST_ASSERT(test->uuid() == uuid); diff --git a/tests/auto/tst_upgrades/tst_upgrades.cpp b/tests/auto/tst_upgrades/tst_upgrades.cpp index c91576b..345f09a 100644 --- a/tests/auto/tst_upgrades/tst_upgrades.cpp +++ b/tests/auto/tst_upgrades/tst_upgrades.cpp @@ -49,7 +49,7 @@ void Upgrades::version1() DB1 db; initDb(db); QTEST_ASSERT(db.open()); - db.sampleTable()->query()->remove(); + db.sampleTable()->query().remove(); } void Upgrades::version2() @@ -72,7 +72,7 @@ void Upgrades::version3() QTEST_ASSERT(db.open()); auto t = db.sampleTable()->query() - ->first(); + .first(); QTEST_ASSERT(id == t->id()); } From 457d9a5d77264ff36abfb7f231559afdcb2fe3b4 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Mon, 10 Aug 2020 17:41:48 +0430 Subject: [PATCH 03/13] test ci --- src/nut/query.h | 4 ++-- tests/auto/tst_basic/tst_basic.cpp | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/nut/query.h b/src/nut/query.h index d83fd16..661b253 100644 --- a/src/nut/query.h +++ b/src/nut/query.h @@ -196,12 +196,12 @@ Q_OUTOFLINE_TEMPLATE Query::Query(Database *database, AbstractTableSet *table } template -Q_OUTOFLINE_TEMPLATE Query::Query(const Query &other) { +Q_OUTOFLINE_TEMPLATE Query::Query(const Query &other) : AbstractQuery() { d = other.d->clone(); } template -Q_OUTOFLINE_TEMPLATE Query::Query(Query &&other) { +Q_OUTOFLINE_TEMPLATE Query::Query(Query &&other) : AbstractQuery() { d = std::move(other.d); other.d = nullptr; } diff --git a/tests/auto/tst_basic/tst_basic.cpp b/tests/auto/tst_basic/tst_basic.cpp index a188f80..4ea84e8 100644 --- a/tests/auto/tst_basic/tst_basic.cpp +++ b/tests/auto/tst_basic/tst_basic.cpp @@ -249,9 +249,8 @@ void BasicTest::testDate() void BasicTest::testLimitedQuery() { - auto q = db.comments()->query(); - auto comments = q.toList(2); - qDebug() << q.sqlCommand(); + auto comments = db.comments()->query() + .toList(2); QCOMPARE(comments.length(), 2); } From 22195353c15cf4bf8472c7a08964596cac2abcf2 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Mon, 10 Aug 2020 17:49:21 +0430 Subject: [PATCH 04/13] removed abstractquery --- src/nut/abstractquery.cpp | 43 ------------------------ src/nut/abstractquery.h | 53 ----------------------------- src/nut/abstractquery_p.h | 71 --------------------------------------- src/nut/nut.pro | 7 ++-- src/nut/query.h | 32 ++++++------------ src/nut/tableset.h | 6 ++-- 6 files changed, 15 insertions(+), 197 deletions(-) delete mode 100644 src/nut/abstractquery.cpp delete mode 100644 src/nut/abstractquery.h delete mode 100644 src/nut/abstractquery_p.h diff --git a/src/nut/abstractquery.cpp b/src/nut/abstractquery.cpp deleted file mode 100644 index 2ea87ed..0000000 --- a/src/nut/abstractquery.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/************************************************************************** -** -** 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 . -** -**************************************************************************/ - -#include "abstractquery.h" -#include "abstractquery_p.h" - -NUT_BEGIN_NAMESPACE - -AbstractQuery::AbstractQuery(QObject *parent) : QObject(parent) - , d_ptr(new AbstractQueryPrivate(this)) -{ - -} - -Nut::AbstractQueryPrivate::AbstractQueryPrivate(Nut::AbstractQuery *parent) : - q_ptr(parent), skip(0), take(0) -{ - -} - -Nut::AbstractQueryPrivate::~AbstractQueryPrivate() -{ - -} - -NUT_END_NAMESPACE diff --git a/src/nut/abstractquery.h b/src/nut/abstractquery.h deleted file mode 100644 index 8618e72..0000000 --- a/src/nut/abstractquery.h +++ /dev/null @@ -1,53 +0,0 @@ -/************************************************************************** -** -** 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 . -** -**************************************************************************/ - -#ifndef NUT_ABSTRACTQUERY_H -#define NUT_ABSTRACTQUERY_H - -#include -#include -#include - -#include "defines.h" -#include "abstractquery_p.h" - -NUT_BEGIN_NAMESPACE - -class AbstractQueryPrivate; -class NUT_EXPORT AbstractQuery : public QObject -{ - Q_OBJECT - -protected: - AbstractQueryPrivate *d_ptr; - Q_DECLARE_PRIVATE(AbstractQuery) - -public: - explicit AbstractQuery(QObject *parent = nullptr); - -protected: - // void addTableToSet(TableSetBase *set, Table *table); - -public slots: -}; - -NUT_END_NAMESPACE - -#endif // NUT_ABSTRACTQUERY_H diff --git a/src/nut/abstractquery_p.h b/src/nut/abstractquery_p.h deleted file mode 100644 index e432869..0000000 --- a/src/nut/abstractquery_p.h +++ /dev/null @@ -1,71 +0,0 @@ -/************************************************************************** -** -** 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 . -** -**************************************************************************/ - -#ifndef NUT_QUERY_P_H -#define NUT_QUERY_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of qapplication_*.cpp, qwidget*.cpp and qfiledialog.cpp. This header -// file may change from version to version without notice, or even be removed. -// -// We mean it. -// - -#include "phrase.h" - -#include -#include -#include - -NUT_BEGIN_NAMESPACE - -class Database; -class AbstractTableSet; -class AbstractQuery; -struct RelationModel; -class NUT_EXPORT AbstractQueryPrivate { - AbstractQuery *q_ptr; - Q_DECLARE_PUBLIC(AbstractQuery) - -public: - explicit AbstractQueryPrivate(AbstractQuery *parent); - ~AbstractQueryPrivate(); - - QString sql; - QString className; - QString tableName; - QString select; - Database *database; - AbstractTableSet *tableSet; - QStringList joins; - QList relations; - int skip; - int take; - PhraseList orderPhrase, fieldPhrase; - ConditionalPhrase wherePhrase; -}; - -NUT_END_NAMESPACE - -#endif // NUT_QUERY_P_H diff --git a/src/nut/nut.pro b/src/nut/nut.pro index b6a4057..3181c1c 100644 --- a/src/nut/nut.pro +++ b/src/nut/nut.pro @@ -47,9 +47,7 @@ HEADERS += \ $$PWD/phrases/phrasedatalist.h \ $$PWD/phrases/phraselist.h \ $$PWD/phrases/datephrase.h \ - $$PWD/table_p.h \ - $$PWD/abstractquery.h \ - $$PWD/abstractquery_p.h + $$PWD/table_p.h SOURCES += \ $$PWD/generators/abstractsqlgenerator.cpp \ @@ -78,8 +76,7 @@ SOURCES += \ $$PWD/phrases/phrasedata.cpp \ $$PWD/phrases/phrasedatalist.cpp \ $$PWD/phrases/phraselist.cpp \ - $$PWD/phrases/datephrase.cpp \ - $$PWD/abstractquery.cpp + $$PWD/phrases/datephrase.cpp load(qt_module) diff --git a/src/nut/query.h b/src/nut/query.h index 661b253..928aa81 100644 --- a/src/nut/query.h +++ b/src/nut/query.h @@ -36,8 +36,6 @@ #endif #include -#include - #include #include #include @@ -79,16 +77,19 @@ struct NUT_EXPORT QueryData { r->wherePhrase = wherePhrase; return r; } + + QueryData() = default; + QueryData(Database *db) : database(db) + { } }; template -class Query : public AbstractQuery +class Query { QueryData *d; - bool m_autoDelete; public: - explicit Query(Database *database, AbstractTableSet *tableSet, bool autoDelete); + explicit Query(Database *database, AbstractTableSet *tableSet); Query (const Query &other); Query (Query &&other); @@ -168,8 +169,6 @@ Q_OUTOFLINE_TEMPLATE QList Query::select(const std::function Query::select(const std::function -Q_OUTOFLINE_TEMPLATE Query::Query(Database *database, AbstractTableSet *tableSet, - bool autoDelete) - : AbstractQuery(database), d(new QueryData), m_autoDelete(autoDelete) +Q_OUTOFLINE_TEMPLATE Query::Query(Database *database, AbstractTableSet *tableSet) + : d(new QueryData(database)) { //Q_D(AbstractQuery); @@ -196,12 +194,12 @@ Q_OUTOFLINE_TEMPLATE Query::Query(Database *database, AbstractTableSet *table } template -Q_OUTOFLINE_TEMPLATE Query::Query(const Query &other) : AbstractQuery() { +Q_OUTOFLINE_TEMPLATE Query::Query(const Query &other) { d = other.d->clone(); } template -Q_OUTOFLINE_TEMPLATE Query::Query(Query &&other) : AbstractQuery() { +Q_OUTOFLINE_TEMPLATE Query::Query(Query &&other) { d = std::move(other.d); other.d = nullptr; } @@ -393,10 +391,6 @@ Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) } //while } // while -#ifndef NUT_SHARED_POINTER - if (m_autoDelete) - deleteLater(); -#endif return returnList; } @@ -423,8 +417,6 @@ Q_OUTOFLINE_TEMPLATE QList Query::select(const FieldPhrase f) ret.append(v.value()); } - if (m_autoDelete) - deleteLater(); return ret; } @@ -644,8 +636,6 @@ Q_OUTOFLINE_TEMPLATE int Query::update(const AssignmentPhraseList &ph) QSqlQuery q = d->database->exec(d->sql); - if (m_autoDelete) - deleteLater(); return q.numRowsAffected(); } @@ -658,8 +648,6 @@ Q_OUTOFLINE_TEMPLATE int Query::remove() d->tableName, d->wherePhrase); QSqlQuery q = d->database->exec(d->sql); - if (m_autoDelete) - deleteLater(); return q.numRowsAffected(); } diff --git a/src/nut/tableset.h b/src/nut/tableset.h index 8cd813a..cb143a7 100644 --- a/src/nut/tableset.h +++ b/src/nut/tableset.h @@ -63,7 +63,7 @@ public: Row at(int i) const; Row operator[](int i) const; - Query query(bool autoDelete = true); + Query query(); BulkInserter *bulkInserter(); }; @@ -80,9 +80,9 @@ Q_OUTOFLINE_TEMPLATE TableSet::TableSet(Table *parent) : AbstractTableSet(par } template -Q_OUTOFLINE_TEMPLATE Query TableSet::query(bool autoDelete) +Q_OUTOFLINE_TEMPLATE Query TableSet::query() { - return Query(data->database, this, autoDelete); + return Query(data->database, this); } template From d29795ea09dd2162445b68c8ff891fc1ce1a0bc9 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Mon, 10 Aug 2020 18:03:07 +0430 Subject: [PATCH 05/13] make BulkInserter movable --- src/nut/bulkinserter.cpp | 54 +++++++++++++++++++++++++++++++--------- src/nut/bulkinserter.h | 13 ++++++---- src/nut/bulkinserter_p.h | 23 +++++++++++++++++ src/nut/nut.pro | 3 ++- src/nut/tableset.h | 7 +++--- 5 files changed, 78 insertions(+), 22 deletions(-) create mode 100644 src/nut/bulkinserter_p.h diff --git a/src/nut/bulkinserter.cpp b/src/nut/bulkinserter.cpp index 2e09278..059bb87 100644 --- a/src/nut/bulkinserter.cpp +++ b/src/nut/bulkinserter.cpp @@ -1,4 +1,6 @@ #include "bulkinserter.h" +#include "bulkinserter_p.h" + #include "phrases/phraselist.h" #include "database.h" #include "abstractsqlgenerator.h" @@ -6,23 +8,47 @@ #include -Nut::BulkInserter::BulkInserter(Nut::Database *db, QString &className) - : _database(db), _fieldCount(0) +NUT_BEGIN_NAMESPACE + +BulkInserterPrivate::BulkInserterPrivate(Database *db) + : database(db), fieldCount(0) { + +} + +BulkInserter::BulkInserter(Database *db, QString &className) + : d_ptr(new BulkInserterPrivate(db)) +{ + Q_D(BulkInserter); + foreach (TableModel *m, db->model()) if (m->className() == className) - _className = m->name(); + d->className = m->name(); } -void Nut::BulkInserter::setFields(const Nut::PhraseList &ph) +BulkInserter::BulkInserter(const BulkInserter &other) { - _fields = ph; - _fieldCount = static_cast(ph.data.count()); + d_ptr = other.d_ptr; } -void Nut::BulkInserter::insert(std::initializer_list vars) +BulkInserter::BulkInserter(BulkInserter &&other) { - if (vars.size() != _fieldCount) { + d_ptr = other.d_ptr; + other.d_ptr = nullptr; +} + +void BulkInserter::setFields(const PhraseList &ph) +{ + Q_D(BulkInserter); + d->fields = ph; + d->fieldCount = static_cast(ph.data.count()); +} + +void BulkInserter::insert(std::initializer_list vars) +{ + Q_D(BulkInserter); + + if (vars.size() != d->fieldCount) { qInfo("Number of rows mistake"); return; } @@ -31,13 +57,17 @@ void Nut::BulkInserter::insert(std::initializer_list vars) std::initializer_list::iterator it; for (it = vars.begin(); it != vars.end(); ++it) list.append(*it); - variants.append(list); + d->variants.append(list); } -int Nut::BulkInserter::apply() +int BulkInserter::apply() { - auto sql = _database->sqlGenerator()->insertBulk(_className, _fields, variants); - QSqlQuery q = _database->exec(sql); + Q_D(BulkInserter); + auto sql = d->database->sqlGenerator()->insertBulk(d->className, + d->fields, + d->variants); + QSqlQuery q = d->database->exec(sql); return q.numRowsAffected(); } +NUT_END_NAMESPACE diff --git a/src/nut/bulkinserter.h b/src/nut/bulkinserter.h index 7ba47c6..ae837f6 100644 --- a/src/nut/bulkinserter.h +++ b/src/nut/bulkinserter.h @@ -12,16 +12,16 @@ NUT_BEGIN_NAMESPACE class PhraseList; class Database; +class BulkInserterPrivate; class NUT_EXPORT BulkInserter { - Database *_database; - QString _className; - Nut::PhraseList _fields; - QList variants; - size_t _fieldCount; + Q_DECLARE_PRIVATE(BulkInserter); public: BulkInserter(Database *db, QString &className); + BulkInserter(const BulkInserter &other); + BulkInserter(BulkInserter &&other); + void setFields(const PhraseList &ph); void insert(std::initializer_list vars); @@ -30,6 +30,9 @@ public: insert({args...}); } int apply(); + +private: + BulkInserterPrivate *d_ptr; }; NUT_END_NAMESPACE diff --git a/src/nut/bulkinserter_p.h b/src/nut/bulkinserter_p.h new file mode 100644 index 0000000..41e7cfa --- /dev/null +++ b/src/nut/bulkinserter_p.h @@ -0,0 +1,23 @@ +#ifndef BULKINSERTER_P_H +#define BULKINSERTER_P_H + +#include + +NUT_BEGIN_NAMESPACE + +class Database; +class BulkInserterPrivate +{ +public: + BulkInserterPrivate(Database *db); + + Database *database; + QString className; + PhraseList fields; + QList variants; + size_t fieldCount; +}; + +NUT_END_NAMESPACE + +#endif // BULKINSERTER_P_H diff --git a/src/nut/nut.pro b/src/nut/nut.pro index 3181c1c..0b4bdeb 100644 --- a/src/nut/nut.pro +++ b/src/nut/nut.pro @@ -47,7 +47,8 @@ HEADERS += \ $$PWD/phrases/phrasedatalist.h \ $$PWD/phrases/phraselist.h \ $$PWD/phrases/datephrase.h \ - $$PWD/table_p.h + $$PWD/table_p.h \ + bulkinserter_p.h SOURCES += \ $$PWD/generators/abstractsqlgenerator.cpp \ diff --git a/src/nut/tableset.h b/src/nut/tableset.h index cb143a7..d28ddfb 100644 --- a/src/nut/tableset.h +++ b/src/nut/tableset.h @@ -64,7 +64,7 @@ public: Row operator[](int i) const; Query query(); - BulkInserter *bulkInserter(); + BulkInserter bulkInserter(); }; template @@ -86,10 +86,9 @@ Q_OUTOFLINE_TEMPLATE Query TableSet::query() } template -Q_OUTOFLINE_TEMPLATE BulkInserter *TableSet::bulkInserter() +Q_OUTOFLINE_TEMPLATE BulkInserter TableSet::bulkInserter() { - BulkInserter *bi = new BulkInserter(data->database, data->childClassName); - return bi; + return BulkInserter(data->database, data->childClassName); } template From c0bfa5cc5708a1ca6405fd014768cc0dfa294e7b Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Mon, 10 Aug 2020 18:04:26 +0430 Subject: [PATCH 06/13] fix: test fil (again!!!) --- src/nut/query.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/nut/query.h b/src/nut/query.h index 928aa81..c1cfa0d 100644 --- a/src/nut/query.h +++ b/src/nut/query.h @@ -78,7 +78,9 @@ struct NUT_EXPORT QueryData { return r; } - QueryData() = default; + QueryData() : skip(0), take(0) + { } + QueryData(Database *db) : database(db) { } }; From c382e4d53f67cf77b3b4d4d2e6c3cb39406ca172 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Mon, 10 Aug 2020 18:16:35 +0430 Subject: [PATCH 07/13] fix: query initial values on some compilers --- src/nut/query.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nut/query.h b/src/nut/query.h index c1cfa0d..743b6c1 100644 --- a/src/nut/query.h +++ b/src/nut/query.h @@ -81,7 +81,7 @@ struct NUT_EXPORT QueryData { QueryData() : skip(0), take(0) { } - QueryData(Database *db) : database(db) + QueryData(Database *db) : database(db), skip(0), take(0) { } }; From de4dc0f6c53d1cfe6bd8e8a7ee3cb6b2ff5c950a Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Wed, 12 Aug 2020 17:02:06 +0430 Subject: [PATCH 08/13] wip initial --- src/nut/generators/abstractsqlgenerator.cpp | 6 +- src/nut/nut.pro | 10 ++- src/nut/phrase.h | 4 +- src/nut/phrases/abstractfieldphrase.cpp | 21 +++++- src/nut/phrases/abstractfieldphrase.h | 3 + src/nut/phrases/assignmentphrase.cpp | 7 +- src/nut/phrases/assignmentphraselist.cpp | 8 +- src/nut/phrases/conditionalphrase.cpp | 51 +++++-------- src/nut/phrases/fieldphrase.h | 48 ------------ src/nut/phrases/fieldphrase_bool.cpp | 6 ++ src/nut/phrases/fieldphrase_bool.h | 38 ++++++++++ .../{datephrase.cpp => fieldphrase_date.cpp} | 2 +- .../{datephrase.h => fieldphrase_date.h} | 0 src/nut/phrases/fieldphrase_qstring.cpp | 2 + src/nut/phrases/fieldphrase_qstring.h | 39 ++++++++++ src/nut/phrases/phrasedata.cpp | 75 ++++++++++++------- src/nut/phrases/phrasedata.h | 11 +-- src/nut/phrases/phrasedatalist.cpp | 6 +- tests/auto/tst_phrases/tst_phrases.cpp | 15 ++-- 19 files changed, 214 insertions(+), 138 deletions(-) create mode 100644 src/nut/phrases/fieldphrase_bool.cpp create mode 100644 src/nut/phrases/fieldphrase_bool.h rename src/nut/phrases/{datephrase.cpp => fieldphrase_date.cpp} (99%) rename src/nut/phrases/{datephrase.h => fieldphrase_date.h} (100%) create mode 100644 src/nut/phrases/fieldphrase_qstring.cpp create mode 100644 src/nut/phrases/fieldphrase_qstring.h diff --git a/src/nut/generators/abstractsqlgenerator.cpp b/src/nut/generators/abstractsqlgenerator.cpp index a7d43ee..98c9459 100644 --- a/src/nut/generators/abstractsqlgenerator.cpp +++ b/src/nut/generators/abstractsqlgenerator.cpp @@ -616,10 +616,10 @@ QString AbstractSqlGenerator::selectCommand(const QString &tableName, QString sql = QStringLiteral("SELECT ") + selectText + QStringLiteral(" FROM ") + fromText; - if (whereText != QStringLiteral("")) + if (!whereText.isEmpty()) sql.append(QStringLiteral(" WHERE ") + whereText); - if (orderText != QStringLiteral("")) + if (!orderText.isEmpty()) sql.append(QStringLiteral(" ORDER BY ") + orderText); // for (int i = 0; i < _database->model().count(); i++) @@ -648,7 +648,7 @@ QString AbstractSqlGenerator::selectCommand(const QString &tableName, QString sql = QStringLiteral("SELECT ") + selectText + QStringLiteral(" FROM ") + fromText; - if (whereText != QStringLiteral("")) + if (!whereText.isEmpty()) sql.append(QStringLiteral(" WHERE ") + whereText); for (int i = 0; i < _database->model().count(); i++) diff --git a/src/nut/nut.pro b/src/nut/nut.pro index 0b4bdeb..7beb4ab 100644 --- a/src/nut/nut.pro +++ b/src/nut/nut.pro @@ -46,9 +46,11 @@ HEADERS += \ $$PWD/phrases/phrasedata.h \ $$PWD/phrases/phrasedatalist.h \ $$PWD/phrases/phraselist.h \ - $$PWD/phrases/datephrase.h \ + $$PWD/phrases/fieldphrase_date.h \ $$PWD/table_p.h \ - bulkinserter_p.h + $$PWD/bulkinserter_p.h \ + $$PWD/phrases/fieldphrase_bool.h \ + $$PWD/phrases/fieldphrase_qstring.h SOURCES += \ $$PWD/generators/abstractsqlgenerator.cpp \ @@ -77,7 +79,9 @@ SOURCES += \ $$PWD/phrases/phrasedata.cpp \ $$PWD/phrases/phrasedatalist.cpp \ $$PWD/phrases/phraselist.cpp \ - $$PWD/phrases/datephrase.cpp + $$PWD/phrases/fieldphrase_date.cpp \ + $$PWD/phrases/fieldphrase_bool.cpp \ + $$PWD/phrases/fieldphrase_qstring.cpp load(qt_module) diff --git a/src/nut/phrase.h b/src/nut/phrase.h index 30fb6df..ab9d4f9 100644 --- a/src/nut/phrase.h +++ b/src/nut/phrase.h @@ -30,7 +30,9 @@ #include #include #include -#include +#include +#include +#include NUT_BEGIN_NAMESPACE diff --git a/src/nut/phrases/abstractfieldphrase.cpp b/src/nut/phrases/abstractfieldphrase.cpp index 616384e..4d51091 100644 --- a/src/nut/phrases/abstractfieldphrase.cpp +++ b/src/nut/phrases/abstractfieldphrase.cpp @@ -19,6 +19,7 @@ **************************************************************************/ #include "abstractfieldphrase.h" +#include NUT_BEGIN_NAMESPACE @@ -34,22 +35,26 @@ AbstractFieldPhrase::AbstractFieldPhrase(const char *className, AbstractFieldPhrase::AbstractFieldPhrase(const AbstractFieldPhrase &other) { data = other.data; - data->parents++; + data->ref.ref(); } AbstractFieldPhrase::AbstractFieldPhrase(AbstractFieldPhrase &&other) { data = other.data; - data->parents++; other.data = nullptr; } AbstractFieldPhrase::~AbstractFieldPhrase() { if (data) { - --data->parents; - if (data->parents <= 0) + if (!data->ref.deref()) { + qDebug() << "deleted" << data->className + << data->fieldName; delete data; + } + else + qDebug() << "more parents for" << data->className + << data->fieldName; } } @@ -87,6 +92,14 @@ AssignmentPhrase AbstractFieldPhrase::operator <<(const QVariant &other) return AssignmentPhrase(this, other); } +void AbstractFieldPhrase::detach() +{ + auto clone = data->clone(); + if (!data->ref.deref()) + delete data; + data = clone; +} + #define AbstractFieldPhraseOperatorVariant(class, op, cond) \ ConditionalPhrase class::operator op(const QVariant &other) \ { \ diff --git a/src/nut/phrases/abstractfieldphrase.h b/src/nut/phrases/abstractfieldphrase.h index 0745fa5..a4340be 100644 --- a/src/nut/phrases/abstractfieldphrase.h +++ b/src/nut/phrases/abstractfieldphrase.h @@ -80,6 +80,9 @@ public: AssignmentPhrase operator =(const QVariant &other); AssignmentPhrase operator =(const ConditionalPhrase &other); AssignmentPhrase operator <<(const QVariant &other); + +protected: + void detach(); }; NUT_END_NAMESPACE diff --git a/src/nut/phrases/assignmentphrase.cpp b/src/nut/phrases/assignmentphrase.cpp index 6b49426..f74d458 100644 --- a/src/nut/phrases/assignmentphrase.cpp +++ b/src/nut/phrases/assignmentphrase.cpp @@ -26,7 +26,7 @@ NUT_BEGIN_NAMESPACE AssignmentPhrase::AssignmentPhrase(PhraseData *d) : data(d) { - d->parents++; + d->ref.ref(); } AssignmentPhrase::AssignmentPhrase(AbstractFieldPhrase *l, const QVariant r) @@ -56,9 +56,8 @@ AssignmentPhrase::AssignmentPhrase(AssignmentPhrase *ph, const QVariant &v) AssignmentPhrase::~AssignmentPhrase() { - if (data) - if (!--data->parents) - delete data; + if (data && data->ref.deref()) + delete data; } NUT_END_NAMESPACE diff --git a/src/nut/phrases/assignmentphraselist.cpp b/src/nut/phrases/assignmentphraselist.cpp index b65c8fa..08a1ef6 100644 --- a/src/nut/phrases/assignmentphraselist.cpp +++ b/src/nut/phrases/assignmentphraselist.cpp @@ -68,9 +68,9 @@ AssignmentPhraseList AssignmentPhraseList::operator &(const AssignmentPhrase AssignmentPhraseList::~AssignmentPhraseList() { - foreach (PhraseData *d, data) - if (!--d->parents) - delete d; +// foreach (PhraseData *d, data) +// if (!d->ref.deref()) +// delete d; // qDeleteAll(data); // data.clear(); } @@ -78,7 +78,7 @@ AssignmentPhraseList::~AssignmentPhraseList() void AssignmentPhraseList::incAllDataParents() { foreach (PhraseData *d, data) - d->parents++; + d->ref.ref(); } diff --git a/src/nut/phrases/conditionalphrase.cpp b/src/nut/phrases/conditionalphrase.cpp index 1fe6b27..248d6e9 100644 --- a/src/nut/phrases/conditionalphrase.cpp +++ b/src/nut/phrases/conditionalphrase.cpp @@ -18,6 +18,8 @@ ** **************************************************************************/ +#include + #include "abstractfieldphrase.h" #include "conditionalphrase.h" #include "phrasedata.h" @@ -30,21 +32,21 @@ ConditionalPhrase::ConditionalPhrase() : data(nullptr) ConditionalPhrase::ConditionalPhrase(const ConditionalPhrase &other) { data = other.data; - data->parents++; -// const_cast(other).data = 0; + data->ref.ref(); } #ifdef Q_COMPILER_RVALUE_REFS ConditionalPhrase::ConditionalPhrase(ConditionalPhrase &&other) { - this->data = qMove(other.data); + data = other.data; + other.data = nullptr; } #endif ConditionalPhrase::ConditionalPhrase(const PhraseData *data) { - this->data = const_cast(data); - this->data->parents++; + data = const_cast(data); + data->ref.ref(); } ConditionalPhrase::ConditionalPhrase(AbstractFieldPhrase *l, @@ -104,8 +106,10 @@ ConditionalPhrase::~ConditionalPhrase() { if (data) { data->cleanUp(); - if (!--data->parents) + if (!data->ref.deref()) { + qDebug() << "deleted for cond"; delete data; + } } } @@ -113,7 +117,7 @@ ConditionalPhrase &ConditionalPhrase::operator =(const ConditionalPhrase &other) { data = other.data; if (data) - data->parents++; + data->ref.ref(); return *this; } @@ -122,23 +126,6 @@ ConditionalPhrase ConditionalPhrase::operator ==(const QVariant &other) return ConditionalPhrase(this, PhraseData::Equal, other); } -//ConditionalPhrase ConditionalPhrase::operator ==(const AbstractFieldPhrase &other) -//{ -// return ConditionalPhrase(this, PhraseData::Equal, other); -//} - -//ConditionalPhrase ConditionalPhrase::operator &&(const ConditionalPhrase &other) -//{ -// return ConditionalPhrase(this, PhraseData::And, -// const_cast(other)); -//} - -//ConditionalPhrase ConditionalPhrase::operator ||(const ConditionalPhrase &other) -//{ -// return ConditionalPhrase(this, PhraseData::Or, -// const_cast(other)); -//} - #define DECLARE_CONDITIONALPHRASE_OPERATORS_IMPL(op, cond) \ ConditionalPhrase operator op(const ConditionalPhrase &l, \ const ConditionalPhrase &r) \ @@ -149,8 +136,8 @@ ConditionalPhrase operator op(const ConditionalPhrase &l, \ p.data->operatorCond = cond; \ p.data->left = l.data; \ p.data->right = r.data; \ - l.data->parents++; \ - r.data->parents++; \ + l.data->ref.ref(); \ + r.data->ref.ref(); \ return p; \ } \ ConditionalPhrase operator op(const ConditionalPhrase &l, \ @@ -162,8 +149,8 @@ ConditionalPhrase operator op(const ConditionalPhrase &l, \ p.data->operatorCond = cond; \ p.data->left = l.data; \ p.data->right = r.data; \ - l.data->parents++; \ - r.data->parents++; \ + l.data->ref.ref(); \ + r.data = nullptr; \ return p; \ } \ ConditionalPhrase operator op(ConditionalPhrase &&l, \ @@ -175,8 +162,8 @@ ConditionalPhrase operator op(ConditionalPhrase &&l, \ p.data->operatorCond = cond; \ p.data->left = l.data; \ p.data->right = r.data; \ - l.data->parents++; \ - r.data->parents++; \ + r.data->ref.ref(); \ + l.data = nullptr; \ return p; \ } \ ConditionalPhrase operator op(ConditionalPhrase &&l, ConditionalPhrase &&r) \ @@ -187,8 +174,8 @@ ConditionalPhrase operator op(ConditionalPhrase &&l, ConditionalPhrase &&r) \ p.data->operatorCond = cond; \ p.data->left = l.data; \ p.data->right = r.data; \ - l.data->parents++; \ - r.data->parents++; \ + l.data = nullptr; \ + r.data = nullptr; \ return p; \ } diff --git a/src/nut/phrases/fieldphrase.h b/src/nut/phrases/fieldphrase.h index 7ef4b6d..5071668 100644 --- a/src/nut/phrases/fieldphrase.h +++ b/src/nut/phrases/fieldphrase.h @@ -50,29 +50,6 @@ Q_OUTOFLINE_TEMPLATE ConditionalPhrase FieldPhrase::operator ==(const QVarian return ConditionalPhrase(this, PhraseData::Equal, other); } - -template<> -class FieldPhrase : public AbstractFieldPhrase -{ -public: - FieldPhrase(const char *className, const char *s) : - AbstractFieldPhrase(className, s) - {} - - ConditionalPhrase like(const QString &term) { - return ConditionalPhrase(this, PhraseData::Like, term); - } - - ConditionalPhrase contains(const QString &term) { - return ConditionalPhrase(this, PhraseData::Like, - QVariant(QStringLiteral("%") + term + QStringLiteral("%"))); - } - - AssignmentPhrase operator =(const QVariant &v) { - return AssignmentPhrase(this, v); - } -}; - //Date and time #define CONDITIONAL_VARIANT_METHOD(name, cond) \ ConditionalPhrase name(int val) \ @@ -80,31 +57,6 @@ public: return ConditionalPhrase(this, cond, val); \ } -template<> -class FieldPhrase : public AbstractFieldPhrase -{ -public: - FieldPhrase(const char *className, const char *s) : - AbstractFieldPhrase(className, s) - {} - - AssignmentPhrase operator =(const bool &other) { - return AssignmentPhrase(this, other); - } - - FieldPhrase operator !() - { - FieldPhrase f(data->className, data->fieldName); -// f.data = new PhraseData(data); - f.data->isNot = !data->isNot; - return f; - } - - operator ConditionalPhrase() - { - return ConditionalPhrase(this, PhraseData::Equal, !data->isNot); - } -}; NUT_END_NAMESPACE diff --git a/src/nut/phrases/fieldphrase_bool.cpp b/src/nut/phrases/fieldphrase_bool.cpp new file mode 100644 index 0000000..c8d6716 --- /dev/null +++ b/src/nut/phrases/fieldphrase_bool.cpp @@ -0,0 +1,6 @@ +#include "fieldphrase_bool.h" + +NUT_BEGIN_NAMESPACE + + +NUT_END_NAMESPACE diff --git a/src/nut/phrases/fieldphrase_bool.h b/src/nut/phrases/fieldphrase_bool.h new file mode 100644 index 0000000..ad3e111 --- /dev/null +++ b/src/nut/phrases/fieldphrase_bool.h @@ -0,0 +1,38 @@ +#ifndef NUT_FIELDPHRASE_BOOL_H +#define NUT_FIELDPHRASE_BOOL_H + +#include +#include +#include + +NUT_BEGIN_NAMESPACE + +template<> +class FieldPhrase : public AbstractFieldPhrase +{ +public: + FieldPhrase(const char *className, const char *s) : + AbstractFieldPhrase(className, s) + {} + + AssignmentPhrase operator =(const bool &other) { + return AssignmentPhrase(this, other); + } + + FieldPhrase operator !() + { + FieldPhrase f(data->className, data->fieldName); + // f.data = new PhraseData(data); + f.data->isNot = !data->isNot; + return f; + } + + operator ConditionalPhrase() + { + return ConditionalPhrase(this, PhraseData::Equal, !data->isNot); + } +}; + +NUT_END_NAMESPACE + +#endif // NUT_FIELDPHRASE_BOOL_H diff --git a/src/nut/phrases/datephrase.cpp b/src/nut/phrases/fieldphrase_date.cpp similarity index 99% rename from src/nut/phrases/datephrase.cpp rename to src/nut/phrases/fieldphrase_date.cpp index 0355377..aae3bf4 100644 --- a/src/nut/phrases/datephrase.cpp +++ b/src/nut/phrases/fieldphrase_date.cpp @@ -18,7 +18,7 @@ ** **************************************************************************/ -#include "datephrase.h" +#include "fieldphrase_date.h" NUT_BEGIN_NAMESPACE diff --git a/src/nut/phrases/datephrase.h b/src/nut/phrases/fieldphrase_date.h similarity index 100% rename from src/nut/phrases/datephrase.h rename to src/nut/phrases/fieldphrase_date.h diff --git a/src/nut/phrases/fieldphrase_qstring.cpp b/src/nut/phrases/fieldphrase_qstring.cpp new file mode 100644 index 0000000..5692eed --- /dev/null +++ b/src/nut/phrases/fieldphrase_qstring.cpp @@ -0,0 +1,2 @@ +#include "fieldphrase_qstring.h" + diff --git a/src/nut/phrases/fieldphrase_qstring.h b/src/nut/phrases/fieldphrase_qstring.h new file mode 100644 index 0000000..ede4490 --- /dev/null +++ b/src/nut/phrases/fieldphrase_qstring.h @@ -0,0 +1,39 @@ +#ifndef NUT_FIELDPHRASE_QSTRING_H +#define NUT_FIELDPHRASE_QSTRING_H + +#include +#include +#include + +NUT_BEGIN_NAMESPACE + +template<> +class FieldPhrase : public AbstractFieldPhrase +{ +public: + FieldPhrase(const char *className, const char *s) + : AbstractFieldPhrase(className, s) + {} + + ConditionalPhrase like(const QString &term) + { + return ConditionalPhrase(this, PhraseData::Like, term); + } + + ConditionalPhrase contains(const QString &term) + { + return ConditionalPhrase(this, + PhraseData::Like, + QVariant(QStringLiteral("%") + term + + QStringLiteral("%"))); + } + + AssignmentPhrase operator=(const QVariant &v) + { + return AssignmentPhrase(this, v); + } +}; + +NUT_END_NAMESPACE + +#endif // NUT_FIELDPHRASE_QSTRING_H diff --git a/src/nut/phrases/phrasedata.cpp b/src/nut/phrases/phrasedata.cpp index 2316fd4..cc04aca 100644 --- a/src/nut/phrases/phrasedata.cpp +++ b/src/nut/phrases/phrasedata.cpp @@ -22,52 +22,57 @@ NUT_BEGIN_NAMESPACE -PhraseData::PhraseData() : - className(""), fieldName(""), - type(Field), operatorCond(NotAssign), - left(nullptr), right(nullptr), operand(QVariant::Invalid), isNot(false), parents(1) +PhraseData::PhraseData() + : className(""), fieldName(""), type(Field), operatorCond(NotAssign), + left(nullptr), right(nullptr), operand(QVariant::Invalid), isNot(false), + ref(1) { } -PhraseData::PhraseData(const char *className, const char *fieldName) : - className(className), fieldName(fieldName), - type(Field), operatorCond(NotAssign), - left(nullptr), right(nullptr), operand(QVariant::Invalid), isNot(false), parents(1) +PhraseData::PhraseData(const char *className, const char *fieldName) + : className(className), fieldName(fieldName), type(Field), + operatorCond(NotAssign), left(nullptr), right(nullptr), + operand(QVariant::Invalid), isNot(false), ref(1) { } PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o) - : className(nullptr), fieldName(nullptr), - type(WithoutOperand), operatorCond(o), left(l), right(nullptr), - isNot(false), parents(1) + : className(nullptr), fieldName(nullptr), type(WithoutOperand), + operatorCond(o), left(l), right(nullptr), isNot(false), ref(1) { - l->parents++; + l->ref.ref(); } -PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o, - PhraseData *r) - : className(nullptr), fieldName(nullptr), - type(WithOther), operatorCond(o), - left(l), right(r), - isNot(false), parents(1) +PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o, PhraseData *r) + : className(nullptr), fieldName(nullptr), type(WithOther), operatorCond(o), + left(l), right(r), isNot(false), ref(1) { - l->parents++; - r->parents++; + l->ref.ref(); + r->ref.ref(); } PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o, QVariant r) - : className(nullptr), fieldName(nullptr), - type(WithVariant), operatorCond(o), left(l), - right(nullptr), operand(r), isNot(false), parents(1) + : className(nullptr), fieldName(nullptr), type(WithVariant), + operatorCond(o), left(l), right(nullptr), operand(r), isNot(false), + ref(1) { } +PhraseData::~PhraseData() +{ +// if (left && !left->ref.deref()) +// delete left; + +// if (right && !right->ref.deref()) +// delete right; +} + PhraseData *PhraseData::operator =(PhraseData *other) { - other->parents++; + other->ref.ref(); return other; } PhraseData &PhraseData::operator =(PhraseData &other) { - other.parents++; + other.ref.ref(); return other; } @@ -81,6 +86,26 @@ void PhraseData::cleanUp() { } +PhraseData *PhraseData::clone() const +{ + auto c = new PhraseData; + c->className = className; + c->fieldName = fieldName; + + c->type = type; + + c->operatorCond = operatorCond; + + c->left = left; + c->right = right; + + c->operand = operand; + c->isNot = isNot; +// c->parents = parents; + + return c; +} + void PhraseData::cleanUp(PhraseData *d) { if (d->left) diff --git a/src/nut/phrases/phrasedata.h b/src/nut/phrases/phrasedata.h index 0af3d7b..11fe522 100644 --- a/src/nut/phrases/phrasedata.h +++ b/src/nut/phrases/phrasedata.h @@ -97,24 +97,25 @@ public: QVariant operand; bool isNot; - quint16 parents; +// quint16 parents; + + mutable QAtomicInt ref; PhraseData(); PhraseData(const char *className, const char *fieldName); PhraseData(PhraseData *l, Condition o); PhraseData(PhraseData *l, Condition o, PhraseData *r); PhraseData(PhraseData *l, Condition o, QVariant r); -// explicit PhraseData(const PhraseData &other); -// explicit PhraseData(const PhraseData *other); + + virtual ~PhraseData(); PhraseData *operator =(PhraseData *other); PhraseData &operator =(PhraseData &other); QString toString() const; - ~PhraseData() = default; - void cleanUp(); + PhraseData *clone() const; private: void cleanUp(PhraseData *d); }; diff --git a/src/nut/phrases/phrasedatalist.cpp b/src/nut/phrases/phrasedatalist.cpp index e1858ed..1d359b1 100644 --- a/src/nut/phrases/phrasedatalist.cpp +++ b/src/nut/phrases/phrasedatalist.cpp @@ -37,14 +37,14 @@ PhraseDataList::PhraseDataList(const PhraseDataList &other) : QList void PhraseDataList::append(PhraseData *d) { - d->parents++; + d->ref.ref(); QList::append(d); } void PhraseDataList::append(QList &dl) { foreach (PhraseData *d, dl) - d->parents++; + d->ref.ref(); QList::append(dl); } @@ -53,7 +53,7 @@ PhraseDataList::~PhraseDataList() QList::iterator i; for (i = begin(); i != end(); ++i) { (*i)->cleanUp(); - if (!--(*i)->parents) + if (!(*i)->ref.deref()) delete *i; } } diff --git a/tests/auto/tst_phrases/tst_phrases.cpp b/tests/auto/tst_phrases/tst_phrases.cpp index d319c58..bdb7ed3 100644 --- a/tests/auto/tst_phrases/tst_phrases.cpp +++ b/tests/auto/tst_phrases/tst_phrases.cpp @@ -3,6 +3,7 @@ #include "tst_phrases.h" #include "phrase.h" +#include "sqlitegenerator.h" using namespace Nut; @@ -17,11 +18,15 @@ void PhrasesTest::initTestCase() void PhrasesTest::no1() { - FieldPhrase id("main", "id"); - FieldPhrase name("main", "name"); - FieldPhrase last_name("main", "last_name"); - FieldPhrase date("main", "date"); - auto w = (id == 4 && name == "hi"); + { + FieldPhrase id("main", "id"); + FieldPhrase name("main", "name"); + FieldPhrase last_name("main", "last_name"); + FieldPhrase date("main", "date"); + auto w = (id == 4 && name == QStringLiteral("hi")); + + SqliteGenerator g; + } } void PhrasesTest::numeric() From 6efc4f4ee4360fc2e8cd0d6f3685790b1cfc90a1 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Wed, 12 Aug 2020 18:16:56 +0430 Subject: [PATCH 09/13] make sub projects for better file groupping --- src/nut/config/config.pri | 8 + src/nut/config/nut_config.h | 20 ++ .../{defines_consts.h => config/nut_consts.h} | 6 +- src/nut/config/nut_global.h | 12 ++ src/nut/{defines.h => config/nut_macros.h} | 179 +----------------- src/nut/config/nut_namespace.h | 137 ++++++++++++++ src/nut/{ => core}/abstracttableset.cpp | 8 +- src/nut/{ => core}/abstracttableset.h | 2 +- src/nut/{ => core}/abstracttablesetdata.h | 2 +- src/nut/{ => core}/bulkinserter.cpp | 0 src/nut/{ => core}/bulkinserter.h | 2 +- src/nut/{ => core}/bulkinserter_p.h | 0 src/nut/{ => core}/changelogtable.cpp | 0 src/nut/{ => core}/changelogtable.h | 0 src/nut/core/core.pri | 25 +++ src/nut/{ => core}/database.cpp | 2 +- src/nut/{ => core}/database.h | 2 +- src/nut/{ => core}/database_p.h | 0 src/nut/{ => core}/query.cpp | 0 src/nut/{ => core}/query.h | 8 +- src/nut/{ => core}/table.cpp | 4 + src/nut/{ => core}/table.h | 2 +- src/nut/{ => core}/table_p.h | 3 +- src/nut/{ => core}/tableset.cpp | 0 src/nut/{ => core}/tableset.h | 6 +- src/nut/generators/generators.pri | 15 ++ src/nut/{ => models}/databasemodel.cpp | 0 src/nut/{ => models}/databasemodel.h | 2 +- src/nut/models/models.pri | 14 ++ src/nut/{ => models}/sqlmodel.cpp | 0 src/nut/{ => models}/sqlmodel.h | 4 +- src/nut/{ => models}/sqlmodel_p.h | 2 +- src/nut/{ => models}/tablemodel.cpp | 2 +- src/nut/{ => models}/tablemodel.h | 2 +- src/nut/{src.pri => nut.pri} | 2 +- src/nut/nut.pro | 77 +------- src/nut/phrase.cpp | 44 ----- src/nut/phrase.h | 39 +--- src/nut/phrases/abstractfieldphrase.h | 2 +- src/nut/phrases/assignmentphrase.h | 2 +- src/nut/phrases/assignmentphraselist.h | 2 +- src/nut/phrases/fieldphrase.h | 2 +- src/nut/phrases/fieldphrase_bool.h | 2 +- src/nut/phrases/fieldphrase_qstring.h | 2 +- src/nut/phrases/phrasedata.h | 2 +- src/nut/phrases/phraselist.h | 2 +- src/nut/phrases/phrases.pri | 27 +++ src/nut/serializableobject.cpp | 2 - src/nut/serializableobject.h | 15 -- src/nut/tuple.cpp | 2 - src/nut/tuple.h | 18 -- src/nut/types/dbgeography.h | 2 +- src/nut/types/types.pri | 7 + sync.profile | 2 +- 54 files changed, 320 insertions(+), 402 deletions(-) create mode 100644 src/nut/config/config.pri create mode 100644 src/nut/config/nut_config.h rename src/nut/{defines_consts.h => config/nut_consts.h} (96%) create mode 100644 src/nut/config/nut_global.h rename src/nut/{defines.h => config/nut_macros.h} (64%) create mode 100644 src/nut/config/nut_namespace.h rename src/nut/{ => core}/abstracttableset.cpp (98%) rename src/nut/{ => core}/abstracttableset.h (98%) rename src/nut/{ => core}/abstracttablesetdata.h (98%) rename src/nut/{ => core}/bulkinserter.cpp (100%) rename src/nut/{ => core}/bulkinserter.h (96%) rename src/nut/{ => core}/bulkinserter_p.h (100%) rename src/nut/{ => core}/changelogtable.cpp (100%) rename src/nut/{ => core}/changelogtable.h (100%) create mode 100644 src/nut/core/core.pri rename src/nut/{ => core}/database.cpp (99%) rename src/nut/{ => core}/database.h (98%) rename src/nut/{ => core}/database_p.h (100%) rename src/nut/{ => core}/query.cpp (100%) rename src/nut/{ => core}/query.h (99%) rename src/nut/{ => core}/table.cpp (98%) rename src/nut/{ => core}/table.h (98%) rename src/nut/{ => core}/table_p.h (90%) rename src/nut/{ => core}/tableset.cpp (100%) rename src/nut/{ => core}/tableset.h (99%) create mode 100644 src/nut/generators/generators.pri rename src/nut/{ => models}/databasemodel.cpp (100%) rename src/nut/{ => models}/databasemodel.h (98%) create mode 100644 src/nut/models/models.pri rename src/nut/{ => models}/sqlmodel.cpp (100%) rename src/nut/{ => models}/sqlmodel.h (96%) rename src/nut/{ => models}/sqlmodel_p.h (94%) rename src/nut/{ => models}/tablemodel.cpp (99%) rename src/nut/{ => models}/tablemodel.h (99%) rename src/nut/{src.pri => nut.pri} (98%) create mode 100644 src/nut/phrases/phrases.pri delete mode 100644 src/nut/serializableobject.cpp delete mode 100644 src/nut/serializableobject.h delete mode 100644 src/nut/tuple.cpp delete mode 100644 src/nut/tuple.h create mode 100644 src/nut/types/types.pri diff --git a/src/nut/config/config.pri b/src/nut/config/config.pri new file mode 100644 index 0000000..c3c880a --- /dev/null +++ b/src/nut/config/config.pri @@ -0,0 +1,8 @@ +INCLUDEPATH += $$PWD + +HEADERS += \ + $$PWD/nut_config.h \ + $$PWD/nut_consts.h \ + $$PWD/nut_global.h \ + $$PWD/nut_macros.h \ + $$PWD/nut_namespace.h diff --git a/src/nut/config/nut_config.h b/src/nut/config/nut_config.h new file mode 100644 index 0000000..fd8e780 --- /dev/null +++ b/src/nut/config/nut_config.h @@ -0,0 +1,20 @@ +#ifndef NUT_CONFIG_H +#define NUT_CONFIG_H + +#if defined(NUT_SHARED) || !defined(NUT_STATIC) +# ifdef NUT_STATIC +# error "Both NUT_SHARED and NUT_STATIC defined, please make up your mind" +# endif +# ifndef NUT_SHARED +# define NUT_SHARED +# endif +# if defined(NUT_BUILD_LIB) +# define NUT_EXPORT Q_DECL_EXPORT +# else +# define NUT_EXPORT Q_DECL_IMPORT +# endif +#else +# define NUT_EXPORT +#endif + +#endif // NUT_CONFIG_H diff --git a/src/nut/defines_consts.h b/src/nut/config/nut_consts.h similarity index 96% rename from src/nut/defines_consts.h rename to src/nut/config/nut_consts.h index 380fc1b..8d74aeb 100644 --- a/src/nut/defines_consts.h +++ b/src/nut/config/nut_consts.h @@ -18,8 +18,8 @@ ** **************************************************************************/ -#ifndef DEFINES_P_H -#define DEFINES_P_H +#ifndef NUT_CONSTS_H +#define NUT_CONSTS_H #define __NAME "name" #define __TYPE "type" @@ -56,4 +56,4 @@ # define NUT_WRAP_NAMESPACE(x) x #endif -#endif // DEFINES_P_H +#endif // NUT_CONSTS_H diff --git a/src/nut/config/nut_global.h b/src/nut/config/nut_global.h new file mode 100644 index 0000000..0159842 --- /dev/null +++ b/src/nut/config/nut_global.h @@ -0,0 +1,12 @@ +#ifndef NUT_GLOBAL_H +#define NUT_GLOBAL_H + +#define NUT_NAMESPACE Nut + +#include +#include +#include +#include +#include + +#endif // NUT_GLOBAL_H diff --git a/src/nut/defines.h b/src/nut/config/nut_macros.h similarity index 64% rename from src/nut/defines.h rename to src/nut/config/nut_macros.h index aa6725e..52cd802 100644 --- a/src/nut/defines.h +++ b/src/nut/config/nut_macros.h @@ -1,51 +1,6 @@ -/************************************************************************** -** -** 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 . -** -**************************************************************************/ +#ifndef NUT_MACROS_H +#define NUT_MACROS_H -#ifndef SYNTAX_DEFINES_H -#define SYNTAX_DEFINES_H - -#define NUT_NAMESPACE Nut - -#include -#include - -#include -#include -#include -#include - -#if defined(NUT_SHARED) || !defined(NUT_STATIC) -# ifdef NUT_STATIC -# error "Both NUT_SHARED and NUT_STATIC defined, please make up your mind" -# endif -# ifndef NUT_SHARED -# define NUT_SHARED -# endif -# if defined(NUT_BUILD_LIB) -# define NUT_EXPORT Q_DECL_EXPORT -# else -# define NUT_EXPORT Q_DECL_IMPORT -# endif -#else -# define NUT_EXPORT -#endif #define NUT_INFO(type, name, value) \ Q_CLASSINFO(__nut_NAME_PERFIX type #name #value, \ @@ -180,132 +135,4 @@ public slots: \ #define NUT_NOT_NULL(x) NUT_INFO(__nut_NOT_NULL, x, 1) #define NUT_INDEX(name, field, order) -NUT_BEGIN_NAMESPACE - -inline bool nutClassInfo(const QMetaClassInfo &classInfo, - QString &type, QString &name, QVariant &value) -{ - if (!QString::fromUtf8(classInfo.name()).startsWith(QStringLiteral(__nut_NAME_PERFIX))) - return false; - - QStringList parts = QString::fromUtf8(classInfo.value()).split(QStringLiteral("\n")); - if (parts.count() != 3) - return false; - - type = parts[0]; - name = parts[1]; - value = QVariant::fromValue(parts[2]); - return true; -} - -inline bool nutClassInfoString(const QMetaClassInfo &classInfo, - QString &type, QString &name, QString &value) -{ - if (!QString::fromUtf8(classInfo.name()).startsWith(QStringLiteral(__nut_NAME_PERFIX))) - return false; - - QStringList parts = QString::fromUtf8(classInfo.value()).split(QStringLiteral("\n")); - if (parts.count() != 3) - return false; - - type = parts[0]; - name = parts[1]; - value = parts[2]; - return true; -} - -inline bool nutClassInfoBool(const QMetaClassInfo &classInfo, - QString &type, QString &name, bool &value) -{ - if (!QString::fromUtf8(classInfo.name()).startsWith(QStringLiteral(__nut_NAME_PERFIX))) - return false; - - QStringList parts = QString::fromUtf8(classInfo.value()).split(QStringLiteral("\n")); - if (parts.count() != 3) - return false; - - QString buffer = parts[2].toLower(); - if (buffer != QStringLiteral("true") && buffer != QStringLiteral("false")) - return false; - - type = parts[0]; - name = parts[1]; - value = (buffer == QStringLiteral("true")); - return true; -} - -inline bool nutClassInfoInt(const QMetaClassInfo &classInfo, - QString &type, QString &name, bool &value) -{ - if (!QString::fromUtf8(classInfo.name()).startsWith(QStringLiteral(__nut_NAME_PERFIX))) - return false; - - QStringList parts = QString::fromUtf8(classInfo.value()).split(QStringLiteral("\n")); - if (parts.count() != 3) - return false; - bool ok; - type = parts[0]; - name = parts[1]; - value = parts[2].toInt(&ok); - return ok; -} - -#ifdef NUT_SHARED_POINTER -template -using RowList = QList>; - -template -using RowSet = QSet>; - -template -using Row = QSharedPointer; - -template -inline Row create() { - return QSharedPointer(new T); -} - -template -inline Row create(QObject *parent) { - return QSharedPointer(new T(parent)); -} - -template -inline Row createFrom(T *row) { - return QSharedPointer(row); -} -template -inline Row createFrom(const QSharedPointer row) { - return row; -} - -#else -template -using RowList = QList; - -template -using RowSet = QSet; - -template -using Row = T*; - -template -inline Row create() { - return new T; -} - -template -inline T *get(const Row row) { - return row; -} - -template -inline T *get(const QSharedPointer row) { - return row.data(); -} - -#endif - -NUT_END_NAMESPACE - -#endif // SYNTAX_DEFINES_H +#endif // NUT_MACROS_H diff --git a/src/nut/config/nut_namespace.h b/src/nut/config/nut_namespace.h new file mode 100644 index 0000000..b87c38d --- /dev/null +++ b/src/nut/config/nut_namespace.h @@ -0,0 +1,137 @@ +#ifndef NUT_NAMESPACE_H +#define NUT_NAMESPACE_H + +#include + +#include +#include +#include +#include + +NUT_BEGIN_NAMESPACE + +inline bool nutClassInfo(const QMetaClassInfo &classInfo, + QString &type, QString &name, QVariant &value) +{ + if (!QString::fromUtf8(classInfo.name()).startsWith(QStringLiteral(__nut_NAME_PERFIX))) + return false; + + QStringList parts = QString::fromUtf8(classInfo.value()).split(QStringLiteral("\n")); + if (parts.count() != 3) + return false; + + type = parts[0]; + name = parts[1]; + value = QVariant::fromValue(parts[2]); + return true; +} + +inline bool nutClassInfoString(const QMetaClassInfo &classInfo, + QString &type, QString &name, QString &value) +{ + if (!QString::fromUtf8(classInfo.name()).startsWith(QStringLiteral(__nut_NAME_PERFIX))) + return false; + + QStringList parts = QString::fromUtf8(classInfo.value()).split(QStringLiteral("\n")); + if (parts.count() != 3) + return false; + + type = parts[0]; + name = parts[1]; + value = parts[2]; + return true; +} + +inline bool nutClassInfoBool(const QMetaClassInfo &classInfo, + QString &type, QString &name, bool &value) +{ + if (!QString::fromUtf8(classInfo.name()).startsWith(QStringLiteral(__nut_NAME_PERFIX))) + return false; + + QStringList parts = QString::fromUtf8(classInfo.value()).split(QStringLiteral("\n")); + if (parts.count() != 3) + return false; + + QString buffer = parts[2].toLower(); + if (buffer != QStringLiteral("true") && buffer != QStringLiteral("false")) + return false; + + type = parts[0]; + name = parts[1]; + value = (buffer == QStringLiteral("true")); + return true; +} + +inline bool nutClassInfoInt(const QMetaClassInfo &classInfo, + QString &type, QString &name, bool &value) +{ + if (!QString::fromUtf8(classInfo.name()).startsWith(QStringLiteral(__nut_NAME_PERFIX))) + return false; + + QStringList parts = QString::fromUtf8(classInfo.value()).split(QStringLiteral("\n")); + if (parts.count() != 3) + return false; + bool ok; + type = parts[0]; + name = parts[1]; + value = parts[2].toInt(&ok); + return ok; +} + +#ifdef NUT_RAW_POINTER +template +using RowList = QList; + +template +using RowSet = QSet; + +template +using Row = T*; + +template +inline Row create() { + return new T; +} + +template +inline T *get(const Row row) { + return row; +} + +template +inline T *get(const QSharedPointer row) { + return row.data(); +} +#else +template +using RowList = QList>; + +template +using RowSet = QSet>; + +template +using Row = QSharedPointer; + +template +inline Row create() { + return QSharedPointer(new T); +} + +template +inline Row create(QObject *parent) { + return QSharedPointer(new T(parent)); +} + +template +inline Row createFrom(T *row) { + return QSharedPointer(row); +} +template +inline Row createFrom(const QSharedPointer row) { + return row; +} +#endif + +NUT_END_NAMESPACE + +#endif // NUT_NAMESPACE_H diff --git a/src/nut/abstracttableset.cpp b/src/nut/core/abstracttableset.cpp similarity index 98% rename from src/nut/abstracttableset.cpp rename to src/nut/core/abstracttableset.cpp index cfec831..af90d81 100644 --- a/src/nut/abstracttableset.cpp +++ b/src/nut/core/abstracttableset.cpp @@ -63,10 +63,10 @@ int AbstractTableSet::save(Database *db, bool cleanUp) || t->status() == Table::Deleted) { rowsAffected += t->save(db); if (cleanUp) -#ifdef NUT_SHARED_POINTER - remove(t); -#else +#ifdef NUT_RAW_POINTER t->deleteLater(); +#else + remove(t); #endif } } @@ -79,7 +79,7 @@ int AbstractTableSet::save(Database *db, bool cleanUp) void AbstractTableSet::clearChilds() { -#ifndef NUT_SHARED_POINTER +#ifdef NUT_RAW_POINTER foreach (Table *t, data->childs) t->deleteLater(); #endif diff --git a/src/nut/abstracttableset.h b/src/nut/core/abstracttableset.h similarity index 98% rename from src/nut/abstracttableset.h rename to src/nut/core/abstracttableset.h index 5644005..f5f8f45 100644 --- a/src/nut/abstracttableset.h +++ b/src/nut/core/abstracttableset.h @@ -26,7 +26,7 @@ #include #include -#include +#include NUT_BEGIN_NAMESPACE diff --git a/src/nut/abstracttablesetdata.h b/src/nut/core/abstracttablesetdata.h similarity index 98% rename from src/nut/abstracttablesetdata.h rename to src/nut/core/abstracttablesetdata.h index c53448c..f2b60ac 100644 --- a/src/nut/abstracttablesetdata.h +++ b/src/nut/core/abstracttablesetdata.h @@ -23,7 +23,7 @@ #include -#include +#include NUT_BEGIN_NAMESPACE diff --git a/src/nut/bulkinserter.cpp b/src/nut/core/bulkinserter.cpp similarity index 100% rename from src/nut/bulkinserter.cpp rename to src/nut/core/bulkinserter.cpp diff --git a/src/nut/bulkinserter.h b/src/nut/core/bulkinserter.h similarity index 96% rename from src/nut/bulkinserter.h rename to src/nut/core/bulkinserter.h index ae837f6..d977397 100644 --- a/src/nut/bulkinserter.h +++ b/src/nut/core/bulkinserter.h @@ -6,7 +6,7 @@ #include #include -#include +#include NUT_BEGIN_NAMESPACE diff --git a/src/nut/bulkinserter_p.h b/src/nut/core/bulkinserter_p.h similarity index 100% rename from src/nut/bulkinserter_p.h rename to src/nut/core/bulkinserter_p.h diff --git a/src/nut/changelogtable.cpp b/src/nut/core/changelogtable.cpp similarity index 100% rename from src/nut/changelogtable.cpp rename to src/nut/core/changelogtable.cpp diff --git a/src/nut/changelogtable.h b/src/nut/core/changelogtable.h similarity index 100% rename from src/nut/changelogtable.h rename to src/nut/core/changelogtable.h diff --git a/src/nut/core/core.pri b/src/nut/core/core.pri new file mode 100644 index 0000000..aa46c3e --- /dev/null +++ b/src/nut/core/core.pri @@ -0,0 +1,25 @@ +INCLUDEPATH += $$PWD + +HEADERS += \ + $$PWD/abstracttableset.h \ + $$PWD/abstracttablesetdata.h \ + $$PWD/bulkinserter.h \ + $$PWD/bulkinserter_p.h \ + $$PWD/changelogtable.h \ + $$PWD/database.h \ + $$PWD/database_p.h \ + $$PWD/query.h \ + $$PWD/table.h \ + $$PWD/table_p.h \ + $$PWD/tableset.h + +SOURCES += \ + $$PWD/abstracttableset.cpp \ + $$PWD/bulkinserter.cpp \ + $$PWD/changelogtable.cpp \ + $$PWD/database.cpp \ + $$PWD/query.cpp \ + $$PWD/table.cpp \ + $$PWD/tableset.cpp + + diff --git a/src/nut/database.cpp b/src/nut/core/database.cpp similarity index 99% rename from src/nut/database.cpp rename to src/nut/core/database.cpp index de16341..9eced3d 100644 --- a/src/nut/database.cpp +++ b/src/nut/core/database.cpp @@ -33,7 +33,7 @@ #include "table.h" #include "tableset.h" #include "database_p.h" -#include "defines.h" +#include "config/nut_global.h" #include "tablemodel.h" #include "postgresqlgenerator.h" #include "mysqlgenerator.h" diff --git a/src/nut/database.h b/src/nut/core/database.h similarity index 98% rename from src/nut/database.h rename to src/nut/core/database.h index c88c9d6..9b3ac31 100644 --- a/src/nut/database.h +++ b/src/nut/core/database.h @@ -26,7 +26,7 @@ #include #include -#include +#include #include NUT_BEGIN_NAMESPACE diff --git a/src/nut/database_p.h b/src/nut/core/database_p.h similarity index 100% rename from src/nut/database_p.h rename to src/nut/core/database_p.h diff --git a/src/nut/query.cpp b/src/nut/core/query.cpp similarity index 100% rename from src/nut/query.cpp rename to src/nut/core/query.cpp diff --git a/src/nut/query.h b/src/nut/core/query.h similarity index 99% rename from src/nut/query.h rename to src/nut/core/query.h index 743b6c1..8ff4737 100644 --- a/src/nut/query.h +++ b/src/nut/core/query.h @@ -31,7 +31,7 @@ #include #include -#ifdef NUT_SHARED_POINTER +#ifndef NUT_RAW_POINTER #include #endif @@ -351,10 +351,10 @@ Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) Row row; if (data.table->className() == d->className) { row = Nut::create(); -#ifdef NUT_SHARED_POINTER - returnList.append(row.objectCast()); -#else +#ifdef NUT_RAW_POINTER returnList.append(dynamic_cast(table)); +#else + returnList.append(row.objectCast()); #endif d->tableSet->add(row); diff --git a/src/nut/table.cpp b/src/nut/core/table.cpp similarity index 98% rename from src/nut/table.cpp rename to src/nut/core/table.cpp index b5afe44..866c5c9 100644 --- a/src/nut/table.cpp +++ b/src/nut/core/table.cpp @@ -43,6 +43,10 @@ NUT_BEGIN_NAMESPACE * This should be fixed to v1.2 */ +/*! + * \class Table + * \brief Base class for all tables + */ Table::Table(QObject *parent) : QObject(parent), d(new TablePrivate) { } diff --git a/src/nut/table.h b/src/nut/core/table.h similarity index 98% rename from src/nut/table.h rename to src/nut/core/table.h index ec73c6a..55e1051 100644 --- a/src/nut/table.h +++ b/src/nut/core/table.h @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include diff --git a/src/nut/table_p.h b/src/nut/core/table_p.h similarity index 90% rename from src/nut/table_p.h rename to src/nut/core/table_p.h index ef10672..954bffb 100644 --- a/src/nut/table_p.h +++ b/src/nut/core/table_p.h @@ -4,7 +4,8 @@ #include #include -#include +#include +#include NUT_BEGIN_NAMESPACE diff --git a/src/nut/tableset.cpp b/src/nut/core/tableset.cpp similarity index 100% rename from src/nut/tableset.cpp rename to src/nut/core/tableset.cpp diff --git a/src/nut/tableset.h b/src/nut/core/tableset.h similarity index 99% rename from src/nut/tableset.h rename to src/nut/core/tableset.h index d28ddfb..bd0450c 100644 --- a/src/nut/tableset.h +++ b/src/nut/core/tableset.h @@ -100,10 +100,10 @@ Q_OUTOFLINE_TEMPLATE int TableSet::length() const template Q_OUTOFLINE_TEMPLATE Row TableSet::at(int i) const { -#ifdef NUT_SHARED_POINTER - return data->childs.at(i).template objectCast(); -#else +#ifdef NUT_RAW_POINTER return reinterpret_cast(data->childs.at(i)); +#else + return data->childs.at(i).template objectCast(); #endif } diff --git a/src/nut/generators/generators.pri b/src/nut/generators/generators.pri new file mode 100644 index 0000000..2a81bbe --- /dev/null +++ b/src/nut/generators/generators.pri @@ -0,0 +1,15 @@ +INCLUDEPATH += $$PWD + +HEADERS += \ + $$PWD/abstractsqlgenerator.h \ + $$PWD/postgresqlgenerator.h \ + $$PWD/mysqlgenerator.h \ + $$PWD/sqlitegenerator.h \ + $$PWD/sqlservergenerator.h + +SOURCES += \ + $$PWD/abstractsqlgenerator.cpp \ + $$PWD/postgresqlgenerator.cpp \ + $$PWD/mysqlgenerator.cpp \ + $$PWD/sqlitegenerator.cpp \ + $$PWD/sqlservergenerator.cpp diff --git a/src/nut/databasemodel.cpp b/src/nut/models/databasemodel.cpp similarity index 100% rename from src/nut/databasemodel.cpp rename to src/nut/models/databasemodel.cpp diff --git a/src/nut/databasemodel.h b/src/nut/models/databasemodel.h similarity index 98% rename from src/nut/databasemodel.h rename to src/nut/models/databasemodel.h index 5b8e17c..3dcbb6c 100644 --- a/src/nut/databasemodel.h +++ b/src/nut/models/databasemodel.h @@ -25,7 +25,7 @@ #include #include -#include +#include class QJsonObject; diff --git a/src/nut/models/models.pri b/src/nut/models/models.pri new file mode 100644 index 0000000..9203dc1 --- /dev/null +++ b/src/nut/models/models.pri @@ -0,0 +1,14 @@ +INCLUDEPATH += $$PWD + +HEADERS += \ + $$PWD/databasemodel.h \ + $$PWD/sqlmodel.h \ + $$PWD/sqlmodel_p.h \ + $$PWD/tablemodel.h + +SOURCES += \ + $$PWD/databasemodel.cpp \ + $$PWD/sqlmodel.cpp \ + $$PWD/tablemodel.cpp + + diff --git a/src/nut/sqlmodel.cpp b/src/nut/models/sqlmodel.cpp similarity index 100% rename from src/nut/sqlmodel.cpp rename to src/nut/models/sqlmodel.cpp diff --git a/src/nut/sqlmodel.h b/src/nut/models/sqlmodel.h similarity index 96% rename from src/nut/sqlmodel.h rename to src/nut/models/sqlmodel.h index 3a87d76..50f6815 100644 --- a/src/nut/sqlmodel.h +++ b/src/nut/models/sqlmodel.h @@ -25,7 +25,7 @@ #include #include -#include +#include NUT_BEGIN_NAMESPACE @@ -55,7 +55,7 @@ public: void append(Row
table); // void append(Table *table); QVariant headerData(int section, Qt::Orientation orientation, int role) const; - Row at(const int &i) const; + Row
at(const int &i) const; void setRenderer(const std::function &renderer); diff --git a/src/nut/sqlmodel_p.h b/src/nut/models/sqlmodel_p.h similarity index 94% rename from src/nut/sqlmodel_p.h rename to src/nut/models/sqlmodel_p.h index ea57486..0e2dba1 100644 --- a/src/nut/sqlmodel_p.h +++ b/src/nut/models/sqlmodel_p.h @@ -6,7 +6,7 @@ #include -#include +#include NUT_BEGIN_NAMESPACE diff --git a/src/nut/tablemodel.cpp b/src/nut/models/tablemodel.cpp similarity index 99% rename from src/nut/tablemodel.cpp rename to src/nut/models/tablemodel.cpp index e36f23e..da2d52e 100644 --- a/src/nut/tablemodel.cpp +++ b/src/nut/models/tablemodel.cpp @@ -25,7 +25,7 @@ #include #include "tablemodel.h" -#include "defines.h" +#include "nut_global.h" NUT_BEGIN_NAMESPACE diff --git a/src/nut/tablemodel.h b/src/nut/models/tablemodel.h similarity index 99% rename from src/nut/tablemodel.h rename to src/nut/models/tablemodel.h index 255e9c6..54a28e1 100644 --- a/src/nut/tablemodel.h +++ b/src/nut/models/tablemodel.h @@ -24,7 +24,7 @@ #include #include -#include +#include class QJsonObject; diff --git a/src/nut/src.pri b/src/nut/nut.pri similarity index 98% rename from src/nut/src.pri rename to src/nut/nut.pri index 0c29459..380d07c 100644 --- a/src/nut/src.pri +++ b/src/nut/nut.pri @@ -10,7 +10,7 @@ HEADERS += \ $$PWD/types/dbgeography.h \ $$PWD/tableset.h \ $$PWD/defines_consts.h \ - $$PWD/defines.h \ + $$PWD/nut_global.h \ $$PWD/query.h \ $$PWD/databasemodel.h \ $$PWD/changelogtable.h \ diff --git a/src/nut/nut.pro b/src/nut/nut.pro index 7beb4ab..1b83798 100644 --- a/src/nut/nut.pro +++ b/src/nut/nut.pro @@ -9,79 +9,18 @@ DEFINES += QT_DEPRECATED_WARNINGS NUT_SHARED NUT_BUILD_LIB DEFINES += NUT_SHARED_POINTER -INCLUDEPATH += \ - $$PWD/generators \ - $$PWD/phrases \ - $$PWD/types +include(config/config.pri) +include(core/core.pri) +include(generators/generators.pri) +include(types/types.pri) +include(phrases/phrases.pri) +include(models/models.pri) HEADERS += \ - $$PWD/generators/abstractsqlgenerator.h \ - $$PWD/generators/postgresqlgenerator.h \ - $$PWD/generators/mysqlgenerator.h \ - $$PWD/generators/sqlitegenerator.h \ - $$PWD/generators/sqlservergenerator.h \ - $$PWD/types/dbgeography.h \ - $$PWD/tableset.h \ - $$PWD/defines_consts.h \ - $$PWD/defines.h \ - $$PWD/query.h \ - $$PWD/bulkinserter.h \ - $$PWD/databasemodel.h \ - $$PWD/changelogtable.h \ - $$PWD/abstracttableset.h \ - $$PWD/abstracttablesetdata.h \ - $$PWD/tablemodel.h \ - $$PWD/table.h \ - $$PWD/database.h \ - $$PWD/database_p.h \ - $$PWD/serializableobject.h \ - $$PWD/sqlmodel.h \ - $$PWD/sqlmodel_p.h \ - $$PWD/phrase.h \ - $$PWD/phrases/abstractfieldphrase.h \ - $$PWD/phrases/assignmentphrase.h \ - $$PWD/phrases/assignmentphraselist.h \ - $$PWD/phrases/conditionalphrase.h \ - $$PWD/phrases/fieldphrase.h \ - $$PWD/phrases/phrasedata.h \ - $$PWD/phrases/phrasedatalist.h \ - $$PWD/phrases/phraselist.h \ - $$PWD/phrases/fieldphrase_date.h \ - $$PWD/table_p.h \ - $$PWD/bulkinserter_p.h \ - $$PWD/phrases/fieldphrase_bool.h \ - $$PWD/phrases/fieldphrase_qstring.h + $$PWD/phrase.h SOURCES += \ - $$PWD/generators/abstractsqlgenerator.cpp \ - $$PWD/generators/postgresqlgenerator.cpp \ - $$PWD/generators/mysqlgenerator.cpp \ - $$PWD/generators/sqlitegenerator.cpp \ - $$PWD/generators/sqlservergenerator.cpp \ - $$PWD/types/dbgeography.cpp \ - $$PWD/tableset.cpp \ - $$PWD/query.cpp \ - $$PWD/bulkinserter.cpp \ - $$PWD/databasemodel.cpp \ - $$PWD/abstracttableset.cpp \ - $$PWD/changelogtable.cpp \ - $$PWD/tablemodel.cpp \ - $$PWD/table.cpp \ - $$PWD/database.cpp \ - $$PWD/serializableobject.cpp \ - $$PWD/sqlmodel.cpp \ - $$PWD/phrase.cpp \ - $$PWD/phrases/abstractfieldphrase.cpp \ - $$PWD/phrases/assignmentphrase.cpp \ - $$PWD/phrases/assignmentphraselist.cpp \ - $$PWD/phrases/conditionalphrase.cpp \ - $$PWD/phrases/fieldphrase.cpp \ - $$PWD/phrases/phrasedata.cpp \ - $$PWD/phrases/phrasedatalist.cpp \ - $$PWD/phrases/phraselist.cpp \ - $$PWD/phrases/fieldphrase_date.cpp \ - $$PWD/phrases/fieldphrase_bool.cpp \ - $$PWD/phrases/fieldphrase_qstring.cpp + $$PWD/phrase.cpp load(qt_module) diff --git a/src/nut/phrase.cpp b/src/nut/phrase.cpp index 57e513c..1f47186 100644 --- a/src/nut/phrase.cpp +++ b/src/nut/phrase.cpp @@ -19,47 +19,3 @@ **************************************************************************/ #include "phrase.h" - -#include - -NUT_BEGIN_NAMESPACE - - - - - -//AssignmentPhrase::AssignmentPhrase(AssignmentPhrase *l, const AssignmentPhrase *r) -//{ -//// data = new PhraseData(l->data, PhraseData::Append, r->data); -// qFatal("SS"); -//} - - - - - - -//AssignmentPhraseList operator &(const AssignmentPhrase &l, const AssignmentPhrase &r) -//{ -// return AssignmentPhraseList(l, r); -//} - -//AssignmentPhraseList operator &(const AssignmentPhrase &l, AssignmentPhrase &&r) -//{ -// r.data = 0; -// return AssignmentPhraseList(l, r); -//} - -//AssignmentPhraseList operator &(AssignmentPhrase &&l, const AssignmentPhrase &r) -//{ -// l.data = 0; -// return AssignmentPhraseList(l, r); -//} - -//AssignmentPhraseList operator &(AssignmentPhrase &&l, AssignmentPhrase &&r) -//{ -// r.data = l.data = 0; -// return AssignmentPhraseList(l, r); -//} - -NUT_END_NAMESPACE diff --git a/src/nut/phrase.h b/src/nut/phrase.h index ab9d4f9..c517ccb 100644 --- a/src/nut/phrase.h +++ b/src/nut/phrase.h @@ -21,6 +21,7 @@ #ifndef PHRASE_H #define PHRASE_H +#include #include #include #include @@ -34,42 +35,4 @@ #include #include -NUT_BEGIN_NAMESPACE - -#define SPECIALIZATION_NUMERIC_MEMBER(type, op, cond) \ -ConditionalPhrase operator op(const QVariant &other) \ -{ \ - return ConditionalPhrase(this, cond, other); \ -} - -class AbstractFieldPhrase; -class AssignmentPhrase; -class PhraseList; - -//AssignmentPhraseList operator &(const AssignmentPhrase &l, const AssignmentPhrase &r); -//AssignmentPhraseList operator &(const AssignmentPhrase &l, AssignmentPhrase &&r); -//AssignmentPhraseList operator &(AssignmentPhrase &&l, const AssignmentPhrase &r); -//AssignmentPhraseList operator &(AssignmentPhrase &&l, AssignmentPhrase &&r); - - -//ConditionalPhrase operator <(AbstractFieldPhrase &l, ConditionalPhrase &&other) -//{ -// return ConditionalPhrase(&l, PhraseData::Less, other); -//} - -//template -//class FieldPhrase : public AbstractFieldPhrase -//{ -//public: -// FieldPhrase(const char *className, const char *s) : -// AbstractFieldPhrase(className, s) -// {} - -// AssignmentPhrase operator =(const QVariant &other) { -// return AssignmentPhrase(this, other); -// } -//}; - -NUT_END_NAMESPACE - #endif // PHRASE_H diff --git a/src/nut/phrases/abstractfieldphrase.h b/src/nut/phrases/abstractfieldphrase.h index a4340be..8f2326e 100644 --- a/src/nut/phrases/abstractfieldphrase.h +++ b/src/nut/phrases/abstractfieldphrase.h @@ -21,7 +21,7 @@ #ifndef ABSTRACTFIELDPHRASE_H #define ABSTRACTFIELDPHRASE_H -#include +#include #include #include #include diff --git a/src/nut/phrases/assignmentphrase.h b/src/nut/phrases/assignmentphrase.h index fc2711f..8eeb244 100644 --- a/src/nut/phrases/assignmentphrase.h +++ b/src/nut/phrases/assignmentphrase.h @@ -21,7 +21,7 @@ #ifndef ASSIGNMENTPHRASE_H #define ASSIGNMENTPHRASE_H -#include +#include #include NUT_BEGIN_NAMESPACE diff --git a/src/nut/phrases/assignmentphraselist.h b/src/nut/phrases/assignmentphraselist.h index 7e0c897..1e7c2b4 100644 --- a/src/nut/phrases/assignmentphraselist.h +++ b/src/nut/phrases/assignmentphraselist.h @@ -21,7 +21,7 @@ #ifndef ASSIGNMENTPHRASELIST_H #define ASSIGNMENTPHRASELIST_H -#include +#include NUT_BEGIN_NAMESPACE diff --git a/src/nut/phrases/fieldphrase.h b/src/nut/phrases/fieldphrase.h index 5071668..909cc4f 100644 --- a/src/nut/phrases/fieldphrase.h +++ b/src/nut/phrases/fieldphrase.h @@ -21,7 +21,7 @@ #ifndef FIELDPHRASE_H #define FIELDPHRASE_H -#include +#include #include NUT_BEGIN_NAMESPACE diff --git a/src/nut/phrases/fieldphrase_bool.h b/src/nut/phrases/fieldphrase_bool.h index ad3e111..eb7277c 100644 --- a/src/nut/phrases/fieldphrase_bool.h +++ b/src/nut/phrases/fieldphrase_bool.h @@ -1,7 +1,7 @@ #ifndef NUT_FIELDPHRASE_BOOL_H #define NUT_FIELDPHRASE_BOOL_H -#include +#include #include #include diff --git a/src/nut/phrases/fieldphrase_qstring.h b/src/nut/phrases/fieldphrase_qstring.h index ede4490..754d971 100644 --- a/src/nut/phrases/fieldphrase_qstring.h +++ b/src/nut/phrases/fieldphrase_qstring.h @@ -1,7 +1,7 @@ #ifndef NUT_FIELDPHRASE_QSTRING_H #define NUT_FIELDPHRASE_QSTRING_H -#include +#include #include #include diff --git a/src/nut/phrases/phrasedata.h b/src/nut/phrases/phrasedata.h index 11fe522..48937ab 100644 --- a/src/nut/phrases/phrasedata.h +++ b/src/nut/phrases/phrasedata.h @@ -21,7 +21,7 @@ #ifndef PHRASEDATA_H #define PHRASEDATA_H -#include +#include NUT_BEGIN_NAMESPACE diff --git a/src/nut/phrases/phraselist.h b/src/nut/phrases/phraselist.h index 42620fc..5c02818 100644 --- a/src/nut/phrases/phraselist.h +++ b/src/nut/phrases/phraselist.h @@ -21,7 +21,7 @@ #ifndef PHRASELIST_H #define PHRASELIST_H -#include +#include #include NUT_BEGIN_NAMESPACE diff --git a/src/nut/phrases/phrases.pri b/src/nut/phrases/phrases.pri new file mode 100644 index 0000000..33c0c1b --- /dev/null +++ b/src/nut/phrases/phrases.pri @@ -0,0 +1,27 @@ +INCLUDEPATH += $$PWD + +HEADERS += \ + $$PWD/abstractfieldphrase.h \ + $$PWD/assignmentphrase.h \ + $$PWD/assignmentphraselist.h \ + $$PWD/conditionalphrase.h \ + $$PWD/fieldphrase.h \ + $$PWD/phrasedata.h \ + $$PWD/phrasedatalist.h \ + $$PWD/phraselist.h \ + $$PWD/fieldphrase_date.h \ + $$PWD/fieldphrase_bool.h \ + $$PWD/fieldphrase_qstring.h + +SOURCES += \ + $$PWD/abstractfieldphrase.cpp \ + $$PWD/assignmentphrase.cpp \ + $$PWD/assignmentphraselist.cpp \ + $$PWD/conditionalphrase.cpp \ + $$PWD/fieldphrase.cpp \ + $$PWD/phrasedata.cpp \ + $$PWD/phrasedatalist.cpp \ + $$PWD/phraselist.cpp \ + $$PWD/fieldphrase_date.cpp \ + $$PWD/fieldphrase_bool.cpp \ + $$PWD/fieldphrase_qstring.cpp diff --git a/src/nut/serializableobject.cpp b/src/nut/serializableobject.cpp deleted file mode 100644 index 0a09db5..0000000 --- a/src/nut/serializableobject.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "serializableobject.h" - diff --git a/src/nut/serializableobject.h b/src/nut/serializableobject.h deleted file mode 100644 index d234359..0000000 --- a/src/nut/serializableobject.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef SERIALIZABLEOBJECT_H -#define SERIALIZABLEOBJECT_H - -#include - -class SerializableObject -{ -public: - SerializableObject() = default; - - virtual void load(const QVariant &value) = 0; - virtual QVariant save() = 0; -}; - -#endif // SERIALIZABLEOBJECT_H diff --git a/src/nut/tuple.cpp b/src/nut/tuple.cpp deleted file mode 100644 index c87288d..0000000 --- a/src/nut/tuple.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "tuple.h" - diff --git a/src/nut/tuple.h b/src/nut/tuple.h deleted file mode 100644 index e3131fa..0000000 --- a/src/nut/tuple.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef TUPLE_H -#define TUPLE_H - -#include - -//class AbstractTuple -//{ -// Q_GADGET -//}; - -//template -//class Tuple -//{ -//public: -// T _1; -//}; - -#endif // TUPLE_H diff --git a/src/nut/types/dbgeography.h b/src/nut/types/dbgeography.h index 18b1770..f3a4747 100644 --- a/src/nut/types/dbgeography.h +++ b/src/nut/types/dbgeography.h @@ -25,7 +25,7 @@ #include #include -#include +#include NUT_BEGIN_NAMESPACE diff --git a/src/nut/types/types.pri b/src/nut/types/types.pri new file mode 100644 index 0000000..23679fa --- /dev/null +++ b/src/nut/types/types.pri @@ -0,0 +1,7 @@ + INCLUDEPATH += $$PWD + +HEADERS += \ + $$PWD/dbgeography.h + +SOURCES += \ + $$PWD/dbgeography.cpp diff --git a/sync.profile b/sync.profile index 384554f..99aea03 100644 --- a/sync.profile +++ b/sync.profile @@ -2,4 +2,4 @@ "QtNut" => "$basedir/src/nut", ); -$publicclassregexp = "^QtJsonSerializer::(?!__private::|MetaWriters::Implementations::|TypeExtractors::|Exception).+"; +$publicclassregexp = ".+"; From 54d78c3b609ea5d852dd0a7102629e732ac68201 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Wed, 12 Aug 2020 18:34:59 +0430 Subject: [PATCH 10/13] add NutGlobal header --- sync.profile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sync.profile b/sync.profile index 99aea03..0d98858 100644 --- a/sync.profile +++ b/sync.profile @@ -1,5 +1,7 @@ %modules = ( "QtNut" => "$basedir/src/nut", ); - +%classnames = ( + "nut_global.h" => "NutGlobal" +); $publicclassregexp = ".+"; From ca9fa939a433a9ab34631190bc16b39a4e24696a Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Wed, 12 Aug 2020 19:02:32 +0430 Subject: [PATCH 11/13] update doc --- doc/sharedpointer.md | 32 ++++++------- src/nut/config/nut_namespace.h | 87 ++++++++++++++++++---------------- 2 files changed, 62 insertions(+), 57 deletions(-) diff --git a/doc/sharedpointer.md b/doc/sharedpointer.md index 2287e27..0b27ae8 100644 --- a/doc/sharedpointer.md +++ b/doc/sharedpointer.md @@ -4,23 +4,23 @@ In *shared pointer* mode results of queries is QList> and in * Almost in every case shared pointer mode is better, But nut support regular mode for backward comptability. -To compiling in *shared pointer* define **NUT_SHARED_POINTER** macro +By default _Nut_ compiles in shared pointer mode, to switch to ols raw pointer mode you must define **NUT_RAW_POINTER** macro Nut has template alias ```cpp -#ifdef NUT_SHARED_POINTER - template - using RowList = QList>; - - template - using Row = QSharedPointer; -#else +#ifdef NUT_RAW_POINTER template using RowList = QList; template using Row = T*; +#else + template + using RowList = QList>; + + template + using Row = QSharedPointer; #endif ``` @@ -36,16 +36,16 @@ For the integration of your source, you can use these aliases. Ans also Nut::create() method are defined for two mode ```cpp -#ifdef NUT_SHARED_POINTER - template - inline Row create(QObject *parent) { - return QSharedPointer(new T(parent)); - } -#else +#ifdef NUT_RAW_POINTER template inline Row create() { return new T; } +#else + template + inline Row create(QObject *parent) { + return QSharedPointer(new T(parent)); + } #endif ``` @@ -54,6 +54,6 @@ So you can use the Nut::create function without considering in what way the libr auto post = Nut::create(); ``` -In above example if *NUT_SHARED_POINTER* is defined *post* is *QSharedPointer* else is *Post\** +In above example if *NUT_RAW_POINTER* is defined *post* is *Post\** else is *QSharedPointer* -I recommand use *NUT_SHARED_POINTER* always! +I recommand use shared pointer mode (default) always! diff --git a/src/nut/config/nut_namespace.h b/src/nut/config/nut_namespace.h index b87c38d..a64fc87 100644 --- a/src/nut/config/nut_namespace.h +++ b/src/nut/config/nut_namespace.h @@ -1,7 +1,12 @@ #ifndef NUT_NAMESPACE_H #define NUT_NAMESPACE_H -#include +#ifndef NUT_GLOBAL_H +# error "Do not include nut_namespace.h header directly!" +#endif + +//avoid ide warnings +#include #include #include @@ -79,57 +84,57 @@ inline bool nutClassInfoInt(const QMetaClassInfo &classInfo, } #ifdef NUT_RAW_POINTER -template -using RowList = QList; + template + using RowList = QList; -template -using RowSet = QSet; + template + using RowSet = QSet; -template -using Row = T*; + template + using Row = T*; -template -inline Row create() { - return new T; -} + template + inline Row create() { + return new T; + } -template -inline T *get(const Row row) { - return row; -} + template + inline T *get(const Row row) { + return row; + } -template -inline T *get(const QSharedPointer row) { - return row.data(); -} + template + inline T *get(const QSharedPointer row) { + return row.data(); + } #else -template -using RowList = QList>; + template + using RowList = QList>; -template -using RowSet = QSet>; + template + using RowSet = QSet>; -template -using Row = QSharedPointer; + template + using Row = QSharedPointer; -template -inline Row create() { - return QSharedPointer(new T); -} + template + inline Row create() { + return QSharedPointer(new T); + } -template -inline Row create(QObject *parent) { - return QSharedPointer(new T(parent)); -} + template + inline Row create(QObject *parent) { + return QSharedPointer(new T(parent)); + } -template -inline Row createFrom(T *row) { - return QSharedPointer(row); -} -template -inline Row createFrom(const QSharedPointer row) { - return row; -} + template + inline Row createFrom(T *row) { + return QSharedPointer(row); + } + template + inline Row createFrom(const QSharedPointer row) { + return row; + } #endif NUT_END_NAMESPACE From d3ac69d499b7f4880e1230442383e69e27fe8095 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Thu, 13 Aug 2020 20:37:32 +0430 Subject: [PATCH 12/13] move constructor for database --- src/nut/core/database.cpp | 14 ++++++++++---- src/nut/core/database_p.h | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/nut/core/database.cpp b/src/nut/core/database.cpp index 9eced3d..f29ff5e 100644 --- a/src/nut/core/database.cpp +++ b/src/nut/core/database.cpp @@ -350,7 +350,9 @@ bool DatabasePrivate::putModelToDatabase() void DatabasePrivate::createChangeLogs() { // currentModel.model("change_log") - QStringList diff = sqlGenerator->diff(nullptr, currentModel.tableByName(QStringLiteral("__change_log"))); + QStringList diff = sqlGenerator->diff(nullptr, + currentModel.tableByName( + QStringLiteral("__change_log"))); foreach (QString s, diff) db.exec(s); @@ -364,7 +366,6 @@ void DatabasePrivate::createChangeLogs() Database::Database(QObject *parent) : QObject(parent), d_ptr(new DatabasePrivate(this)) { -// _d = new QSharedDataPointer(new DatabasePrivate(this)); DatabasePrivate::lastId++; } @@ -372,7 +373,6 @@ Database::Database(const Database &other) : QObject(other.parent()), d_ptr(new DatabasePrivate(this)) { DatabasePrivate::lastId++; -// _d = other._d; setDriver(other.driver()); setHostName(other.hostName()); @@ -387,7 +387,7 @@ Database::Database(const QSqlDatabase &other) //TODO: make a polish here DatabasePrivate::lastId++; -// setDriver(other.driver()); + setDriver(other.driverName()); setHostName(other.hostName()); setPort(other.port()); setDatabaseName(other.databaseName()); @@ -396,6 +396,12 @@ Database::Database(const QSqlDatabase &other) qRegisterMetaType(); } +Database::Database(Database &&other) +{ + d_ptr = other.d_ptr; + other.d_ptr = nullptr; +} + Database::~Database() { Q_D(Database); diff --git a/src/nut/core/database_p.h b/src/nut/core/database_p.h index c401b6a..394825b 100644 --- a/src/nut/core/database_p.h +++ b/src/nut/core/database_p.h @@ -30,7 +30,7 @@ NUT_BEGIN_NAMESPACE class ChangeLogTable; -class NUT_EXPORT DatabasePrivate //: public QSharedData +class NUT_EXPORT DatabasePrivate { Database *q_ptr; Q_DECLARE_PUBLIC(Database) From cfe00e73d3c2390546ee4e8695492bdea5b46172 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Fri, 14 Aug 2020 17:43:28 +0430 Subject: [PATCH 13/13] movable database --- src/nut/core/database.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/nut/core/database.h b/src/nut/core/database.h index 9b3ac31..4e9cadb 100644 --- a/src/nut/core/database.h +++ b/src/nut/core/database.h @@ -48,6 +48,7 @@ public: explicit Database(QObject *parent = nullptr); explicit Database(const Database &other); explicit Database(const QSqlDatabase &other); + explicit Database(Database &&other); ~Database(); bool open();