merge sub projects

This commit is contained in:
Hamed Masafi 2020-08-15 12:32:08 +04:30
commit abf8d246b8
67 changed files with 560 additions and 553 deletions

View File

@ -4,23 +4,23 @@ In *shared pointer* mode results of queries is QList<QSharedPointer<T>> and in *
Almost in every case shared pointer mode is better, But nut support regular mode for backward comptability. 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 Nut has template alias
```cpp ```cpp
#ifdef NUT_SHARED_POINTER #ifdef NUT_RAW_POINTER
template <typename T>
using RowList = QList<QSharedPointer<T>>;
template <typename T>
using Row = QSharedPointer<T>;
#else
template <typename T> template <typename T>
using RowList = QList<T*>; using RowList = QList<T*>;
template <typename T> template <typename T>
using Row = T*; using Row = T*;
#else
template <typename T>
using RowList = QList<QSharedPointer<T>>;
template <typename T>
using Row = QSharedPointer<T>;
#endif #endif
``` ```
@ -36,16 +36,16 @@ For the integration of your source, you can use these aliases.
Ans also Nut::create<T>() method are defined for two mode Ans also Nut::create<T>() method are defined for two mode
```cpp ```cpp
#ifdef NUT_SHARED_POINTER #ifdef NUT_RAW_POINTER
template<class T>
inline Row<T> create(QObject *parent) {
return QSharedPointer<T>(new T(parent));
}
#else
template<class T> template<class T>
inline Row<T> create() { inline Row<T> create() {
return new T; return new T;
} }
#else
template<class T>
inline Row<T> create(QObject *parent) {
return QSharedPointer<T>(new T(parent));
}
#endif #endif
``` ```
@ -54,6 +54,6 @@ So you can use the Nut::create function without considering in what way the libr
auto post = Nut::create<Post>(); auto post = Nut::create<Post>();
``` ```
In above example if *NUT_SHARED_POINTER* is defined *post* is *QSharedPointer<Post>* else is *Post\** In above example if *NUT_RAW_POINTER* is defined *post* is *Post\** else is *QSharedPointer<Post>*
I recommand use *NUT_SHARED_POINTER* always! I recommand use shared pointer mode (default) always!

View File

@ -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

View File

@ -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

View File

@ -18,8 +18,8 @@
** **
**************************************************************************/ **************************************************************************/
#ifndef DEFINES_P_H #ifndef NUT_CONSTS_H
#define DEFINES_P_H #define NUT_CONSTS_H
#define __NAME "name" #define __NAME "name"
#define __TYPE "type" #define __TYPE "type"
@ -56,4 +56,4 @@
# define NUT_WRAP_NAMESPACE(x) x # define NUT_WRAP_NAMESPACE(x) x
#endif #endif
#endif // DEFINES_P_H #endif // NUT_CONSTS_H

View File

@ -0,0 +1,12 @@
#ifndef NUT_GLOBAL_H
#define NUT_GLOBAL_H
#define NUT_NAMESPACE Nut
#include <QtNut/nut_config.h>
#include <QtNut/nut_consts.h>
#include <QtNut/nut_macros.h>
#include <QtNut/nut_macros.h>
#include <QtNut/nut_namespace.h>
#endif // NUT_GLOBAL_H

View File

