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/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..a64fc87 --- /dev/null +++ b/src/nut/config/nut_namespace.h @@ -0,0 +1,142 @@ +#ifndef NUT_NAMESPACE_H +#define NUT_NAMESPACE_H + +#ifndef NUT_GLOBAL_H +# error "Do not include nut_namespace.h header directly!" +#endif + +//avoid ide warnings +#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 98% rename from src/nut/bulkinserter.cpp rename to src/nut/core/bulkinserter.cpp index 1864294..059bb87 100644 --- a/src/nut/bulkinserter.cpp +++ b/src/nut/core/bulkinserter.cpp @@ -5,7 +5,6 @@ #include "database.h" #include "abstractsqlgenerator.h" #include "databasemodel.h" -#include "tablemodel.h" #include 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 97% rename from src/nut/database.cpp rename to src/nut/core/database.cpp index a7c8b22..c34ac05 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" @@ -348,7 +348,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); @@ -362,7 +364,6 @@ void DatabasePrivate::createChangeLogs() Database::Database(QObject *parent) : QObject(parent), d_ptr(new DatabasePrivate(this)) { -// _d = new QSharedDataPointer(new DatabasePrivate(this)); DatabasePrivate::lastId++; } @@ -370,7 +371,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()); @@ -385,7 +385,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()); @@ -394,6 +394,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/database.h b/src/nut/core/database.h similarity index 97% rename from src/nut/database.h rename to src/nut/core/database.h index c88c9d6..4e9cadb 100644 --- a/src/nut/database.h +++ b/src/nut/core/database.h @@ -26,7 +26,7 @@ #include #include -#include +#include #include NUT_BEGIN_NAMESPACE @@ -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(); diff --git a/src/nut/database_p.h b/src/nut/core/database_p.h similarity index 97% rename from src/nut/database_p.h rename to src/nut/core/database_p.h index c401b6a..394825b 100644 --- a/src/nut/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) 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/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/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 0b4bdeb..1b83798 100644 --- a/src/nut/nut.pro +++ b/src/nut/nut.pro @@ -9,75 +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/datephrase.h \ - $$PWD/table_p.h \ - bulkinserter_p.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/datephrase.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 30fb6df..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 @@ -30,44 +31,8 @@ #include #include #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 +#include +#include +#include #endif // PHRASE_H 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..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 @@ -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/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.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/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/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..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 @@ -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..eb7277c --- /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..754d971 --- /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..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 @@ -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/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 99aea03..0d98858 100644 --- a/sync.profile +++ b/sync.profile @@ -1,5 +1,7 @@ %modules = ( "QtNut" => "$basedir/src/nut", ); - +%classnames = ( + "nut_global.h" => "NutGlobal" +); $publicclassregexp = ".+"; 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()