@ -1,51 +1,6 @@
/************************************************************************** #ifndef NUT_MACROS_H
** #define NUT_MACROS_H
** 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 <http://www.gnu.org/licenses/>.
**
**************************************************************************/
#ifndef SYNTAX_DEFINES_H
#define SYNTAX_DEFINES_H
#define NUT_NAMESPACE Nut
#include <QtNut/defines_consts.h>
#include <QtCore/QtGlobal>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QVariant>
#include <QtCore/QMetaClassInfo>
#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) \ #define NUT_INFO(type, name, value) \
Q_CLASSINFO(__nut_NAME_PERFIX 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_NOT_NULL(x) NUT_INFO(__nut_NOT_NULL, x, 1)
#define NUT_INDEX(name, field, order) #define NUT_INDEX(name, field, order)
NUT_BEGIN_NAMESPACE #endif // NUT_MACROS_H
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 <class T>
using RowList = QList<QSharedPointer<T>>;
template <class T>
using RowSet = QSet<QSharedPointer<T>>;
template <typename T>
using Row = QSharedPointer<T>;
template<class T>
inline Row<T> create() {
return QSharedPointer<T>(new T);
}
template<class T>
inline Row<T> create(QObject *parent) {
return QSharedPointer<T>(new T(parent));
}
template<class T>
inline Row<T> createFrom(T *row) {
return QSharedPointer<T>(row);
}
template<class T>
inline Row<T> createFrom(const QSharedPointer<T> row) {
return row;
}
#else
template <typename T>
using RowList = QList<T*>;
template <typename T>
using RowSet = QSet<T*>;
template <typename T>
using Row = T*;
template<class T>
inline Row<T> create() {
return new T;
}
template<class T>
inline T *get(const Row<T> row) {
return row;
}
template<class T>
inline T *get(const QSharedPointer<T> row) {
return row.data();
}
#endif
NUT_END_NAMESPACE
#endif // SYNTAX_DEFINES_H

View File

@ -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 <QtNut/nut_global.h>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QVariant>
#include <QtCore/QMetaClassInfo>
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 <typename T>
using RowList = QList<T*>;
template <typename T>
using RowSet = QSet<T*>;
template <typename T>
using Row = T*;
template<class T>
inline Row<T> create() {
return new T;
}
template<class T>
inline T *get(const Row<T> row) {
return row;
}
template<class T>
inline T *get(const QSharedPointer<T> row) {
return row.data();
}
#else
template <class T>
using RowList = QList<QSharedPointer<T>>;
template <class T>
using RowSet = QSet<QSharedPointer<T>>;
template <typename T>
using Row = QSharedPointer<T>;
template<class T>
inline Row<T> create() {
return QSharedPointer<T>(new T);
}
template<class T>
inline Row<T> create(QObject *parent) {
return QSharedPointer<T>(new T(parent));
}
template<class T>
inline Row<T> createFrom(T *row) {
return QSharedPointer<T>(row);
}
template<class T>
inline Row<T> createFrom(const QSharedPointer<T> row) {
return row;
}
#endif
NUT_END_NAMESPACE
#endif // NUT_NAMESPACE_H

View File

@ -63,10 +63,10 @@ int AbstractTableSet::save(Database *db, bool cleanUp)
|| t->status() == Table::Deleted) { || t->status() == Table::Deleted) {
rowsAffected += t->save(db); rowsAffected += t->save(db);
if (cleanUp) if (cleanUp)
#ifdef NUT_SHARED_POINTER #ifdef NUT_RAW_POINTER
remove(t);
#else
t->deleteLater(); t->deleteLater();
#else
remove(t);
#endif #endif
} }
} }
@ -79,7 +79,7 @@ int AbstractTableSet::save(Database *db, bool cleanUp)
void AbstractTableSet::clearChilds() void AbstractTableSet::clearChilds()
{ {
#ifndef NUT_SHARED_POINTER #ifdef NUT_RAW_POINTER
foreach (Table *t, data->childs) foreach (Table *t, data->childs)
t->deleteLater(); t->deleteLater();
#endif #endif

View File

@ -26,7 +26,7 @@
#include <QtCore/QSet> #include <QtCore/QSet>
#include <QtCore/QExplicitlySharedDataPointer> #include <QtCore/QExplicitlySharedDataPointer>
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE

View File

@ -23,7 +23,7 @@
#include <QtCore/QSharedData> #include <QtCore/QSharedData>
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE

View File

@ -5,7 +5,6 @@
#include "database.h" #include "database.h"
#include "abstractsqlgenerator.h" #include "abstractsqlgenerator.h"
#include "databasemodel.h" #include "databasemodel.h"
#include "tablemodel.h"
#include <QtCore/QDebug> #include <QtCore/QDebug>

View File

@ -6,7 +6,7 @@
#include <QtNut/phraselist.h> #include <QtNut/phraselist.h>
#include <QtNut/fieldphrase.h> #include <QtNut/fieldphrase.h>
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE

25
src/nut/core/core.pri Normal file
View File

@ -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

View File

@ -33,7 +33,7 @@
#include "table.h" #include "table.h"
#include "tableset.h" #include "tableset.h"
#include "database_p.h" #include "database_p.h"
#include "defines.h" #include "config/nut_global.h"
#include "tablemodel.h" #include "tablemodel.h"
#include "postgresqlgenerator.h" #include "postgresqlgenerator.h"
#include "mysqlgenerator.h" #include "mysqlgenerator.h"
@ -348,7 +348,9 @@ bool DatabasePrivate::putModelToDatabase()
void DatabasePrivate::createChangeLogs() void DatabasePrivate::createChangeLogs()
{ {
// currentModel.model("change_log") // 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) foreach (QString s, diff)
db.exec(s); db.exec(s);
@ -362,7 +364,6 @@ void DatabasePrivate::createChangeLogs()
Database::Database(QObject *parent) Database::Database(QObject *parent)
: QObject(parent), d_ptr(new DatabasePrivate(this)) : QObject(parent), d_ptr(new DatabasePrivate(this))
{ {
// _d = new QSharedDataPointer<DatabasePrivate>(new DatabasePrivate(this));
DatabasePrivate::lastId++; DatabasePrivate::lastId++;
} }
@ -370,7 +371,6 @@ Database::Database(const Database &other)
: QObject(other.parent()), d_ptr(new DatabasePrivate(this)) : QObject(other.parent()), d_ptr(new DatabasePrivate(this))
{ {
DatabasePrivate::lastId++; DatabasePrivate::lastId++;
// _d = other._d;
setDriver(other.driver()); setDriver(other.driver());
setHostName(other.hostName()); setHostName(other.hostName());
@ -385,7 +385,7 @@ Database::Database(const QSqlDatabase &other)
//TODO: make a polish here //TODO: make a polish here
DatabasePrivate::lastId++; DatabasePrivate::lastId++;
// setDriver(other.driver()); setDriver(other.driverName());
setHostName(other.hostName()); setHostName(other.hostName());
setPort(other.port()); setPort(other.port());
setDatabaseName(other.databaseName()); setDatabaseName(other.databaseName());
@ -394,6 +394,12 @@ Database::Database(const QSqlDatabase &other)
qRegisterMetaType<ChangeLogTable*>(); qRegisterMetaType<ChangeLogTable*>();
} }
Database::Database(Database &&other)
{
d_ptr = other.d_ptr;
other.d_ptr = nullptr;
}
Database::~Database() Database::~Database()
{ {
Q_D(Database); Q_D(Database);

View File

@ -26,7 +26,7 @@
#include <QtCore/QSharedDataPointer> #include <QtCore/QSharedDataPointer>
#include <QtSql/QSqlDatabase> #include <QtSql/QSqlDatabase>
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
#include <QtNut/tableset.h> #include <QtNut/tableset.h>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE
@ -48,6 +48,7 @@ public:
explicit Database(QObject *parent = nullptr); explicit Database(QObject *parent = nullptr);
explicit Database(const Database &other); explicit Database(const Database &other);
explicit Database(const QSqlDatabase &other); explicit Database(const QSqlDatabase &other);
explicit Database(Database &&other);
~Database(); ~Database();
bool open(); bool open();

View File

@ -30,7 +30,7 @@
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE
class ChangeLogTable; class ChangeLogTable;
class NUT_EXPORT DatabasePrivate //: public QSharedData class NUT_EXPORT DatabasePrivate
{ {
Database *q_ptr; Database *q_ptr;
Q_DECLARE_PUBLIC(Database) Q_DECLARE_PUBLIC(Database)

View File

@ -31,7 +31,7 @@
#include <QtSql/QSqlQueryModel> #include <QtSql/QSqlQueryModel>
#include <QtSql/QSqlQuery> #include <QtSql/QSqlQuery>
#ifdef NUT_SHARED_POINTER #ifndef NUT_RAW_POINTER
#include <QtCore/QSharedPointer> #include <QtCore/QSharedPointer>
#endif #endif
@ -351,10 +351,10 @@ Q_OUTOFLINE_TEMPLATE RowList<T> Query<T>::toList(int count)
Row<Table> row; Row<Table> row;
if (data.table->className() == d->className) { if (data.table->className() == d->className) {
row = Nut::create<T>(); row = Nut::create<T>();
#ifdef NUT_SHARED_POINTER #ifdef NUT_RAW_POINTER
returnList.append(row.objectCast<T>());
#else
returnList.append(dynamic_cast<T*>(table)); returnList.append(dynamic_cast<T*>(table));
#else
returnList.append(row.objectCast<T>());
#endif #endif
d->tableSet->add(row); d->tableSet->add(row);

View File

@ -43,6 +43,10 @@ NUT_BEGIN_NAMESPACE
* This should be fixed to v1.2 * This should be fixed to v1.2
*/ */
/*!
* \class Table
* \brief Base class for all tables
*/
Table::Table(QObject *parent) : QObject(parent), Table::Table(QObject *parent) : QObject(parent),
d(new TablePrivate) d(new TablePrivate)
{ } { }

View File

@ -25,7 +25,7 @@
#include <QtCore/qglobal.h> #include <QtCore/qglobal.h>
#include <QtCore/QSet> #include <QtCore/QSet>
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
#include <QtNut/tablemodel.h> #include <QtNut/tablemodel.h>
#include <QtNut/phrase.h> #include <QtNut/phrase.h>

View File

@ -4,7 +4,8 @@
#include <QtCore/QSet> #include <QtCore/QSet>
#include <QtCore/QSharedData> #include <QtCore/QSharedData>
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
#include <QtNut/table.h>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE

View File

@ -100,10 +100,10 @@ Q_OUTOFLINE_TEMPLATE int TableSet<T>::length() const
template<class T> template<class T>
Q_OUTOFLINE_TEMPLATE Row<T> TableSet<T>::at(int i) const Q_OUTOFLINE_TEMPLATE Row<T> TableSet<T>::at(int i) const
{ {
#ifdef NUT_SHARED_POINTER #ifdef NUT_RAW_POINTER
return data->childs.at(i).template objectCast<T>();
#else
return reinterpret_cast<T*>(data->childs.at(i)); return reinterpret_cast<T*>(data->childs.at(i));
#else
return data->childs.at(i).template objectCast<T>();
#endif #endif
} }

View File

@ -616,10 +616,10 @@ QString AbstractSqlGenerator::selectCommand(const QString &tableName,
QString sql = QStringLiteral("SELECT ") + selectText QString sql = QStringLiteral("SELECT ") + selectText
+ QStringLiteral(" FROM ") + fromText; + QStringLiteral(" FROM ") + fromText;
if (whereText != QStringLiteral("")) if (!whereText.isEmpty())
sql.append(QStringLiteral(" WHERE ") + whereText); sql.append(QStringLiteral(" WHERE ") + whereText);
if (orderText != QStringLiteral("")) if (!orderText.isEmpty())
sql.append(QStringLiteral(" ORDER BY ") + orderText); sql.append(QStringLiteral(" ORDER BY ") + orderText);
// for (int i = 0; i < _database->model().count(); i++) // for (int i = 0; i < _database->model().count(); i++)
@ -648,7 +648,7 @@ QString AbstractSqlGenerator::selectCommand(const QString &tableName,
QString sql = QStringLiteral("SELECT ") + selectText QString sql = QStringLiteral("SELECT ") + selectText
+ QStringLiteral(" FROM ") + fromText; + QStringLiteral(" FROM ") + fromText;
if (whereText != QStringLiteral("")) if (!whereText.isEmpty())
sql.append(QStringLiteral(" WHERE ") + whereText); sql.append(QStringLiteral(" WHERE ") + whereText);
for (int i = 0; i < _database->model().count(); i++) for (int i = 0; i < _database->model().count(); i++)

View File

@ -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

View File

@ -25,7 +25,7 @@
#include <QtCore/QMap> #include <QtCore/QMap>
#include <QtCore/QString> #include <QtCore/QString>
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
class QJsonObject; class QJsonObject;

14
src/nut/models/models.pri Normal file
View File

@ -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

View File

@ -25,7 +25,7 @@
#include <QtCore/QExplicitlySharedDataPointer> #include <QtCore/QExplicitlySharedDataPointer>
#include <QtCore/QList> #include <QtCore/QList>
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE
@ -55,7 +55,7 @@ public:
void append(Row<Table> table); void append(Row<Table> table);
// void append(Table *table); // void append(Table *table);
QVariant headerData(int section, Qt::Orientation orientation, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const;
Row<Nut::Table> at(const int &i) const; Row<Table> at(const int &i) const;
void setRenderer(const std::function<QVariant (int, QVariant)> &renderer); void setRenderer(const std::function<QVariant (int, QVariant)> &renderer);

View File

@ -6,7 +6,7 @@
#include <functional> #include <functional>
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE

View File

@ -25,7 +25,7 @@
#include <QtCore/QJsonObject> #include <QtCore/QJsonObject>
#include "tablemodel.h" #include "tablemodel.h"
#include "defines.h" #include "nut_global.h"
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE

View File

@ -24,7 +24,7 @@
#include <QtCore/QVariant> #include <QtCore/QVariant>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
class QJsonObject; class QJsonObject;

View File

@ -10,7 +10,7 @@ HEADERS += \
$$PWD/types/dbgeography.h \ $$PWD/types/dbgeography.h \
$$PWD/tableset.h \ $$PWD/tableset.h \
$$PWD/defines_consts.h \ $$PWD/defines_consts.h \
$$PWD/defines.h \ $$PWD/nut_global.h \
$$PWD/query.h \ $$PWD/query.h \
$$PWD/databasemodel.h \ $$PWD/databasemodel.h \
$$PWD/changelogtable.h \ $$PWD/changelogtable.h \

View File

@ -9,75 +9,18 @@ DEFINES += QT_DEPRECATED_WARNINGS NUT_SHARED NUT_BUILD_LIB
DEFINES += NUT_SHARED_POINTER DEFINES += NUT_SHARED_POINTER
INCLUDEPATH += \ include(config/config.pri)
$$PWD/generators \ include(core/core.pri)
$$PWD/phrases \ include(generators/generators.pri)
$$PWD/types include(types/types.pri)
include(phrases/phrases.pri)
include(models/models.pri)
HEADERS += \ HEADERS += \
$$PWD/generators/abstractsqlgenerator.h \ $$PWD/phrase.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
SOURCES += \ SOURCES += \
$$PWD/generators/abstractsqlgenerator.cpp \ $$PWD/phrase.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
load(qt_module) load(qt_module)

View File

@ -19,47 +19,3 @@
**************************************************************************/ **************************************************************************/
#include "phrase.h" #include "phrase.h"
#include <QtCore/QDebug>
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

View File

@ -21,6 +21,7 @@
#ifndef PHRASE_H #ifndef PHRASE_H
#define PHRASE_H #define PHRASE_H
#include <QtNut/nut_global.h>
#include <QtNut/conditionalphrase.h> #include <QtNut/conditionalphrase.h>
#include <QtNut/abstractfieldphrase.h> #include <QtNut/abstractfieldphrase.h>
#include <QtNut/fieldphrase.h> #include <QtNut/fieldphrase.h>
@ -30,44 +31,8 @@
#include <QtNut/phrasedata.h> #include <QtNut/phrasedata.h>
#include <QtNut/assignmentphrase.h> #include <QtNut/assignmentphrase.h>
#include <QtNut/numericphrase.h> #include <QtNut/numericphrase.h>
#include <QtNut/datephrase.h> #include <QtNut/fieldphrase_date.h>
#include <QtNut/fieldphrase_qstring.h>
NUT_BEGIN_NAMESPACE #include <QtNut/fieldphrase_bool.h>
#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<typename T>
//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 #endif // PHRASE_H

View File

@ -19,6 +19,7 @@
**************************************************************************/ **************************************************************************/
#include "abstractfieldphrase.h" #include "abstractfieldphrase.h"
#include <QDebug>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE
@ -34,23 +35,27 @@ AbstractFieldPhrase::AbstractFieldPhrase(const char *className,
AbstractFieldPhrase::AbstractFieldPhrase(const AbstractFieldPhrase &other) AbstractFieldPhrase::AbstractFieldPhrase(const AbstractFieldPhrase &other)
{ {
data = other.data; data = other.data;
data->parents++; data->ref.ref();
} }
AbstractFieldPhrase::AbstractFieldPhrase(AbstractFieldPhrase &&other) AbstractFieldPhrase::AbstractFieldPhrase(AbstractFieldPhrase &&other)
{ {
data = other.data; data = other.data;
data->parents++;
other.data = nullptr; other.data = nullptr;
} }
AbstractFieldPhrase::~AbstractFieldPhrase() AbstractFieldPhrase::~AbstractFieldPhrase()
{ {
if (data) { if (data) {
--data->parents; if (!data->ref.deref()) {
if (data->parents <= 0) qDebug() << "deleted" << data->className
<< data->fieldName;
delete data; delete data;
} }
else
qDebug() << "more parents for" << data->className
<< data->fieldName;
}
} }
PhraseList AbstractFieldPhrase::operator |(const AbstractFieldPhrase &other) PhraseList AbstractFieldPhrase::operator |(const AbstractFieldPhrase &other)
@ -87,6 +92,14 @@ AssignmentPhrase AbstractFieldPhrase::operator <<(const QVariant &other)
return AssignmentPhrase(this, 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) \ #define AbstractFieldPhraseOperatorVariant(class, op, cond) \
ConditionalPhrase class::operator op(const QVariant &other) \ ConditionalPhrase class::operator op(const QVariant &other) \
{ \ { \

View File

@ -21,7 +21,7 @@
#ifndef ABSTRACTFIELDPHRASE_H #ifndef ABSTRACTFIELDPHRASE_H
#define ABSTRACTFIELDPHRASE_H #define ABSTRACTFIELDPHRASE_H
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
#include <QtNut/assignmentphrase.h> #include <QtNut/assignmentphrase.h>
#include <QtNut/conditionalphrase.h> #include <QtNut/conditionalphrase.h>
#include <QtNut/phraselist.h> #include <QtNut/phraselist.h>
@ -80,6 +80,9 @@ public:
AssignmentPhrase operator =(const QVariant &other); AssignmentPhrase operator =(const QVariant &other);
AssignmentPhrase operator =(const ConditionalPhrase &other); AssignmentPhrase operator =(const ConditionalPhrase &other);
AssignmentPhrase operator <<(const QVariant &other); AssignmentPhrase operator <<(const QVariant &other);
protected:
void detach();
}; };
NUT_END_NAMESPACE NUT_END_NAMESPACE

View File

@ -26,7 +26,7 @@ NUT_BEGIN_NAMESPACE
AssignmentPhrase::AssignmentPhrase(PhraseData *d) : data(d) AssignmentPhrase::AssignmentPhrase(PhraseData *d) : data(d)
{ {
d->parents++; d->ref.ref();
} }
AssignmentPhrase::AssignmentPhrase(AbstractFieldPhrase *l, const QVariant r) AssignmentPhrase::AssignmentPhrase(AbstractFieldPhrase *l, const QVariant r)
@ -56,8 +56,7 @@ AssignmentPhrase::AssignmentPhrase(AssignmentPhrase *ph, const QVariant &v)
AssignmentPhrase::~AssignmentPhrase() AssignmentPhrase::~AssignmentPhrase()
{ {
if (data) if (data && data->ref.deref())
if (!--data->parents)
delete data; delete data;
} }

View File

@ -21,7 +21,7 @@
#ifndef ASSIGNMENTPHRASE_H #ifndef ASSIGNMENTPHRASE_H
#define ASSIGNMENTPHRASE_H #define ASSIGNMENTPHRASE_H
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
#include <QtNut/assignmentphraselist.h> #include <QtNut/assignmentphraselist.h>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE

View File

@ -68,9 +68,9 @@ AssignmentPhraseList AssignmentPhraseList::operator &(const AssignmentPhrase
AssignmentPhraseList::~AssignmentPhraseList() AssignmentPhraseList::~AssignmentPhraseList()
{ {
foreach (PhraseData *d, data) // foreach (PhraseData *d, data)
if (!--d->parents) // if (!d->ref.deref())
delete d; // delete d;
// qDeleteAll(data); // qDeleteAll(data);
// data.clear(); // data.clear();
} }
@ -78,7 +78,7 @@ AssignmentPhraseList::~AssignmentPhraseList()
void AssignmentPhraseList::incAllDataParents() void AssignmentPhraseList::incAllDataParents()
{ {
foreach (PhraseData *d, data) foreach (PhraseData *d, data)
d->parents++; d->ref.ref();
} }

View File

@ -21,7 +21,7 @@
#ifndef ASSIGNMENTPHRASELIST_H #ifndef ASSIGNMENTPHRASELIST_H
#define ASSIGNMENTPHRASELIST_H #define ASSIGNMENTPHRASELIST_H
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE

View File

@ -18,6 +18,8 @@
** **
**************************************************************************/ **************************************************************************/
#include <QDebug>
#include "abstractfieldphrase.h" #include "abstractfieldphrase.h"
#include "conditionalphrase.h" #include "conditionalphrase.h"
#include "phrasedata.h" #include "phrasedata.h"
@ -30,21 +32,21 @@ ConditionalPhrase::ConditionalPhrase() : data(nullptr)
ConditionalPhrase::ConditionalPhrase(const ConditionalPhrase &other) ConditionalPhrase::ConditionalPhrase(const ConditionalPhrase &other)
{ {
data = other.data; data = other.data;
data->parents++; data->ref.ref();
// const_cast<ConditionalPhrase&>(other).data = 0;
} }
#ifdef Q_COMPILER_RVALUE_REFS #ifdef Q_COMPILER_RVALUE_REFS
ConditionalPhrase::ConditionalPhrase(ConditionalPhrase &&other) ConditionalPhrase::ConditionalPhrase(ConditionalPhrase &&other)
{ {
this->data = qMove(other.data); data = other.data;
other.data = nullptr;
} }
#endif #endif
ConditionalPhrase::ConditionalPhrase(const PhraseData *data) ConditionalPhrase::ConditionalPhrase(const PhraseData *data)
{ {
this->data = const_cast<PhraseData*>(data); data = const_cast<PhraseData*>(data);
this->data->parents++; data->ref.ref();
} }
ConditionalPhrase::ConditionalPhrase(AbstractFieldPhrase *l, ConditionalPhrase::ConditionalPhrase(AbstractFieldPhrase *l,
@ -104,16 +106,18 @@ ConditionalPhrase::~ConditionalPhrase()
{ {
if (data) { if (data) {
data->cleanUp(); data->cleanUp();
if (!--data->parents) if (!data->ref.deref()) {
qDebug() << "deleted for cond";
delete data; delete data;
} }
} }
}
ConditionalPhrase &ConditionalPhrase::operator =(const ConditionalPhrase &other) ConditionalPhrase &ConditionalPhrase::operator =(const ConditionalPhrase &other)
{ {
data = other.data; data = other.data;
if (data) if (data)
data->parents++; data->ref.ref();
return *this; return *this;
} }
@ -122,23 +126,6 @@ ConditionalPhrase ConditionalPhrase::operator ==(const QVariant &other)
return ConditionalPhrase(this, PhraseData::Equal, 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<ConditionalPhrase&>(other));
//}
//ConditionalPhrase ConditionalPhrase::operator ||(const ConditionalPhrase &other)
//{
// return ConditionalPhrase(this, PhraseData::Or,
// const_cast<ConditionalPhrase&>(other));
//}
#define DECLARE_CONDITIONALPHRASE_OPERATORS_IMPL(op, cond) \ #define DECLARE_CONDITIONALPHRASE_OPERATORS_IMPL(op, cond) \
ConditionalPhrase operator op(const ConditionalPhrase &l, \ ConditionalPhrase operator op(const ConditionalPhrase &l, \
const ConditionalPhrase &r) \ const ConditionalPhrase &r) \
@ -149,8 +136,8 @@ ConditionalPhrase operator op(const ConditionalPhrase &l, \
p.data->operatorCond = cond; \ p.data->operatorCond = cond; \
p.data->left = l.data; \ p.data->left = l.data; \
p.data->right = r.data; \ p.data->right = r.data; \
l.data->parents++; \ l.data->ref.ref(); \
r.data->parents++; \ r.data->ref.ref(); \
return p; \ return p; \
} \ } \
ConditionalPhrase operator op(const ConditionalPhrase &l, \ ConditionalPhrase operator op(const ConditionalPhrase &l, \
@ -162,8 +149,8 @@ ConditionalPhrase operator op(const ConditionalPhrase &l, \
p.data->operatorCond = cond; \ p.data->operatorCond = cond; \
p.data->left = l.data; \ p.data->left = l.data; \
p.data->right = r.data; \ p.data->right = r.data; \
l.data->parents++; \ l.data->ref.ref(); \
r.data->parents++; \ r.data = nullptr; \
return p; \ return p; \
} \ } \
ConditionalPhrase operator op(ConditionalPhrase &&l, \ ConditionalPhrase operator op(ConditionalPhrase &&l, \
@ -175,8 +162,8 @@ ConditionalPhrase operator op(ConditionalPhrase &&l, \
p.data->operatorCond = cond; \ p.data->operatorCond = cond; \
p.data->left = l.data; \ p.data->left = l.data; \
p.data->right = r.data; \ p.data->right = r.data; \
l.data->parents++; \ r.data->ref.ref(); \
r.data->parents++; \ l.data = nullptr; \
return p; \ return p; \
} \ } \
ConditionalPhrase operator op(ConditionalPhrase &&l, ConditionalPhrase &&r) \ ConditionalPhrase operator op(ConditionalPhrase &&l, ConditionalPhrase &&r) \
@ -187,8 +174,8 @@ ConditionalPhrase operator op(ConditionalPhrase &&l, ConditionalPhrase &&r) \
p.data->operatorCond = cond; \ p.data->operatorCond = cond; \
p.data->left = l.data; \ p.data->left = l.data; \
p.data->right = r.data; \ p.data->right = r.data; \
l.data->parents++; \ l.data = nullptr; \
r.data->parents++; \ r.data = nullptr; \
return p; \ return p; \
} }

View File

@ -21,7 +21,7 @@
#ifndef FIELDPHRASE_H #ifndef FIELDPHRASE_H
#define FIELDPHRASE_H #define FIELDPHRASE_H
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
#include <QtNut/abstractfieldphrase.h> #include <QtNut/abstractfieldphrase.h>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE
@ -50,29 +50,6 @@ Q_OUTOFLINE_TEMPLATE ConditionalPhrase FieldPhrase<T>::operator ==(const QVarian
return ConditionalPhrase(this, PhraseData::Equal, other); return ConditionalPhrase(this, PhraseData::Equal, other);
} }
template<>
class FieldPhrase<QString> : 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 //Date and time
#define CONDITIONAL_VARIANT_METHOD(name, cond) \ #define CONDITIONAL_VARIANT_METHOD(name, cond) \
ConditionalPhrase name(int val) \ ConditionalPhrase name(int val) \
@ -80,31 +57,6 @@ public:
return ConditionalPhrase(this, cond, val); \ return ConditionalPhrase(this, cond, val); \
} }
template<>
class FieldPhrase<bool> : public AbstractFieldPhrase
{
public:
FieldPhrase(const char *className, const char *s) :
AbstractFieldPhrase(className, s)
{}
AssignmentPhrase operator =(const bool &other) {
return AssignmentPhrase(this, other);
}
FieldPhrase<bool> operator !()
{
FieldPhrase<bool> 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 NUT_END_NAMESPACE

View File

@ -0,0 +1,6 @@
#include "fieldphrase_bool.h"
NUT_BEGIN_NAMESPACE
NUT_END_NAMESPACE

View File

@ -0,0 +1,38 @@
#ifndef NUT_FIELDPHRASE_BOOL_H
#define NUT_FIELDPHRASE_BOOL_H
#include <QtNut/nut_global.h>
#include <QtNut/fieldphrase.h>
#include <QtNut/fieldphrase.h>
NUT_BEGIN_NAMESPACE
template<>
class FieldPhrase<bool> : public AbstractFieldPhrase
{
public:
FieldPhrase(const char *className, const char *s) :
AbstractFieldPhrase(className, s)
{}
AssignmentPhrase operator =(const bool &other) {
return AssignmentPhrase(this, other);
}
FieldPhrase<bool> operator !()
{
FieldPhrase<bool> 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

View File

@ -18,7 +18,7 @@
** **
**************************************************************************/ **************************************************************************/
#include "datephrase.h" #include "fieldphrase_date.h"
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE

View File

@ -0,0 +1,2 @@
#include "fieldphrase_qstring.h"

View File

@ -0,0 +1,39 @@
#ifndef NUT_FIELDPHRASE_QSTRING_H
#define NUT_FIELDPHRASE_QSTRING_H
#include <QtNut/nut_global.h>
#include <QtNut/abstractfieldphrase.h>
#include <QtNut/fieldphrase.h>
NUT_BEGIN_NAMESPACE
template<>
class FieldPhrase<QString> : 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

View File

@ -22,52 +22,57 @@
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE
PhraseData::PhraseData() : PhraseData::PhraseData()
className(""), fieldName(""), : className(""), fieldName(""), type(Field), operatorCond(NotAssign),
type(Field), operatorCond(NotAssign), left(nullptr), right(nullptr), operand(QVariant::Invalid), isNot(false),
left(nullptr), right(nullptr), operand(QVariant::Invalid), isNot(false), parents(1) ref(1)
{ } { }
PhraseData::PhraseData(const char *className, const char *fieldName) : PhraseData::PhraseData(const char *className, const char *fieldName)
className(className), fieldName(fieldName), : className(className), fieldName(fieldName), type(Field),
type(Field), operatorCond(NotAssign), operatorCond(NotAssign), left(nullptr), right(nullptr),
left(nullptr), right(nullptr), operand(QVariant::Invalid), isNot(false), parents(1) operand(QVariant::Invalid), isNot(false), ref(1)
{ } { }
PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o) PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o)
: className(nullptr), fieldName(nullptr), : className(nullptr), fieldName(nullptr), type(WithoutOperand),
type(WithoutOperand), operatorCond(o), left(l), right(nullptr), operatorCond(o), left(l), right(nullptr), isNot(false), ref(1)
isNot(false), parents(1)
{ {
l->parents++; l->ref.ref();
} }
PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o, PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o, PhraseData *r)
PhraseData *r) : className(nullptr), fieldName(nullptr), type(WithOther), operatorCond(o),
: className(nullptr), fieldName(nullptr), left(l), right(r), isNot(false), ref(1)
type(WithOther), operatorCond(o),
left(l), right(r),
isNot(false), parents(1)
{ {
l->parents++; l->ref.ref();
r->parents++; r->ref.ref();
} }
PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o, QVariant r) PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o, QVariant r)
: className(nullptr), fieldName(nullptr), : className(nullptr), fieldName(nullptr), type(WithVariant),
type(WithVariant), operatorCond(o), left(l), operatorCond(o), left(l), right(nullptr), operand(r), isNot(false),
right(nullptr), operand(r), isNot(false), parents(1) ref(1)
{ } { }
PhraseData::~PhraseData()
{
// if (left && !left->ref.deref())
// delete left;
// if (right && !right->ref.deref())
// delete right;
}
PhraseData *PhraseData::operator =(PhraseData *other) PhraseData *PhraseData::operator =(PhraseData *other)
{ {
other->parents++; other->ref.ref();
return other; return other;
} }
PhraseData &PhraseData::operator =(PhraseData &other) PhraseData &PhraseData::operator =(PhraseData &other)
{ {
other.parents++; other.ref.ref();
return other; 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) void PhraseData::cleanUp(PhraseData *d)
{ {
if (d->left) if (d->left)

View File

@ -21,7 +21,7 @@
#ifndef PHRASEDATA_H #ifndef PHRASEDATA_H
#define PHRASEDATA_H #define PHRASEDATA_H
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE
@ -97,24 +97,25 @@ public:
QVariant operand; QVariant operand;
bool isNot; bool isNot;
quint16 parents; // quint16 parents;
mutable QAtomicInt ref;
PhraseData(); PhraseData();
PhraseData(const char *className, const char *fieldName); PhraseData(const char *className, const char *fieldName);
PhraseData(PhraseData *l, Condition o); PhraseData(PhraseData *l, Condition o);
PhraseData(PhraseData *l, Condition o, PhraseData *r); PhraseData(PhraseData *l, Condition o, PhraseData *r);
PhraseData(PhraseData *l, Condition o, QVariant 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);
PhraseData &operator =(PhraseData &other); PhraseData &operator =(PhraseData &other);
QString toString() const; QString toString() const;
~PhraseData() = default;
void cleanUp(); void cleanUp();
PhraseData *clone() const;
private: private:
void cleanUp(PhraseData *d); void cleanUp(PhraseData *d);
}; };

View File

@ -37,14 +37,14 @@ PhraseDataList::PhraseDataList(const PhraseDataList &other) : QList<PhraseData*>
void PhraseDataList::append(PhraseData *d) void PhraseDataList::append(PhraseData *d)
{ {
d->parents++; d->ref.ref();
QList<PhraseData*>::append(d); QList<PhraseData*>::append(d);
} }
void PhraseDataList::append(QList<PhraseData *> &dl) void PhraseDataList::append(QList<PhraseData *> &dl)
{ {
foreach (PhraseData *d, dl) foreach (PhraseData *d, dl)
d->parents++; d->ref.ref();
QList<PhraseData*>::append(dl); QList<PhraseData*>::append(dl);
} }
@ -53,7 +53,7 @@ PhraseDataList::~PhraseDataList()
QList<PhraseData*>::iterator i; QList<PhraseData*>::iterator i;
for (i = begin(); i != end(); ++i) { for (i = begin(); i != end(); ++i) {
(*i)->cleanUp(); (*i)->cleanUp();
if (!--(*i)->parents) if (!(*i)->ref.deref())
delete *i; delete *i;
} }
} }

View File

@ -21,7 +21,7 @@
#ifndef PHRASELIST_H #ifndef PHRASELIST_H
#define PHRASELIST_H #define PHRASELIST_H
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
#include <QtNut/phrasedatalist.h> #include <QtNut/phrasedatalist.h>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE

View File

@ -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

View File

@ -1,2 +0,0 @@
#include "serializableobject.h"

View File

@ -1,15 +0,0 @@
#ifndef SERIALIZABLEOBJECT_H
#define SERIALIZABLEOBJECT_H
#include <QtCore/QVariant>
class SerializableObject
{
public:
SerializableObject() = default;
virtual void load(const QVariant &value) = 0;
virtual QVariant save() = 0;
};
#endif // SERIALIZABLEOBJECT_H

View File

@ -1,2 +0,0 @@
#include "tuple.h"

View File

@ -1,18 +0,0 @@
#ifndef TUPLE_H
#define TUPLE_H
#include <QObject>
//class AbstractTuple
//{
// Q_GADGET
//};
//template <typename T>
//class Tuple
//{
//public:
// T _1;
//};
#endif // TUPLE_H

View File

@ -25,7 +25,7 @@
#include <QtCore/qglobal.h> #include <QtCore/qglobal.h>
#include <QtCore/QVariant> #include <QtCore/QVariant>
#include <QtNut/defines.h> #include <QtNut/nut_global.h>
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE

7
src/nut/types/types.pri Normal file
View File

@ -0,0 +1,7 @@
INCLUDEPATH += $$PWD
HEADERS += \
$$PWD/dbgeography.h
SOURCES += \
$$PWD/dbgeography.cpp

View File

@ -1,5 +1,7 @@
%modules = ( %modules = (
"QtNut" => "$basedir/src/nut", "QtNut" => "$basedir/src/nut",
); );
%classnames = (
"nut_global.h" => "NutGlobal"
);
$publicclassregexp = ".+"; $publicclassregexp = ".+";

View File

@ -3,6 +3,7 @@
#include "tst_phrases.h" #include "tst_phrases.h"
#include "phrase.h" #include "phrase.h"
#include "sqlitegenerator.h"
using namespace Nut; using namespace Nut;
@ -16,12 +17,16 @@ void PhrasesTest::initTestCase()
} }
void PhrasesTest::no1() void PhrasesTest::no1()
{
{ {
FieldPhrase<int> id("main", "id"); FieldPhrase<int> id("main", "id");
FieldPhrase<QString> name("main", "name"); FieldPhrase<QString> name("main", "name");
FieldPhrase<QString> last_name("main", "last_name"); FieldPhrase<QString> last_name("main", "last_name");
FieldPhrase<QDate> date("main", "date"); FieldPhrase<QDate> date("main", "date");
auto w = (id == 4 && name == "hi"); auto w = (id == 4 && name == QStringLiteral("hi"));
SqliteGenerator g;
}
} }
void PhrasesTest::numeric() void PhrasesTest::numeric()