diff --git a/.cmake.conf b/.cmake.conf new file mode 100644 index 0000000..5060cd2 --- /dev/null +++ b/.cmake.conf @@ -0,0 +1 @@ +set(QT_REPO_MODULE_VERSION "0.7.0") diff --git a/.github/workflows/qt.yml b/.github/workflows/qt.yml index b579d4b..0c0bf3d 100644 --- a/.github/workflows/qt.yml +++ b/.github/workflows/qt.yml @@ -1,90 +1,158 @@ -name: CI build +name: CI Build -on: [push] +on: + push: + branches-ignore: + - "releases/**" + paths-ignore: + - "**.md" + pull_request: + paths-ignore: + - "**.md" jobs: build: strategy: fail-fast: false matrix: - version: - - 5.15.0 - - platform: - - gcc_64 - - android - - msvc2019 - - msvc2019_64 - - winrt_x64_msvc2019 - - winrt_x86_msvc2019 - - winrt_armv7_msvc2019 - - mingw81_64 - - mingw81_32 - - clang_64 - - ios - + qt_version: [5.12.11, 5.15.2, 6.2.0] + platform: [ubuntu-20.04, windows-latest, macos-latest] include: - - platform: gcc_64 - os: ubuntu-latest - - platform: android - os: ubuntu-latest - - platform: msvc2019_64 - os: windows-latest - - platform: msvc2019 - os: windows-latest - - platform: winrt_x64_msvc2019 - os: windows-latest - - platform: winrt_x86_msvc2019 - os: windows-latest - - platform: winrt_armv7_msvc2019 - os: windows-latest - - platform: mingw81_64 - os: windows-latest - - platform: mingw81_32 - os: windows-latest - - platform: clang_64 - os: macos-latest - - runs-on: ${{matrix.os}} + - qt_version: 6.2.0 + additional_arguments: -D QT_DEFAULT_MAJOR_VERSION=6 + build_cmake: true + - platform: ubuntu-20.04 + make: make + #CXXFLAGS: -Wall -Wextra + MAKEFLAGS: -j2 + - platform: macos-latest + make: make + #CXXFLAGS: -Wall -Wextra + MAKEFLAGS: -j3 + - platform: windows-latest + make: nmake + QMAKE_MSC_VER: 16.11.31911.196 + cmake_params: -D CMAKE_CXX_FLAGS_DEBUG="/g" + - platform: ubuntu-20.04 + tests: [sqlite, posgtresql] + - platform: ubuntu-20.04 + qt_version: system + tests: [sqlite, posgtresql, mysql] + make: make + name: ubuntu-20.04, system + - platform: windows-latest + qt_version: 5.15.2 + tests: [mssql] + + runs-on: ${{ matrix.platform }} + name: ${{ matrix.platform }} - Qt ${{ matrix.qt_version }} + + env: + CXXFLAGS: ${{ matrix.CXXFLAGS }} + MAKEFLAGS: ${{ matrix.MAKEFLAGS }} + QMAKE_MSC_VER: ${{ matrix.QMAKE_MSC_VER }} + CMAKE_PREFIX_PATH: $Qt6_DIR/lib/cmake + CMAKE_CXX_FLAGS_DEBUG: ${{ matrix.CMAKE_CXX_FLAGS_DEBUG }} + steps: - - uses: actions/checkout@v1 + - name: Clone repo + uses: actions/checkout@v2.3.4 with: submodules: recursive - - uses: actions/setup-python@v1 - - uses: Skycoder42/action-setup-qt@master - id: qt + + - name: Install Qt + if: matrix.qt_version != 'system' + uses: jurplel/install-qt-action@v2.14.0 with: - version: ${{matrix.version}} - platform: ${{matrix.platform}} - packages: qt.tools.ifw.32 - - name: qmake + version: ${{ matrix.qt_version }} + + - name: Install Qt from package manager + if: matrix.qt_version == 'system' run: | - qmake CONFIG+=install_ok QT_PLATFORM=${{matrix.platform}} "QT_TOOL_PATH=${{steps.qt.outputs.qtdir}}/Tools" nut.pro - ${{steps.qt.outputs.make}} qmake_all - - name: make module - run: | - ${{steps.qt.outputs.make}} - ${{steps.qt.outputs.make}} INSTALL_ROOT="${{steps.qt.outputs.installdir}}" install - - name: make tests - if: steps.qt.outputs.tests == 'true' - run: | - ${{steps.qt.outputs.make}} all - ${{steps.qt.outputs.make}} ${{steps.qt.outputs.testflags}} run-tests - - name: upload module to releases - uses: Skycoder42/action-upload-release@master - if: startsWith(github.ref, 'refs/tags/') + sudo apt install qt5-default qt5-qmake qt5-qmake-bin libqt5core5a libqt5gui5 libqt5sql5 libqt5sql5-psql libqt5sql5-mysql libqt5sql5-sqlite + + - name: Setup MSVC environment for QMake + uses: ilammy/msvc-dev-cmd@v1 with: - repo_token: ${{secrets.GITHUB_TOKEN}} - directory: ${{steps.qt.outputs.outdir}} - platform: ${{matrix.platform}} - asset_name: nut-${{matrix.platform}}-${{matrix.version}} - tag: ${{github.ref}} - overwrite: true + uwp: false + + - name: Build with QMake + run: | + mkdir build-qmake + cd build-qmake + qmake ../nut.pro + ${{ matrix.make }} qmake_all + ${{ matrix.make }} + + - name: Build with CMake + if: startsWith(matrix.qt_version, '6.') + run: | + mkdir build-cmake + cd build-cmake + cmake .. ${{ matrix.additional_arguments }} ${{ matrix.cmake_params }} + cmake --build . + + - name: Seutp postgres + if: contains(matrix.tests, 'posgtresql') + uses: ikalnytskyi/action-setup-postgres@v1 + + - name: Setup sql server + if: contains(matrix.tests, 'mssql') + uses: potatoqualitee/mssqlsuite@v1 + with: + install: sqlengine + sa-password: NUT_sa_PASS_1_??? + show-log: true + + - name: Check sql server + if: contains(matrix.tests, 'mssql') + run: sqlcmd -S localhost -U sa -P NUT_sa_PASS_1_??? -d tempdb -Q "SELECT @@version;" + + - name: Run tests with sqlite + if: contains(matrix.tests, 'sqlite') + continue-on-error: true + run: | + rm tests/auto/common/test_params.h + cp tests/auto/common/test_params_sqlite.h tests/auto/common/test_params.h + cd build-qmake + ${{ matrix.make }} all + ${{ matrix.make }} run-tests + + - name: Run tests with posgtresql + if: contains(matrix.tests, 'posgtresql') + #continue-on-error: true + run: | + rm tests/auto/common/test_params.h + cp tests/auto/common/test_params_postgresql.h tests/auto/common/test_params.h + cd build-qmake + ${{ matrix.make }} all + ${{ matrix.make }} run-tests + + - name: Run tests with mysql + if: contains(matrix.tests, 'mysql') + #continue-on-error: true + run: | + sudo systemctl start mysql.service + rm tests/auto/common/test_params.h + cp tests/auto/common/test_params_mysql.h tests/auto/common/test_params.h + cd build-qmake + ${{ matrix.make }} all + ${{ matrix.make }} run-tests + + - name: Run tests with sql server + if: contains(matrix.tests, 'mssql') + continue-on-error: true + run: | + rm tests/auto/common/test_params.h + cp tests/auto/common/test_params_mssql.h tests/auto/common/test_params.h + cd build-qmake + ${{ matrix.make }} all + ${{ matrix.make }} run-tests deploy: if: startsWith(github.ref, 'refs/tags/') needs: build - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v1 with: @@ -94,7 +162,7 @@ jobs: - uses: Skycoder42/action-deploy-qt@master with: token: ${{secrets.GITHUB_TOKEN}} - version: 5.15.0 + version: 5.15.2 host: ${{secrets.SSHFS_HOST}} key: ${{secrets.SSHFS_KEY}} port: ${{secrets.SSHFS_PORT}} diff --git a/.gitignore b/.gitignore index ce75793..e8338a6 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,4 @@ test/tst_quuid/tst_uuid* test/tst_upgrades/tst_upgrades* .idea +CMakeLists.txt.user diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 8251c1c..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "src/nut/3rdparty/serializer"] - path = src/nut/3rdparty/serializer - url = https://github.com/HamedMasafi/Serializer.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d9e7851 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,21 @@ +# Generated from nut.pro. + +cmake_minimum_required(VERSION 3.16) + +set(CMAKE_AUTOMOC ON) + +include(.cmake.conf) +project(Nut + VERSION "0.7.0" + DESCRIPTION "Nut" + HOMEPAGE_URL "https://github.com/HamedMasafi/Nut" + LANGUAGES CXX C +) + +set(PROJECT_VERSION_MAJOR, 0) +set(PROJECT_VERSION_MINOR, 7) +set(PROJECT_VERSION_PATCH, 0) + +find_package(Qt6 CONFIG REQUIRED COMPONENTS BuildInternals Core Gui Sql) + +qt_build_repo() diff --git a/doc/database.md b/doc/database.md index 399ae72..e3c6e4c 100644 --- a/doc/database.md +++ b/doc/database.md @@ -1,4 +1,4 @@ -Database class must inherits from Nut::Database class. +Database class must inherit from Nut::Database class. Database class can have NUT_DB_VERSION for declaring version number, version will be stored in database if upgrade needed. ```cpp NUT_DB_VERSION(major, minor) diff --git a/doc/query.md b/doc/query.md index c78ea4a..6f4230b 100644 --- a/doc/query.md +++ b/doc/query.md @@ -30,7 +30,7 @@ auto posts = db.posts().query() ->orderBy(Post::idField()) ->toList(); ``` -Also you can sort descending by adding **!** to field name +Also, you can sort descending by adding **!** to field name ```cpp auto posts = db.posts().query() ->where(Post::idField() == 1) diff --git a/src/.qmake.stash b/src/.qmake.stash deleted file mode 100644 index a0814c5..0000000 --- a/src/.qmake.stash +++ /dev/null @@ -1,22 +0,0 @@ -QMAKE_CXX.QT_COMPILER_STDCXX = 201402L -QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 10 -QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 2 -QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 1 -QMAKE_CXX.COMPILER_MACROS = \ - QT_COMPILER_STDCXX \ - QMAKE_GCC_MAJOR_VERSION \ - QMAKE_GCC_MINOR_VERSION \ - QMAKE_GCC_PATCH_VERSION -QMAKE_CXX.INCDIRS = \ - /usr/include/c++/10 \ - /usr/include/c++/10/x86_64-redhat-linux \ - /usr/include/c++/10/backward \ - /usr/lib/gcc/x86_64-redhat-linux/10/include \ - /usr/local/include \ - /usr/include -QMAKE_CXX.LIBDIRS = \ - /usr/lib/gcc/x86_64-redhat-linux/10 \ - /usr/lib64 \ - /lib64 \ - /usr/lib \ - /lib diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..e666972 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,3 @@ +# Generated from src.pro. + +add_subdirectory(nut) diff --git a/src/nut/3rdparty/serializer b/src/nut/3rdparty/serializer deleted file mode 160000 index 535778e..0000000 --- a/src/nut/3rdparty/serializer +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 535778e15d30ef51b53e80d47630bef4ca20f4c7 diff --git a/src/nut/CMakeLists.txt b/src/nut/CMakeLists.txt new file mode 100644 index 0000000..319bcac --- /dev/null +++ b/src/nut/CMakeLists.txt @@ -0,0 +1,65 @@ +# Generated from nut.pro. + +##################################################################### +## Nut Module: +##################################################################### + +qt_internal_add_module(Nut + SOURCES + config/nut_config.h + config/nut_consts.h + config/nut_global.h + config/nut_macros.h + config/nut_namespace.h + core/abstracttableset.cpp core/abstracttableset.h + core/abstracttablesetdata.h + core/bulkinserter.cpp core/bulkinserter.h core/bulkinserter_p.h + core/changelogtable.cpp core/changelogtable.h + core/database.cpp core/database.h core/database_p.h + core/foreigncontainer.cpp core/foreigncontainer.h + core/propertysignalmapper.cpp core/propertysignalmapper.h + core/query.cpp core/query.h + core/table.cpp core/table.h core/table_p.h + core/tableset.cpp core/tableset.h + core/sqlserializer.cpp core/sqlserializer.h + generators/abstractsqlgenerator.cpp generators/abstractsqlgenerator.h + generators/mysqlgenerator.cpp generators/mysqlgenerator.h + generators/postgresqlgenerator.cpp generators/postgresqlgenerator.h + generators/sqlitegenerator.cpp generators/sqlitegenerator.h + generators/sqlservergenerator.cpp generators/sqlservergenerator.h + models/databasemodel.cpp models/databasemodel.h + models/sqlmodel.cpp models/sqlmodel.h models/sqlmodel_p.h + models/tablemodel.cpp models/tablemodel.h + phrase.cpp phrase.h + phrases/abstractfieldphrase.cpp phrases/abstractfieldphrase.h + phrases/assignmentphrase.cpp phrases/assignmentphrase.h + phrases/assignmentphraselist.cpp phrases/assignmentphraselist.h + phrases/conditionalphrase.cpp phrases/conditionalphrase.h + phrases/fieldphrase.cpp phrases/fieldphrase.h + phrases/fieldphrase_bool.cpp phrases/fieldphrase_bool.h + phrases/fieldphrase_date.cpp phrases/fieldphrase_date.h + phrases/fieldphrase_qstring.cpp phrases/fieldphrase_qstring.h + phrases/phrasedata.cpp phrases/phrasedata.h + phrases/phrasedatalist.cpp phrases/phrasedatalist.h + phrases/phraselist.cpp phrases/phraselist.h + types/dbgeography.cpp types/dbgeography.h + DEFINES + NUT_BUILD_LIB + NUT_SHARED + NUT_SHARED_POINTER + QT_DEPRECATED_WARNINGS + INCLUDE_DIRECTORIES + config + core + generators + models + phrases + types + PUBLIC_LIBRARIES + Qt::Core + Qt::Gui + Qt::Sql +) + +#### Keys ignored in scope 1:.:.:nut.pro:: +# MODULE = "nut" diff --git a/src/nut/config/nut_config.h b/src/nut/config/nut_config.h index fd8e780..cb3f5aa 100644 --- a/src/nut/config/nut_config.h +++ b/src/nut/config/nut_config.h @@ -1,6 +1,10 @@ #ifndef NUT_CONFIG_H #define NUT_CONFIG_H +#include + +QT_BEGIN_NAMESPACE + #if defined(NUT_SHARED) || !defined(NUT_STATIC) # ifdef NUT_STATIC # error "Both NUT_SHARED and NUT_STATIC defined, please make up your mind" @@ -17,4 +21,6 @@ # define NUT_EXPORT #endif +QT_END_NAMESPACE + #endif // NUT_CONFIG_H diff --git a/src/nut/config/nut_consts.h b/src/nut/config/nut_consts.h index 8d74aeb..1ef2f0c 100644 --- a/src/nut/config/nut_consts.h +++ b/src/nut/config/nut_consts.h @@ -21,6 +21,10 @@ #ifndef NUT_CONSTS_H #define NUT_CONSTS_H +#include + +QT_BEGIN_NAMESPACE + #define __NAME "name" #define __TYPE "type" #define __FIELDS "fields" @@ -46,6 +50,7 @@ #define __nut_REMOVE "remove" #define __nut_CHANGE "change" +#define NUT_NAMESPACE Nut #ifdef NUT_NAMESPACE # define NUT_BEGIN_NAMESPACE namespace NUT_NAMESPACE{ # define NUT_END_NAMESPACE } @@ -56,4 +61,6 @@ # define NUT_WRAP_NAMESPACE(x) x #endif +QT_END_NAMESPACE + #endif // NUT_CONSTS_H diff --git a/src/nut/config/nut_global.h b/src/nut/config/nut_global.h index 0159842..2405d18 100644 --- a/src/nut/config/nut_global.h +++ b/src/nut/config/nut_global.h @@ -1,7 +1,9 @@ #ifndef NUT_GLOBAL_H #define NUT_GLOBAL_H -#define NUT_NAMESPACE Nut +#include + +QT_BEGIN_NAMESPACE #include #include @@ -9,4 +11,6 @@ #include #include +QT_END_NAMESPACE + #endif // NUT_GLOBAL_H diff --git a/src/nut/config/nut_macros.h b/src/nut/config/nut_macros.h index c4e08ae..b160425 100644 --- a/src/nut/config/nut_macros.h +++ b/src/nut/config/nut_macros.h @@ -1,6 +1,9 @@ #ifndef NUT_MACROS_H #define NUT_MACROS_H +#include + +QT_BEGIN_NAMESPACE #define NUT_INFO(type, name, value) \ Q_CLASSINFO(__nut_NAME_PERFIX type #name #value, \ @@ -17,127 +20,128 @@ #define NUT_DB_VERSION(version) \ NUT_INFO(__nut_DB_VERSION, version, 0) -#define NUT_DECLARE_TABLE(type, name) \ - NUT_INFO(__nut_TABLE, type, name) \ - Q_PROPERTY(NUT_WRAP_NAMESPACE(TableSet) name READ name) \ - NUT_WRAP_NAMESPACE(TableSet) *m_##name; \ - public: \ - static const type *_##name; \ - NUT_WRAP_NAMESPACE(TableSet) *name() const \ - { return m_##name; } \ - private: +#define NUT_DECLARE_TABLE(type, name) \ + NUT_INFO(__nut_TABLE, type, name) \ + Q_PROPERTY(NUT_WRAP_NAMESPACE(TableSet) name READ name) \ + NUT_WRAP_NAMESPACE(TableSet) * m_##name; \ + \ +public: \ + static const type *_##name; \ + NUT_WRAP_NAMESPACE(TableSet) * name() const { return m_##name; } \ + \ +private: //Table -#define NUT_FIELD(type, name) \ - private: \ - NUT_INFO(__nut_FIELD, name, 0) \ - public: \ - static NUT_WRAP_NAMESPACE(FieldPhrase)& name ## Field(){ \ - static NUT_WRAP_NAMESPACE(FieldPhrase) f = \ - NUT_WRAP_NAMESPACE(FieldPhrase) \ - (staticMetaObject.className(), #name); \ - return f; \ +#define NUT_FIELD(type, name) \ +private: \ + NUT_INFO(__nut_FIELD, name, 0) \ +public: \ + static NUT_WRAP_NAMESPACE(FieldPhrase) & name##Field() \ + { \ + static NUT_WRAP_NAMESPACE(FieldPhrase) f = NUT_WRAP_NAMESPACE( \ + FieldPhrase)(staticMetaObject.className(), #name); \ + return f; \ } -#define NUT_DECLARE_FIELD(type, name, read, write) \ - Q_PROPERTY(type name READ read WRITE write) \ - NUT_INFO(__nut_FIELD, name, 0) \ - type m_##name; \ -public: \ - static NUT_WRAP_NAMESPACE(FieldPhrase)& name ## Field(){ \ - static NUT_WRAP_NAMESPACE(FieldPhrase) f = \ - NUT_WRAP_NAMESPACE(FieldPhrase) \ - (staticMetaObject.className(), #name); \ - return f; \ - } \ - type read() const{ \ - return m_##name; \ - } \ - void write(type name){ \ - m_##name = name; \ - propertyChanged(QString::fromUtf8(#name)); \ +#define NUT_DECLARE_FIELD(type, name, read, write) \ + Q_PROPERTY(type name READ read WRITE write) \ + NUT_INFO(__nut_FIELD, name, 0) \ + type m_##name; \ + \ +public: \ + static NUT_WRAP_NAMESPACE(FieldPhrase) & name##Field() \ + { \ + static NUT_WRAP_NAMESPACE(FieldPhrase) f = NUT_WRAP_NAMESPACE( \ + FieldPhrase)(staticMetaObject.className(), #name); \ + return f; \ + } \ + type read() const { return m_##name; } \ + void write(type name) \ + { \ + m_##name = name; \ + propertyChanged(QString::fromUtf8(#name)); \ } -#define NUT_FOREIGN_KEY(type, keytype, name, read, write) \ - Q_PROPERTY(Nut::Row name READ read WRITE write) \ - NUT_DECLARE_FIELD(keytype, name##Id, read##Id, write##Id) \ - NUT_INFO(__nut_FOREIGN_KEY, name, type) \ - Nut::Row m_##name; \ -public Q_SLOTS: \ - Nut::Row read() const { return m_##name ; } \ - Q_INVOKABLE void write(Nut::Row name){ \ - m_##name = name; \ - } +#define NUT_FOREIGN_KEY(type, keytype, name, read, write) \ + Q_PROPERTY(NUT_WRAP_NAMESPACE(Row) name READ read WRITE write) \ + NUT_DECLARE_FIELD(keytype, name##Id, read##Id, write##Id) \ + NUT_INFO(__nut_FOREIGN_KEY, name, type) \ + NUT_WRAP_NAMESPACE(Row) m_##name; \ +public Q_SLOTS: \ + NUT_WRAP_NAMESPACE(Row) read() const { return m_##name; } \ + Q_INVOKABLE void write(NUT_WRAP_NAMESPACE(Row) name) { m_##name = name; } -#define NUT_FOREIGN_KEY_DECLARE(type, keytype, name, read, write) \ - NUT_INFO(__nut_FIELD, name##Id, 0) \ - NUT_INFO(__nut_FOREIGN_KEY, name, type) \ - Nut::Row m_##name; \ - keytype m_##name##Id; \ - Q_PROPERTY(Nut::Row name READ read WRITE write) \ - Q_PROPERTY(keytype name##Id READ read##Id WRITE write##Id) \ -public: \ - Nut::Row read() const; \ - keytype read##Id() const; \ - static NUT_WRAP_NAMESPACE(FieldPhrase)& name##Id ## Field(){ \ - static NUT_WRAP_NAMESPACE(FieldPhrase) f = \ - NUT_WRAP_NAMESPACE(FieldPhrase) \ - (staticMetaObject.className(), #name "Id"); \ - return f; \ - } \ -public : \ - Q_INVOKABLE void write(Nut::Row name); \ - Q_INVOKABLE void write(Nut::Row name); \ +#define NUT_FOREIGN_KEY_DECLARE(type, keytype, name, read, write) \ + NUT_INFO(__nut_FIELD, name##Id, 0) \ + NUT_INFO(__nut_FOREIGN_KEY, name, type) \ + NUT_WRAP_NAMESPACE(Row) m_##name; \ + keytype m_##name##Id; \ + Q_PROPERTY(NUT_WRAP_NAMESPACE(Row) name READ read WRITE write) \ + Q_PROPERTY(keytype name##Id READ read##Id WRITE write##Id) \ +public: \ + NUT_WRAP_NAMESPACE(Row) read() const; \ + keytype read##Id() const; \ + static NUT_WRAP_NAMESPACE(FieldPhrase) & name##Id##Field() \ + { \ + static NUT_WRAP_NAMESPACE(FieldPhrase) f = NUT_WRAP_NAMESPACE( \ + FieldPhrase)(staticMetaObject.className(), #name "Id"); \ + return f; \ + } \ + \ +public: \ + Q_INVOKABLE void write(NUT_WRAP_NAMESPACE(Row) name); \ + Q_INVOKABLE void write(NUT_WRAP_NAMESPACE(Row) name); \ void write##Id(keytype name##Id); -#define NUT_FOREIGN_KEY_IMPLEMENT(class, type, keytype, name, read, write) \ - Nut::Row class::read() const { return m_##name ; } \ - void class::write(Nut::Row name){ \ - propertyChanged(QStringLiteral(QT_STRINGIFY2(name##Id))); \ - m_##name = name; \ - m_##name##Id = name->primaryValue().value(); \ - } \ - void class::write(Nut::Row name){ \ - write(qSharedPointerDynamicCast(name)); \ - } keytype class::read##Id() const{ \ - if (m_##name) \ - return m_##name->primaryValue().value(); \ - return m_##name##Id; \ - } \ - void class::write##Id(keytype name##Id){ \ - m_##name##Id = name##Id; \ - m_##name = nullptr; \ - propertyChanged(QStringLiteral(QT_STRINGIFY2(name##Id))); \ +#define NUT_FOREIGN_KEY_IMPLEMENT(class, type, keytype, name, read, write) \ + NUT_WRAP_NAMESPACE(Row) class ::read() const { return m_##name; } \ + void class ::write(NUT_WRAP_NAMESPACE(Row) name) \ + { \ + propertyChanged(QStringLiteral(QT_STRINGIFY2(name##Id))); \ + m_##name = name; \ + m_##name##Id = name->primaryValue().value(); \ + } \ + void class ::write(NUT_WRAP_NAMESPACE(Row) name) \ + { \ + write(qSharedPointerDynamicCast(name)); \ + } \ + keytype class ::read##Id() const \ + { \ + if (m_##name) \ + return m_##name->primaryValue().value(); \ + return m_##name##Id; \ + } \ + void class ::write##Id(keytype name##Id) \ + { \ + m_##name##Id = name##Id; \ + m_##name = nullptr; \ + propertyChanged(QStringLiteral(QT_STRINGIFY2(name##Id))); \ } +#define NUT_DECLARE_CHILD_TABLE(type, n) \ +private: \ + NUT_WRAP_NAMESPACE(TableSet) *m_##n; \ + \ +public: \ + static type *n##Table(); \ + NUT_WRAP_NAMESPACE(TableSet) *n(); -#define NUT_DECLARE_CHILD_TABLE(type, n) \ - private: \ - NUT_WRAP_NAMESPACE(TableSet) *m_##n; \ - public: \ - static type *n##Table(); \ - NUT_WRAP_NAMESPACE(TableSet) *n(); - -#define NUT_IMPLEMENT_CHILD_TABLE(class, type, n) \ - type *class::n##Table(){ \ - static auto f = new type(); \ - return f; \ - } \ - NUT_WRAP_NAMESPACE(TableSet) *class::n(){ \ - return m_##n; \ - } +#define NUT_IMPLEMENT_CHILD_TABLE(class, type, n) \ + type *class ::n##Table() \ + { \ + static auto f = new type(); \ + return f; \ + } \ + NUT_WRAP_NAMESPACE(TableSet) *class ::n() { return m_##n; } //#define NUT_FIELD(name) NUT_INFO(__nut_FIELD, name, 0) -#define NUT_PRIMARY_KEY(x) NUT_INFO(__nut_PRIMARY_KEY, x, 0) \ - public: \ - QVariant primaryValue() const override { \ - return property(#x); \ - } \ - void setPrimaryValue(const QVariant &value) override { \ - setProperty(#x, value); \ - } \ - private: - +#define NUT_PRIMARY_KEY(x) \ + NUT_INFO(__nut_PRIMARY_KEY, x, 0) \ +public: \ + QVariant primaryValue() const override { return property(#x); } \ + void setPrimaryValue(const QVariant &value) override { setProperty(#x, value); } \ + \ +private: #define NUT_AUTO_INCREMENT(x) NUT_INFO(__nut_AUTO_INCREMENT, x, 0) #define NUT_PRIMARY_AUTO_INCREMENT(x) NUT_INFO(__nut_PRIMARY_KEY_AI, x, 0)\ @@ -149,4 +153,6 @@ public : \ #define NUT_NOT_NULL(x) NUT_INFO(__nut_NOT_NULL, x, 1) #define NUT_INDEX(name, field, order) +QT_END_NAMESPACE + #endif // NUT_MACROS_H diff --git a/src/nut/config/nut_namespace.h b/src/nut/config/nut_namespace.h index a64fc87..5491006 100644 --- a/src/nut/config/nut_namespace.h +++ b/src/nut/config/nut_namespace.h @@ -1,10 +1,6 @@ #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 @@ -13,6 +9,8 @@ #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE inline bool nutClassInfo(const QMetaClassInfo &classInfo, @@ -84,59 +82,77 @@ inline bool nutClassInfoInt(const QMetaClassInfo &classInfo, } #ifdef NUT_RAW_POINTER - template - using RowList = QList; - - template - using RowSet = QSet; - - template - using Row = T*; + template + using RowList = QList; template - inline Row create() { + using WeakRowList = QList; + + template + using RowSet = QSet; + + template + using Row = T *; + + template + inline Row create() + { return new T; } template - inline T *get(const Row row) { + inline T *get(const Row row) + { return row; } template - inline T *get(const QSharedPointer row) { + inline T *get(const QSharedPointer row) + { return row.data(); } #else - template + template using RowList = QList>; - template - using RowSet = QSet>; - - template - using Row = QSharedPointer; + template + using WeakRowList = QList>; template - inline Row create() { + using RowSet = QSet>; + + template + using Row = QSharedPointer; + + template + using WeakRow = QWeakPointer; + + template + inline Row create() + { return QSharedPointer(new T); } template - inline Row create(QObject *parent) { + inline Row create(QObject *parent) + { return QSharedPointer(new T(parent)); } template - inline Row createFrom(T *row) { + inline Row createFrom(T *row) + { return QSharedPointer(row); } template - inline Row createFrom(const QSharedPointer row) { + inline Row createFrom(const QSharedPointer row) + { return row; } #endif NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // NUT_NAMESPACE_H diff --git a/src/nut/core/abstracttableset.cpp b/src/nut/core/abstracttableset.cpp index df0c380..cec5deb 100644 --- a/src/nut/core/abstracttableset.cpp +++ b/src/nut/core/abstracttableset.cpp @@ -18,12 +18,16 @@ ** **************************************************************************/ +#include + #include "table.h" #include "database.h" #include "abstracttableset.h" #include "databasemodel.h" #include "abstracttablesetdata.h" +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE AbstractTableSet::AbstractTableSet(Database *parent) : QObject(parent), @@ -40,7 +44,7 @@ AbstractTableSet::AbstractTableSet(Table *parent) : QObject(parent), AbstractTableSet::~AbstractTableSet() { - Q_FOREACH (Row t, data->childs) + for (auto &t: data->children) if (t) t->setParentTableSet(nullptr); } @@ -52,14 +56,14 @@ int AbstractTableSet::save(Database *db, bool cleanUp) if (data->table) masterModel = db->model().tableByClassName(QString::fromUtf8(data->table->metaObject()->className())); - Q_FOREACH (Row
t, data->childs) { + for (auto &t : data->children) { if (data->table) t->setParentTable(data->table, masterModel, - db->model().tableByClassName(QString::fromUtf8(t->metaObject()->className()))); + db->model().tableByClassName( + QString::fromUtf8(t->metaObject()->className()))); - if (t->status() == Table::Added - || t->status() == Table::Modified + if (t->status() == Table::Added || t->status() == Table::Modified || t->status() == Table::Deleted) { rowsAffected += t->save(db); if (cleanUp) @@ -71,32 +75,67 @@ int AbstractTableSet::save(Database *db, bool cleanUp) } } - if (cleanUp) - data->childs.clear(); + for (auto &row : data->weakChildren) { + auto t = row.lock(); + if (data->table) + t->setParentTable(data->table, + masterModel, + db->model().tableByClassName( + QString::fromUtf8(t->metaObject()->className()))); + + if (t->status() == Table::Added || t->status() == Table::Modified + || t->status() == Table::Deleted) { + rowsAffected += t->save(db); + if (cleanUp) +#ifdef NUT_RAW_POINTER + t->deleteLater(); +#else + remove(row); +#endif + } + } + + if (cleanUp) { + data->children.clear(); + data->weakChildren.clear(); + } return rowsAffected; } -void AbstractTableSet::clearChilds() +void AbstractTableSet::clearChildren() { #ifdef NUT_RAW_POINTER - Q_FOREACH (Table *t, data->childs) + for (auto &t: data->children) t->deleteLater(); #endif - data->childs.clear(); + data->children.clear(); } void AbstractTableSet::add(Row
t) { data.detach(); - data->childs.append(t); + data->children.append(t); t->setParentTableSet(this); } +void AbstractTableSet::add(WeakRow
t) +{ + data.detach(); + data->weakChildren.append(t); + t.toStrongRef()->setParentTableSet(this); +} + void AbstractTableSet::remove(Row
t) { data.detach(); - data->childs.removeAll(t); + data->children.removeAll(t); +} + +void AbstractTableSet::remove(WeakRow
t) +{ + data.detach(); + data->weakChildren.removeAll(t); } QString AbstractTableSet::childClassName() const @@ -117,7 +156,9 @@ void AbstractTableSet::setDatabase(Database *database) int AbstractTableSet::size() const { - return data->childs.size(); + return data->children.size(); } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/core/abstracttableset.h b/src/nut/core/abstracttableset.h index cd155b1..35d6c6c 100644 --- a/src/nut/core/abstracttableset.h +++ b/src/nut/core/abstracttableset.h @@ -28,11 +28,14 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class Table; class Database; class AbstractTableSetData; +class TableModel; class NUT_EXPORT AbstractTableSet : public QObject { @@ -42,7 +45,7 @@ public: virtual ~AbstractTableSet(); virtual int save(Database *db, bool cleanUp = false); - void clearChilds(); + void clearChildren(); QString childClassName() const; Database *database() const; @@ -58,12 +61,17 @@ public://TODO: change this to private // void remove(Table *t); void add(Row
t); + void add(WeakRow
t); void remove(Row
t); + void remove(WeakRow
t); friend class Table; friend class QueryBase; +private: + void saveChangedOnRow(Nut::Table *t, Nut::TableModel *masterModel); }; NUT_END_NAMESPACE +QT_END_NAMESPACE #endif // NUT_ABSTRACTTABLESET_H diff --git a/src/nut/core/abstracttablesetdata.h b/src/nut/core/abstracttablesetdata.h index f2b60ac..76cac8e 100644 --- a/src/nut/core/abstracttablesetdata.h +++ b/src/nut/core/abstracttablesetdata.h @@ -25,6 +25,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class Table; @@ -42,13 +44,17 @@ public: // QSet tables; // QList childRows; - RowList
childs; + RowList
children; + WeakRowList
weakChildren; Database *database; Table *table; QString childClassName; }; + NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // NUT_ABSTRACTTABLESETDATA_H diff --git a/src/nut/core/bulkinserter.cpp b/src/nut/core/bulkinserter.cpp index 0dda362..b3262a8 100644 --- a/src/nut/core/bulkinserter.cpp +++ b/src/nut/core/bulkinserter.cpp @@ -1,3 +1,23 @@ +/************************************************************************** +** +** This file is part of Nut project. +** https://github.com/HamedMasafi/Nut +** +** Nut is free software: you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation, either version 3 of the License, or +** (at your option) any later version. +** +** Nut is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public License +** along with Nut. If not, see . +** +**************************************************************************/ + #include "bulkinserter.h" #include "bulkinserter_p.h" @@ -8,6 +28,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE BulkInserterPrivate::BulkInserterPrivate(Database *db) @@ -21,7 +43,7 @@ BulkInserter::BulkInserter(Database *db, QString &className) { Q_D(BulkInserter); - Q_FOREACH (TableModel *m, db->model()) + for (auto &m: db->model()) if (m->className() == className) d->className = m->name(); } @@ -71,3 +93,5 @@ int BulkInserter::apply() } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/core/bulkinserter.h b/src/nut/core/bulkinserter.h index d977397..fa7aa98 100644 --- a/src/nut/core/bulkinserter.h +++ b/src/nut/core/bulkinserter.h @@ -1,3 +1,23 @@ +/************************************************************************** +** +** 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 BULKINSERTER_H #define BULKINSERTER_H @@ -8,6 +28,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class PhraseList; @@ -15,7 +37,7 @@ class Database; class BulkInserterPrivate; class NUT_EXPORT BulkInserter { - Q_DECLARE_PRIVATE(BulkInserter); + Q_DECLARE_PRIVATE(BulkInserter) public: BulkInserter(Database *db, QString &className); @@ -37,4 +59,6 @@ private: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // BULKINSERTER_H diff --git a/src/nut/core/bulkinserter_p.h b/src/nut/core/bulkinserter_p.h index 41e7cfa..69c9538 100644 --- a/src/nut/core/bulkinserter_p.h +++ b/src/nut/core/bulkinserter_p.h @@ -1,8 +1,40 @@ +/************************************************************************** +** +** 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 . +** +**************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Nut API. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + #ifndef BULKINSERTER_P_H #define BULKINSERTER_P_H #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class Database; @@ -20,4 +52,6 @@ public: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // BULKINSERTER_P_H diff --git a/src/nut/core/changelogtable.cpp b/src/nut/core/changelogtable.cpp index 93e096c..0ed9e03 100644 --- a/src/nut/core/changelogtable.cpp +++ b/src/nut/core/changelogtable.cpp @@ -20,6 +20,8 @@ #include "changelogtable.h" +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE ChangeLogTable::ChangeLogTable(QObject *tableSet) : Table(tableSet) @@ -29,3 +31,5 @@ ChangeLogTable::ChangeLogTable(QObject *tableSet) : Table(tableSet) } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/core/changelogtable.h b/src/nut/core/changelogtable.h index 76f6c38..6138406 100644 --- a/src/nut/core/changelogtable.h +++ b/src/nut/core/changelogtable.h @@ -24,6 +24,8 @@ #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class NUT_EXPORT ChangeLogTable : public Table @@ -43,6 +45,8 @@ public: NUT_END_NAMESPACE -Q_DECLARE_METATYPE(Nut::ChangeLogTable*) +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(NUT_WRAP_NAMESPACE(ChangeLogTable*)) #endif // CHANGELOGTABLE_H diff --git a/src/nut/core/core.pri b/src/nut/core/core.pri index 05b39f2..033c566 100644 --- a/src/nut/core/core.pri +++ b/src/nut/core/core.pri @@ -11,6 +11,7 @@ HEADERS += \ $$PWD/foreigncontainer.h \ $$PWD/propertysignalmapper.h \ $$PWD/query.h \ + $$PWD/sqlserializer.h \ $$PWD/table.h \ $$PWD/table_p.h \ $$PWD/tableset.h @@ -23,6 +24,7 @@ SOURCES += \ $$PWD/foreigncontainer.cpp \ $$PWD/propertysignalmapper.cpp \ $$PWD/query.cpp \ + $$PWD/sqlserializer.cpp \ $$PWD/table.cpp \ $$PWD/tableset.cpp diff --git a/src/nut/core/database.cpp b/src/nut/core/database.cpp index 553a71d..da53f73 100644 --- a/src/nut/core/database.cpp +++ b/src/nut/core/database.cpp @@ -49,8 +49,11 @@ # define __CHANGE_LOG_TABLE_NAME "__change_logs" #endif +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE +QStringList DatabasePrivate::updatedDatabases; qulonglong DatabasePrivate::lastId = 0; QMap DatabasePrivate::allTableMaps; @@ -131,7 +134,12 @@ bool DatabasePrivate::updateDatabase() { Q_Q(Database); - if (!getCurrectSchema()) + QString databaseHistoryName = driver + "\t" + databaseName + "\t" + hostName; + + if (updatedDatabases.contains(databaseHistoryName)) + return true; + + if (!getCurrentSchema()) return true; DatabaseModel last = isDatabaseNew ? DatabaseModel() : getLastSchema(); @@ -140,12 +148,12 @@ bool DatabasePrivate::updateDatabase() if (last == current) { qDebug("Database is up-to-date"); //TODO: crash without this and I don't know why! - changeLogs->clearChilds(); + changeLogs->clearChildren(); return true; } - Q_FOREACH (TableModel *tm, current) { - Q_FOREACH (FieldModel *fm, tm->fields()) { + for (auto &tm: current) { + for (auto &fm: tm->fields()) { if (sqlGenerator->fieldType(fm).isEmpty()) { qWarning("The type (%s) is not supported for field %s::%s", QMetaType::typeName(fm->type), @@ -160,10 +168,10 @@ bool DatabasePrivate::updateDatabase() else qDebug("Database is changed"); - QStringList sql = sqlGenerator->diff(last, current); + QStringList sql = sqlGenerator->diffDatabase(last, current); db.transaction(); - Q_FOREACH (QString s, sql) { + for (auto &s: sql) { db.exec(s); if (db.lastError().type() != QSqlError::NoError) { @@ -182,6 +190,7 @@ bool DatabasePrivate::updateDatabase() if (!last.count()) q->databaseCreated(); + updatedDatabases.append(databaseHistoryName); } else { qWarning("Unable update database, error = %s", db.lastError().text().toLatin1().data()); @@ -190,14 +199,14 @@ bool DatabasePrivate::updateDatabase() return ok; } -bool DatabasePrivate::getCurrectSchema() +bool DatabasePrivate::getCurrentSchema() { Q_Q(Database); //is not first instanicate of this class if (allTableMaps.contains(QString::fromUtf8(q->metaObject()->className()))) { currentModel = allTableMaps[QString::fromUtf8(q->metaObject()->className())]; - return false; +// return false; } QMap tables; @@ -252,15 +261,28 @@ bool DatabasePrivate::getCurrectSchema() QMetaProperty tableProperty = q->metaObject()->property(i); int typeId = QMetaType::type(tableProperty.typeName()); - if (tables.values().contains(QString::fromUtf8(tableProperty.name())) + if ((unsigned) typeId >= QVariant::UserType) { + bool contains{false}; + auto tableName = QString::fromUtf8(tableProperty.name()); + for (auto i = tables.begin(); i != tables.end(); ++i) + if (i.value() == tableName) + contains = true; + + if (contains) { + TableModel *sch = new TableModel(typeId, tableName); + currentModel.append(sch); + } + } + + /*if (tables.values().contains(QString::fromUtf8(tableProperty.name())) && (unsigned)typeId >= QVariant::UserType) { TableModel *sch = new TableModel(typeId, QString::fromUtf8(tableProperty.name())); currentModel.append(sch); - } + }*/ } - Q_FOREACH (TableModel *table, currentModel) { - Q_FOREACH (FieldModel *f, table->fields()) { + for (auto &table: currentModel) { + for (auto &f: table->fields()) { if (f->isPrimaryKey && ! sqlGenerator->supportPrimaryKey(f->type)) qFatal("The field of type %s does not support as primary key", qPrintable(f->typeName)); @@ -270,7 +292,7 @@ bool DatabasePrivate::getCurrectSchema() qPrintable(f->typeName)); } - Q_FOREACH (RelationModel *fk, table->foreignKeys()) + for (auto &fk: table->foreignKeys()) fk->masterTable = currentModel.tableByClassName(fk->masterClassName); } @@ -295,28 +317,8 @@ DatabaseModel DatabasePrivate::getLastSchema() DatabaseModel ret = json; return ret; - /* - Q_FOREACH (QString key, json.keys()) { - TableModel *sch = new TableModel(json.value(key).toObject(), key); - ret.append(sch); - }*/ } return DatabaseModel(); - - // QSqlQuery query = q->exec("select * from __change_logs order by id - // desc limit 1"); - // DatabaseModel ret; - // if(query.next()){ - // QJsonObject json = - // QJsonDocument::fromJson(query.value("data").toByteArray()).object(); - - // Q_FOREACH (QString key, json.keys()) { - // TableModel *sch = new TableModel(json.value(key).toObject(), - // key); - // ret.append(sch); - // } - // } - // return ret; } bool DatabasePrivate::putModelToDatabase() @@ -333,26 +335,16 @@ bool DatabasePrivate::putModelToDatabase() changeLog->deleteLater(); return true; - - // QSqlQuery query(db); - // query.prepare("insert into __change_logs (data) values (:data)"); - // query.bindValue(":data", - // QString(QJsonDocument(currentModel.toJson()).toJson())); - // bool ret = query.exec(); - // if(query.lastError().type() != QSqlError::NoError) - // qWarning(QString("storeSchemaInDB" + - // query.lastError().text()).toLatin1().data()); - // return ret; } void DatabasePrivate::createChangeLogs() { // currentModel.model("change_log") - QStringList diff = sqlGenerator->diff(nullptr, + QStringList diff = sqlGenerator->diffTable(nullptr, currentModel.tableByName( QStringLiteral("__change_log"))); - Q_FOREACH (QString s, diff) + for (auto &s: diff) db.exec(s); } @@ -564,12 +556,12 @@ bool Database::open(bool updateDatabase) else if (d->driver == QStringLiteral("QODBC") || d->driver == QStringLiteral("QODBC3")) { QString driverName = QString(); QStringList parts = d->databaseName.toLower().split(';'); - Q_FOREACH (QString p, parts) + for (auto &p: parts) if (p.trimmed().startsWith(QStringLiteral("driver="))) driverName = p.split('=').at(1).toLower().trimmed(); // if (driverName == "{sql server}") - d->sqlGenerator = new SqlServerGenerator(this); + d->sqlGenerator = new SqlServerGenerator(this); // TODO: add ODBC driver for mysql, postgres, ... } @@ -615,7 +607,7 @@ int Database::saveChanges(bool cleanUp) } int rowsAffected = 0; - Q_FOREACH (AbstractTableSet *ts, d->tableSets) + for (const auto &ts: qAsConst(d->tableSets)) rowsAffected += ts->save(this, cleanUp); return rowsAffected; @@ -624,8 +616,10 @@ int Database::saveChanges(bool cleanUp) void Database::cleanUp() { Q_D(Database); - Q_FOREACH (AbstractTableSet *ts, d->tableSets) - ts->clearChilds(); + for (const auto &ts: qAsConst(d->tableSets)) + ts->clearChildren(); } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/core/database.h b/src/nut/core/database.h index 9f92a6f..6df88c6 100644 --- a/src/nut/core/database.h +++ b/src/nut/core/database.h @@ -29,6 +29,8 @@ #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class DatabaseModel; @@ -57,7 +59,7 @@ public: QSqlQuery exec(const QString& sql); - int saveChanges(bool cleanUp = false); + int saveChanges(bool cleanUp = true); void cleanUp(); QString databaseName() const; @@ -75,7 +77,6 @@ public: QSqlDatabase database(); protected: - //remove minor version virtual void databaseCreated(); virtual void databaseUpdated(int oldVersion, int newVersion); @@ -96,4 +97,6 @@ private: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // NUTDATABASE_H diff --git a/src/nut/core/database_p.h b/src/nut/core/database_p.h index 394825b..76ad7c4 100644 --- a/src/nut/core/database_p.h +++ b/src/nut/core/database_p.h @@ -18,6 +18,16 @@ ** **************************************************************************/ +// +// W A R N I N G +// ------------- +// +// This file is not part of the Nut API. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + #ifndef DATABASE_P_H #define DATABASE_P_H @@ -27,6 +37,8 @@ #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class ChangeLogTable; @@ -44,7 +56,7 @@ public: void createChangeLogs(); bool putModelToDatabase(); DatabaseModel getLastSchema(); - bool getCurrectSchema(); + bool getCurrentSchema(); QSqlDatabase db; @@ -63,6 +75,7 @@ public: static QMap allTableMaps; static qulonglong lastId; + static QStringList updatedDatabases; QSet tableSets; @@ -73,4 +86,6 @@ public: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // DATABASE_P_H diff --git a/src/nut/core/foreigncontainer.h b/src/nut/core/foreigncontainer.h index 5833422..a91688f 100644 --- a/src/nut/core/foreigncontainer.h +++ b/src/nut/core/foreigncontainer.h @@ -1,6 +1,33 @@ +/************************************************************************** +** +** 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 FOREIGNCONTAINER_H #define FOREIGNCONTAINER_H +#include +#include + +QT_BEGIN_NAMESPACE + +NUT_BEGIN_NAMESPACE + template class ForeignContainer { @@ -55,4 +82,8 @@ public: } }; +NUT_END_NAMESPACE + +QT_END_NAMESPACE + #endif // FOREIGNCONTAINER_H diff --git a/src/nut/core/propertysignalmapper.cpp b/src/nut/core/propertysignalmapper.cpp index 2b82cda..78d8457 100644 --- a/src/nut/core/propertysignalmapper.cpp +++ b/src/nut/core/propertysignalmapper.cpp @@ -20,6 +20,9 @@ #include "propertysignalmapper.h" #include "table.h" +#include "nut_global.h" + +QT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE @@ -71,3 +74,5 @@ QString PropertySignalMapper::changedProperty(QObject *obj, int senderSignalInde } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/core/propertysignalmapper.h b/src/nut/core/propertysignalmapper.h index ea2dfac..a705207 100644 --- a/src/nut/core/propertysignalmapper.h +++ b/src/nut/core/propertysignalmapper.h @@ -26,6 +26,8 @@ #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class Table; @@ -46,4 +48,6 @@ public: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // PROPERTYSIGNALMAPPER_H diff --git a/src/nut/core/query.cpp b/src/nut/core/query.cpp index 8ddb18e..4caf929 100644 --- a/src/nut/core/query.cpp +++ b/src/nut/core/query.cpp @@ -20,6 +20,8 @@ #include "query.h" +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE /*! @@ -80,3 +82,5 @@ NUT_BEGIN_NAMESPACE */ NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/core/query.h b/src/nut/core/query.h index d73a20f..662d772 100644 --- a/src/nut/core/query.h +++ b/src/nut/core/query.h @@ -44,9 +44,18 @@ #include #include +#ifdef NUT_PRINT_DEBUG_INFO +# define printSql(sql) qDebug().noquote() << "[Nut][" << __FUNCTION__ << "] sql=" << sql; +#else +# define printSql(sql) +#endif + +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE struct NUT_EXPORT QueryData { + bool hasCustomCommand{false}; QString sql; QString className; QString tableName; @@ -146,24 +155,28 @@ public: //debug purpose QString sqlCommand() const; + + Query &setSqlCommand(const QString &command); }; template template Q_OUTOFLINE_TEMPLATE QList Query::select(const std::function allocator) -{ - //Q_D(AbstractQuery); +{ QList ret; - d->joins.prepend(d->tableName); - d->sql = d->database->sqlGenerator()->selectCommand(d->tableName, - AbstractSqlGenerator::SingleField, - QStringLiteral("*"), - d->wherePhrase, - d->relations, - d->skip, - d->take); + if (!d->hasCustomCommand) { + d->joins.prepend(d->tableName); + d->sql = d->database->sqlGenerator()->selectCommand(d->tableName, + AbstractSqlGenerator::SingleField, + QStringLiteral("*"), + d->wherePhrase, + d->relations, + d->skip, + d->take); + printSql(d->sql); + } QSqlQuery q = d->database->exec(d->sql); while (q.next()) { @@ -184,8 +197,6 @@ template Q_OUTOFLINE_TEMPLATE Query::Query(Database *database, AbstractTableSet *tableSet) : d(new QueryData(database)) { - //Q_D(AbstractQuery); - d->database = database; d->tableSet = tableSet; d->className = QString::fromUtf8(T::staticMetaObject.className()); @@ -209,7 +220,6 @@ Q_OUTOFLINE_TEMPLATE Query::Query(Query &&other) { template Q_OUTOFLINE_TEMPLATE Query::~Query() { - //Q_D(AbstractQuery); delete d; } @@ -228,14 +238,19 @@ Q_OUTOFLINE_TEMPLATE Query &Query::operator=(const Query &q) template Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) { - //Q_D(AbstractQuery); RowList returnList; d->select = QStringLiteral("*"); - d->sql = d->database->sqlGenerator()->selectCommand( - d->tableName, d->fieldPhrase, d->wherePhrase, d->orderPhrase, - d->relations, d->skip, count); + if (!d->hasCustomCommand) + d->sql = d->database->sqlGenerator()->selectCommand(d->tableName, + d->fieldPhrase, + d->wherePhrase, + d->orderPhrase, + d->relations, + d->skip, + count); + printSql(d->sql); QSqlQuery q = d->database->exec(d->sql); if (q.lastError().isValid()) { qDebug() << q.lastError().text(); @@ -244,7 +259,7 @@ Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) QSet relatedTables; relatedTables << d->database->model().tableByName(d->tableName); - Q_FOREACH (RelationModel *rel, d->relations) + for (auto &rel: d->relations) relatedTables << rel->slaveTable << rel->masterTable; struct LevelData{ @@ -271,7 +286,7 @@ Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) data.lastKeyValue = QVariant(); QHash masters; - Q_FOREACH (RelationModel *rel, d->relations) + for (auto &rel: d->relations) if (rel->slaveTable->name() == table->name()) masters.insert(rel->masterTable->name(), rel->localProperty); @@ -337,7 +352,7 @@ Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) } // check if master if current table has processed - Q_FOREACH (int m, data.masters) + for (auto &m: data.masters) if (!checked[m]) { // qDebug() << "row is checked"; continue; @@ -350,7 +365,7 @@ Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) //create table row Row
row; if (data.table->className() == d->className) { - Row tmpRow = Nut::create(); + Row tmpRow = create(); row = tmpRow.template objectCast
(); row->init(); @@ -363,8 +378,13 @@ Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) } else { Table *table; + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + auto childMetaObject = QMetaType(data.table->typeId()).metaObject(); +#else const QMetaObject *childMetaObject = QMetaType::metaObjectForType(data.table->typeId()); +#endif table = qobject_cast
(childMetaObject->newInstance()); // table = dynamic_cast
(QMetaType::create(data.table->typeId())); if (!table) @@ -374,7 +394,7 @@ Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) } QList childFields = data.table->fields(); - Q_FOREACH (FieldModel *field, childFields) + for (auto &field: childFields) row->setProperty(field->name.toLatin1().data(), d->database->sqlGenerator()->unescapeValue( field->type, @@ -399,6 +419,8 @@ Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) Q_ARG(Nut::Row, levels[master].lastRow)); + if (Q_UNLIKELY(!ok)) + qWarning("Unable to invoke method %s on object", qPrintable(setterName)); } } @@ -419,17 +441,20 @@ template template Q_OUTOFLINE_TEMPLATE QList Query::select(const FieldPhrase f) { - //Q_D(AbstractQuery); QList ret; - d->joins.prepend(d->tableName); - d->sql = d->database->sqlGenerator()->selectCommand( - d->tableName, - AbstractSqlGenerator::SingleField, f.data->toString(), - d->wherePhrase, - d->relations, - d->skip, d->take); + if (!d->hasCustomCommand) { + d->joins.prepend(d->tableName); + d->sql = d->database->sqlGenerator()->selectCommand(d->tableName, + AbstractSqlGenerator::SingleField, + f.data->toString(), + d->wherePhrase, + d->relations, + d->skip, + d->take); + printSql(d->sql); + } QSqlQuery q = d->database->exec(d->sql); while (q.next()) { @@ -455,16 +480,16 @@ Q_OUTOFLINE_TEMPLATE Row Query::first() template Q_OUTOFLINE_TEMPLATE int Query::count() { - //Q_D(AbstractQuery); - - d->joins.prepend(d->tableName); - d->select = QStringLiteral("COUNT(*)"); - d->sql = d->database->sqlGenerator()->selectCommand( - d->tableName, - AbstractSqlGenerator::Count, - QStringLiteral("*"), - d->wherePhrase, - d->relations); + if (!d->hasCustomCommand) { + d->joins.prepend(d->tableName); + d->select = QStringLiteral("COUNT(*)"); + d->sql = d->database->sqlGenerator()->selectCommand(d->tableName, + AbstractSqlGenerator::Count, + QStringLiteral("*"), + d->wherePhrase, + d->relations); + printSql(d->sql); + } QSqlQuery q = d->database->exec(d->sql); if (q.next()) @@ -475,14 +500,15 @@ Q_OUTOFLINE_TEMPLATE int Query::count() template Q_OUTOFLINE_TEMPLATE QVariant Query::max(const FieldPhrase &f) { - //Q_D(AbstractQuery); - - d->joins.prepend(d->tableName); - d->sql = d->database->sqlGenerator()->selectCommand( - d->tableName, - AbstractSqlGenerator::Max, f.data->toString(), - d->wherePhrase, - d->relations); + if (!d->hasCustomCommand) { + d->joins.prepend(d->tableName); + d->sql = d->database->sqlGenerator()->selectCommand(d->tableName, + AbstractSqlGenerator::Max, + f.data->toString(), + d->wherePhrase, + d->relations); + printSql(d->sql); + } QSqlQuery q = d->database->exec(d->sql); if (q.next()) @@ -493,14 +519,15 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::max(const FieldPhrase &f) template Q_OUTOFLINE_TEMPLATE QVariant Query::min(const FieldPhrase &f) { - //Q_D(AbstractQuery); - - d->joins.prepend(d->tableName); - d->sql = d->database->sqlGenerator()->selectCommand( - d->tableName, - AbstractSqlGenerator::Min, f.data->toString(), - d->wherePhrase, - d->relations); + if (!d->hasCustomCommand) { + d->joins.prepend(d->tableName); + d->sql = d->database->sqlGenerator()->selectCommand(d->tableName, + AbstractSqlGenerator::Min, + f.data->toString(), + d->wherePhrase, + d->relations); + printSql(d->sql); + } QSqlQuery q = d->database->exec(d->sql); if (q.next()) @@ -511,14 +538,15 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::min(const FieldPhrase &f) template Q_OUTOFLINE_TEMPLATE QVariant Query::sum(const FieldPhrase &f) { - //Q_D(AbstractQuery); - - d->joins.prepend(d->tableName); - d->sql = d->database->sqlGenerator()->selectCommand( - d->tableName, - AbstractSqlGenerator::Sum, f.data->toString(), - d->wherePhrase, - d->relations); + if (!d->hasCustomCommand) { + d->joins.prepend(d->tableName); + d->sql = d->database->sqlGenerator()->selectCommand(d->tableName, + AbstractSqlGenerator::Sum, + f.data->toString(), + d->wherePhrase, + d->relations); + printSql(d->sql); + } QSqlQuery q = d->database->exec(d->sql); if (q.next()) @@ -529,14 +557,15 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::sum(const FieldPhrase &f) template Q_OUTOFLINE_TEMPLATE QVariant Query::average(const FieldPhrase &f) { - //Q_D(AbstractQuery); - - d->joins.prepend(d->tableName); - d->sql = d->database->sqlGenerator()->selectCommand( - d->tableName, - AbstractSqlGenerator::Average, f.data->toString(), - d->wherePhrase, - d->relations); + if (!d->hasCustomCommand) { + d->joins.prepend(d->tableName); + d->sql = d->database->sqlGenerator()->selectCommand(d->tableName, + AbstractSqlGenerator::Average, + f.data->toString(), + d->wherePhrase, + d->relations); + printSql(d->sql); + } QSqlQuery q = d->database->exec(d->sql); if (q.next()) @@ -547,9 +576,10 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::average(const FieldPhrase &f) template Q_OUTOFLINE_TEMPLATE QVariant Query::insert(const AssignmentPhraseList &p) { - //Q_D(AbstractQuery); - d->sql = d->database->sqlGenerator() - ->insertCommand(d->tableName, p); + if (!d->hasCustomCommand) { + d->sql = d->database->sqlGenerator()->insertCommand(d->tableName, p); + printSql(d->sql); + } QSqlQuery q = d->database->exec(d->sql); return q.lastInsertId(); @@ -558,8 +588,6 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::insert(const AssignmentPhraseList &p) template Q_OUTOFLINE_TEMPLATE Query &Query::join(const QString &className) { - //Q_D(AbstractQuery); - RelationModel *rel = d->database->model() .relationByClassNames(d->className, className); if (!rel) @@ -587,7 +615,6 @@ Q_OUTOFLINE_TEMPLATE Query &Query::join(Table *c) template Q_OUTOFLINE_TEMPLATE Query &Query::where(const ConditionalPhrase &ph) { - //Q_D(AbstractQuery); if (d->wherePhrase.data) d->wherePhrase = d->wherePhrase && ph; else @@ -598,7 +625,6 @@ Q_OUTOFLINE_TEMPLATE Query &Query::where(const ConditionalPhrase &ph) template Q_OUTOFLINE_TEMPLATE Query &Query::setWhere(const ConditionalPhrase &ph) { - //Q_D(AbstractQuery); d->wherePhrase = ph; return *this; } @@ -606,7 +632,6 @@ Q_OUTOFLINE_TEMPLATE Query &Query::setWhere(const ConditionalPhrase &ph) template Q_OUTOFLINE_TEMPLATE Query &Query::skip(int n) { - //Q_D(AbstractQuery); d->skip = n; return *this; } @@ -614,7 +639,6 @@ Q_OUTOFLINE_TEMPLATE Query &Query::skip(int n) template Q_OUTOFLINE_TEMPLATE Query &Query::take(int n) { - //Q_D(AbstractQuery); d->take = n; return *this; } @@ -622,24 +646,13 @@ Q_OUTOFLINE_TEMPLATE Query &Query::take(int n) template Q_OUTOFLINE_TEMPLATE Query &Query::fields(const PhraseList &ph) { - //Q_D(AbstractQuery); d->fieldPhrase = ph; return *this; } -//template -//Q_OUTOFLINE_TEMPLATE Query &Query::orderBy(QString fieldName, -// QString type) -//{ -// //Q_D(AbstractQuery); -// d->orderPhrases.append(fieldName, type); -// return *this; -//} - template Q_OUTOFLINE_TEMPLATE Query &Query::orderBy(const PhraseList &ph) { - //Q_D(AbstractQuery); d->orderPhrase = ph; return *this; } @@ -647,13 +660,10 @@ Q_OUTOFLINE_TEMPLATE Query &Query::orderBy(const PhraseList &ph) template Q_OUTOFLINE_TEMPLATE int Query::update(const AssignmentPhraseList &ph) { - //Q_D(AbstractQuery); - - d->sql = d->database->sqlGenerator()->updateCommand( - d->tableName, - ph, - d->wherePhrase); - + if (!d->hasCustomCommand) { + d->sql = d->database->sqlGenerator()->updateCommand(d->tableName, ph, d->wherePhrase); + printSql(d->sql); + } QSqlQuery q = d->database->exec(d->sql); return q.numRowsAffected(); @@ -662,10 +672,10 @@ Q_OUTOFLINE_TEMPLATE int Query::update(const AssignmentPhraseList &ph) template Q_OUTOFLINE_TEMPLATE int Query::remove() { - //Q_D(AbstractQuery); - - d->sql = d->database->sqlGenerator()->deleteCommand( - d->tableName, d->wherePhrase); + if (!d->hasCustomCommand) { + d->sql = d->database->sqlGenerator()->deleteCommand(d->tableName, d->wherePhrase); + printSql(d->sql); + } QSqlQuery q = d->database->exec(d->sql); return q.numRowsAffected(); @@ -682,36 +692,33 @@ Q_OUTOFLINE_TEMPLATE QSqlQueryModel *Query::toModel() template Q_OUTOFLINE_TEMPLATE void Query::toModel(QSqlQueryModel *model) { - //Q_D(AbstractQuery); - - d->sql = d->database->sqlGenerator()->selectCommand( - d->tableName, - d->fieldPhrase, - d->wherePhrase, d->orderPhrase, d->relations, - d->skip, d->take); - + if (!d->hasCustomCommand) { + d->sql = d->database->sqlGenerator()->selectCommand(d->tableName, + d->fieldPhrase, + d->wherePhrase, + d->orderPhrase, + d->relations, + d->skip, + d->take); + printSql(d->sql); + } DatabaseModel dbModel = d->database->model(); model->setQuery(d->sql, d->database->database()); int fieldIndex = 0; if (d->fieldPhrase.data.count()) { - Q_FOREACH (const PhraseData *pd, d->fieldPhrase.data) { - QString displayName = dbModel - .tableByClassName(QString::fromUtf8(pd->className)) + for (const auto &pd : qAsConst(d->fieldPhrase.data)) { + QString displayName = dbModel.tableByClassName(QString::fromUtf8(pd->className)) ->field(QString::fromUtf8(pd->fieldName)) ->displayName; - model->setHeaderData(fieldIndex++, - Qt::Horizontal, - displayName); + model->setHeaderData(fieldIndex++, Qt::Horizontal, displayName); } } else { TableModel *tbl = d->database->model().tableByName(d->tableName); - Q_FOREACH (FieldModel *f, tbl->fields()) { - model->setHeaderData(fieldIndex++, - Qt::Horizontal, - f->displayName); + for (auto &f : tbl->fields()) { + model->setHeaderData(fieldIndex++, Qt::Horizontal, f->displayName); } } } @@ -719,38 +726,15 @@ Q_OUTOFLINE_TEMPLATE void Query::toModel(QSqlQueryModel *model) template Q_OUTOFLINE_TEMPLATE void Query::toModel(SqlModel *model) { - //Q_D(AbstractQuery); - d->sql = d->database->sqlGenerator()->selectCommand( d->tableName, d->fieldPhrase, d->wherePhrase, d->orderPhrase, d->relations, d->skip, d->take); + printSql(d->sql); + model->setTable(toList()); - /* - DatabaseModel dbModel = d->database->model(); - model->setQuery(d->sql, d->database->database()); - - int fieldIndex = 0; - - if (d->fieldPhrase.data.count()) { - Q_FOREACH (const PhraseData *pd, d->fieldPhrase.data) { - QString displayName = dbModel.tableByClassName(pd->className) - ->field(pd->fieldName)->displayName; - - model->setHeaderData(fieldIndex++, - Qt::Horizontal, - displayName); - } - } else { - TableModel *tbl = d->database->model().tableByName(d->tableName); - Q_FOREACH (FieldModel *f, tbl->fields()) { - model->setHeaderData(fieldIndex++, - Qt::Horizontal, - f->displayName); - } - }*/ } template @@ -760,15 +744,15 @@ Q_OUTOFLINE_TEMPLATE QString Query::sqlCommand() const return d->sql; } -//TODO: complete this class later -//class RawQuery : public Query -//{ -//public: -// void setRawCommand(const QString &sql) { - -// } -//}; +template +Q_OUTOFLINE_TEMPLATE Query &Query::setSqlCommand(const QString &command) +{ + d->hasCustomCommand = true; + d->sql = command; +} NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // NUT_QUERY_H diff --git a/src/nut/core/sqlserializer.cpp b/src/nut/core/sqlserializer.cpp new file mode 100644 index 0000000..c80c995 --- /dev/null +++ b/src/nut/core/sqlserializer.cpp @@ -0,0 +1,694 @@ +/************************************************************************** +** +** This file is part of Nut project. +** https://github.com/HamedMasafi/Nut +** +** Nut is free software: you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation, either version 3 of the License, or +** (at your option) any later version. +** +** Nut is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public License +** along with Nut. If not, see . +** +**************************************************************************/ + +#include "sqlserializer.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "nut_p.h" +#include "nut_global.h" + +#ifdef QT_GUI_LIB +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#define DATE_FORMAT QStringLiteral("yyyy-MM-dd") +#define TIME_FORMAT QStringLiteral("HH:mm:ss.zzz") + +QT_BEGIN_NAMESPACE + +NUT_BEGIN_NAMESPACE + +SqlSerializer::SqlSerializer() +{ + +} + +SqlSerializer::~SqlSerializer() +{ + +} + +QVariant SqlSerializer::fromString(const QString &value, const QMetaType::Type &type) const +{ + switch (type) { + case QMetaType::Bool: return !value.compare(QStringLiteral("true"), Qt::CaseInsensitive) || value == QStringLiteral("1"); + case QMetaType::Char: + case QMetaType::SChar: + case QMetaType::Int: return value.toInt(); + case QMetaType::UChar: + case QMetaType::UInt: return value.toUInt(); + case QMetaType::Short: return value.toShort(); + case QMetaType::UShort: return value.toUShort(); + case QMetaType::Long: return QVariant::fromValue(value.toLong()); + case QMetaType::ULong: return QVariant::fromValue(value.toULong()); + case QMetaType::LongLong: return value.toLongLong(); + case QMetaType::ULongLong: return QVariant::fromValue(value.toULongLong()); + case QMetaType::Float: return value.toFloat(); + case QMetaType::Double: return value.toDouble(); + case QMetaType::QString: return unescapeString(value); + case QMetaType::QDate: return QDate::fromString(value, DATE_FORMAT); + case QMetaType::QTime: return QTime::fromString(value, TIME_FORMAT); + case QMetaType::QDateTime: return QDateTime::fromString(value, DATE_FORMAT + QStringLiteral(" ") + TIME_FORMAT); + case QMetaType::QUrl: return QUrl(value); + case QMetaType::QChar: return value.at(0); + case QMetaType::QStringList: { + QStringList ret; + QString copy(value); + QString out; + + while (readString(copy, out) ) + ret.append(out); + + return ret; + } + + case QMetaType::QPoint: { + QList parts = toListInt(value); + if (parts.size() != 2) + return QPoint(); + + return QPoint(parts.at(0), parts.at(1)); + } + case QMetaType::QSize: { + QList parts = toListInt(value); + if (parts.size() != 2) + return QSize(); + + return QSize(parts.at(0), parts.at(1)); + } + case QMetaType::QRect: { + QList parts = toListInt(value); + if (parts.size() != 4) + return QRect(); + + return QRect(parts.at(0), parts.at(1), parts.at(2), parts.at(3)); + } + case QMetaType::QLine: { + QList parts = toListInt(value); + if (parts.size() != 4) + return QLine(); + + return QLine(parts.at(0), parts.at(1), parts.at(2), parts.at(3)); + } + case QMetaType::QPointF: { + QList parts = toListReal(value); + if (parts.size() != 2) + return QPointF(); + + return QPointF(parts.at(0), parts.at(1)); + } + case QMetaType::QSizeF: { + QList parts = toListReal(value); + if (parts.size() != 2) + return QSizeF(); + + return QSizeF(parts.at(0), parts.at(1)); + } + case QMetaType::QRectF: { + QList parts = toListReal(value); + if (parts.size() != 4) + return QRectF(); + + return QRectF(parts.at(0), parts.at(1), parts.at(2), parts.at(3)); + } + case QMetaType::QLineF: { + QList parts = toListReal(value); + if (parts.size() != 4) + return QLineF(); + + return QLineF(parts.at(0), parts.at(1), parts.at(2), parts.at(3)); + } + + case QMetaType::QUuid: + return QUuid(value); + + case QMetaType::QByteArray: + return value.toUtf8(); + + case QMetaType::QJsonDocument: + return QJsonDocument::fromJson(value.toUtf8()); + + case QMetaType::QJsonObject: + return QJsonDocument::fromJson(value.toUtf8()).object(); + + case QMetaType::QJsonArray: + return QJsonDocument::fromJson(value.toUtf8()).array(); + + case QMetaType::QJsonValue: { + if (value == QStringLiteral("true")) + return QJsonValue(true); + else if (value == QStringLiteral("false")) + return QJsonValue(false); + bool ok; + int n = value.toInt(&ok); + if (ok) + return QJsonValue(n); + + double d = value.toDouble(&ok); + if (ok) + return QJsonValue(d); + + return QJsonValue(value); + } + + case QMetaType::QBitArray: { + QBitArray bita(value.size()); + for (int i = 0; i < value.size(); ++i) { + if (value.at(i) == QStringLiteral("0")) + bita.setBit(i, false); + else + bita.setBit(i, true); + } + return bita; + } + + case QMetaType::QVariantMap: { + QVariantMap ret; + QStringList parts = value.split(QStringLiteral("\n")); + for (auto &p: parts) { + if (p.isEmpty()) + continue; + QString name; + QString value; + if (readString(p, name) && readString(p, value)) + ret.insert(name, value); + } + return ret; + } + + case QMetaType::QVariantList: { + QVariantMap ret; + QStringList parts = value.split(QStringLiteral("\n")); + for (auto &p: parts) { + if (p.isEmpty()) + continue; + QString name; + QString value; + if (readString(p, name) && readString(p, value)) + ret.insert(name, value); + } + return ret; + } + +#ifdef QT_GUI_LIB + case QMetaType::QVector2D: { + QList parts = toListFloat(value); + if (parts.size() != 2) + return QVector2D(); + + return QVector2D(parts.at(0), parts.at(1)); + } + case QMetaType::QVector3D: { + QList parts = toListFloat(value); + if (parts.size() != 3) + return QVector3D(); + + return QVector3D(parts.at(0), parts.at(1), parts.at(2)); + } + case QMetaType::QVector4D: { + QList parts = toListFloat(value); + if (parts.size() != 4) + return QVector4D(); + + return QVector4D(parts.at(0), parts.at(1), parts.at(2), parts.at(3)); + } + + case QMetaType::QImage: { + QImage image; + image.loadFromData(QByteArray::fromBase64(value.toLocal8Bit())); + return image; + } + + case QMetaType::QColor: + return QColor(value); + + case QMetaType::QPolygon: { + QStringList parts = value.split(QStringLiteral(" ")); + QPolygon pol; + for (int i = 0; i < parts.count(); i++) + pol.append(fromString(parts.at(i), QMetaType::QPoint).toPoint()); + return pol; + } + case QMetaType::QPolygonF: { + QStringList parts = value.split(QStringLiteral(" ")); + QPolygonF pol; + for (int i = 0; i < parts.count(); i++) + pol.append(fromString(parts.at(i), QMetaType::QPointF).toPointF()); + return pol; + } + case QMetaType::QFont: { + QFont f; + f.fromString(value); + return f; + } +#endif + default: + return QVariant(); + } +} + +QString SqlSerializer::toString(const QVariant &value) const +{ + auto type = METATYPE_ID(value); + switch (type) { + case QMetaType::Bool: + case QMetaType::Char: + case QMetaType::Short: + case QMetaType::UShort: + case QMetaType::Int: + case QMetaType::UInt: + case QMetaType::Long: + case QMetaType::ULong: + case QMetaType::LongLong: + case QMetaType::ULongLong: + case QMetaType::Double: + case QMetaType::Float: + case QMetaType::QChar: + case QMetaType::QUrl: + return value.toString(); + + case QMetaType::UChar: + case QMetaType::SChar: + return QString::number(value.toInt()); + + case QMetaType::QString: + return value.toString(); + + case QMetaType::QStringList: { + QString ret; + QStringList sl = value.toStringList(); + for (auto &s: sl) { + if (!ret.isEmpty()) + ret.append(QStringLiteral(" ")); + + ret.append(QStringLiteral("\"") + escapeString(s) + QStringLiteral("\"")); + } + + return ret; + } + + case QMetaType::QUuid: + return value.toUuid().toString(); + + case QMetaType::QByteArray: + return QString::fromUtf8(value.toByteArray()); + + case QMetaType::QDate: return value.toDate().toString(DATE_FORMAT); + case QMetaType::QTime: return value.toTime().toString(TIME_FORMAT); + case QMetaType::QDateTime: return value.toDateTime().toString(DATE_FORMAT + QStringLiteral(" ") + TIME_FORMAT); + + case QMetaType::QPoint: { + QPoint pt = value.toPoint(); + return fromVariantList({pt.x(), pt.y()}); + } + case QMetaType::QPointF: { + QPointF pt = value.toPointF(); + return fromVariantList({pt.x(), pt.y()}); + } + case QMetaType::QSize: { + QSize pt = value.toSize(); + return fromVariantList({pt.width(), pt.height()}); + } + case QMetaType::QSizeF: { + QSizeF pt = value.toSizeF(); + return fromVariantList({pt.width(), pt.height()}); + } + case QMetaType::QRect: { + QRect rc = value.toRect(); + return fromVariantList({rc.x(), rc.y(), rc.width(), rc.height()}); + } + case QMetaType::QRectF: { + QRectF rc = value.toRectF(); + return fromVariantList({rc.x(), rc.y(), rc.width(), rc.height()}); + } + case QMetaType::QLine: { + QLine rc = value.toLine(); + return fromVariantList({rc.x1(), rc.y1(), rc.x2(), rc.y2()}); + } + case QMetaType::QLineF: { + QLineF rc = value.toLineF(); + return fromVariantList({rc.x1(), rc.y1(), rc.x2(), rc.y2()}); + } + case QMetaType::QJsonDocument: + return QString::fromUtf8(value.toJsonDocument().toJson(QJsonDocument::Compact)); + + case QMetaType::QJsonObject: { + QJsonDocument doc; + doc.setObject(value.toJsonObject()); + return QString::fromUtf8(doc.toJson(QJsonDocument::Compact)); + } + + case QMetaType::QJsonArray: { + QJsonDocument doc; + doc.setArray(value.toJsonArray()); + return QString::fromUtf8(doc.toJson(QJsonDocument::Compact)); + } + + case QMetaType::QJsonValue: + return value.toJsonValue().toVariant().toString(); + + case QMetaType::QBitArray: { + QString ret; + QBitArray bita = value.toBitArray(); + for (int i = 0; i < bita.size(); ++i) + ret.append(bita.at(i) ? QStringLiteral("1") : QStringLiteral("0")); + return ret; + } + case QMetaType::QVariantMap: { + QString ret; + QVariantMap map = value.toMap(); + for (auto i = map.begin(); i != map.end(); ++i) { + if (!ret.isEmpty()) + ret.append(QStringLiteral("\n")); + QVariant v = map.value(i.key()); + QString str = toString(v); + ret.append(QStringLiteral("\"%1\" \"%2\"") + .arg(escapeString(i.key()), escapeString(str))); + + } + return ret; + } + +#ifdef QT_GUI_LIB + case QMetaType::QVector2D: { + QVector2D vec = value.value(); + return fromList(QList() << vec.x() << vec.y()); + } + case QMetaType::QVector3D: { + QVector3D vec = value.value(); + return fromList(QList() << vec.x() << vec.y() << vec.z()); + } + case QMetaType::QVector4D: { + QVector4D vec = value.value(); + return fromList(QList() << vec.x() << vec.y() << vec.z() << vec.w()); + } + + case QMetaType::QImage: { + QImage image = value.value(); + QByteArray byteArray; + QBuffer buffer(&byteArray); + image.save(&buffer, "PNG"); + QString base64 = QString::fromLatin1(byteArray.toBase64().data()); + return base64; + } + + case QMetaType::QColor: + return value.value().name(); + + case QMetaType::QPolygon: { + QStringList list; + QPolygon pol = value.value(); + QPoint pt; + for (int i = 0; i < pol.size(); ++i) { + pt = pol.at(i); + list.append(toString(pt)); + } + + return list.join(QStringLiteral(" ")); + } + case QMetaType::QPolygonF: { + QStringList list; + QPolygonF pol = value.value(); + QPointF pt; + for (int i = 0; i < pol.size(); ++i) { + pt = pol.at(i); + list.append(toString(pt)); + } + + return list.join(QStringLiteral(" ")); + } + case QMetaType::QFont: + return value.value().toString(); +#endif + + case QMetaType::QVariantList: { + auto l = value.toList(); + QString ret; + + for (auto &v: l) { + if (!ret.isEmpty()) + ret.append(QStringLiteral(", ")); + ret.append(toString(v)); + } + + return QStringLiteral("(") + ret + QStringLiteral(")"); + break; + } + + default: + qWarning("The type (%s) does not supported", + METATYPE_TO_NAME(type)); + return QString(); + } +} + +QList SqlSerializer::toListInt(const QString &s) const +{ + return toListInt(s, QStringLiteral(",")); +} + +QList SqlSerializer::toListInt(const QString &s, const QString &sep) const +{ + auto parts = s.split(sep); + QList ret; + for (auto &p: parts) { + bool ok; + ret.append(p.toInt(&ok)); + if (!ok) + return ret; + } + + return ret; +} + +QList SqlSerializer::toListReal(const QString &s) const +{ + return toListReal(s, QStringLiteral(",")); +} + +QString SqlSerializer::fromList(const QList &list) const +{ + QString ret; + for (auto &n: list) { + if (!ret.isEmpty()) + ret.append(QStringLiteral(",")); + ret.append(QString::number(n)); + } + return ret; +} + +QList SqlSerializer::toListReal(const QString &s, const QString &sep) const +{ + auto parts = s.split(sep); + QList ret; + for (auto &p: parts) { + bool ok; + ret.append(p.toDouble(&ok)); + if (!ok) + return ret; + } + + return ret; +} + +QList SqlSerializer::toListFloat(const QString &s) const +{ + auto parts = s.split(QStringLiteral(",")); + QList ret; + for (auto &p: parts) { + bool ok; + ret.append(p.toFloat(&ok)); + if (!ok) + return ret; + } + + return ret; +} + +QString SqlSerializer::fromList(const QList &list) const +{ + QString ret; + for (auto &n: list) { + if (!ret.isEmpty()) + ret.append(QStringLiteral(",")); + ret.append(QString::number(n, 'f', -1)); + } + return ret; +} + +QString SqlSerializer::fromList(const QList &list) const +{ + QString ret; + for (auto &n: list) { + if (!ret.isEmpty()) + ret.append(QStringLiteral(",")); + ret.append(QString::number(static_cast(n))); + } + return ret; +} + +QString SqlSerializer::fromVariantList(const QVariantList &list) const +{ + QString ret; + for (auto &n: list) { + if (!ret.isEmpty()) + ret.append(QStringLiteral(",")); + ret.append(n.toString()); + } + return ret; +} + +#define CASE_W(o, r) \ +case o: \ + ret.append(QStringLiteral(r)); \ + break; +QString SqlSerializer::escapeString(const QString &str) const +{ +// QString ret; +// for (int i = 0; i < str.length(); ++i) { +// switch (str.at(i).cell()) { +// CASE_W('\\', "\\\\") +// CASE_W('\r', "\\r") +// CASE_W('\n', "\\n") +// CASE_W('\a', "\\a") +// CASE_W('\b', "\\b") +// CASE_W('\f', "\\f") +// // CASE_W('\'', "\\'") +// CASE_W('\t', "\\t") +// CASE_W('\v', "\\v") +// CASE_W('\"', "\\\"") + +// default: +// ret.append(str.at(i)); +// } +// } +// return ret; + QString ret(str); + return ret.replace(QStringLiteral("'"), QStringLiteral("''")); +} + +QString SqlSerializer::unescapeString(const QString &str) const +{ +// QString ret; +// for (int i = 0; i < str.length(); ++i) { +// if (str.at(i) == '\\' && str.length() > i) { +// switch (str.at(++i).cell()) { +// case '\\': +// ret.append(QStringLiteral("\\")); +// break; +// case 'r': +// ret.append(QStringLiteral("\r")); +// break; +// case 'n': +// ret.append(QStringLiteral("\n")); +// break; +// case 'a': +// ret.append(QStringLiteral("\a")); +// break; +// case 'b': +// ret.append(QStringLiteral("b")); +// break; +// case 'f': +// ret.append(QStringLiteral("\f")); +// break; +// // case '\'': +// // ret.append(QStringLiteral("\\'")); +// // break; +// case 't': +// ret.append(QStringLiteral("\t")); +// break; +// case 'v': +// ret.append(QStringLiteral("\v")); +// break; +// case '"': +// ret.append(QStringLiteral("\\\"")); +// break; + +// default: +// ret.append(str.at(i)); +// } +// } else { +// ret.append(str.at(i)); +// } +// } + +// return ret; + QString ret(str); + return ret.replace(QStringLiteral("''"), QStringLiteral("'")); +} + +bool SqlSerializer::readString(QString &text, QString &out) const +{ + int start = -1; + int end = -1; + + for (int i = 0; i < text.length(); ++i) { + if (text.at(i) == QLatin1Char('"') && (i == 0 || text.at(i - 1) != QStringLiteral("\\"))) { + if (start == -1) + start = i; + else + end = i; + } + if (end != -1){ + out = text.mid(start + 1, end - start - 1); + text = text.mid(end + 1); + return true; + } + } + return false; +} + +QVariant SqlSerializer::deserialize(const QString &value, const QMetaType::Type &type) const +{ + return fromString(unescapeString(value), type); +} + +QString SqlSerializer::serialize(const QVariant &value) const +{ + return escapeString(toString(value)); +} + +NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/core/sqlserializer.h b/src/nut/core/sqlserializer.h new file mode 100644 index 0000000..ebc90e3 --- /dev/null +++ b/src/nut/core/sqlserializer.h @@ -0,0 +1,63 @@ +/************************************************************************** +** +** 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 SQLSERIALIZER_H +#define SQLSERIALIZER_H + +#include +#include + +QT_BEGIN_NAMESPACE + +NUT_BEGIN_NAMESPACE + +class SqlSerializer +{ +public: + SqlSerializer(); + virtual ~SqlSerializer(); + + bool readString(QString &text, QString &out) const; + + QVariant fromString(const QString &value, const QMetaType::Type &type) const; + QString toString(const QVariant &value) const; + QList toListInt(const QString &s) const; + QList toListInt(const QString &s, const QString &sep) const; + QList toListReal(const QString &s) const; + QList toListReal(const QString &s, const QString &sep) const; + QList toListFloat(const QString &s) const; + + QString fromList(const QList &list) const; + QString fromList(const QList &list) const; + QString fromList(const QList &list) const; + QString fromVariantList(const QVariantList &list) const; + + QVariant deserialize(const QString &value, const QMetaType::Type &type) const; + QString serialize(const QVariant &value) const; +private: + QString escapeString(const QString &str) const; + QString unescapeString(const QString &str) const; +}; + +NUT_END_NAMESPACE + +QT_END_NAMESPACE + +#endif // SQLSERIALIZER_H diff --git a/src/nut/core/table.cpp b/src/nut/core/table.cpp index 0c672db..61ac8b1 100644 --- a/src/nut/core/table.cpp +++ b/src/nut/core/table.cpp @@ -30,6 +30,8 @@ #include "abstracttableset.h" #include "propertysignalmapper.h" +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE /* @@ -89,17 +91,6 @@ void Table::add(AbstractTableSet *t) void Table::propertyChanged(const QString &propName) { - //Q_D(Table); -// if (!d->model) -// d->model = TableModel::findByClassName(metaObject()->className()); - -// if (!d->model) -// qFatal ("model for class '%s' not found", qPrintable(metaObject()->className())); - -// Q_FOREACH (FieldModel *f, d->model->fields()) -// if(f->isPrimaryKey && propName == f->name && f->isAutoIncrement) -// return; - d.detach(); d->changedProperties.insert(propName); if (d->status == FetchedFromDB) @@ -121,7 +112,7 @@ void Table::clear() d->changedProperties.clear(); } -QSet Table::changedProperties() const +const QSet &Table::changedProperties() const { //Q_D(const Table); return d->changedProperties; @@ -138,7 +129,7 @@ bool Table::setParentTable(Table *master, TableModel *masterModel, TableModel *m // if (!d->model) // d->model = TableModel::findByClassName(metaObject()->className()); - Q_FOREACH (RelationModel *r, model->foreignKeys()) + for (auto &r: model->foreignKeys()) if(r->masterClassName == masterClassName) { setProperty(QString(r->localColumn).toLatin1().data(), @@ -179,7 +170,7 @@ void Table::setParentTableSet(AbstractTableSet *parent) AbstractTableSet *Table::childTableSet(const QString &name) const { //Q_D(const Table); - Q_FOREACH (AbstractTableSet *t, d->childTableSets) + for (auto &t: qAsConst(d->childTableSets)) if (t->childClassName() == name) return t; return Q_NULLPTR; @@ -230,3 +221,5 @@ void TablePrivate::refreshModel() } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/core/table.h b/src/nut/core/table.h index 0748646..3d2849d 100644 --- a/src/nut/core/table.h +++ b/src/nut/core/table.h @@ -29,6 +29,8 @@ #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class Database; @@ -66,7 +68,7 @@ public: AbstractTableSet *childTableSet(const QString &name) const; - QSet changedProperties() const; + const QSet &changedProperties() const; bool setParentTable(Table *master, TableModel *masterModel, TableModel *model); Q_SIGNALS: @@ -103,4 +105,9 @@ private: NUT_END_NAMESPACE +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(NUT_WRAP_NAMESPACE(Table)*) +Q_DECLARE_METATYPE(NUT_WRAP_NAMESPACE(Row)) + #endif // TABLE_H diff --git a/src/nut/core/table_p.h b/src/nut/core/table_p.h index 954bffb..12ba411 100644 --- a/src/nut/core/table_p.h +++ b/src/nut/core/table_p.h @@ -1,3 +1,33 @@ +/************************************************************************** +** +** 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 . +** +**************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Nut API. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + #ifndef TABLEPRIVATE_H #define TABLEPRIVATE_H @@ -7,6 +37,8 @@ #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class TableModel; @@ -31,4 +63,6 @@ public: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // TABLEPRIVATE_H diff --git a/src/nut/core/tableset.h b/src/nut/core/tableset.h index f494736..5b3497c 100644 --- a/src/nut/core/tableset.h +++ b/src/nut/core/tableset.h @@ -35,6 +35,8 @@ #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE template @@ -98,16 +100,16 @@ Q_OUTOFLINE_TEMPLATE BulkInserter TableSet::bulkInserter() template Q_OUTOFLINE_TEMPLATE int TableSet::length() const { - return data->childs.count(); + return data->children.count(); } template Q_OUTOFLINE_TEMPLATE Row TableSet::at(int i) const { #ifdef NUT_RAW_POINTER - return reinterpret_cast(data->childs.at(i)); + return reinterpret_cast(data->children.at(i)); #else - return data->childs.at(i).template objectCast(); + return data->children.at(i).template objectCast(); #endif } @@ -136,7 +138,7 @@ template Q_OUTOFLINE_TEMPLATE void TableSet::append(Row t) { data.detach(); - data->childs.append(t); + data->children.append(t); // data->tables.insert(t.data()); // data->childRows.append(t.data()); @@ -151,7 +153,7 @@ Q_OUTOFLINE_TEMPLATE void TableSet::append(Row t) template Q_OUTOFLINE_TEMPLATE void TableSet::append(RowList t) { - Q_FOREACH (Row i, t) + for (auto &i: t) append(i); } @@ -159,19 +161,21 @@ template Q_OUTOFLINE_TEMPLATE void TableSet::remove(Row t) { data.detach(); -// data->childs.removeOne(t.data()); +// data->children.removeOne(t.data()); // data->tables.remove(t.data()); - data->childs.removeOne(t); + data->children.removeOne(t); t->setStatus(Table::Deleted); } template Q_OUTOFLINE_TEMPLATE void TableSet::remove(RowList t) { - Q_FOREACH (Row i, t) + for (auto &i: t) remove(i); } NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // TABLESET_H diff --git a/src/nut/generators/abstractsqlgenerator.cpp b/src/nut/generators/abstractsqlgenerator.cpp index 0ae7223..d23e75b 100644 --- a/src/nut/generators/abstractsqlgenerator.cpp +++ b/src/nut/generators/abstractsqlgenerator.cpp @@ -31,6 +31,9 @@ #include "databasemodel.h" #include "tablemodel.h" #include "sqlserializer.h" +#include "nut_p.h" + +QT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE @@ -114,7 +117,7 @@ QString AbstractSqlGenerator::recordsPhrase(TableModel *table) return QString(); QString ret = QString(); - Q_FOREACH (FieldModel *f, table->fields()) { + for (auto &f: table->fields()) { if (!ret.isEmpty()) ret.append(QLatin1String(", ")); ret.append(QStringLiteral("%1.%2 AS \"%1.%2\"").arg(table->name(), f->name)); @@ -125,9 +128,9 @@ QString AbstractSqlGenerator::recordsPhrase(TableModel *table) QString AbstractSqlGenerator::insertBulk(const QString &tableName, const PhraseList &ph, const QList &vars) { QString sql; - Q_FOREACH (QVariantList list, vars) { + for (auto &list: vars) { QStringList values; - Q_FOREACH (QVariant v, list) + for (auto &v: list) values.append(escapeValue(v)); if (!sql.isEmpty()) @@ -147,7 +150,7 @@ QString AbstractSqlGenerator::fieldDeclare(FieldModel *field) if (type.isEmpty()) return type; - QString ret = escaleFieldName(field->name) + QStringLiteral(" ") + type; + QString ret = escapeFieldName(field->name) + QStringLiteral(" ") + type; if (field->notNull) ret.append(QStringLiteral(" NOT NULL")); @@ -157,7 +160,7 @@ QString AbstractSqlGenerator::fieldDeclare(FieldModel *field) return ret; } -QString AbstractSqlGenerator::escaleFieldName(const QString &fieldName) const +QString AbstractSqlGenerator::escapeFieldName(const QString &fieldName) const { return fieldName; } @@ -174,7 +177,7 @@ QString AbstractSqlGenerator::relationDeclare(const RelationModel *relation) .arg(relation->localColumn, relation->slaveTable->name()); } -QStringList AbstractSqlGenerator::diff(const DatabaseModel &lastModel, +QStringList AbstractSqlGenerator::diffDatabase(const DatabaseModel &lastModel, const DatabaseModel &newModel) { QStringList ret; @@ -185,7 +188,7 @@ QStringList AbstractSqlGenerator::diff(const DatabaseModel &lastModel, for (i = unionModel.begin(); i != unionModel.end(); ++i) { TableModel *oldTable = lastModel.tableByName((*i)->name()); TableModel *newTable = newModel.tableByName((*i)->name()); - QStringList sql = diff(oldTable, newTable); + QStringList sql = diffTable(oldTable, newTable); if (!sql.isEmpty()) ret << sql; @@ -197,13 +200,16 @@ QStringList AbstractSqlGenerator::diff(const DatabaseModel &lastModel, return ret; } -QString AbstractSqlGenerator::diff(FieldModel *oldField, FieldModel *newField) +QString AbstractSqlGenerator::diffField(FieldModel *oldField, FieldModel *newField) { - QString sql = QString(); + if (!oldField && !newField) + return QString(); + if (oldField && newField) if (*oldField == *newField) - return sql; + return QString(); + QString sql = QString(); if (!newField) { sql = QStringLiteral("DROP COLUMN ") + oldField->name; } else { @@ -216,7 +222,7 @@ QString AbstractSqlGenerator::diff(FieldModel *oldField, FieldModel *newField) return sql; } -QStringList AbstractSqlGenerator::diff(TableModel *oldTable, TableModel *newTable) +QStringList AbstractSqlGenerator::diffTable(TableModel *oldTable, TableModel *newTable) { if (!newTable && !oldTable) return QStringList(); @@ -232,28 +238,28 @@ QStringList AbstractSqlGenerator::diff(TableModel *oldTable, TableModel *newTabl QList relations; if (oldTable) { - Q_FOREACH (FieldModel *f, oldTable->fields()) + for (auto &f: oldTable->fields()) if (!fieldNames.contains(f->name)) fieldNames.append(f->name); - Q_FOREACH (RelationModel *r, oldTable->foreignKeys()) + for (auto &r: oldTable->foreignKeys()) if (!relations.contains(r->localColumn)) relations.append(r->localColumn); } - Q_FOREACH (FieldModel *f, newTable->fields()) + for (auto &f: newTable->fields()) if (!fieldNames.contains(f->name)) fieldNames.append(f->name); - Q_FOREACH (RelationModel *r, newTable->foreignKeys()) + for (auto &r: newTable->foreignKeys()) if (!relations.contains(r->localColumn)) relations.append(r->localColumn); QStringList columnSql; - Q_FOREACH (QString fieldName, fieldNames) { + for (auto &fieldName: fieldNames) { FieldModel *newField = newTable->field(fieldName); if (oldTable) { FieldModel *oldField = oldTable->field(fieldName); - QString buffer = diff(oldField, newField); + QString buffer = diffField(oldField, newField); if (!buffer.isEmpty()) columnSql << buffer; } else { @@ -303,23 +309,23 @@ QStringList AbstractSqlGenerator::diffRelation(TableModel *oldTable, TableModel QList relations; if (oldTable) { - Q_FOREACH (RelationModel *r, oldTable->foreignKeys()) + for (auto &r: oldTable->foreignKeys()) if (!relations.contains(r->localColumn)) relations.append(r->localColumn); } - Q_FOREACH (RelationModel *r, newTable->foreignKeys()) + for (auto &r: newTable->foreignKeys()) if (!relations.contains(r->localColumn)) relations.append(r->localColumn); QStringList columnSql; - Q_FOREACH (QString fieldName, relations) { + for (auto &fieldName: relations) { RelationModel *newRelation = newTable->foreignKeyByField(fieldName); RelationModel *oldRelation = nullptr; if (oldTable) oldRelation = oldTable->foreignKeyByField(fieldName); - QStringList buffer = diff(oldRelation, newRelation); + QStringList buffer = diffRelation2(oldRelation, newRelation); if (!buffer.isEmpty()) columnSql << buffer.at(0); } @@ -332,7 +338,7 @@ QStringList AbstractSqlGenerator::diffRelation(TableModel *oldTable, TableModel return ret; } -QStringList AbstractSqlGenerator::diff(RelationModel *oldRel, RelationModel *newRel) +QStringList AbstractSqlGenerator::diffRelation2(RelationModel *oldRel, RelationModel *newRel) { QStringList ret; /* @@ -478,7 +484,7 @@ QString AbstractSqlGenerator::insertRecord(Table *t, QString tableName) if (changedPropertiesText != QLatin1String("")) changedPropertiesText.append(QStringLiteral(", ")); - changedPropertiesText.append(escaleFieldName(f)); + changedPropertiesText.append(escapeFieldName(f)); } sql = QStringLiteral("INSERT INTO %1 (%2) VALUES (%3)") .arg(tableName, changedPropertiesText, values.join(QStringLiteral(", "))); @@ -495,9 +501,9 @@ QString AbstractSqlGenerator::updateRecord(Table *t, QString tableName) QString key = model->primaryKey(); QStringList values; - for (auto &f : t->changedProperties()) + for (const auto &f : t->changedProperties()) if (f != key) - values.append(f + QStringLiteral("=") + values.append(escapeFieldName(f) + QStringLiteral("=") + escapeValue(t->property(f.toLatin1().data()))); sql = QStringLiteral("UPDATE %1 SET %2 WHERE %3=%4") @@ -600,11 +606,11 @@ QString AbstractSqlGenerator::selectCommand(const QString &tableName, if (fields.data.count() == 0) { QSet tables; tables.insert(_database->model().tableByName(tableName)); - Q_FOREACH (RelationModel *rel, joins) + for (auto &rel: joins) tables << rel->masterTable << rel->slaveTable; selectText = QString(); - Q_FOREACH (TableModel *t, tables) { + for (auto &t: qAsConst(tables)) { if (!selectText.isEmpty()) selectText.append(QStringLiteral(", ")); selectText.append(recordsPhrase(t)); @@ -689,8 +695,8 @@ QString AbstractSqlGenerator::updateCommand(const QString &tableName, const ConditionalPhrase &where) { QString assigmentTexts = QString(); - Q_FOREACH (PhraseData *d, assigments.data) { - if (assigmentTexts != QStringLiteral("")) + for (auto &d: assigments.data) { + if (assigmentTexts != QLatin1String()) assigmentTexts.append(QStringLiteral(", ")); assigmentTexts.append(createConditionalPhrase(d)); @@ -717,92 +723,23 @@ QString AbstractSqlGenerator::insertCommand(const QString &tableName, const Assi QString fieldNames; QString values; - Q_FOREACH (PhraseData *d, assigments.data) { + for (auto &d: assigments.data) { if (!fieldNames.isEmpty()) fieldNames.append(QStringLiteral(", ")); if (!values.isEmpty()) values.append(QStringLiteral(", ")); - fieldNames.append(escaleFieldName(QString::fromUtf8(d->left->fieldName))); + fieldNames.append(escapeFieldName(QString::fromUtf8(d->left->fieldName))); values.append(escapeValue(d->operand)); } return QStringLiteral("INSERT INTO %1 (%2) VALUES (%3);") .arg(tableName, fieldNames, values); } -//QString SqlGeneratorBase::selectCommand(SqlGeneratorBase::AgregateType t, -// QString agregateArg, -// QString tableName, -// QList &wheres, -// QList &orders, -// QList joins, -// int skip, int take) -//{ -// Q_UNUSED(take) -// Q_UNUSED(skip) - -// QStringList joinedOrders; -// QString select = agregateText(t, agregateArg); - -// //TODO: temporatory disabled -// if (t == SelectAll) { -// QSet tables; -// tables.insert(_database->model().tableByName(tableName)); -// Q_FOREACH (RelationModel *rel, joins) -// tables << rel->masterTable << rel->slaveTable; - -// select = ""; -// Q_FOREACH (TableModel *t, tables) { -// if (!select.isEmpty()) -// select.append(", "); -// select.append(recordsPhrase(t)); -// } -// } -// QString from = join(tableName, joins, &joinedOrders); -// QString where = createWhere(wheres); -// QString orderText = joinedOrders.join(", "); - -// Q_FOREACH (WherePhrase p, orders) { -// if (orderText != "") -// orderText.append(", "); -// orderText.append(phraseOrder(p.data())); -// } - -// QString sql = "SELECT " + select + " FROM " + from; - -// if (where != "") -// sql.append(" WHERE " + where); - -// if (orderText != "") -// sql.append(" ORDER BY " + orderText); - -// for (int i = 0; i < _database->model().count(); i++) -// sql = sql.replace(_database->model().at(i)->className() + ".", -// _database->model().at(i)->name() + "."); - -// replaceTableNames(sql); - -// return sql + " "; -//} - -//QString SqlGeneratorBase::createWhere(QList &wheres) -//{ -// QString whereText = ""; - -// Q_FOREACH (WherePhrase w, wheres) { -// if (whereText != "") -// whereText.append(" AND "); - -// whereText.append(phrase(w.data())); -// } - -// return whereText; -//} - void AbstractSqlGenerator::replaceTableNames(QString &command) { - Q_FOREACH (TableModel *m, _database->model()) + for (auto &m: _database->model()) command = command .replace(QStringLiteral("[") + m->className() + QStringLiteral("]"), m->name()); @@ -810,10 +747,10 @@ void AbstractSqlGenerator::replaceTableNames(QString &command) void AbstractSqlGenerator::removeTableNames(QString &command) { - Q_FOREACH (TableModel *m, _database->model()) + for (auto &m: _database->model()) command = command.replace(QStringLiteral("[") + m->className() - + QStringLiteral("]."), QStringLiteral("")); + + QStringLiteral("]."), QLatin1String()); } QString AbstractSqlGenerator::dateTimePartName(const PhraseData::Condition &op) const @@ -891,13 +828,13 @@ QString AbstractSqlGenerator::dateTimePartName(const PhraseData::Condition &op) QString AbstractSqlGenerator::escapeValue(const QVariant &v) const { - if (v.type() == QVariant::String && v.toString().isEmpty()) + if (VARIANT_TYPE_COMPARE(v, String) && v.toString().isEmpty()) return QStringLiteral("''"); - if (v.type() == QVariant::List) { + if (VARIANT_TYPE_COMPARE_X(v, QVariant::List, QMetaType::QVariantList)) { auto list = v.toList(); QStringList ret; - Q_FOREACH (QVariant vi, list) { + for (auto &vi: list) { ret.append(QStringLiteral("'") + _serializer->serialize(vi) + QStringLiteral("'")); @@ -1121,7 +1058,7 @@ QString AbstractSqlGenerator::createConditionalPhrase(const PhraseData *d) const QString AbstractSqlGenerator::createOrderPhrase(const PhraseList &ph) { QString ret = QString(); - Q_FOREACH (const PhraseData *d, ph.data) { + for (const auto &d: ph.data) { if (!ret.isEmpty()) ret.append(QStringLiteral(", ")); ret.append(d->toString()); @@ -1135,10 +1072,10 @@ QString AbstractSqlGenerator::createOrderPhrase(const PhraseList &ph) QString AbstractSqlGenerator::createFieldPhrase(const PhraseList &ph) { QString ret = QString(); - Q_FOREACH (const PhraseData *d, ph.data) { + for (const auto &d: ph.data) { if (!ret.isEmpty()) ret.append(QStringLiteral(", ")); - ret.append(d->toString()); + ret.append("`" + d->toString() + "`"); if (d->isNot) qDebug() << "Operator ! is ignored in fields phrase"; } @@ -1147,7 +1084,7 @@ QString AbstractSqlGenerator::createFieldPhrase(const PhraseList &ph) void AbstractSqlGenerator::createInsertPhrase(const AssignmentPhraseList &ph, QString &fields, QString &values) { - Q_FOREACH (PhraseData *d, ph.data) { + for (auto &d: ph.data) { if (!fields.isEmpty()) fields.append(QStringLiteral(", ")); @@ -1175,3 +1112,5 @@ void AbstractSqlGenerator::createInsertPhrase(const AssignmentPhraseList &ph, QS } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/generators/abstractsqlgenerator.h b/src/nut/generators/abstractsqlgenerator.h index 9340cb6..2bd6078 100644 --- a/src/nut/generators/abstractsqlgenerator.h +++ b/src/nut/generators/abstractsqlgenerator.h @@ -27,7 +27,8 @@ #include -class SqlSerializer; + +QT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE @@ -37,6 +38,7 @@ class DatabaseModel; class TableModel; class Database; struct RelationModel; +class SqlSerializer; class NUT_EXPORT AbstractSqlGenerator : public QObject { // Q_OBJECT @@ -80,7 +82,7 @@ public: //fields virtual QString fieldType(FieldModel *field) = 0; virtual QString fieldDeclare(FieldModel *field); - virtual QString escaleFieldName(const QString &fieldName) const; + virtual QString escapeFieldName(const QString &fieldName) const; virtual QStringList constraints(TableModel *table); virtual QString escapeValue(const QVariant &v) const; virtual QVariant unescapeValue(const QMetaType::Type &type, const QVariant &dbValue); @@ -91,11 +93,11 @@ public: virtual QString relationDeclare(const RelationModel *relation); - virtual QStringList diff(const DatabaseModel &lastModel, const DatabaseModel &newModel); - virtual QString diff(FieldModel *oldField, FieldModel *newField); - virtual QStringList diff(TableModel *oldTable, TableModel *newTable); + virtual QStringList diffDatabase(const DatabaseModel &lastModel, const DatabaseModel &newModel); + virtual QString diffField(FieldModel *oldField, FieldModel *newField); + virtual QStringList diffTable(TableModel *oldTable, TableModel *newTable); virtual QStringList diffRelation(TableModel *oldTable, TableModel *newTable); - virtual QStringList diff(RelationModel *oldRel, RelationModel *newRel); + virtual QStringList diffRelation2(RelationModel *oldRel, RelationModel *newRel); virtual QString join(const QString &mainTable, const QList &list, @@ -169,4 +171,6 @@ protected: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // NUT_ABSTRACTSQLGENERATOR_H diff --git a/src/nut/generators/mysqlgenerator.cpp b/src/nut/generators/mysqlgenerator.cpp index 69987b3..173f97b 100644 --- a/src/nut/generators/mysqlgenerator.cpp +++ b/src/nut/generators/mysqlgenerator.cpp @@ -26,12 +26,17 @@ #include #include #include +#include + #ifdef QT_GUI_LIB # include # include #endif #include "sqlserializer.h" +#include "nut_p.h" + +QT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE @@ -83,15 +88,15 @@ QString MySqlGenerator::fieldType(FieldModel *field) dbType = QStringLiteral("TEXT"); break; + case QMetaType::QUuid: + dbType = QStringLiteral("VARCHAR(38)"); + break; case QMetaType::QPolygon: case QMetaType::QPolygonF: // dbType = "POLYGON"; // break; - case QMetaType::QUuid: -// dbType = "VARCHAR(64)"; -// break; case QMetaType::QPoint: case QMetaType::QPointF: @@ -114,7 +119,7 @@ QString MySqlGenerator::fieldType(FieldModel *field) default: qWarning("Type %s::%s(%d) is not supported", qPrintable(field->name), - QMetaType::typeName(field->type), + METATYPE_TO_NAME(field->type), field->type); dbType = QString(); } @@ -127,18 +132,21 @@ QString MySqlGenerator::fieldType(FieldModel *field) QString MySqlGenerator::escapeValue(const QVariant &v) const { - if (v.type() == QVariant::Bool) + if (VARIANT_TYPE_COMPARE_X(v, Bool, Bool)) return v.toBool() ? QStringLiteral("1") : QStringLiteral("0"); - if (v.type() == QVariant::Time) + if (VARIANT_TYPE_COMPARE(v, Time)) return v.toTime().toString(QStringLiteral("''HH:mm:ss''")); - if (v.type() == QVariant::Date) + if (VARIANT_TYPE_COMPARE(v, Date)) return v.toDate().toString(QStringLiteral("''yyyy-MM-dd''")); - if (v.type() == QVariant::DateTime) + if (VARIANT_TYPE_COMPARE(v, DateTime)) return v.toDateTime().toString(QStringLiteral("''yyyy-MM-dd HH:mm:ss''")); + if (VARIANT_TYPE_COMPARE(v, Uuid)) + return QStringLiteral("'") + v.toUuid().toString() + QStringLiteral("'"); + //#ifdef QT_GUI_LIB // if (v.type() == QVariant::Polygon) { // QString ret; @@ -194,7 +202,7 @@ QVariant MySqlGenerator::unescapeValue(const QMetaType::Type &type, const QVaria // if (!readInsideParentese(ref, p)) // return pol; // QStringList parts = p.split(","); -// Q_FOREACH (QString v, parts) { +// for (auto &v: parts) { // QList l = _serializer->toListInt(p.trimmed(), " "); // if (l.count() != 2) // return QPolygon(); @@ -210,7 +218,7 @@ QVariant MySqlGenerator::unescapeValue(const QMetaType::Type &type, const QVaria // return pol; // QStringList parts = p.split(","); -// Q_FOREACH (QString v, parts) { +// for (auto &v: parts) { // QList l = _serializer->toListReal(p.trimmed(), " "); // if (l.count() != 2) // return QPolygonF(); @@ -229,6 +237,9 @@ QVariant MySqlGenerator::unescapeValue(const QMetaType::Type &type, const QVaria if (type == QMetaType::QDate) return dbValue.toDate(); + if (type == QMetaType::QUuid) + return QUuid::fromString(dbValue.toString()); + return AbstractSqlGenerator::unescapeValue(type, dbValue); } @@ -240,12 +251,12 @@ bool MySqlGenerator::readInsideParentese(QString &text, QString &out) for (int i = 0; i < text.length(); ++i) { QChar ch = text.at(i); - if (ch == '(') { + if (ch == QLatin1Char('(')) { if (start == -1) start = i; pc++; } - if (ch == ')') { + if (ch == QLatin1Char(')')) { pc--; if (!pc && end == -1) @@ -315,11 +326,20 @@ QString MySqlGenerator::createConditionalPhrase(const PhraseData *d) const case PhraseData::AddMinutes: case PhraseData::AddMinutesDateTime: case PhraseData::AddSeconds: - case PhraseData::AddSecondsDateTime: - return QStringLiteral("DATE_ADD(%1, INTERVAL %2 %3)") - .arg(createConditionalPhrase(d->left), - d->operand.toString(), - AbstractSqlGenerator::dateTimePartName(op)); + case PhraseData::AddSecondsDateTime: { + auto interval = d->operand.toInt(); + + if (interval < 0) + return QStringLiteral("DATE_SUB(%1, INTERVAL %2 %3)") + .arg(createConditionalPhrase(d->left)) + .arg(-interval) + .arg(AbstractSqlGenerator::dateTimePartName(op)); + else + return QStringLiteral("DATE_ADD(%1, INTERVAL %2 %3)") + .arg(createConditionalPhrase(d->left)) + .arg(interval) + .arg(AbstractSqlGenerator::dateTimePartName(op)); + } default: break; @@ -362,8 +382,11 @@ QString MySqlGenerator::primaryKeyConstraint(const TableModel *table) const .arg(table->primaryKey()); } -QString MySqlGenerator::escaleFieldName(const QString &fieldName) const +QString MySqlGenerator::escapeFieldName(const QString &fieldName) const { return "`" + fieldName + "`"; } + NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/generators/mysqlgenerator.h b/src/nut/generators/mysqlgenerator.h index a90ed07..93c1840 100644 --- a/src/nut/generators/mysqlgenerator.h +++ b/src/nut/generators/mysqlgenerator.h @@ -25,6 +25,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class NUT_EXPORT MySqlGenerator : public AbstractSqlGenerator @@ -40,7 +42,7 @@ public: QString createConditionalPhrase(const PhraseData *d) const override; void appendSkipTake(QString &sql, int skip, int take) override; QString primaryKeyConstraint(const TableModel *table) const override; - QString escaleFieldName(const QString &fieldName) const override; + QString escapeFieldName(const QString &fieldName) const override; private: bool readInsideParentese(QString &text, QString &out); @@ -48,4 +50,6 @@ private: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // MYSQLGENERATOR_H diff --git a/src/nut/generators/postgresqlgenerator.cpp b/src/nut/generators/postgresqlgenerator.cpp index d29cd01..5f64619 100644 --- a/src/nut/generators/postgresqlgenerator.cpp +++ b/src/nut/generators/postgresqlgenerator.cpp @@ -32,6 +32,9 @@ #include "table.h" #include "tablemodel.h" #include "sqlserializer.h" +#include "nut_p.h" + +QT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE @@ -43,12 +46,12 @@ bool PostgreSqlGenerator::readInsideParentese(QString &text, QString &out) for (int i = 0; i < text.length(); ++i) { QChar ch = text.at(i); - if (ch == '(') { + if (ch == QLatin1Char('(')) { if (start == -1) start = i; pc++; } - if (ch == ')') { + if (ch == QLatin1Char(')')) { pc--; if (!pc && end == -1) @@ -63,14 +66,14 @@ bool PostgreSqlGenerator::readInsideParentese(QString &text, QString &out) return false; } -bool PostgreSqlGenerator::isPostGisType(const QVariant::Type &t) const +bool PostgreSqlGenerator::isPostGisType(const QMetaType::Type &t) const { - return t == QVariant::Point - || t == QVariant::PointF - || t == QVariant::Rect - || t == QVariant::RectF - || t == QVariant::Polygon - || t == QVariant::PolygonF; + return t == QMetaType::QPoint + || t == QMetaType::QPointF + || t == QMetaType::QRect + || t == QMetaType::QRectF + || t == QMetaType::QPolygon + || t == QMetaType::QPolygonF; } PostgreSqlGenerator::PostgreSqlGenerator(Database *parent) : AbstractSqlGenerator (parent) @@ -189,13 +192,16 @@ QString PostgreSqlGenerator::fieldType(FieldModel *field) return dbType; } -QString PostgreSqlGenerator::diff(FieldModel *oldField, FieldModel *newField) +QString PostgreSqlGenerator::diffField(FieldModel *oldField, FieldModel *newField) { - QString sql = QString(); + if(!oldField && !newField) + return QString(); + if(oldField && newField) if(*oldField == *newField) return QString(); + QString sql = QString(); if(!newField){ sql = QStringLiteral("DROP COLUMN ") + oldField->name; }else{ @@ -212,25 +218,25 @@ QString PostgreSqlGenerator::diff(FieldModel *oldField, FieldModel *newField) QString PostgreSqlGenerator::escapeValue(const QVariant &v) const { - if (v.type() == QVariant::Time) + if (VARIANT_TYPE_COMPARE(v, Time)) return v.toTime().toString(QStringLiteral("''HH:mm:ss''")); - if (v.type() == QVariant::Date) + if (VARIANT_TYPE_COMPARE(v, Date)) return v.toDate().toString(QStringLiteral("''yyyy-MM-dd''")); - if (v.type() == QVariant::DateTime) + if (VARIANT_TYPE_COMPARE(v, DateTime)) return v.toDateTime().toString(QStringLiteral("''yyyy-MM-dd HH:mm:ss''")); - if (v.type() == QVariant::StringList) + if (VARIANT_TYPE_COMPARE(v, StringList)) return QStringLiteral("'{") + v.toStringList().join(QStringLiteral(",")) + QStringLiteral("}'"); - if (v.type() == QVariant::Point) { + if (VARIANT_TYPE_COMPARE(v, Point)) { QPoint pt = v.toPoint(); return QStringLiteral("point(%1, %2)").arg(pt.x()).arg(pt.y()); } - if (v.type() == QVariant::PointF) { + if (VARIANT_TYPE_COMPARE(v, PointF)) { QPointF pt = v.toPointF(); return QStringLiteral("point(%1, %2)").arg(pt.x()).arg(pt.y()); } @@ -241,7 +247,7 @@ QString PostgreSqlGenerator::escapeValue(const QVariant &v) const } #ifdef QT_GUI_LIB - if (v.type() == QVariant::Polygon) { + if (VARIANT_TYPE_COMPARE(v, Polygon)) { QString ret; QPoint pt; QPolygon pol = v.value(); @@ -254,7 +260,7 @@ QString PostgreSqlGenerator::escapeValue(const QVariant &v) const } return QStringLiteral("'((") + ret + QStringLiteral("))'"); } - if (v.type() == QVariant::PolygonF) { + if (VARIANT_TYPE_COMPARE(v, PolygonF)) { QString ret; QPointF pt; QPolygonF pol = v.value(); @@ -287,20 +293,20 @@ QVariant PostgreSqlGenerator::unescapeValue(const QMetaType::Type &type, const Q return AbstractSqlGenerator::unescapeValue(QMetaType::QPoint, dbValue.toString() .replace(QStringLiteral("("), - QStringLiteral("")) + QLatin1String()) .replace(QStringLiteral(")"), - QStringLiteral(""))); + QLatin1String())); if (type == QMetaType::QPointF) return AbstractSqlGenerator::unescapeValue(QMetaType::QPointF, dbValue.toString() .replace(QStringLiteral("("), - QStringLiteral("")) + QLatin1String()) .replace(QStringLiteral(")"), - QStringLiteral(""))); + QLatin1String())); if (type == QMetaType::QStringList) return dbValue.toString() - .replace(QStringLiteral("{"), QStringLiteral("")) - .replace(QStringLiteral("}"), QStringLiteral("")) + .replace(QStringLiteral("{"), QLatin1String()) + .replace(QStringLiteral("}"), QLatin1String()) .split(QStringLiteral(",")); #ifdef QT_GUI_LIB @@ -340,6 +346,17 @@ QVariant PostgreSqlGenerator::unescapeValue(const QMetaType::Type &type, const Q return AbstractSqlGenerator::unescapeValue(type, dbValue); } +void PostgreSqlGenerator::appendSkipTake(QString &sql, int skip, int take) +{ + if (take > 0 && skip > 0) { + sql.append(QStringLiteral(" LIMIT %1 OFFSET %2") + .arg(take) + .arg(skip)); + } else if (take > 0) { + sql.append(QStringLiteral(" LIMIT %1").arg(take)); + } +} + QString PostgreSqlGenerator::createConditionalPhrase(const PhraseData *d) const { if (!d) @@ -353,7 +370,7 @@ QString PostgreSqlGenerator::createConditionalPhrase(const PhraseData *d) const } if (d->type == PhraseData::WithVariant) { - if (isPostGisType(d->operand.type()) && d->operatorCond == PhraseData::Equal) { + if (isPostGisType(METATYPE_ID(d->operand)) && d->operatorCond == PhraseData::Equal) { return QStringLiteral("%1 ~= %2") .arg(AbstractSqlGenerator::createConditionalPhrase(d->left), escapeValue(d->operand)); @@ -402,3 +419,5 @@ QString PostgreSqlGenerator::createConditionalPhrase(const PhraseData *d) const } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/generators/postgresqlgenerator.h b/src/nut/generators/postgresqlgenerator.h index 7d5865b..5345394 100644 --- a/src/nut/generators/postgresqlgenerator.h +++ b/src/nut/generators/postgresqlgenerator.h @@ -25,30 +25,33 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class NUT_EXPORT PostgreSqlGenerator : public AbstractSqlGenerator { private: bool readInsideParentese(QString &text, QString &out); - bool isPostGisType(const QVariant::Type &t) const; + bool isPostGisType(const QMetaType::Type &t) const; + public: explicit PostgreSqlGenerator(Database *parent = nullptr); QString fieldType(FieldModel *field) override; - QString diff(FieldModel *oldField, FieldModel *newField) override; + QString diffField(FieldModel *oldField, FieldModel *newField) override; - // SqlGeneratorBase interface -public: QString escapeValue(const QVariant &v) const override; QVariant unescapeValue(const QMetaType::Type &type, const QVariant &dbValue) override; + void appendSkipTake(QString &sql, int skip = -1, int take = -1) override; - // SqlGeneratorBase interface protected: QString createConditionalPhrase(const PhraseData *d) const override; }; NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // POSTGRESQLGENERATOR_H diff --git a/src/nut/generators/sqlitegenerator.cpp b/src/nut/generators/sqlitegenerator.cpp index 6a01311..2b34db5 100644 --- a/src/nut/generators/sqlitegenerator.cpp +++ b/src/nut/generators/sqlitegenerator.cpp @@ -21,6 +21,9 @@ #include "sqlitegenerator.h" #include "table.h" #include "tablemodel.h" +#include "nut_p.h" + +QT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE @@ -116,15 +119,18 @@ bool SqliteGenerator::supportAutoIncrement(const QMetaType::Type &type) } -QStringList SqliteGenerator::diff(TableModel *oldTable, TableModel *newTable) +QStringList SqliteGenerator::diffTable(TableModel *oldTable, TableModel *newTable) { QStringList ret; + if (!oldTable && !newTable) + return ret; + if (oldTable && newTable) if (*oldTable == *newTable) return ret; - QStringList newTableSql = AbstractSqlGenerator::diff(nullptr, newTable); + QStringList newTableSql = AbstractSqlGenerator::diffTable(nullptr, newTable); if (!newTable) return QStringList() << QStringLiteral("DROP TABLE ") + oldTable->name(); @@ -135,22 +141,22 @@ QStringList SqliteGenerator::diff(TableModel *oldTable, TableModel *newTable) QList fieldNames; QList relations; - Q_FOREACH (FieldModel *f, oldTable->fields()) + for (auto &f: oldTable->fields()) if (!fieldNames.contains(f->name)) fieldNames.append(f->name); - Q_FOREACH (RelationModel *r, oldTable->foreignKeys()) + for (auto &r: oldTable->foreignKeys()) if (!relations.contains(r->localColumn)) relations.append(r->localColumn); - Q_FOREACH (FieldModel *f, newTable->fields()) + for (auto &f: newTable->fields()) if (!fieldNames.contains(f->name)) fieldNames.append(f->name); - Q_FOREACH (RelationModel *r, newTable->foreignKeys()) + for (auto &r: newTable->foreignKeys()) if (!relations.contains(r->localColumn)) relations.append(r->localColumn); QString columns; - Q_FOREACH (FieldModel *f, oldTable->fields()) { + for (auto &f: oldTable->fields()) { if (!newTable->field(f->name)) continue; @@ -238,9 +244,8 @@ QString SqliteGenerator::createConditionalPhrase(const PhraseData *d) const int i = d->operand.toInt(); return QStringLiteral("DATE(%1,'%2 %3')") .arg(createConditionalPhrase(d->left), - (i < 0 ? QStringLiteral("") : QStringLiteral("+")) + QString::number(i), + (i < 0 ? QLatin1String() : QStringLiteral("+")) + QString::number(i), dateTimePartName(op)); - break; } case PhraseData::AddHours: case PhraseData::AddMinutes: @@ -248,9 +253,8 @@ QString SqliteGenerator::createConditionalPhrase(const PhraseData *d) const int i = d->operand.toInt(); return QStringLiteral("TIME(%1,'%2 %3')") .arg(createConditionalPhrase(d->left), - (i < 0 ? QStringLiteral("") : QStringLiteral("+")) + QString::number(i), + (i < 0 ? QLatin1String() : QStringLiteral("+")) + QString::number(i), dateTimePartName(op)); - break; } case PhraseData::AddYearsDateTime: case PhraseData::AddMonthsDateTime: @@ -261,7 +265,7 @@ QString SqliteGenerator::createConditionalPhrase(const PhraseData *d) const int i = d->operand.toInt(); return QStringLiteral("DATETIME(%1,'%2 %3')") .arg(createConditionalPhrase(d->left), - (i < 0 ? QStringLiteral("") : QStringLiteral("+")) + QString::number(i), + (i < 0 ? QLatin1String() : QStringLiteral("+")) + QString::number(i), dateTimePartName(op)); break; } @@ -308,13 +312,13 @@ QString SqliteGenerator::createConditionalPhrase(const PhraseData *d) const QString SqliteGenerator::escapeValue(const QVariant &v) const { - if (v.type() == QVariant::Time) + if (VARIANT_TYPE_COMPARE(v, Time)) return v.toTime().toString(QStringLiteral("''HH:mm:ss''")); - if (v.type() == QVariant::Date) + if (VARIANT_TYPE_COMPARE(v, Date)) return v.toDate().toString(QStringLiteral("''yyyy-MM-dd''")); - if (v.type() == QVariant::DateTime) + if (VARIANT_TYPE_COMPARE(v, DateTime)) return v.toDateTime().toString(QStringLiteral("''yyyy-MM-dd HH:mm:ss''")); return AbstractSqlGenerator::escapeValue(v); @@ -335,3 +339,5 @@ QVariant SqliteGenerator::unescapeValue(const QMetaType::Type &type, const QVari } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/generators/sqlitegenerator.h b/src/nut/generators/sqlitegenerator.h index 693f379..751ed9f 100644 --- a/src/nut/generators/sqlitegenerator.h +++ b/src/nut/generators/sqlitegenerator.h @@ -25,6 +25,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class NUT_EXPORT SqliteGenerator : public AbstractSqlGenerator @@ -40,7 +42,7 @@ public: void appendSkipTake(QString &sql, int skip, int take) override; QString primaryKeyConstraint(const TableModel *table) const override; - QStringList diff(TableModel *oldTable, TableModel *newTable) override; + QStringList diffTable(TableModel *oldTable, TableModel *newTable) override; QString createConditionalPhrase(const PhraseData *d) const override; @@ -50,4 +52,6 @@ public: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // SQLITEGENERATOR_H diff --git a/src/nut/generators/sqlservergenerator.cpp b/src/nut/generators/sqlservergenerator.cpp index dc86698..6dced57 100644 --- a/src/nut/generators/sqlservergenerator.cpp +++ b/src/nut/generators/sqlservergenerator.cpp @@ -21,10 +21,13 @@ #include "sqlservergenerator.h" #include "table.h" #include "tablemodel.h" +#include "nut_p.h" #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE SqlServerGenerator::SqlServerGenerator(Database *parent) @@ -37,7 +40,7 @@ QString SqlServerGenerator::masterDatabaseName(QString databaseName) return databaseName.replace( QRegularExpression(QStringLiteral("DATABASE\\=(\\w+)"), QRegularExpression::CaseInsensitiveOption), - QStringLiteral("DATABASE=")); + QStringLiteral("DATABASE=master")); } QString SqlServerGenerator::fieldType(FieldModel *field) @@ -130,13 +133,16 @@ QString SqlServerGenerator::fieldType(FieldModel *field) } } -QString SqlServerGenerator::diff(FieldModel *oldField, FieldModel *newField) +QString SqlServerGenerator::diffField(FieldModel *oldField, FieldModel *newField) { - QString sql = QString(); + if (!oldField && !newField) + return QString(); + if (oldField && newField) if (*oldField == *newField) - return sql; + return QString(); + QString sql = QString(); if (!newField) { sql = QStringLiteral("DROP COLUMN ") + oldField->name; } else { @@ -152,44 +158,44 @@ QString SqlServerGenerator::diff(FieldModel *oldField, FieldModel *newField) QString SqlServerGenerator::escapeValue(const QVariant &v) const { - switch (v.type()) { - case QVariant::String: - case QVariant::Char: - case QVariant::Polygon: - case QVariant::PolygonF: - case QVariant::Size: - case QVariant::SizeF: - case QVariant::Rect: - case QVariant::RectF: - case QVariant::Line: - case QVariant::LineF: - case QVariant::Color: - case QVariant::StringList: -// case QVariant::JsonArray: -// case QVariant::JsonValue: -// case QVariant::JsonObject: -// case QVariant::JsonDocument: - case QVariant::Url: + switch (METATYPE_ID(v)) { + case QMetaType::QString: + case QMetaType::QChar: + case QMetaType::QPolygon: + case QMetaType::QPolygonF: + case QMetaType::QSize: + case QMetaType::QSizeF: + case QMetaType::QRect: + case QMetaType::QRectF: + case QMetaType::QLine: + case QMetaType::QLineF: + case QMetaType::QColor: + case QMetaType::QStringList: +// case QMetaType::QJsonArray: +// case QMetaType::QJsonValue: +// case QMetaType::QJsonObject: +// case QMetaType::QJsonDocument: + case QMetaType::QUrl: return QStringLiteral("N") + AbstractSqlGenerator::escapeValue(v); -// case QVariant::Point: { +// case QMetaType::QPoint: { // QPoint pt = v.toPoint(); // return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg( // pt.y()); // } -// case QVariant::PointF: { +// case QMetaType::QPointF: { // QPointF pt = v.toPointF(); // return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg( // pt.y()); // } - case QVariant::Time: + case QMetaType::QTime: return v.toTime().toString(QStringLiteral("''HH:mm:ss''")); - case QVariant::Date: + case QMetaType::QDate: return v.toDate().toString(QStringLiteral("''yyyy-MM-dd''")); - case QVariant::DateTime: + case QMetaType::QDateTime: return v.toDateTime().toString(QStringLiteral("''yyyy-MM-dd HH:mm:ss''")); default: @@ -279,3 +285,5 @@ QString SqlServerGenerator::createConditionalPhrase(const PhraseData *d) const } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/generators/sqlservergenerator.h b/src/nut/generators/sqlservergenerator.h index 6156fe5..60b9672 100644 --- a/src/nut/generators/sqlservergenerator.h +++ b/src/nut/generators/sqlservergenerator.h @@ -25,6 +25,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class NUT_EXPORT SqlServerGenerator : public AbstractSqlGenerator @@ -35,7 +37,7 @@ public: QString masterDatabaseName(QString databaseName) override; QString fieldType(FieldModel *field) override; - QString diff(FieldModel *oldField, FieldModel *newField) override; + QString diffField(FieldModel *oldField, FieldModel *newField) override; QString escapeValue(const QVariant &v) const override; QVariant unescapeValue(const QMetaType::Type &type, const QVariant &dbValue) override; @@ -48,4 +50,6 @@ protected: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // SQLSERVERGENERATOR_H diff --git a/src/nut/models/databasemodel.cpp b/src/nut/models/databasemodel.cpp index 3b878cb..50af8fc 100644 --- a/src/nut/models/databasemodel.cpp +++ b/src/nut/models/databasemodel.cpp @@ -24,6 +24,8 @@ #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE QMap DatabaseModel::_models; @@ -48,7 +50,7 @@ DatabaseModel::DatabaseModel(const QJsonObject &json) : setVersion(json.value(NODE_VERSION).toInt()); QJsonObject tables = json.value(NODE_TABLES).toObject(); - Q_FOREACH (QString key, tables.keys()) { + for (auto &key: tables.keys()) { if(!tables.value(key).isObject()) continue; @@ -146,7 +148,7 @@ RelationModel *DatabaseModel::relationByClassNames(const QString &masterClassNam if(!childTable) return nullptr; - Q_FOREACH (RelationModel *rel, childTable->foreignKeys()) + for (auto &rel: childTable->foreignKeys()) if(rel->masterClassName == masterClassName) return rel; @@ -160,7 +162,7 @@ RelationModel *DatabaseModel::relationByTableNames(const QString &masterTableNam if(!childTable) return nullptr; - Q_FOREACH (RelationModel *rel, childTable->foreignKeys()) + for (auto &rel: childTable->foreignKeys()) if(rel->masterTable->name() == masterTableName) return rel; @@ -174,7 +176,7 @@ DatabaseModel DatabaseModel::fromJson(QJsonObject &json) model.setVersion(json.value(NODE_VERSION).toInt()); QJsonObject tables = json.value(NODE_TABLES).toObject(); - Q_FOREACH (QString key, tables.keys()) { + for (auto &key: tables.keys()) { if(!json.value(key).isObject()) continue; @@ -209,8 +211,8 @@ bool DatabaseModel::remove(const QString &tableName) void DatabaseModel::fixRelations() { /*TODO: fixme - Q_FOREACH (TableModel *table, currentModel) - Q_FOREACH (RelationModel *fk, table->foreignKeys()) + for (auto &table: currentModel) + for (auto &fk: table->foreignKeys()) fk->masterTable = currentModel.tableByClassName(fk->masterClassName); */ } @@ -238,12 +240,11 @@ void DatabaseModel::deleteAllModels() DatabaseModel operator +(const DatabaseModel &l, const DatabaseModel &r) { DatabaseModel model; - DatabaseModel::const_iterator i; - for (i = r.constBegin(); i != r.constEnd(); ++i) + for (auto i = r.constBegin(); i != r.constEnd(); ++i) model.append(*i); - for (i = l.constBegin(); i != l.constEnd(); ++i) + for (auto i = l.constBegin(); i != l.constEnd(); ++i) model.append(*i); return model; @@ -252,17 +253,16 @@ DatabaseModel operator +(const DatabaseModel &l, const DatabaseModel &r) DatabaseModel operator |(const DatabaseModel &l, const DatabaseModel &r) { DatabaseModel ret; - DatabaseModel::const_iterator i; QSet tables; - for (i = r.constBegin(); i != r.constEnd(); ++i) { + for (auto i = r.constBegin(); i != r.constEnd(); ++i) { if (tables.contains((*i)->name())) continue; ret.append(*i); tables.insert((*i)->name()); } - for (i = l.constBegin(); i != l.constEnd(); ++i) { + for (auto i = l.constBegin(); i != l.constEnd(); ++i) { if (tables.contains((*i)->name())) continue; ret.append(*i); @@ -273,3 +273,5 @@ DatabaseModel operator |(const DatabaseModel &l, const DatabaseModel &r) } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/models/databasemodel.h b/src/nut/models/databasemodel.h index 3dcbb6c..f226caf 100644 --- a/src/nut/models/databasemodel.h +++ b/src/nut/models/databasemodel.h @@ -18,8 +18,8 @@ ** **************************************************************************/ -#ifndef DATABASEMODEL_H -#define DATABASEMODEL_H +#ifndef DATABASE_MODEL_H +#define DATABASE_MODEL_H #include #include @@ -29,6 +29,8 @@ class QJsonObject; +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class TableModel; @@ -66,7 +68,7 @@ public: bool remove(const QString &tableName); - //TODO: may be private (called from DatabasePrivate::getCurrectSchema only) + //TODO: may be private (called from DatabasePrivate::getCurrentSchema only) void fixRelations(); static DatabaseModel *modelByName(const QString &name); @@ -78,4 +80,6 @@ DatabaseModel operator |(const DatabaseModel &l, const DatabaseModel &r); NUT_END_NAMESPACE -#endif // DATABASEMODEL_H +QT_END_NAMESPACE + +#endif // DATABASE_MODEL_H diff --git a/src/nut/models/sqlmodel.cpp b/src/nut/models/sqlmodel.cpp index 6a58a26..06843b7 100644 --- a/src/nut/models/sqlmodel.cpp +++ b/src/nut/models/sqlmodel.cpp @@ -27,6 +27,8 @@ #include "sqlmodel.h" #include "query.h" +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE SqlModelPrivate::SqlModelPrivate(SqlModel *parent) : q_ptr(parent) @@ -124,3 +126,5 @@ Row
SqlModel::at(const int &i) const } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/models/sqlmodel.h b/src/nut/models/sqlmodel.h index de822cf..4f42272 100644 --- a/src/nut/models/sqlmodel.h +++ b/src/nut/models/sqlmodel.h @@ -27,6 +27,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class Database; @@ -44,9 +46,10 @@ public: // explicit SqlModel(Query *q); explicit SqlModel(Database *database, AbstractTableSet *tableSet, QObject *parent = Q_NULLPTR); - int rowCount(const QModelIndex &parent) const; - int columnCount(const QModelIndex &parent) const; - QVariant data(const QModelIndex &index, int role) const; + int rowCount(const QModelIndex &parent) const override; + int columnCount(const QModelIndex &parent) const override; + QVariant data(const QModelIndex &index, int role) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; template void setTable(RowList rows); @@ -54,7 +57,6 @@ public: void setRows(RowList
rows); void append(Row
table); // void append(Table *table); - QVariant headerData(int section, Qt::Orientation orientation, int role) const; Row
at(const int &i) const; void setRenderer(const std::function &renderer); @@ -67,12 +69,13 @@ template Q_OUTOFLINE_TEMPLATE void SqlModel::setTable(RowList rows) { RowList
tab; - Q_FOREACH (auto t, rows) + for (auto t: rows) tab.append(t); setRows(tab); } - NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // SQLMODEL_H diff --git a/src/nut/models/sqlmodel_p.h b/src/nut/models/sqlmodel_p.h index 0e2dba1..38af843 100644 --- a/src/nut/models/sqlmodel_p.h +++ b/src/nut/models/sqlmodel_p.h @@ -1,3 +1,33 @@ +/************************************************************************** +** +** 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 . +** +**************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Nut API. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + #ifndef SQLMODEL_P_H #define SQLMODEL_P_H @@ -8,6 +38,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class SqlModel; @@ -29,4 +61,6 @@ public: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // SQLMODEL_P_H diff --git a/src/nut/models/tablemodel.cpp b/src/nut/models/tablemodel.cpp index 81cb646..424f9e1 100644 --- a/src/nut/models/tablemodel.cpp +++ b/src/nut/models/tablemodel.cpp @@ -26,6 +26,9 @@ #include "tablemodel.h" #include "nut_global.h" +#include "nut_p.h" + +QT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE @@ -74,7 +77,7 @@ FieldModel *TableModel::field(int n) const FieldModel *TableModel::field(const QString &name) const { - Q_FOREACH (FieldModel *f, _fields) + for (auto &f: _fields) if(f->name == name) return f; @@ -94,7 +97,7 @@ QList TableModel::foreignKeys() const QStringList TableModel::fieldsNames() const { QStringList ret; - Q_FOREACH (FieldModel *f, _fields) + for (auto &f: _fields) ret.append(f->name); return ret; } @@ -106,7 +109,7 @@ bool TableModel::operator ==(const TableModel &t) const{ if(fields().count() != t.fields().count()) return false; - Q_FOREACH (FieldModel *f, _fields) { + for (auto &f: _fields) { FieldModel *tf = t.field(f->name); if(!tf) return false; @@ -129,7 +132,7 @@ TableModel::TableModel(int typeId, const QString &tableName) // if (findByTypeId(typeId)) // return; - const QMetaObject *tableMetaObject = QMetaType::metaObjectForType(typeId); + const QMetaObject *tableMetaObject = QMetaType(typeId).metaObject(); _typeId = typeId; _name = tableName; @@ -162,12 +165,16 @@ TableModel::TableModel(int typeId, const QString &tableName) QMetaProperty fieldProperty = tableMetaObject->property(j); auto name = QString::fromUtf8(fieldProperty.name()); FieldModel *fieldObj = field(name); - Q_FOREACH (FieldModel *f, _fields) + for (auto &f: _fields) if(f->name == name) - f = fieldObj; + fieldObj = f; if(!fieldObj) continue; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + fieldObj->type = static_cast(fieldProperty.metaType().id()); +#else fieldObj->type = static_cast(fieldProperty.type()); +#endif fieldObj->typeName = QString::fromUtf8(fieldProperty.typeName()); } @@ -244,13 +251,17 @@ TableModel::TableModel(const QJsonObject &json, const QString &tableName) : _typ QJsonObject fields = json.value(QStringLiteral(__FIELDS)).toObject(); QJsonObject relations = json.value(QStringLiteral(__FOREIGN_KEYS)).toObject(); - Q_FOREACH (QString key, fields.keys()) { + for (auto &key: fields.keys()) { QJsonObject fieldObject = fields.value(key).toObject(); //TODO: use FieldModel(QJsonObject) ctor auto *f = new FieldModel; f->name = fieldObject.value(QStringLiteral(__NAME)).toString(); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + f->type = static_cast(QMetaType::fromName(fieldObject.value(QStringLiteral(__TYPE)).toString().toLatin1()).id()); +#else f->type = static_cast(QMetaType::type(fieldObject.value(QStringLiteral(__TYPE)).toString().toLatin1().data())); - f->typeName = QString::fromUtf8(QMetaType::typeName(f->type)); +#endif + f->typeName = QString::fromUtf8(METATYPE_TO_NAME(f->type)); if(fieldObject.contains(QStringLiteral(__nut_NOT_NULL))) f->notNull = fieldObject.value(QStringLiteral(__nut_NOT_NULL)).toBool(); @@ -266,7 +277,7 @@ TableModel::TableModel(const QJsonObject &json, const QString &tableName) : _typ _fields.append(f); } - Q_FOREACH (QString key, relations.keys()) { + for (auto &key: relations.keys()) { QJsonObject relObject = fields.value(key).toObject(); _foreignKeys.append(new RelationModel(relObject)); } @@ -284,10 +295,10 @@ QJsonObject TableModel::toJson() const QJsonObject fieldsObj; QJsonObject foreignKeysObj; - Q_FOREACH (FieldModel *f, _fields) { + for (auto &f: _fields) { QJsonObject fieldObj; fieldObj.insert(QStringLiteral(__NAME), f->name); - fieldObj.insert(QStringLiteral(__TYPE), QString::fromUtf8(QVariant::typeToName(f->type))); + fieldObj.insert(QStringLiteral(__TYPE), QString::fromUtf8(METATYPE_TO_NAME(f->type))); if(f->length) fieldObj.insert(QStringLiteral(__nut_LEN), f->length); @@ -309,7 +320,7 @@ QJsonObject TableModel::toJson() const fieldsObj.insert(f->name, fieldObj); } - Q_FOREACH (RelationModel *rel, _foreignKeys) + for (auto &rel: _foreignKeys) foreignKeysObj.insert(rel->localColumn, rel->toJson()); obj.insert(QStringLiteral(__FIELDS), fieldsObj); @@ -320,7 +331,7 @@ QJsonObject TableModel::toJson() const RelationModel *TableModel::foreignKey(const QString &otherTable) const { - Q_FOREACH (RelationModel *fk, _foreignKeys) + for (auto &fk: _foreignKeys) if(fk->masterClassName == otherTable) return fk; @@ -329,7 +340,7 @@ RelationModel *TableModel::foreignKey(const QString &otherTable) const RelationModel *TableModel::foreignKeyByField(const QString &fieldName) const { - Q_FOREACH (RelationModel *fk, _foreignKeys) + for (auto &fk: _foreignKeys) if(fk->localColumn == fieldName) return fk; @@ -339,9 +350,9 @@ RelationModel *TableModel::foreignKeyByField(const QString &fieldName) const QString TableModel::toString() const { QStringList sl; - Q_FOREACH (FieldModel *f, _fields) + for (auto &f: _fields) sl.append(f->name + QStringLiteral(" ") - + QString::fromUtf8(QVariant::typeToName(f->type))); + + QString::fromUtf8(METATYPE_TO_NAME(f->type))); QString ret = QStringLiteral("%1 (%2)") .arg(_name, sl.join(QStringLiteral(", "))); @@ -350,7 +361,7 @@ QString TableModel::toString() const QString TableModel::primaryKey() const { - Q_FOREACH (FieldModel *f, _fields) + for (auto &f: _fields) if(f->isPrimaryKey) return f->name; return QString(); @@ -381,7 +392,7 @@ QJsonObject FieldModel::toJson() const { QJsonObject fieldObj; fieldObj.insert(QStringLiteral(__NAME), name); - fieldObj.insert(QStringLiteral(__TYPE), QString::fromUtf8(QVariant::typeToName(type))); + fieldObj.insert(QStringLiteral(__TYPE), QString::fromUtf8(METATYPE_TO_NAME(type))); fieldObj.insert(QStringLiteral(__nut_LEN), length); fieldObj.insert(QStringLiteral(__nut_NOT_NULL), notNull); fieldObj.insert(QStringLiteral(__nut_UNIQUE), isUnique); @@ -424,3 +435,5 @@ bool operator !=(const RelationModel &l, const RelationModel &r) } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/models/tablemodel.h b/src/nut/models/tablemodel.h index 54a28e1..bd76bc6 100644 --- a/src/nut/models/tablemodel.h +++ b/src/nut/models/tablemodel.h @@ -28,6 +28,8 @@ class QJsonObject; +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class TableModel; @@ -135,4 +137,6 @@ private: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // TABLEMODEL_H diff --git a/src/nut/nut.pri b/src/nut/nut.pri index 0493622..12007fb 100644 --- a/src/nut/nut.pri +++ b/src/nut/nut.pri @@ -16,4 +16,3 @@ HEADERS += \ SOURCES += \ $$PWD/phrase.cpp -include($$PWD/3rdparty/serializer/src/src.pri) diff --git a/src/nut/nut.pro b/src/nut/nut.pro index 1b83798..2158f76 100644 --- a/src/nut/nut.pro +++ b/src/nut/nut.pro @@ -17,11 +17,11 @@ include(phrases/phrases.pri) include(models/models.pri) HEADERS += \ - $$PWD/phrase.h + $$PWD/phrase.h \ + $$PWD/nut_p.h SOURCES += \ $$PWD/phrase.cpp load(qt_module) -include($$PWD/3rdparty/serializer/src/src.pri) diff --git a/src/nut/nut_p.h b/src/nut/nut_p.h new file mode 100644 index 0000000..61371d8 --- /dev/null +++ b/src/nut/nut_p.h @@ -0,0 +1,48 @@ +/************************************************************************** +** +** 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 . +** +**************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Nut API. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + +#ifndef NUT_P_H +#define NUT_P_H + +#include + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +# define VARIANT_TYPE_COMPARE(v, t) v.typeId() == QMetaType::Q##t +# define VARIANT_TYPE_COMPARE_X(v, vt, mt) v.typeId() == QMetaType::mt +# define METATYPE_TO_NAME(type) QMetaType(type).name() +# define METATYPE_ID(v) static_cast(v.typeId()) +#else +# define VARIANT_TYPE_COMPARE(v, t) v.type() == QVariant::t +# define VARIANT_TYPE_COMPARE_X(v, vt, mt) v.type() == QVariant::vt +# define METATYPE_TO_NAME(type) QMetaType::typeName(type) +# define METATYPE_ID(v) static_cast(v.type()) +#endif + +#endif diff --git a/src/nut/phrase.cpp b/src/nut/phrase.cpp index 1f47186..672da3a 100644 --- a/src/nut/phrase.cpp +++ b/src/nut/phrase.cpp @@ -19,3 +19,6 @@ **************************************************************************/ #include "phrase.h" + +QT_BEGIN_NAMESPACE +QT_END_NAMESPACE diff --git a/src/nut/phrase.h b/src/nut/phrase.h index c517ccb..60c9a8a 100644 --- a/src/nut/phrase.h +++ b/src/nut/phrase.h @@ -21,6 +21,9 @@ #ifndef PHRASE_H #define PHRASE_H +#include + + #include #include #include @@ -35,4 +38,7 @@ #include #include +QT_BEGIN_NAMESPACE +QT_END_NAMESPACE + #endif // PHRASE_H diff --git a/src/nut/phrases/abstractfieldphrase.cpp b/src/nut/phrases/abstractfieldphrase.cpp index d7a6af4..edee043 100644 --- a/src/nut/phrases/abstractfieldphrase.cpp +++ b/src/nut/phrases/abstractfieldphrase.cpp @@ -21,6 +21,8 @@ #include "abstractfieldphrase.h" #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE AbstractFieldPhrase::AbstractFieldPhrase(PhraseData *d) : data(d) @@ -137,3 +139,5 @@ AbstractFieldPhrase AbstractFieldPhrase::operator !() } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/phrases/abstractfieldphrase.h b/src/nut/phrases/abstractfieldphrase.h index 76e77ef..51c0c05 100644 --- a/src/nut/phrases/abstractfieldphrase.h +++ b/src/nut/phrases/abstractfieldphrase.h @@ -26,6 +26,8 @@ #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class PhraseData; @@ -46,7 +48,7 @@ public: ConditionalPhrase in(QList list) { QVariantList vlist; - Q_FOREACH (T t, list) + for (auto &t: list) vlist.append(QVariant::fromValue(t)); return ConditionalPhrase(this, PhraseData::In, vlist); @@ -87,4 +89,6 @@ protected: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // ABSTRACTFIELDPHRASE_H diff --git a/src/nut/phrases/assignmentphrase.cpp b/src/nut/phrases/assignmentphrase.cpp index f74d458..6200829 100644 --- a/src/nut/phrases/assignmentphrase.cpp +++ b/src/nut/phrases/assignmentphrase.cpp @@ -22,6 +22,8 @@ #include "assignmentphrase.h" #include "phrasedata.h" +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE AssignmentPhrase::AssignmentPhrase(PhraseData *d) : data(d) @@ -61,3 +63,5 @@ AssignmentPhrase::~AssignmentPhrase() } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/phrases/assignmentphrase.h b/src/nut/phrases/assignmentphrase.h index 8eeb244..813a8f2 100644 --- a/src/nut/phrases/assignmentphrase.h +++ b/src/nut/phrases/assignmentphrase.h @@ -23,6 +23,9 @@ #include #include +#include + +QT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE @@ -45,5 +48,6 @@ public: }; NUT_END_NAMESPACE +QT_END_NAMESPACE #endif // ASSIGNMENTPHRASE_H diff --git a/src/nut/phrases/assignmentphraselist.cpp b/src/nut/phrases/assignmentphraselist.cpp index 135be2e..a57489b 100644 --- a/src/nut/phrases/assignmentphraselist.cpp +++ b/src/nut/phrases/assignmentphraselist.cpp @@ -22,8 +22,9 @@ #include "phrasedata.h" #include "assignmentphrase.h" -NUT_BEGIN_NAMESPACE +QT_BEGIN_NAMESPACE +NUT_BEGIN_NAMESPACE AssignmentPhraseList AssignmentPhrase::operator &(const AssignmentPhrase &other) { @@ -68,18 +69,14 @@ AssignmentPhraseList AssignmentPhraseList::operator &(const AssignmentPhrase AssignmentPhraseList::~AssignmentPhraseList() { -// Q_FOREACH (PhraseData *d, data) -// if (!d->ref.deref()) -// delete d; -// qDeleteAll(data); - // data.clear(); } void AssignmentPhraseList::incAllDataParents() { - Q_FOREACH (PhraseData *d, data) + for (auto &d: data) d->ref.ref(); } - NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/phrases/assignmentphraselist.h b/src/nut/phrases/assignmentphraselist.h index 1e7c2b4..aa42507 100644 --- a/src/nut/phrases/assignmentphraselist.h +++ b/src/nut/phrases/assignmentphraselist.h @@ -23,6 +23,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class PhraseData; @@ -47,4 +49,6 @@ private: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // ASSIGNMENTPHRASELIST_H diff --git a/src/nut/phrases/conditionalphrase.cpp b/src/nut/phrases/conditionalphrase.cpp index 28c3f81..eecac5e 100644 --- a/src/nut/phrases/conditionalphrase.cpp +++ b/src/nut/phrases/conditionalphrase.cpp @@ -24,6 +24,8 @@ #include "conditionalphrase.h" #include "phrasedata.h" +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE ConditionalPhrase::ConditionalPhrase() : data(nullptr) @@ -232,3 +234,5 @@ ConditionalPhrase operator >=(ConditionalPhrase &&l, ConditionalPhrase &&r) } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/phrases/conditionalphrase.h b/src/nut/phrases/conditionalphrase.h index 33d2ad7..35472d0 100644 --- a/src/nut/phrases/conditionalphrase.h +++ b/src/nut/phrases/conditionalphrase.h @@ -23,6 +23,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class PhraseData; @@ -89,7 +91,8 @@ ConditionalPhrase NUT_EXPORT operator <=(ConditionalPhrase &&l, ConditionalPhras ConditionalPhrase NUT_EXPORT operator >(ConditionalPhrase &&l, ConditionalPhrase &&r); ConditionalPhrase NUT_EXPORT operator >=(ConditionalPhrase &&l, ConditionalPhrase &&r); - NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // CONDITIONALPHRASE_H diff --git a/src/nut/phrases/fieldphrase.h b/src/nut/phrases/fieldphrase.h index 909cc4f..5f44dd8 100644 --- a/src/nut/phrases/fieldphrase.h +++ b/src/nut/phrases/fieldphrase.h @@ -24,6 +24,8 @@ #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE template @@ -60,4 +62,6 @@ Q_OUTOFLINE_TEMPLATE ConditionalPhrase FieldPhrase::operator ==(const QVarian NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // FIELDPHRASE_H diff --git a/src/nut/phrases/fieldphrase_bool.cpp b/src/nut/phrases/fieldphrase_bool.cpp index c8d6716..8987d19 100644 --- a/src/nut/phrases/fieldphrase_bool.cpp +++ b/src/nut/phrases/fieldphrase_bool.cpp @@ -1,6 +1,6 @@ #include "fieldphrase_bool.h" -NUT_BEGIN_NAMESPACE +QT_BEGIN_NAMESPACE -NUT_END_NAMESPACE +QT_END_NAMESPACE diff --git a/src/nut/phrases/fieldphrase_bool.h b/src/nut/phrases/fieldphrase_bool.h index eb7277c..a74a7d8 100644 --- a/src/nut/phrases/fieldphrase_bool.h +++ b/src/nut/phrases/fieldphrase_bool.h @@ -5,6 +5,8 @@ #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE template<> @@ -35,4 +37,6 @@ public: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // NUT_FIELDPHRASE_BOOL_H diff --git a/src/nut/phrases/fieldphrase_date.cpp b/src/nut/phrases/fieldphrase_date.cpp index aae3bf4..40e541e 100644 --- a/src/nut/phrases/fieldphrase_date.cpp +++ b/src/nut/phrases/fieldphrase_date.cpp @@ -20,6 +20,8 @@ #include "fieldphrase_date.h" +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE FieldPhrase::FieldPhrase(const char *className, const char *s) : @@ -145,3 +147,5 @@ COMMON_OPERATORS_IMPL(QTime) COMMON_OPERATORS_IMPL(QDateTime) NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/phrases/fieldphrase_date.h b/src/nut/phrases/fieldphrase_date.h index b76cd1e..c596a93 100644 --- a/src/nut/phrases/fieldphrase_date.h +++ b/src/nut/phrases/fieldphrase_date.h @@ -26,6 +26,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE #define COMMON_OPERATORS_DECL(T) \ @@ -121,4 +123,6 @@ public: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // DATEPHRASE_H diff --git a/src/nut/phrases/fieldphrase_qstring.h b/src/nut/phrases/fieldphrase_qstring.h index 754d971..68d27ab 100644 --- a/src/nut/phrases/fieldphrase_qstring.h +++ b/src/nut/phrases/fieldphrase_qstring.h @@ -5,6 +5,8 @@ #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE template<> @@ -36,4 +38,6 @@ public: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // NUT_FIELDPHRASE_QSTRING_H diff --git a/src/nut/phrases/numericphrase.h b/src/nut/phrases/numericphrase.h index e7e7bbb..1c2c071 100644 --- a/src/nut/phrases/numericphrase.h +++ b/src/nut/phrases/numericphrase.h @@ -5,6 +5,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE #define SPECIALIZATION_NUMERIC_MEMBER(type, op, cond) \ @@ -85,4 +87,6 @@ SPECIALIZATION_NUMERIC_TYPE(float) NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // NUMERICPHRASE_H diff --git a/src/nut/phrases/phrasedata.cpp b/src/nut/phrases/phrasedata.cpp index cc04aca..9e90781 100644 --- a/src/nut/phrases/phrasedata.cpp +++ b/src/nut/phrases/phrasedata.cpp @@ -20,18 +20,20 @@ #include "phrasedata.h" +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE PhraseData::PhraseData() : className(""), fieldName(""), type(Field), operatorCond(NotAssign), - left(nullptr), right(nullptr), operand(QVariant::Invalid), isNot(false), + left(nullptr), right(nullptr), operand(), 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), ref(1) + operand(), isNot(false), ref(1) { } PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o) @@ -115,3 +117,5 @@ void PhraseData::cleanUp(PhraseData *d) } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/phrases/phrasedata.h b/src/nut/phrases/phrasedata.h index 48937ab..bd1dde6 100644 --- a/src/nut/phrases/phrasedata.h +++ b/src/nut/phrases/phrasedata.h @@ -23,6 +23,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class NUT_EXPORT PhraseData @@ -122,4 +124,6 @@ private: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // PHRASEDATA_H diff --git a/src/nut/phrases/phrasedatalist.cpp b/src/nut/phrases/phrasedatalist.cpp index 34cf6ae..f2ebaae 100644 --- a/src/nut/phrases/phrasedatalist.cpp +++ b/src/nut/phrases/phrasedatalist.cpp @@ -20,6 +20,8 @@ #include "phrasedatalist.h" +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE PhraseDataList::PhraseDataList() : QList() @@ -43,7 +45,7 @@ void PhraseDataList::append(PhraseData *d) void PhraseDataList::append(QList &dl) { - Q_FOREACH (PhraseData *d, dl) + for (auto &d: dl) d->ref.ref(); QList::append(dl); } @@ -59,3 +61,5 @@ PhraseDataList::~PhraseDataList() } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/phrases/phrasedatalist.h b/src/nut/phrases/phrasedatalist.h index a7b6fda..bc71706 100644 --- a/src/nut/phrases/phrasedatalist.h +++ b/src/nut/phrases/phrasedatalist.h @@ -23,6 +23,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class NUT_EXPORT PhraseDataList : public QList @@ -37,4 +39,6 @@ public: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // PHRASEDATALIST_H diff --git a/src/nut/phrases/phraselist.cpp b/src/nut/phrases/phraselist.cpp index 285ba37..aabf560 100644 --- a/src/nut/phrases/phraselist.cpp +++ b/src/nut/phrases/phraselist.cpp @@ -21,6 +21,8 @@ #include "abstractfieldphrase.h" #include "phraselist.h" +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE PhraseList::PhraseList() : isValid(false) @@ -83,7 +85,7 @@ PhraseList PhraseList::operator |(const AbstractFieldPhrase &other) { void PhraseList::incAllDataParents() { -// Q_FOREACH (PhraseData *d, data) +// for (auto &d: data) // d->parents++; } @@ -92,3 +94,5 @@ PhraseList PhraseList::operator |(PhraseList &other) { } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/phrases/phraselist.h b/src/nut/phrases/phraselist.h index 5c02818..bfba8ca 100644 --- a/src/nut/phrases/phraselist.h +++ b/src/nut/phrases/phraselist.h @@ -24,6 +24,8 @@ #include #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class AbstractFieldPhrase; @@ -51,4 +53,6 @@ private: NUT_END_NAMESPACE +QT_END_NAMESPACE + #endif // PHRASELIST_H diff --git a/src/nut/types/dbgeography.cpp b/src/nut/types/dbgeography.cpp index a0fdbc0..cea5248 100644 --- a/src/nut/types/dbgeography.cpp +++ b/src/nut/types/dbgeography.cpp @@ -20,6 +20,8 @@ #include "dbgeography.h" +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE DbGeography::DbGeography() : m_longitude(0), m_latitude(0) @@ -79,3 +81,5 @@ DbGeography::operator QVariant() } NUT_END_NAMESPACE + +QT_END_NAMESPACE diff --git a/src/nut/types/dbgeography.h b/src/nut/types/dbgeography.h index f3a4747..7f0d935 100644 --- a/src/nut/types/dbgeography.h +++ b/src/nut/types/dbgeography.h @@ -27,6 +27,8 @@ #include +QT_BEGIN_NAMESPACE + NUT_BEGIN_NAMESPACE class NUT_EXPORT DbGeography @@ -50,6 +52,8 @@ public: NUT_END_NAMESPACE +QT_END_NAMESPACE + Q_DECLARE_METATYPE(NUT_WRAP_NAMESPACE(DbGeography)) #endif // DBGEOGRAPHY_H diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..2214137 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,7 @@ +# Generated from tests.pro. + +if(QT_BUILD_STANDALONE_TESTS) + # Add qt_find_package calls for extra dependencies that need to be found when building + # the standalone tests here. +endif() +qt_build_tests() diff --git a/tests/auto/CMakeLists.txt b/tests/auto/CMakeLists.txt new file mode 100644 index 0000000..787de99 --- /dev/null +++ b/tests/auto/CMakeLists.txt @@ -0,0 +1,13 @@ +# Generated from auto.pro. + +add_subdirectory(tst_basic) +add_subdirectory(tst_benckmark) +add_subdirectory(tst_datatypes) +add_subdirectory(tst_phrases) +add_subdirectory(tst_properties) +add_subdirectory(tst_qttypes) +add_subdirectory(tst_quuid) +add_subdirectory(tst_generators) +add_subdirectory(tst_upgrades) +add_subdirectory(tst_json) +add_subdirectory(tst_datetime) diff --git a/tests/auto/common/comment.h b/tests/auto/common/comment.h index e85720d..ecdbb31 100644 --- a/tests/auto/common/comment.h +++ b/tests/auto/common/comment.h @@ -4,13 +4,19 @@ #include #include #include +#include #ifdef NUT_NAMESPACE using namespace NUT_NAMESPACE; #endif -class Post; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +Q_MOC_INCLUDE("user.h") +Q_MOC_INCLUDE("post.h") +#endif + class User; +class Post; class Comment : public Table { Q_OBJECT diff --git a/tests/auto/common/consts.h b/tests/auto/common/consts.h index 7ccd623..7f311fe 100644 --- a/tests/auto/common/consts.h +++ b/tests/auto/common/consts.h @@ -13,18 +13,17 @@ .arg(QString::fromUtf8(__func__)) -/*#define DRIVER QStringLiteral("QSQLITE") -#define HOST QString() -#define USERNAME QString() -#define PASSWORD QString() -*/ +#define DATABASE QStringLiteral("nut_test_%1_db") \ +.arg(QString::fromUtf8(metaObject()->className())).toLower() +#include "test_params.h" + +/* #define DRIVER QStringLiteral("QMYSQL") #define HOST QStringLiteral("192.168.10.2") #define USERNAME QStringLiteral("root") #define PASSWORD QStringLiteral("lDexDJGvQwx20sfgtsetDSupmn9") +*/ -#define DATABASE QStringLiteral("nut_test_%1_db") \ - .arg(QString::fromUtf8(metaObject()->className())).toLower() #ifdef Q_OS_LINUX # define OS "Linux" diff --git a/tests/auto/common/nut-lib.pri b/tests/auto/common/nut-lib.pri index 83873b9..087315a 100644 --- a/tests/auto/common/nut-lib.pri +++ b/tests/auto/common/nut-lib.pri @@ -1,54 +1,54 @@ contains(debug_and_release, CONFIG): message(debug_and_release) debug_and_release:!ReleaseBuild:!DebugBuild { - runtarget.target = run-tests - runtarget.CONFIG = recursive - runtarget.recurse_target = run-tests - QMAKE_EXTRA_TARGETS += runtarget + runtarget.target = run-tests + runtarget.CONFIG = recursive + runtarget.recurse_target = run-tests + QMAKE_EXTRA_TARGETS += runtarget } else { - oneshell.target = .ONESHELL - QMAKE_EXTRA_TARGETS += oneshell + oneshell.target = .ONESHELL + QMAKE_EXTRA_TARGETS += oneshell - win32:!win32-g++ { - CONFIG(debug, debug|release): outdir_helper = debug - CONFIG(release, debug|release): outdir_helper = release - runtarget.target = run-tests - !compat_test: runtarget.depends += $(DESTDIR_TARGET) - runtarget.commands += set PATH=$$shell_path($$shadowed($$dirname(_QMAKE_CONF_))/bin);$$shell_path($$[QT_INSTALL_BINS]);$(PATH) - runtarget.commands += $$escape_expand(\\n\\t)set QT_PLUGIN_PATH=$$shadowed($$dirname(_QMAKE_CONF_))/plugins;$$[QT_INSTALL_PLUGINS];$(QT_PLUGIN_PATH) - runtarget.commands += $$escape_expand(\\n\\t)set QML2_IMPORT_PATH=$$shadowed($$dirname(_QMAKE_CONF_))/qml;$$[QT_INSTALL_QML];$(QML2_IMPORT_PATH) - !isEmpty(LOGGING_RULES): runtarget.commands += $$escape_expand(\\n\\t)set \"QT_LOGGING_RULES=$$LOGGING_RULES\" - runtarget.commands += $$escape_expand(\\n\\t)if exist $${outdir_helper}\\fail del $${outdir_helper}\\fail - runtarget.commands += $$escape_expand(\\n\\t)start /w call $(DESTDIR_TARGET) ^> $${outdir_helper}\\test.log ^|^| echo FAIL ^> $${outdir_helper}\\fail ^& exit 0 - runtarget.commands += $$escape_expand(\\n\\t)type $${outdir_helper}\\test.log - runtarget.commands += $$escape_expand(\\n\\t)if exist $${outdir_helper}\\fail exit 42 - QMAKE_EXTRA_TARGETS += runtarget - } else { - win32-g++: QMAKE_DIRLIST_SEP = ";" - runtarget.commands += export PATH=\"$$shell_path($$shadowed($$dirname(_QMAKE_CONF_))/bin):$$shell_path($$[QT_INSTALL_BINS]):$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}PATH\" - runtarget.commands += $$escape_expand(\\n\\t)export QT_PLUGIN_PATH=\"$$shadowed($$dirname(_QMAKE_CONF_))/plugins$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_PLUGINS]$${QMAKE_DIRLIST_SEP}$(QT_PLUGIN_PATH)\" - runtarget.commands += $$escape_expand(\\n\\t)export QML2_IMPORT_PATH=\"$$shadowed($$dirname(_QMAKE_CONF_))/qml$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_QML]$${QMAKE_DIRLIST_SEP}$(QML2_IMPORT_PATH)\" - !isEmpty(LOGGING_RULES): runtarget.commands += $$escape_expand(\\n\\t)export QT_LOGGING_RULES=\"$$LOGGING_RULES\" - win32-g++: QMAKE_DIRLIST_SEP = ":" + win32:!win32-g++ { + CONFIG(debug, debug|release): outdir_helper = debug + CONFIG(release, debug|release): outdir_helper = release + runtarget.target = run-tests + !compat_test: runtarget.depends += $(DESTDIR_TARGET) + runtarget.commands += set PATH=$$shell_path($$shadowed($$dirname(_QMAKE_CONF_))/bin);$$shell_path($$[QT_INSTALL_BINS]);$(PATH) + runtarget.commands += $$escape_expand(\\n\\t)set QT_PLUGIN_PATH=$$shadowed($$dirname(_QMAKE_CONF_))/plugins;$$[QT_INSTALL_PLUGINS];$(QT_PLUGIN_PATH) + runtarget.commands += $$escape_expand(\\n\\t)set QML2_IMPORT_PATH=$$shadowed($$dirname(_QMAKE_CONF_))/qml;$$[QT_INSTALL_QML];$(QML2_IMPORT_PATH) + !isEmpty(LOGGING_RULES): runtarget.commands += $$escape_expand(\\n\\t)set \"QT_LOGGING_RULES=$$LOGGING_RULES\" + runtarget.commands += $$escape_expand(\\n\\t)if exist $${outdir_helper}\\fail del $${outdir_helper}\\fail + runtarget.commands += $$escape_expand(\\n\\t)start /w call $(DESTDIR_TARGET) ^> $${outdir_helper}\\test.log ^|^| echo FAIL ^> $${outdir_helper}\\fail ^& exit 0 + runtarget.commands += $$escape_expand(\\n\\t)type $${outdir_helper}\\test.log + runtarget.commands += $$escape_expand(\\n\\t)if exist $${outdir_helper}\\fail exit 42 + QMAKE_EXTRA_TARGETS += runtarget + } else { + win32-g++: QMAKE_DIRLIST_SEP = ";" + runtarget.commands += export PATH=\"$$shell_path($$shadowed($$dirname(_QMAKE_CONF_))/bin):$$shell_path($$[QT_INSTALL_BINS]):$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}PATH\" + runtarget.commands += $$escape_expand(\\n\\t)export QT_PLUGIN_PATH=\"$$shadowed($$dirname(_QMAKE_CONF_))/plugins$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_PLUGINS]$${QMAKE_DIRLIST_SEP}$(QT_PLUGIN_PATH)\" + runtarget.commands += $$escape_expand(\\n\\t)export QML2_IMPORT_PATH=\"$$shadowed($$dirname(_QMAKE_CONF_))/qml$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_QML]$${QMAKE_DIRLIST_SEP}$(QML2_IMPORT_PATH)\" + !isEmpty(LOGGING_RULES): runtarget.commands += $$escape_expand(\\n\\t)export QT_LOGGING_RULES=\"$$LOGGING_RULES\" + win32-g++: QMAKE_DIRLIST_SEP = ":" - linux|win32-g++ { - runtarget.commands += $$escape_expand(\\n\\t)export LD_LIBRARY_PATH=\"$$shadowed($$dirname(_QMAKE_CONF_))/lib$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_LIBS]$${QMAKE_DIRLIST_SEP}$(LD_LIBRARY_PATH)\" - runtarget.commands += $$escape_expand(\\n\\t)export QT_QPA_PLATFORM=minimal - } else:mac { - runtarget.commands += $$escape_expand(\\n\\t)export DYLD_LIBRARY_PATH=\"$$shadowed($$dirname(_QMAKE_CONF_))/lib:$$[QT_INSTALL_LIBS]:$(DYLD_LIBRARY_PATH)\" - runtarget.commands += $$escape_expand(\\n\\t)export DYLD_FRAMEWORK_PATH=\"$$shadowed($$dirname(_QMAKE_CONF_))/lib:$$[QT_INSTALL_LIBS]:$(DYLD_FRAMEWORK_PATH)\" - } - - runtarget.target = run-tests - win32-g++ { - !compat_test: runtarget.depends += $(DESTDIR_TARGET) - runtarget.commands += $$escape_expand(\\n\\t)./$(DESTDIR_TARGET) - } else { - !compat_test: runtarget.depends += $(TARGET) - runtarget.commands += $$escape_expand(\\n\\t)./$(TARGET) - } - QMAKE_EXTRA_TARGETS += runtarget + linux|win32-g++ { + runtarget.commands += $$escape_expand(\\n\\t)export LD_LIBRARY_PATH=\"$$shadowed($$dirname(_QMAKE_CONF_))/lib$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_LIBS]$${QMAKE_DIRLIST_SEP}$(LD_LIBRARY_PATH)\" + runtarget.commands += $$escape_expand(\\n\\t)export QT_QPA_PLATFORM=minimal + } else:mac { + runtarget.commands += $$escape_expand(\\n\\t)export DYLD_LIBRARY_PATH=\"$$shadowed($$dirname(_QMAKE_CONF_))/lib:$$[QT_INSTALL_LIBS]:$(DYLD_LIBRARY_PATH)\" + runtarget.commands += $$escape_expand(\\n\\t)export DYLD_FRAMEWORK_PATH=\"$$shadowed($$dirname(_QMAKE_CONF_))/lib:$$[QT_INSTALL_LIBS]:$(DYLD_FRAMEWORK_PATH)\" } + + runtarget.target = run-tests + win32-g++ { + !compat_test: runtarget.depends += $(DESTDIR_TARGET) + runtarget.commands += $$escape_expand(\\n\\t)./$(DESTDIR_TARGET) + } else { + !compat_test: runtarget.depends += $(TARGET) + runtarget.commands += $$escape_expand(\\n\\t)./$(TARGET) + } + QMAKE_EXTRA_TARGETS += runtarget + } } INCLUDEPATH += $$PWD/../common @@ -57,6 +57,7 @@ QT += nut CONFIG += testcase DEFINES += NUT_PATH=\\\"$$PWD/../../\\\" +DEFINES += NUT_PRINT_DEBUG_INFO runtarget.target = run-tests runtarget.CONFIG = recursive diff --git a/tests/auto/common/post.h b/tests/auto/common/post.h index 41608c9..b2feb75 100644 --- a/tests/auto/common/post.h +++ b/tests/auto/common/post.h @@ -6,11 +6,17 @@ #include #include #include +#include #ifdef NUT_NAMESPACE using namespace NUT_NAMESPACE; #endif +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +Q_MOC_INCLUDE("comment.h") +Q_MOC_INCLUDE("score.h") +#endif + class Comment; class Score; class Post : public Table diff --git a/tests/auto/common/score.cpp b/tests/auto/common/score.cpp index 91881b5..2de623b 100644 --- a/tests/auto/common/score.cpp +++ b/tests/auto/common/score.cpp @@ -2,7 +2,7 @@ #include "user.h" #include "post.h" -Score::Score(QObject *parent) : Nut::Table(parent) +Score::Score(QObject *parent) : NUT_WRAP_NAMESPACE(Table)(parent) { } diff --git a/tests/auto/common/score.h b/tests/auto/common/score.h index 53dfcb6..efcad7c 100644 --- a/tests/auto/common/score.h +++ b/tests/auto/common/score.h @@ -3,10 +3,17 @@ #include #include +#include +#include + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +Q_MOC_INCLUDE("user.h") +Q_MOC_INCLUDE("post.h") +#endif class User; class Post; -class Score : public Nut::Table +class Score : public NUT_WRAP_NAMESPACE(Table) { Q_OBJECT @@ -15,6 +22,8 @@ class Score : public Nut::Table NUT_DECLARE_FIELD(int, score, score, setScore) + NUT_DECLARE_FIELD(int, condition, condition, setCondition) + NUT_FOREIGN_KEY_DECLARE(Post, int, post, post, setPost) NUT_FOREIGN_KEY_DECLARE(User, QUuid, author, author, setAuthor) diff --git a/tests/auto/common/test_params.h b/tests/auto/common/test_params.h new file mode 100644 index 0000000..c1d81c5 --- /dev/null +++ b/tests/auto/common/test_params.h @@ -0,0 +1,4 @@ +#define DRIVER QStringLiteral("QSQLITE") +#define HOST QString() +#define USERNAME QString() +#define PASSWORD QString() diff --git a/tests/auto/common/test_params_mssql.h b/tests/auto/common/test_params_mssql.h new file mode 100644 index 0000000..5bb5c7b --- /dev/null +++ b/tests/auto/common/test_params_mssql.h @@ -0,0 +1,14 @@ +#include + +#ifdef DATABASE +#undef DATABASE +#endif + +#define DATABASE \ + QStringLiteral("DRIVER={SQL Server Native Client 11.0};Server=localhost;DATABASE=nut_test_%1_db;UID=sa;PWD=NUT_sa_PASS_1_???;") \ + .arg(QString::fromUtf8(metaObject()->className()).toLower()) + +#define DRIVER QStringLiteral("QODBC") +#define HOST QLatin1String("") +#define USERNAME QLatin1String("") +#define PASSWORD QLatin1String("") diff --git a/tests/auto/common/test_params_mysql.h b/tests/auto/common/test_params_mysql.h new file mode 100644 index 0000000..94e82f9 --- /dev/null +++ b/tests/auto/common/test_params_mysql.h @@ -0,0 +1,4 @@ +#define DRIVER QStringLiteral("QMYSQL") +#define HOST QStringLiteral("localhost") +#define USERNAME QStringLiteral("root") +#define PASSWORD QStringLiteral("root") diff --git a/tests/auto/common/test_params_postgresql.h b/tests/auto/common/test_params_postgresql.h new file mode 100644 index 0000000..32424bc --- /dev/null +++ b/tests/auto/common/test_params_postgresql.h @@ -0,0 +1,4 @@ +#define DRIVER QStringLiteral("QPSQL") +#define HOST QStringLiteral("localhost") +#define USERNAME QStringLiteral("postgres") +#define PASSWORD QStringLiteral("postgres") diff --git a/tests/auto/common/test_params_sqlite.h b/tests/auto/common/test_params_sqlite.h new file mode 100644 index 0000000..c1d81c5 --- /dev/null +++ b/tests/auto/common/test_params_sqlite.h @@ -0,0 +1,4 @@ +#define DRIVER QStringLiteral("QSQLITE") +#define HOST QString() +#define USERNAME QString() +#define PASSWORD QString() diff --git a/tests/auto/common/user.cpp b/tests/auto/common/user.cpp index fb22ebf..3cbbf47 100644 --- a/tests/auto/common/user.cpp +++ b/tests/auto/common/user.cpp @@ -3,9 +3,9 @@ #include "user.h" -User::User(QObject *tableSet) : Table(tableSet), - m_comments(new TableSet(this)), - m_scores(new TableSet(this)) +User::User(QObject *tableSet) : Nut::Table(tableSet), + m_comments(new Nut::TableSet(this)), + m_scores(new Nut::TableSet(this)) { init(); } diff --git a/tests/auto/common/user.h b/tests/auto/common/user.h index f646b0d..01144bd 100644 --- a/tests/auto/common/user.h +++ b/tests/auto/common/user.h @@ -6,14 +6,20 @@ #include #include +#include #ifdef NUT_NAMESPACE using namespace NUT_NAMESPACE; #endif +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +Q_MOC_INCLUDE("comment.h") +Q_MOC_INCLUDE("score.h") +#endif + class Comment; class Score; -class User : public Nut::Table +class User : public NUT_WRAP_NAMESPACE(Table) { Q_OBJECT diff --git a/tests/auto/common/weblogdatabase.h b/tests/auto/common/weblogdatabase.h index bedb418..af39d01 100644 --- a/tests/auto/common/weblogdatabase.h +++ b/tests/auto/common/weblogdatabase.h @@ -7,6 +7,13 @@ using namespace NUT_NAMESPACE; #endif +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +Q_MOC_INCLUDE("user.h") +Q_MOC_INCLUDE("post.h") +Q_MOC_INCLUDE("score.h") +Q_MOC_INCLUDE("comment.h") +#endif + class Post; class Comment; class User; diff --git a/tests/auto/tst_basic/CMakeLists.txt b/tests/auto/tst_basic/CMakeLists.txt new file mode 100644 index 0000000..27f1ac5 --- /dev/null +++ b/tests/auto/tst_basic/CMakeLists.txt @@ -0,0 +1,89 @@ +# Generated from tst_basic.pro. + +##################################################################### +## tst_basic Test: +##################################################################### + +if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_basic LANGUAGES C CXX ASM) + find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST) +endif() + +qt_internal_add_test(tst_basic + SOURCES + ../common/comment.cpp ../common/comment.h + ../common/consts.h + ../common/post.cpp ../common/post.h + ../common/score.cpp ../common/score.h + ../common/user.cpp ../common/user.h + ../common/weblogdatabase.cpp ../common/weblogdatabase.h + tst_basic.cpp tst_basic.h + DEFINES + NUT_PATH=\\\"${CMAKE_CURRENT_SOURCE_DIR}/../../\\\" + INCLUDE_DIRECTORIES + ../common/../common + PUBLIC_LIBRARIES + Qt::Gui + Qt::Sql + nut +) + +#### Keys ignored in scope 1:.:.:tst_basic.pro:: +# TEMPLATE = "app" + +## Scopes: +##################################################################### + +#### Keys ignored in scope 4:.:../common:../common/nut-lib.pri:debug_and_release AND NOT ReleaseBuild AND NOT DebugBuild: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.CONFIG = "recursive" +# runtarget.recurse_target = "run-tests" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 5:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "oneshell" +# oneshell.target = ".ONESHELL" + +#### Keys ignored in scope 6:.:../common:../common/nut-lib.pri:WIN32 AND NOT win32-g++: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "set" "PATH=$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin;$$shell_path$$[QT_INSTALL_BINS];$(PATH)" "$$escape_expand(\\n\\t)" "set" "QT_PLUGIN_PATH=$$shadowed$$dirname_QMAKE_CONF_/plugins;$$[QT_INSTALL_PLUGINS];$(QT_PLUGIN_PATH)" "$$escape_expand(\\n\\t)" "set" "QML2_IMPORT_PATH=$$shadowed$$dirname_QMAKE_CONF_/qml;$$[QT_INSTALL_QML];$(QML2_IMPORT_PATH)" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "del" "$${outdir_helper}\\fail" "$$escape_expand(\\n\\t)" "start" "/w" "call" "$(DESTDIR_TARGET)" "^>" "$${outdir_helper}\\test.log" "^|^|" "echo" "FAIL" "^>" "$${outdir_helper}\\fail" "^&" "exit" "0" "$$escape_expand(\\n\\t)" "type" "$${outdir_helper}\\test.log" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "exit" "42" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 7:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Debug): +# outdir_helper = "debug" + +#### Keys ignored in scope 8:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Release): +# outdir_helper = "release" + +#### Keys ignored in scope 9:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 10:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "set" "\"QT_LOGGING_RULES=$$LOGGING_RULES\"" + +#### Keys ignored in scope 11:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "export" "PATH=\"$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin:$$shell_path$$[QT_INSTALL_BINS]:$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}PATH\"" "$$escape_expand(\\n\\t)" "export" "QT_PLUGIN_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/plugins$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_PLUGINS]$${QMAKE_DIRLIST_SEP}$(QT_PLUGIN_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QML2_IMPORT_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/qml$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_QML]$${QMAKE_DIRLIST_SEP}$(QML2_IMPORT_PATH)\"" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 12:.:../common:../common/nut-lib.pri:win32-g++: +# QMAKE_DIRLIST_SEP = ";" + +#### Keys ignored in scope 13:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "QT_LOGGING_RULES=\"$$LOGGING_RULES\"" + +#### Keys ignored in scope 15:.:../common:../common/nut-lib.pri:LINUX OR win32-g++: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "LD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_LIBS]$${QMAKE_DIRLIST_SEP}$(LD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QT_QPA_PLATFORM=minimal" + +#### Keys ignored in scope 17:.:../common:../common/nut-lib.pri:APPLE: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "DYLD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "DYLD_FRAMEWORK_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_FRAMEWORK_PATH)\"" + +#### Keys ignored in scope 19:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 20:.:../common:../common/nut-lib.pri:else: +# runtarget.commands = "$$escape_expand(\\n\\t)" "./$(TARGET)" + +#### Keys ignored in scope 21:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(TARGET)" diff --git a/tests/auto/tst_basic/tst_basic.cpp b/tests/auto/tst_basic/tst_basic.cpp index 87de847..f11bbd0 100644 --- a/tests/auto/tst_basic/tst_basic.cpp +++ b/tests/auto/tst_basic/tst_basic.cpp @@ -35,6 +35,8 @@ void BasicTest::initTestCase() db.setUserName(USERNAME); db.setPassword(PASSWORD); + qDebug().noquote() << "Connecting to" << DATABASE; + bool ok = db.open(); QVERIFY(ok); @@ -60,14 +62,15 @@ void BasicTest::createUser() user->setUsername(QStringLiteral("admin")); user->setPassword(QStringLiteral("123456")); db.users()->append(user); - db.saveChanges(); + QTEST_ASSERT(db.saveChanges() != 0); + QTEST_ASSERT(user->id() != 0); } void BasicTest::createPost() { TIC(); auto newPost = Nut::create(); - newPost->setTitle("post title"); + newPost->setTitle(QStringLiteral("post title")); newPost->setSaveDate(QDateTime::currentDateTime()); newPost->setPublic(false); @@ -83,14 +86,16 @@ void BasicTest::createPost() for (int i = 0; i < 10; ++i) { auto score = Nut::create(); score->setScore(i % 5); + score->setCondition(1); // test keyword on mysql newPost->scores()->append(score); } - db.saveChanges(); + QTEST_ASSERT(db.saveChanges() != 0); postId = newPost->id(); QTEST_ASSERT(newPost->id() != 0); + TOC(); } @@ -115,7 +120,7 @@ void BasicTest::createPost2() comment->setPostId(postId); db.comments()->append(comment); } - db.saveChanges(); + QTEST_ASSERT(db.saveChanges() != 0); QVERIFY(postId != 0); } @@ -140,11 +145,11 @@ void BasicTest::updatePostOnTheFly() void BasicTest::selectPublicts() { auto publinPostsCount = db.posts()->query() - .where(Post::isPublicField()) + .where(Post::isPublicField() == true) .count(); auto nonPublicPostsCount = db.posts()->query() - .where(!Post::isPublicField()) + .where(Post::isPublicField() == false) .count(); QCOMPARE(publinPostsCount, 1); @@ -160,7 +165,7 @@ void BasicTest::selectPosts() auto posts = q.toList(); post = posts.at(0); - post->setBody(QStringLiteral("")); + post->setBody(QLatin1String()); PRINT(posts.length()); PRINT(posts.at(0)->comments()->length()); @@ -248,6 +253,7 @@ void BasicTest::testDate() auto newPost = Nut::create(); newPost->setTitle(QStringLiteral("post title")); newPost->setSaveDate(d); + newPost->setPublic(true); db.posts()->append(newPost); diff --git a/tests/auto/tst_basic/tst_basic.pro b/tests/auto/tst_basic/tst_basic.pro index c2e5ca2..0789142 100644 --- a/tests/auto/tst_basic/tst_basic.pro +++ b/tests/auto/tst_basic/tst_basic.pro @@ -2,7 +2,6 @@ QT += testlib sql TARGET = tst_basic TEMPLATE = app - CONFIG += warn_on c++11 include(../common/nut-lib.pri) diff --git a/tests/auto/tst_benckmark/CMakeLists.txt b/tests/auto/tst_benckmark/CMakeLists.txt new file mode 100644 index 0000000..990032e --- /dev/null +++ b/tests/auto/tst_benckmark/CMakeLists.txt @@ -0,0 +1,89 @@ +# Generated from tst_benckmark.pro. + +##################################################################### +## tst_benchmark Test: +##################################################################### + +if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_benchmark LANGUAGES C CXX ASM) + find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST) +endif() + +qt_internal_add_test(tst_benchmark + SOURCES + ../common/comment.cpp ../common/comment.h + ../common/consts.h + ../common/post.cpp ../common/post.h + ../common/score.cpp ../common/score.h + ../common/user.cpp ../common/user.h + ../common/weblogdatabase.cpp ../common/weblogdatabase.h + tst_benchmark.cpp tst_benchmark.h + DEFINES + NUT_PATH=\\\"${CMAKE_CURRENT_SOURCE_DIR}/../../\\\" + INCLUDE_DIRECTORIES + ../common/../common + PUBLIC_LIBRARIES + Qt::Gui + Qt::Sql + nut +) + +#### Keys ignored in scope 1:.:.:tst_benckmark.pro:: +# TEMPLATE = "app" + +## Scopes: +##################################################################### + +#### Keys ignored in scope 4:.:../common:../common/nut-lib.pri:debug_and_release AND NOT ReleaseBuild AND NOT DebugBuild: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.CONFIG = "recursive" +# runtarget.recurse_target = "run-tests" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 5:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "oneshell" +# oneshell.target = ".ONESHELL" + +#### Keys ignored in scope 6:.:../common:../common/nut-lib.pri:WIN32 AND NOT win32-g++: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "set" "PATH=$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin;$$shell_path$$[QT_INSTALL_BINS];$(PATH)" "$$escape_expand(\\n\\t)" "set" "QT_PLUGIN_PATH=$$shadowed$$dirname_QMAKE_CONF_/plugins;$$[QT_INSTALL_PLUGINS];$(QT_PLUGIN_PATH)" "$$escape_expand(\\n\\t)" "set" "QML2_IMPORT_PATH=$$shadowed$$dirname_QMAKE_CONF_/qml;$$[QT_INSTALL_QML];$(QML2_IMPORT_PATH)" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "del" "$${outdir_helper}\\fail" "$$escape_expand(\\n\\t)" "start" "/w" "call" "$(DESTDIR_TARGET)" "^>" "$${outdir_helper}\\test.log" "^|^|" "echo" "FAIL" "^>" "$${outdir_helper}\\fail" "^&" "exit" "0" "$$escape_expand(\\n\\t)" "type" "$${outdir_helper}\\test.log" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "exit" "42" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 7:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Debug): +# outdir_helper = "debug" + +#### Keys ignored in scope 8:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Release): +# outdir_helper = "release" + +#### Keys ignored in scope 9:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 10:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "set" "\"QT_LOGGING_RULES=$$LOGGING_RULES\"" + +#### Keys ignored in scope 11:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "export" "PATH=\"$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin:$$shell_path$$[QT_INSTALL_BINS]:$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}PATH\"" "$$escape_expand(\\n\\t)" "export" "QT_PLUGIN_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/plugins$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_PLUGINS]$${QMAKE_DIRLIST_SEP}$(QT_PLUGIN_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QML2_IMPORT_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/qml$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_QML]$${QMAKE_DIRLIST_SEP}$(QML2_IMPORT_PATH)\"" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 12:.:../common:../common/nut-lib.pri:win32-g++: +# QMAKE_DIRLIST_SEP = ";" + +#### Keys ignored in scope 13:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "QT_LOGGING_RULES=\"$$LOGGING_RULES\"" + +#### Keys ignored in scope 15:.:../common:../common/nut-lib.pri:LINUX OR win32-g++: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "LD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_LIBS]$${QMAKE_DIRLIST_SEP}$(LD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QT_QPA_PLATFORM=minimal" + +#### Keys ignored in scope 17:.:../common:../common/nut-lib.pri:APPLE: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "DYLD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "DYLD_FRAMEWORK_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_FRAMEWORK_PATH)\"" + +#### Keys ignored in scope 19:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 20:.:../common:../common/nut-lib.pri:else: +# runtarget.commands = "$$escape_expand(\\n\\t)" "./$(TARGET)" + +#### Keys ignored in scope 21:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(TARGET)" diff --git a/tests/auto/tst_commands/CMakeLists.txt b/tests/auto/tst_commands/CMakeLists.txt new file mode 100644 index 0000000..80b782f --- /dev/null +++ b/tests/auto/tst_commands/CMakeLists.txt @@ -0,0 +1,35 @@ +# Generated from tst_commands.pro. + +##################################################################### +## tst_nut Test: +##################################################################### + +if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_nut LANGUAGES C CXX ASM) + find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST) +endif() + +qt_internal_add_test(tst_nut + QMLTEST + QML_IMPORTPATH + "${CMAKE_CURRENT_BINARY_DIR}/../src/imports" + SOURCES + ../common/comment.cpp ../common/comment.h + ../common/post.cpp ../common/post.h + ../common/user.cpp ../common/user.h + ../common/weblogdatabase.cpp ../common/weblogdatabase.h + tst_commands.cpp tst_commands.h + INCLUDE_DIRECTORIES + ../../src + ../common + PUBLIC_LIBRARIES + Qt::Gui + Qt::Qml + Qt::Quick + Qt::Sql +) + +#### Keys ignored in scope 1:.:.:tst_commands.pro:: +# IMPORTPATH = "$$OUT_PWD/../src/imports" +# TEMPLATE = "app" diff --git a/tests/auto/tst_datatypes/CMakeLists.txt b/tests/auto/tst_datatypes/CMakeLists.txt new file mode 100644 index 0000000..9083f2a --- /dev/null +++ b/tests/auto/tst_datatypes/CMakeLists.txt @@ -0,0 +1,85 @@ +# Generated from tst_datatypes.pro. + +##################################################################### +## tst_datatypes Test: +##################################################################### + +if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_datatypes LANGUAGES C CXX ASM) + find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST) +endif() + +qt_internal_add_test(tst_datatypes + SOURCES + db.cpp db.h + sampletable.cpp sampletable.h + tst_datatypes.cpp tst_datatypes.h + DEFINES + NUT_PATH=\\\"${CMAKE_CURRENT_SOURCE_DIR}/../../\\\" + INCLUDE_DIRECTORIES + ../common/../common + PUBLIC_LIBRARIES + Qt::Gui + Qt::Sql + nut +) + +#### Keys ignored in scope 1:.:.:tst_datatypes.pro:: +# TEMPLATE = "app" + +## Scopes: +##################################################################### + +#### Keys ignored in scope 4:.:../common:../common/nut-lib.pri:debug_and_release AND NOT ReleaseBuild AND NOT DebugBuild: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.CONFIG = "recursive" +# runtarget.recurse_target = "run-tests" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 5:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "oneshell" +# oneshell.target = ".ONESHELL" + +#### Keys ignored in scope 6:.:../common:../common/nut-lib.pri:WIN32 AND NOT win32-g++: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "set" "PATH=$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin;$$shell_path$$[QT_INSTALL_BINS];$(PATH)" "$$escape_expand(\\n\\t)" "set" "QT_PLUGIN_PATH=$$shadowed$$dirname_QMAKE_CONF_/plugins;$$[QT_INSTALL_PLUGINS];$(QT_PLUGIN_PATH)" "$$escape_expand(\\n\\t)" "set" "QML2_IMPORT_PATH=$$shadowed$$dirname_QMAKE_CONF_/qml;$$[QT_INSTALL_QML];$(QML2_IMPORT_PATH)" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "del" "$${outdir_helper}\\fail" "$$escape_expand(\\n\\t)" "start" "/w" "call" "$(DESTDIR_TARGET)" "^>" "$${outdir_helper}\\test.log" "^|^|" "echo" "FAIL" "^>" "$${outdir_helper}\\fail" "^&" "exit" "0" "$$escape_expand(\\n\\t)" "type" "$${outdir_helper}\\test.log" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "exit" "42" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 7:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Debug): +# outdir_helper = "debug" + +#### Keys ignored in scope 8:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Release): +# outdir_helper = "release" + +#### Keys ignored in scope 9:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 10:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "set" "\"QT_LOGGING_RULES=$$LOGGING_RULES\"" + +#### Keys ignored in scope 11:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "export" "PATH=\"$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin:$$shell_path$$[QT_INSTALL_BINS]:$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}PATH\"" "$$escape_expand(\\n\\t)" "export" "QT_PLUGIN_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/plugins$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_PLUGINS]$${QMAKE_DIRLIST_SEP}$(QT_PLUGIN_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QML2_IMPORT_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/qml$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_QML]$${QMAKE_DIRLIST_SEP}$(QML2_IMPORT_PATH)\"" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 12:.:../common:../common/nut-lib.pri:win32-g++: +# QMAKE_DIRLIST_SEP = ";" + +#### Keys ignored in scope 13:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "QT_LOGGING_RULES=\"$$LOGGING_RULES\"" + +#### Keys ignored in scope 15:.:../common:../common/nut-lib.pri:LINUX OR win32-g++: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "LD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_LIBS]$${QMAKE_DIRLIST_SEP}$(LD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QT_QPA_PLATFORM=minimal" + +#### Keys ignored in scope 17:.:../common:../common/nut-lib.pri:APPLE: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "DYLD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "DYLD_FRAMEWORK_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_FRAMEWORK_PATH)\"" + +#### Keys ignored in scope 19:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 20:.:../common:../common/nut-lib.pri:else: +# runtarget.commands = "$$escape_expand(\\n\\t)" "./$(TARGET)" + +#### Keys ignored in scope 21:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(TARGET)" diff --git a/tests/auto/tst_datatypes/db.h b/tests/auto/tst_datatypes/db.h index 401ac8c..9c39e54 100644 --- a/tests/auto/tst_datatypes/db.h +++ b/tests/auto/tst_datatypes/db.h @@ -4,7 +4,7 @@ #include "database.h" class SampleTable; -class DB : public Nut::Database +class DB : public NUT_WRAP_NAMESPACE(Database) { Q_OBJECT diff --git a/tests/auto/tst_datatypes/sampletable.h b/tests/auto/tst_datatypes/sampletable.h index db88673..ef36ece 100644 --- a/tests/auto/tst_datatypes/sampletable.h +++ b/tests/auto/tst_datatypes/sampletable.h @@ -19,7 +19,7 @@ #define FIELD_Q(type) NUT_DECLARE_FIELD(q##type, f##type, f##type, setF##type) -class SampleTable : public Nut::Table +class SampleTable : public NUT_WRAP_NAMESPACE(Table) { Q_OBJECT diff --git a/tests/auto/tst_datatypes/tst_datatypes.cpp b/tests/auto/tst_datatypes/tst_datatypes.cpp index 293e940..b2a472a 100644 --- a/tests/auto/tst_datatypes/tst_datatypes.cpp +++ b/tests/auto/tst_datatypes/tst_datatypes.cpp @@ -45,7 +45,7 @@ void DataTypesTest::initTestCase() f_real = 1.2; f_float = 2.3f; - f_url = QUrl("http://google.com/search?q=nut"); + f_url = QUrl(QStringLiteral("http://google.com/search?q=nut")); f_time = QTime::currentTime(); f_time.setHMS(f_time.hour(), f_time.minute(), f_time.second()); @@ -58,17 +58,17 @@ void DataTypesTest::initTestCase() f_jsonDoc = QJsonDocument::fromJson("{\"a\": 1}"); f_jsonObj = f_jsonDoc.object(); f_jsonArray.insert(0, QJsonValue(1)); - f_jsonArray.insert(1, QJsonValue("Hi")); + f_jsonArray.insert(1, QJsonValue(QString::fromUtf8("Hi"))); f_jsonArray.insert(2, QJsonValue(true)); f_jsonValue = QJsonValue(true); - f_stringList.append("One"); - f_stringList.append("Two"); - f_stringList.append("Three"); - f_string = "this is \n sample ' unescapped \r\n text"; + f_stringList.append(QStringLiteral("One")); + f_stringList.append(QStringLiteral("Two")); + f_stringList.append(QStringLiteral("Three")); + f_string = QStringLiteral("this is \n sample ' unescapped \r\n text"); - f_qchar = QChar('z'); + f_qchar = QLatin1Char('z'); #ifdef QT_GUI_LIB f_point = QPoint(1, 2); @@ -78,7 +78,7 @@ void DataTypesTest::initTestCase() f_color = Qt::red; #endif - QTEST_ASSERT(ok); + QVERIFY(ok); db.sampleTables()->query().remove(); } @@ -131,57 +131,55 @@ void DataTypesTest::insert() void DataTypesTest::retrive() { Nut::RowList list = db.sampleTables()->query().toList(); - QTEST_ASSERT(list.count() == 1); + QCOMPARE(list.count(), 1); Nut::Row t = list.first(); - QTEST_ASSERT(t->f_int8() == f_int8); - QTEST_ASSERT(t->f_int16() == f_int16); - QTEST_ASSERT(t->f_int32() == f_int32); - QTEST_ASSERT(t->f_int64() == f_int64); + QCOMPARE(t->f_int8(), f_int8); + QCOMPARE(t->f_int16(), f_int16); + QCOMPARE(t->f_int32(), f_int32); + QCOMPARE(t->f_int64(), f_int64); - QTEST_ASSERT(t->f_uint8() == f_uint8); - QTEST_ASSERT(t->f_uint16() == f_uint16); - QTEST_ASSERT(t->f_uint32() == f_uint32); - QTEST_ASSERT(t->f_uint64() == f_uint64); + QCOMPARE(t->f_uint8(), f_uint8); + QCOMPARE(t->f_uint16(), f_uint16); + QCOMPARE(t->f_uint32(), f_uint32); + QCOMPARE(t->f_uint64(), f_uint64); qDebug() << t->f_real() << f_real << qAbs(t->f_real() - f_real) * 1000000000000.f << qFuzzyCompare(t->f_real(), f_real); -// QTEST_ASSERT(qFuzzyCompare(t->f_real(), f_real)); -// QTEST_ASSERT(qFuzzyCompare(t->f_float(), f_float)); +// QCOMPARE(qFuzzyCompare(t->f_real(), f_real)); +// QCOMPARE(qFuzzyCompare(t->f_float(), f_float)); - QTEST_ASSERT(t->f_url() == f_url); - QTEST_ASSERT(t->f_uuid() == f_uuid); + QCOMPARE(t->f_url(), f_url); + QCOMPARE(t->f_uuid(), f_uuid); - QTEST_ASSERT(t->f_time() == f_time); - QTEST_ASSERT(t->f_date() == f_date); - QTEST_ASSERT(t->f_dateTime() == f_dateTime); + QCOMPARE(t->f_time(), f_time); + QCOMPARE(t->f_date(), f_date); + QCOMPARE(t->f_dateTime(), f_dateTime); - QTEST_ASSERT(t->f_jsonDoc() == f_jsonDoc); - QTEST_ASSERT(t->f_jsonObj() == f_jsonObj); - QTEST_ASSERT(t->f_jsonArray() == f_jsonArray); - QTEST_ASSERT(t->f_jsonValue() == f_jsonValue); + QCOMPARE(t->f_jsonDoc(), f_jsonDoc); + QCOMPARE(t->f_jsonObj(), f_jsonObj); + QCOMPARE(t->f_jsonArray(), f_jsonArray); + QCOMPARE(t->f_jsonValue(), f_jsonValue); - QTEST_ASSERT(t->f_string() == f_string); - QTEST_ASSERT(t->f_stringList() == f_stringList); - QTEST_ASSERT(t->f_qchar() == f_qchar); + QCOMPARE(t->f_string(), f_string); + QCOMPARE(t->f_stringList(), f_stringList); + QCOMPARE(t->f_qchar(), f_qchar); #ifdef QT_GUI_LIB - QTEST_ASSERT(t->f_point() == f_point); - QTEST_ASSERT(t->f_pointf() == f_pointf); + QCOMPARE(t->f_point(), f_point); + QCOMPARE(t->f_pointf(), f_pointf); - QTEST_ASSERT(t->f_polygon() == f_polygon); - QTEST_ASSERT(t->f_polygonf() == f_polygonf); - QTEST_ASSERT(t->f_color() == f_color); + QCOMPARE(t->f_polygon(), f_polygon); + QCOMPARE(t->f_polygonf(), f_polygonf); + QCOMPARE(t->f_color(), f_color); #endif } -#define CHECK(name) \ - c = db.sampleTables()->query() \ - .where(SampleTable::f_ ## name ## Field() == f_ ## name) \ - .count(); \ - QTEST_ASSERT(c == 1); +#define CHECK(name) \ + c = db.sampleTables()->query().where(SampleTable::f_##name##Field() == f_##name).count(); \ + QCOMPARE(c, 1); void DataTypesTest::check() { diff --git a/tests/auto/tst_datetime/CMakeLists.txt b/tests/auto/tst_datetime/CMakeLists.txt new file mode 100644 index 0000000..74e87e3 --- /dev/null +++ b/tests/auto/tst_datetime/CMakeLists.txt @@ -0,0 +1,85 @@ +# Generated from tst_datetime.pro. + +##################################################################### +## tst_datetime Test: +##################################################################### + +if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_datetime LANGUAGES C CXX ASM) + find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST) +endif() + +qt_internal_add_test(tst_datetime + SOURCES + db.cpp db.h + sampletable.cpp sampletable.h + tst_datetime.cpp tst_datetime.h + DEFINES + NUT_PATH=\\\"${CMAKE_CURRENT_SOURCE_DIR}/../../\\\" + INCLUDE_DIRECTORIES + ../common/../common + PUBLIC_LIBRARIES + Qt::Gui + Qt::Sql + nut +) + +#### Keys ignored in scope 1:.:.:tst_datetime.pro:: +# TEMPLATE = "app" + +## Scopes: +##################################################################### + +#### Keys ignored in scope 4:.:../common:../common/nut-lib.pri:debug_and_release AND NOT ReleaseBuild AND NOT DebugBuild: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.CONFIG = "recursive" +# runtarget.recurse_target = "run-tests" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 5:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "oneshell" +# oneshell.target = ".ONESHELL" + +#### Keys ignored in scope 6:.:../common:../common/nut-lib.pri:WIN32 AND NOT win32-g++: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "set" "PATH=$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin;$$shell_path$$[QT_INSTALL_BINS];$(PATH)" "$$escape_expand(\\n\\t)" "set" "QT_PLUGIN_PATH=$$shadowed$$dirname_QMAKE_CONF_/plugins;$$[QT_INSTALL_PLUGINS];$(QT_PLUGIN_PATH)" "$$escape_expand(\\n\\t)" "set" "QML2_IMPORT_PATH=$$shadowed$$dirname_QMAKE_CONF_/qml;$$[QT_INSTALL_QML];$(QML2_IMPORT_PATH)" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "del" "$${outdir_helper}\\fail" "$$escape_expand(\\n\\t)" "start" "/w" "call" "$(DESTDIR_TARGET)" "^>" "$${outdir_helper}\\test.log" "^|^|" "echo" "FAIL" "^>" "$${outdir_helper}\\fail" "^&" "exit" "0" "$$escape_expand(\\n\\t)" "type" "$${outdir_helper}\\test.log" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "exit" "42" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 7:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Debug): +# outdir_helper = "debug" + +#### Keys ignored in scope 8:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Release): +# outdir_helper = "release" + +#### Keys ignored in scope 9:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 10:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "set" "\"QT_LOGGING_RULES=$$LOGGING_RULES\"" + +#### Keys ignored in scope 11:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "export" "PATH=\"$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin:$$shell_path$$[QT_INSTALL_BINS]:$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}PATH\"" "$$escape_expand(\\n\\t)" "export" "QT_PLUGIN_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/plugins$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_PLUGINS]$${QMAKE_DIRLIST_SEP}$(QT_PLUGIN_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QML2_IMPORT_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/qml$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_QML]$${QMAKE_DIRLIST_SEP}$(QML2_IMPORT_PATH)\"" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 12:.:../common:../common/nut-lib.pri:win32-g++: +# QMAKE_DIRLIST_SEP = ";" + +#### Keys ignored in scope 13:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "QT_LOGGING_RULES=\"$$LOGGING_RULES\"" + +#### Keys ignored in scope 15:.:../common:../common/nut-lib.pri:LINUX OR win32-g++: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "LD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_LIBS]$${QMAKE_DIRLIST_SEP}$(LD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QT_QPA_PLATFORM=minimal" + +#### Keys ignored in scope 17:.:../common:../common/nut-lib.pri:APPLE: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "DYLD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "DYLD_FRAMEWORK_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_FRAMEWORK_PATH)\"" + +#### Keys ignored in scope 19:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 20:.:../common:../common/nut-lib.pri:else: +# runtarget.commands = "$$escape_expand(\\n\\t)" "./$(TARGET)" + +#### Keys ignored in scope 21:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(TARGET)" diff --git a/tests/auto/tst_datetime/db.h b/tests/auto/tst_datetime/db.h index 401ac8c..9c39e54 100644 --- a/tests/auto/tst_datetime/db.h +++ b/tests/auto/tst_datetime/db.h @@ -4,7 +4,7 @@ #include "database.h" class SampleTable; -class DB : public Nut::Database +class DB : public NUT_WRAP_NAMESPACE(Database) { Q_OBJECT diff --git a/tests/auto/tst_datetime/sampletable.h b/tests/auto/tst_datetime/sampletable.h index 2587bac..9936dd1 100644 --- a/tests/auto/tst_datetime/sampletable.h +++ b/tests/auto/tst_datetime/sampletable.h @@ -7,7 +7,7 @@ #include "table.h" -class SampleTable : public Nut::Table +class SampleTable : public NUT_WRAP_NAMESPACE(Table) { Q_OBJECT @@ -19,7 +19,7 @@ class SampleTable : public Nut::Table NUT_DECLARE_FIELD(QDateTime, dt, dt, setDT) public: - Q_INVOKABLE SampleTable(QObject *parent = Q_NULLPTR); + Q_INVOKABLE SampleTable(QObject *parent = nullptr); }; Q_DECLARE_METATYPE(SampleTable*) diff --git a/tests/auto/tst_datetime/tst_datetime.cpp b/tests/auto/tst_datetime/tst_datetime.cpp index 212d3e1..f453b58 100644 --- a/tests/auto/tst_datetime/tst_datetime.cpp +++ b/tests/auto/tst_datetime/tst_datetime.cpp @@ -30,58 +30,66 @@ void DateTimeTest::initTestCase() db.setUserName(USERNAME); db.setPassword(PASSWORD); - QTEST_ASSERT(db.open()); + QVERIFY(db.open()); db.sampleTables()->query().remove(); } -#define TEST_DATE(date, command, n) \ -do { \ - auto s = Nut::create(); \ - s->setD(date); \ - db.sampleTables()->append(s); \ - db.saveChanges(); \ - auto count = db.sampleTables()->query() \ - .where(SampleTable::dField().command(n) == date.command(n)) \ - .count(); \ - QTEST_ASSERT(count); \ -} while (false) +#define TEST_DATE(date, command, n) \ + do { \ + auto s = Nut::create(); \ + s->setD(date); \ + db.sampleTables()->append(s); \ + db.saveChanges(); \ + auto count = db.sampleTables() \ + ->query() \ + .where(SampleTable::dField().command(n) == date.command(n)) \ + .count(); \ + QVERIFY(count > 0); \ + db.sampleTables()->query().remove(); \ + } while (false) -#define TEST_TIME(time, command, n, num) \ -do { \ - auto s = Nut::create(); \ - s->setT(time); \ - db.sampleTables()->append(s); \ - db.saveChanges(); \ - auto count = db.sampleTables()->query() \ - .where(SampleTable::tField().command(n) == time.addSecs(num)) \ - .count(); \ - QTEST_ASSERT(count); \ -} while (false) +#define TEST_TIME(time, command, n, num) \ + do { \ + auto s = Nut::create(); \ + s->setT(time); \ + db.sampleTables()->append(s); \ + db.saveChanges(); \ + auto count = db.sampleTables() \ + ->query() \ + .where(SampleTable::tField().command(n) == time.addSecs(num)) \ + .count(); \ + QVERIFY(count > 0); \ + db.sampleTables()->query().remove(); \ + } while (false) -#define TEST_DATE2(datetime, command, n) \ -do { \ - auto s = Nut::create(); \ - s->setDT(datetime); \ - db.sampleTables()->append(s); \ - db.saveChanges(); \ - auto count = db.sampleTables()->query() \ - .where(SampleTable::dtField().command(n) == datetime.command(n)) \ - .count(); \ - QTEST_ASSERT(count); \ -} while (false) +#define TEST_DATE2(datetime, command, n) \ + do { \ + auto s = Nut::create(); \ + s->setDT(datetime); \ + db.sampleTables()->append(s); \ + db.saveChanges(); \ + auto count = db.sampleTables() \ + ->query() \ + .where(SampleTable::dtField().command(n) == datetime.command(n)) \ + .count(); \ + QVERIFY(count > 0); \ + db.sampleTables()->query().remove(); \ + } while (false) -#define TEST_TIME2(datetime, command, n, num) \ -do { \ - auto s = Nut::create(); \ - s->setDT(datetime); \ - db.sampleTables()->append(s); \ - db.saveChanges(); \ - auto count = db.sampleTables()->query() \ - .where(SampleTable::dtField().command(n) == datetime.addSecs(num)) \ - .count(); \ - QTEST_ASSERT(count); \ -} while (false) +#define TEST_TIME2(datetime, command, n, num) \ + do { \ + auto s = Nut::create(); \ + s->setDT(datetime); \ + db.sampleTables()->append(s); \ + db.saveChanges(); \ + auto count = db.sampleTables() \ + ->query() \ + .where(SampleTable::dtField().command(n) == datetime.addSecs(num)) \ + .count(); \ + QVERIFY(count > 0); \ + db.sampleTables()->query().remove(); \ + } while (false) #define MINUTE(m) m * 60 #define HOUR(h) MINUTE(h) * 60 @@ -101,7 +109,7 @@ void DateTimeTest::dateAdd() void DateTimeTest::timeAdd() { - QTime t = QTime::currentTime(); + QTime t(12, 34, 56); TEST_TIME(t, addHours, 10, HOUR(10)); TEST_TIME(t, addMinutes, 10, MINUTE(10)); @@ -114,7 +122,7 @@ void DateTimeTest::timeAdd() void DateTimeTest::dateTimeAdd() { - QDateTime dt = QDateTime::currentDateTime(); + QDateTime dt({2021, 12, 23}, {12, 34, 56}); TEST_DATE2(dt, addYears, 10); TEST_DATE2(dt, addMonths, 10); @@ -147,11 +155,11 @@ void DateTimeTest::datePart() int count; count = db.sampleTables()->query().where(SampleTable::dField().year() == d.year()).count(); - QTEST_ASSERT(count); + QVERIFY(count); count = db.sampleTables()->query().where(SampleTable::dField().month() == d.month()).count(); - QTEST_ASSERT(count); + QVERIFY(count); count = db.sampleTables()->query().where(SampleTable::dField().day() == d.day()).count(); - QTEST_ASSERT(count); + QVERIFY(count); } @@ -168,11 +176,11 @@ void DateTimeTest::timePart() int count; count = db.sampleTables()->query().where(SampleTable::tField().hour() == t.hour()).count(); - QTEST_ASSERT(count); + QVERIFY(count); count = db.sampleTables()->query().where(SampleTable::tField().minute() == t.minute()).count(); - QTEST_ASSERT(count); + QVERIFY(count); count = db.sampleTables()->query().where(SampleTable::tField().second() == t.second()).count(); - QTEST_ASSERT(count); + QVERIFY(count); } void DateTimeTest::dateTimePart() @@ -188,18 +196,18 @@ void DateTimeTest::dateTimePart() int count; count = db.sampleTables()->query().where(SampleTable::dtField().year() == dt.date().year()).count(); - QTEST_ASSERT(count); + QVERIFY(count); count = db.sampleTables()->query().where(SampleTable::dtField().month() == dt.date().month()).count(); - QTEST_ASSERT(count); + QVERIFY(count); count = db.sampleTables()->query().where(SampleTable::dtField().day() == dt.date().day()).count(); - QTEST_ASSERT(count); + QVERIFY(count); count = db.sampleTables()->query().where(SampleTable::dtField().hour() == dt.time().hour()).count(); - QTEST_ASSERT(count); + QVERIFY(count); count = db.sampleTables()->query().where(SampleTable::dtField().minute() == dt.time().minute()).count(); - QTEST_ASSERT(count); + QVERIFY(count); count = db.sampleTables()->query().where(SampleTable::dtField().second() == dt.time().second()).count(); - QTEST_ASSERT(count); + QVERIFY(count); } void DateTimeTest::cleanupTestCase() diff --git a/tests/auto/tst_generators/CMakeLists.txt b/tests/auto/tst_generators/CMakeLists.txt new file mode 100644 index 0000000..b90e7bf --- /dev/null +++ b/tests/auto/tst_generators/CMakeLists.txt @@ -0,0 +1,83 @@ +# Generated from tst_generators.pro. + +##################################################################### +## tst_generators Test: +##################################################################### + +if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_generators LANGUAGES C CXX ASM) + find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST) +endif() + +qt_internal_add_test(tst_generators + SOURCES + tst_generators.cpp tst_generators.h + DEFINES + NUT_PATH=\\\"${CMAKE_CURRENT_SOURCE_DIR}/../../\\\" + INCLUDE_DIRECTORIES + ../common/../common + PUBLIC_LIBRARIES + Qt::Gui + Qt::Sql + nut +) + +#### Keys ignored in scope 1:.:.:tst_generators.pro:: +# TEMPLATE = "app" + +## Scopes: +##################################################################### + +#### Keys ignored in scope 4:.:../common:../common/nut-lib.pri:debug_and_release AND NOT ReleaseBuild AND NOT DebugBuild: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.CONFIG = "recursive" +# runtarget.recurse_target = "run-tests" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 5:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "oneshell" +# oneshell.target = ".ONESHELL" + +#### Keys ignored in scope 6:.:../common:../common/nut-lib.pri:WIN32 AND NOT win32-g++: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "set" "PATH=$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin;$$shell_path$$[QT_INSTALL_BINS];$(PATH)" "$$escape_expand(\\n\\t)" "set" "QT_PLUGIN_PATH=$$shadowed$$dirname_QMAKE_CONF_/plugins;$$[QT_INSTALL_PLUGINS];$(QT_PLUGIN_PATH)" "$$escape_expand(\\n\\t)" "set" "QML2_IMPORT_PATH=$$shadowed$$dirname_QMAKE_CONF_/qml;$$[QT_INSTALL_QML];$(QML2_IMPORT_PATH)" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "del" "$${outdir_helper}\\fail" "$$escape_expand(\\n\\t)" "start" "/w" "call" "$(DESTDIR_TARGET)" "^>" "$${outdir_helper}\\test.log" "^|^|" "echo" "FAIL" "^>" "$${outdir_helper}\\fail" "^&" "exit" "0" "$$escape_expand(\\n\\t)" "type" "$${outdir_helper}\\test.log" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "exit" "42" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 7:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Debug): +# outdir_helper = "debug" + +#### Keys ignored in scope 8:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Release): +# outdir_helper = "release" + +#### Keys ignored in scope 9:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 10:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "set" "\"QT_LOGGING_RULES=$$LOGGING_RULES\"" + +#### Keys ignored in scope 11:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "export" "PATH=\"$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin:$$shell_path$$[QT_INSTALL_BINS]:$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}PATH\"" "$$escape_expand(\\n\\t)" "export" "QT_PLUGIN_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/plugins$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_PLUGINS]$${QMAKE_DIRLIST_SEP}$(QT_PLUGIN_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QML2_IMPORT_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/qml$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_QML]$${QMAKE_DIRLIST_SEP}$(QML2_IMPORT_PATH)\"" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 12:.:../common:../common/nut-lib.pri:win32-g++: +# QMAKE_DIRLIST_SEP = ";" + +#### Keys ignored in scope 13:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "QT_LOGGING_RULES=\"$$LOGGING_RULES\"" + +#### Keys ignored in scope 15:.:../common:../common/nut-lib.pri:LINUX OR win32-g++: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "LD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_LIBS]$${QMAKE_DIRLIST_SEP}$(LD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QT_QPA_PLATFORM=minimal" + +#### Keys ignored in scope 17:.:../common:../common/nut-lib.pri:APPLE: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "DYLD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "DYLD_FRAMEWORK_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_FRAMEWORK_PATH)\"" + +#### Keys ignored in scope 19:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 20:.:../common:../common/nut-lib.pri:else: +# runtarget.commands = "$$escape_expand(\\n\\t)" "./$(TARGET)" + +#### Keys ignored in scope 21:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(TARGET)" diff --git a/tests/auto/tst_generators/tst_generators.cpp b/tests/auto/tst_generators/tst_generators.cpp index 733b9ed..4ace4af 100644 --- a/tests/auto/tst_generators/tst_generators.cpp +++ b/tests/auto/tst_generators/tst_generators.cpp @@ -85,7 +85,7 @@ void GeneratorsTest::types(Nut::AbstractSqlGenerator *g, QString name) ; Nut::FieldModel m; - Q_FOREACH (QMetaType::Type t, types) { + for (auto &t: types) { m.type = t; QString fn = g->fieldType(&m); diff --git a/tests/auto/tst_join/CMakeLists.txt b/tests/auto/tst_join/CMakeLists.txt new file mode 100644 index 0000000..1482ff6 --- /dev/null +++ b/tests/auto/tst_join/CMakeLists.txt @@ -0,0 +1,37 @@ +# Generated from tst_join.pro. + +##################################################################### +## tst_nut Test: +##################################################################### + +if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_nut LANGUAGES C CXX ASM) + find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST) +endif() + +qt_internal_add_test(tst_nut + QMLTEST + QML_IMPORTPATH + "${CMAKE_CURRENT_BINARY_DIR}/../src/imports" + SOURCES + ../common/comment.cpp ../common/comment.h + ../common/consts.h + ../common/post.cpp ../common/post.h + ../common/score.cpp ../common/score.h + ../common/user.cpp ../common/user.h + ../common/weblogdatabase.cpp ../common/weblogdatabase.h + jointest.cpp jointest.h + INCLUDE_DIRECTORIES + ../../src + ../common + PUBLIC_LIBRARIES + Qt::Gui + Qt::Qml + Qt::Quick + Qt::Sql +) + +#### Keys ignored in scope 1:.:.:tst_join.pro:: +# IMPORTPATH = "$$OUT_PWD/../src/imports" +# TEMPLATE = "app" diff --git a/tests/auto/tst_json/CMakeLists.txt b/tests/auto/tst_json/CMakeLists.txt new file mode 100644 index 0000000..8b64ef9 --- /dev/null +++ b/tests/auto/tst_json/CMakeLists.txt @@ -0,0 +1,65 @@ +# Generated from tst_json.pro. + +##################################################################### +## tst_upgrades Binary: +##################################################################### + +qt_internal_add_executable(tst_upgrades + GUI + SOURCES + ../../../src/nut/config/nut_config.h + ../../../src/nut/config/nut_consts.h + ../../../src/nut/config/nut_global.h + ../../../src/nut/config/nut_macros.h + ../../../src/nut/config/nut_namespace.h + ../../../src/nut/core/abstracttableset.cpp ../../../src/nut/core/abstracttableset.h + ../../../src/nut/core/abstracttablesetdata.h + ../../../src/nut/core/bulkinserter.cpp ../../../src/nut/core/bulkinserter.h ../../../src/nut/core/bulkinserter_p.h + ../../../src/nut/core/changelogtable.cpp ../../../src/nut/core/changelogtable.h + ../../../src/nut/core/database.cpp ../../../src/nut/core/database.h ../../../src/nut/core/database_p.h + ../../../src/nut/core/foreigncontainer.cpp ../../../src/nut/core/foreigncontainer.h + ../../../src/nut/core/propertysignalmapper.cpp ../../../src/nut/core/propertysignalmapper.h + ../../../src/nut/core/query.cpp ../../../src/nut/core/query.h + ../../../src/nut/core/table.cpp ../../../src/nut/core/table.h ../../../src/nut/core/table_p.h + ../../../src/nut/core/tableset.cpp ../../../src/nut/core/tableset.h + ../../../src/nut/generators/abstractsqlgenerator.cpp ../../../src/nut/generators/abstractsqlgenerator.h + ../../../src/nut/generators/mysqlgenerator.cpp ../../../src/nut/generators/mysqlgenerator.h + ../../../src/nut/generators/postgresqlgenerator.cpp ../../../src/nut/generators/postgresqlgenerator.h + ../../../src/nut/generators/sqlitegenerator.cpp ../../../src/nut/generators/sqlitegenerator.h + ../../../src/nut/generators/sqlservergenerator.cpp ../../../src/nut/generators/sqlservergenerator.h + ../../../src/nut/models/databasemodel.cpp ../../../src/nut/models/databasemodel.h + ../../../src/nut/models/sqlmodel.cpp ../../../src/nut/models/sqlmodel.h ../../../src/nut/models/sqlmodel_p.h + ../../../src/nut/models/tablemodel.cpp ../../../src/nut/models/tablemodel.h + ../../../src/nut/phrase.cpp ../../../src/nut/phrase.h + ../../../src/nut/phrases/abstractfieldphrase.cpp ../../../src/nut/phrases/abstractfieldphrase.h + ../../../src/nut/phrases/assignmentphrase.cpp ../../../src/nut/phrases/assignmentphrase.h + ../../../src/nut/phrases/assignmentphraselist.cpp ../../../src/nut/phrases/assignmentphraselist.h + ../../../src/nut/phrases/conditionalphrase.cpp ../../../src/nut/phrases/conditionalphrase.h + ../../../src/nut/phrases/fieldphrase.cpp ../../../src/nut/phrases/fieldphrase.h + ../../../src/nut/phrases/fieldphrase_bool.cpp ../../../src/nut/phrases/fieldphrase_bool.h + ../../../src/nut/phrases/fieldphrase_date.cpp ../../../src/nut/phrases/fieldphrase_date.h + ../../../src/nut/phrases/fieldphrase_qstring.cpp ../../../src/nut/phrases/fieldphrase_qstring.h + ../../../src/nut/phrases/phrasedata.cpp ../../../src/nut/phrases/phrasedata.h + ../../../src/nut/phrases/phrasedatalist.cpp ../../../src/nut/phrases/phrasedatalist.h + ../../../src/nut/phrases/phraselist.cpp ../../../src/nut/phrases/phraselist.h + ../../../src/nut/types/dbgeography.cpp ../../../src/nut/types/dbgeography.h + db.cpp db.h + sampletable.cpp sampletable.h + tst_json.cpp tst_json.h + DEFINES + NUT_SHARED_POINTER + INCLUDE_DIRECTORIES + ../../../src/nut + ../../../src/nut/config + ../../../src/nut/core + ../../../src/nut/generators + ../../../src/nut/models + ../../../src/nut/phrases + ../../../src/nut/types + PUBLIC_LIBRARIES + Qt::Gui + Qt::Sql +) + +#### Keys ignored in scope 1:.:.:tst_json.pro:: +# TEMPLATE = "app" diff --git a/tests/auto/tst_json/db.h b/tests/auto/tst_json/db.h index d31adb7..8149b94 100644 --- a/tests/auto/tst_json/db.h +++ b/tests/auto/tst_json/db.h @@ -5,7 +5,7 @@ class Table; -class DB : public Nut::Database +class DB : public NUT_WRAP_NAMESPACE(Database) { Q_OBJECT diff --git a/tests/auto/tst_json/sampletable.h b/tests/auto/tst_json/sampletable.h index 57ac136..035803d 100644 --- a/tests/auto/tst_json/sampletable.h +++ b/tests/auto/tst_json/sampletable.h @@ -4,7 +4,7 @@ #include "table.h" #include -class Table : public Nut::Table +class Table : public NUT_WRAP_NAMESPACE(Table) { Q_OBJECT diff --git a/tests/auto/tst_json/tst_json.pro b/tests/auto/tst_json/tst_json.pro index c60c9a4..0255d18 100644 --- a/tests/auto/tst_json/tst_json.pro +++ b/tests/auto/tst_json/tst_json.pro @@ -4,8 +4,8 @@ TARGET = tst_upgrades TEMPLATE = app CONFIG += warn_on c++11 -#include(../common/nut-lib.pri) -include(/doc/dev/qt/Nut/src/nut/nut.pri) +include(../common/nut-lib.pri) +#include(/doc/dev/qt/Nut/src/nut/nut.pri) SOURCES += \ tst_json.cpp \ diff --git a/tests/auto/tst_phrases/CMakeLists.txt b/tests/auto/tst_phrases/CMakeLists.txt new file mode 100644 index 0000000..e04bb76 --- /dev/null +++ b/tests/auto/tst_phrases/CMakeLists.txt @@ -0,0 +1,84 @@ +# Generated from tst_phrases.pro. + +##################################################################### +## tst_phrases Test: +##################################################################### + +if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_phrases LANGUAGES C CXX ASM) + find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST) +endif() + +qt_internal_add_test(tst_phrases + SOURCES + generator.cpp generator.h + tst_phrases.cpp tst_phrases.h + DEFINES + NUT_PATH=\\\"${CMAKE_CURRENT_SOURCE_DIR}/../../\\\" + INCLUDE_DIRECTORIES + ../common/../common + PUBLIC_LIBRARIES + Qt::Gui + Qt::Sql + nut +) + +#### Keys ignored in scope 1:.:.:tst_phrases.pro:: +# TEMPLATE = "app" + +## Scopes: +##################################################################### + +#### Keys ignored in scope 4:.:../common:../common/nut-lib.pri:debug_and_release AND NOT ReleaseBuild AND NOT DebugBuild: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.CONFIG = "recursive" +# runtarget.recurse_target = "run-tests" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 5:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "oneshell" +# oneshell.target = ".ONESHELL" + +#### Keys ignored in scope 6:.:../common:../common/nut-lib.pri:WIN32 AND NOT win32-g++: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "set" "PATH=$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin;$$shell_path$$[QT_INSTALL_BINS];$(PATH)" "$$escape_expand(\\n\\t)" "set" "QT_PLUGIN_PATH=$$shadowed$$dirname_QMAKE_CONF_/plugins;$$[QT_INSTALL_PLUGINS];$(QT_PLUGIN_PATH)" "$$escape_expand(\\n\\t)" "set" "QML2_IMPORT_PATH=$$shadowed$$dirname_QMAKE_CONF_/qml;$$[QT_INSTALL_QML];$(QML2_IMPORT_PATH)" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "del" "$${outdir_helper}\\fail" "$$escape_expand(\\n\\t)" "start" "/w" "call" "$(DESTDIR_TARGET)" "^>" "$${outdir_helper}\\test.log" "^|^|" "echo" "FAIL" "^>" "$${outdir_helper}\\fail" "^&" "exit" "0" "$$escape_expand(\\n\\t)" "type" "$${outdir_helper}\\test.log" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "exit" "42" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 7:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Debug): +# outdir_helper = "debug" + +#### Keys ignored in scope 8:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Release): +# outdir_helper = "release" + +#### Keys ignored in scope 9:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 10:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "set" "\"QT_LOGGING_RULES=$$LOGGING_RULES\"" + +#### Keys ignored in scope 11:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "export" "PATH=\"$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin:$$shell_path$$[QT_INSTALL_BINS]:$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}PATH\"" "$$escape_expand(\\n\\t)" "export" "QT_PLUGIN_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/plugins$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_PLUGINS]$${QMAKE_DIRLIST_SEP}$(QT_PLUGIN_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QML2_IMPORT_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/qml$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_QML]$${QMAKE_DIRLIST_SEP}$(QML2_IMPORT_PATH)\"" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 12:.:../common:../common/nut-lib.pri:win32-g++: +# QMAKE_DIRLIST_SEP = ";" + +#### Keys ignored in scope 13:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "QT_LOGGING_RULES=\"$$LOGGING_RULES\"" + +#### Keys ignored in scope 15:.:../common:../common/nut-lib.pri:LINUX OR win32-g++: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "LD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_LIBS]$${QMAKE_DIRLIST_SEP}$(LD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QT_QPA_PLATFORM=minimal" + +#### Keys ignored in scope 17:.:../common:../common/nut-lib.pri:APPLE: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "DYLD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "DYLD_FRAMEWORK_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_FRAMEWORK_PATH)\"" + +#### Keys ignored in scope 19:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 20:.:../common:../common/nut-lib.pri:else: +# runtarget.commands = "$$escape_expand(\\n\\t)" "./$(TARGET)" + +#### Keys ignored in scope 21:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(TARGET)" diff --git a/tests/auto/tst_properties/CMakeLists.txt b/tests/auto/tst_properties/CMakeLists.txt new file mode 100644 index 0000000..69a50ee --- /dev/null +++ b/tests/auto/tst_properties/CMakeLists.txt @@ -0,0 +1,85 @@ +# Generated from tst_properties.pro. + +##################################################################### +## tst_basic Test: +##################################################################### + +if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_basic LANGUAGES C CXX ASM) + find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST) +endif() + +qt_internal_add_test(tst_basic + SOURCES + sampledatabase.cpp sampledatabase.h + sampletable.cpp sampletable.h + tst_properties.cpp tst_properties.h + DEFINES + NUT_PATH=\\\"${CMAKE_CURRENT_SOURCE_DIR}/../../\\\" + INCLUDE_DIRECTORIES + ../common/../common + PUBLIC_LIBRARIES + Qt::Gui + Qt::Sql + nut +) + +#### Keys ignored in scope 1:.:.:tst_properties.pro:: +# TEMPLATE = "app" + +## Scopes: +##################################################################### + +#### Keys ignored in scope 4:.:../common:../common/nut-lib.pri:debug_and_release AND NOT ReleaseBuild AND NOT DebugBuild: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.CONFIG = "recursive" +# runtarget.recurse_target = "run-tests" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 5:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "oneshell" +# oneshell.target = ".ONESHELL" + +#### Keys ignored in scope 6:.:../common:../common/nut-lib.pri:WIN32 AND NOT win32-g++: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "set" "PATH=$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin;$$shell_path$$[QT_INSTALL_BINS];$(PATH)" "$$escape_expand(\\n\\t)" "set" "QT_PLUGIN_PATH=$$shadowed$$dirname_QMAKE_CONF_/plugins;$$[QT_INSTALL_PLUGINS];$(QT_PLUGIN_PATH)" "$$escape_expand(\\n\\t)" "set" "QML2_IMPORT_PATH=$$shadowed$$dirname_QMAKE_CONF_/qml;$$[QT_INSTALL_QML];$(QML2_IMPORT_PATH)" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "del" "$${outdir_helper}\\fail" "$$escape_expand(\\n\\t)" "start" "/w" "call" "$(DESTDIR_TARGET)" "^>" "$${outdir_helper}\\test.log" "^|^|" "echo" "FAIL" "^>" "$${outdir_helper}\\fail" "^&" "exit" "0" "$$escape_expand(\\n\\t)" "type" "$${outdir_helper}\\test.log" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "exit" "42" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 7:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Debug): +# outdir_helper = "debug" + +#### Keys ignored in scope 8:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Release): +# outdir_helper = "release" + +#### Keys ignored in scope 9:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 10:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "set" "\"QT_LOGGING_RULES=$$LOGGING_RULES\"" + +#### Keys ignored in scope 11:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "export" "PATH=\"$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin:$$shell_path$$[QT_INSTALL_BINS]:$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}PATH\"" "$$escape_expand(\\n\\t)" "export" "QT_PLUGIN_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/plugins$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_PLUGINS]$${QMAKE_DIRLIST_SEP}$(QT_PLUGIN_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QML2_IMPORT_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/qml$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_QML]$${QMAKE_DIRLIST_SEP}$(QML2_IMPORT_PATH)\"" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 12:.:../common:../common/nut-lib.pri:win32-g++: +# QMAKE_DIRLIST_SEP = ";" + +#### Keys ignored in scope 13:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "QT_LOGGING_RULES=\"$$LOGGING_RULES\"" + +#### Keys ignored in scope 15:.:../common:../common/nut-lib.pri:LINUX OR win32-g++: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "LD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_LIBS]$${QMAKE_DIRLIST_SEP}$(LD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QT_QPA_PLATFORM=minimal" + +#### Keys ignored in scope 17:.:../common:../common/nut-lib.pri:APPLE: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "DYLD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "DYLD_FRAMEWORK_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_FRAMEWORK_PATH)\"" + +#### Keys ignored in scope 19:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 20:.:../common:../common/nut-lib.pri:else: +# runtarget.commands = "$$escape_expand(\\n\\t)" "./$(TARGET)" + +#### Keys ignored in scope 21:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(TARGET)" diff --git a/tests/auto/tst_properties/sampledatabase.h b/tests/auto/tst_properties/sampledatabase.h index 90ca262..baebf12 100644 --- a/tests/auto/tst_properties/sampledatabase.h +++ b/tests/auto/tst_properties/sampledatabase.h @@ -4,7 +4,7 @@ #include class SampleTable; -class SampleDataBase : public Nut::Database +class SampleDataBase : public NUT_WRAP_NAMESPACE(Database) { Q_OBJECT NUT_DB_VERSION(1) diff --git a/tests/auto/tst_properties/sampletable.h b/tests/auto/tst_properties/sampletable.h index 6520c9a..2b4a399 100644 --- a/tests/auto/tst_properties/sampletable.h +++ b/tests/auto/tst_properties/sampletable.h @@ -3,7 +3,7 @@ #include -class SampleTable : public Nut::Table +class SampleTable : public NUT_WRAP_NAMESPACE(Table) { Q_OBJECT Q_PROPERTY(int id READ id WRITE setId NOTIFY idChanged) diff --git a/tests/auto/tst_qttypes/CMakeLists.txt b/tests/auto/tst_qttypes/CMakeLists.txt new file mode 100644 index 0000000..4756615 --- /dev/null +++ b/tests/auto/tst_qttypes/CMakeLists.txt @@ -0,0 +1,85 @@ +# Generated from tst_qttypes.pro. + +##################################################################### +## tst_qttypes Test: +##################################################################### + +if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_qttypes LANGUAGES C CXX ASM) + find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST) +endif() + +qt_internal_add_test(tst_qttypes + SOURCES + db.cpp db.h + sampletable.cpp sampletable.h + tst_qttypes.cpp tst_qttypes.h + DEFINES + NUT_PATH=\\\"${CMAKE_CURRENT_SOURCE_DIR}/../../\\\" + INCLUDE_DIRECTORIES + ../common/../common + PUBLIC_LIBRARIES + Qt::Gui + Qt::Sql + nut +) + +#### Keys ignored in scope 1:.:.:tst_qttypes.pro:: +# TEMPLATE = "app" + +## Scopes: +##################################################################### + +#### Keys ignored in scope 4:.:../common:../common/nut-lib.pri:debug_and_release AND NOT ReleaseBuild AND NOT DebugBuild: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.CONFIG = "recursive" +# runtarget.recurse_target = "run-tests" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 5:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "oneshell" +# oneshell.target = ".ONESHELL" + +#### Keys ignored in scope 6:.:../common:../common/nut-lib.pri:WIN32 AND NOT win32-g++: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "set" "PATH=$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin;$$shell_path$$[QT_INSTALL_BINS];$(PATH)" "$$escape_expand(\\n\\t)" "set" "QT_PLUGIN_PATH=$$shadowed$$dirname_QMAKE_CONF_/plugins;$$[QT_INSTALL_PLUGINS];$(QT_PLUGIN_PATH)" "$$escape_expand(\\n\\t)" "set" "QML2_IMPORT_PATH=$$shadowed$$dirname_QMAKE_CONF_/qml;$$[QT_INSTALL_QML];$(QML2_IMPORT_PATH)" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "del" "$${outdir_helper}\\fail" "$$escape_expand(\\n\\t)" "start" "/w" "call" "$(DESTDIR_TARGET)" "^>" "$${outdir_helper}\\test.log" "^|^|" "echo" "FAIL" "^>" "$${outdir_helper}\\fail" "^&" "exit" "0" "$$escape_expand(\\n\\t)" "type" "$${outdir_helper}\\test.log" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "exit" "42" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 7:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Debug): +# outdir_helper = "debug" + +#### Keys ignored in scope 8:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Release): +# outdir_helper = "release" + +#### Keys ignored in scope 9:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 10:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "set" "\"QT_LOGGING_RULES=$$LOGGING_RULES\"" + +#### Keys ignored in scope 11:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "export" "PATH=\"$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin:$$shell_path$$[QT_INSTALL_BINS]:$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}PATH\"" "$$escape_expand(\\n\\t)" "export" "QT_PLUGIN_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/plugins$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_PLUGINS]$${QMAKE_DIRLIST_SEP}$(QT_PLUGIN_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QML2_IMPORT_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/qml$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_QML]$${QMAKE_DIRLIST_SEP}$(QML2_IMPORT_PATH)\"" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 12:.:../common:../common/nut-lib.pri:win32-g++: +# QMAKE_DIRLIST_SEP = ";" + +#### Keys ignored in scope 13:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "QT_LOGGING_RULES=\"$$LOGGING_RULES\"" + +#### Keys ignored in scope 15:.:../common:../common/nut-lib.pri:LINUX OR win32-g++: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "LD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_LIBS]$${QMAKE_DIRLIST_SEP}$(LD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QT_QPA_PLATFORM=minimal" + +#### Keys ignored in scope 17:.:../common:../common/nut-lib.pri:APPLE: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "DYLD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "DYLD_FRAMEWORK_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_FRAMEWORK_PATH)\"" + +#### Keys ignored in scope 19:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 20:.:../common:../common/nut-lib.pri:else: +# runtarget.commands = "$$escape_expand(\\n\\t)" "./$(TARGET)" + +#### Keys ignored in scope 21:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(TARGET)" diff --git a/tests/auto/tst_qttypes/db.h b/tests/auto/tst_qttypes/db.h index 6beb344..7451e98 100644 --- a/tests/auto/tst_qttypes/db.h +++ b/tests/auto/tst_qttypes/db.h @@ -4,7 +4,7 @@ #include "database.h" class SampleTable; -class DB : public Nut::Database +class DB : public NUT_WRAP_NAMESPACE(Database) { Q_OBJECT diff --git a/tests/auto/tst_qttypes/sampletable.h b/tests/auto/tst_qttypes/sampletable.h index 52d4d66..7ad4775 100644 --- a/tests/auto/tst_qttypes/sampletable.h +++ b/tests/auto/tst_qttypes/sampletable.h @@ -9,7 +9,7 @@ #include "table.h" -class SampleTable : public Nut::Table +class SampleTable : public NUT_WRAP_NAMESPACE(Table) { Q_OBJECT diff --git a/tests/auto/tst_quuid/CMakeLists.txt b/tests/auto/tst_quuid/CMakeLists.txt new file mode 100644 index 0000000..bf12f89 --- /dev/null +++ b/tests/auto/tst_quuid/CMakeLists.txt @@ -0,0 +1,86 @@ +# Generated from tst_quuid.pro. + +##################################################################### +## tst_uuid Test: +##################################################################### + +if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_uuid LANGUAGES C CXX ASM) + find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST) +endif() + +qt_internal_add_test(tst_uuid + SOURCES + ../common/consts.h + test.cpp test.h + testdatabase.cpp testdatabase.h + tst_uuid.cpp tst_uuid.h + DEFINES + NUT_PATH=\\\"${CMAKE_CURRENT_SOURCE_DIR}/../../\\\" + INCLUDE_DIRECTORIES + ../common/../common + PUBLIC_LIBRARIES + Qt::Gui + Qt::Sql + nut +) + +#### Keys ignored in scope 1:.:.:tst_quuid.pro:: +# TEMPLATE = "app" + +## Scopes: +##################################################################### + +#### Keys ignored in scope 4:.:../common:../common/nut-lib.pri:debug_and_release AND NOT ReleaseBuild AND NOT DebugBuild: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.CONFIG = "recursive" +# runtarget.recurse_target = "run-tests" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 5:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "oneshell" +# oneshell.target = ".ONESHELL" + +#### Keys ignored in scope 6:.:../common:../common/nut-lib.pri:WIN32 AND NOT win32-g++: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "set" "PATH=$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin;$$shell_path$$[QT_INSTALL_BINS];$(PATH)" "$$escape_expand(\\n\\t)" "set" "QT_PLUGIN_PATH=$$shadowed$$dirname_QMAKE_CONF_/plugins;$$[QT_INSTALL_PLUGINS];$(QT_PLUGIN_PATH)" "$$escape_expand(\\n\\t)" "set" "QML2_IMPORT_PATH=$$shadowed$$dirname_QMAKE_CONF_/qml;$$[QT_INSTALL_QML];$(QML2_IMPORT_PATH)" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "del" "$${outdir_helper}\\fail" "$$escape_expand(\\n\\t)" "start" "/w" "call" "$(DESTDIR_TARGET)" "^>" "$${outdir_helper}\\test.log" "^|^|" "echo" "FAIL" "^>" "$${outdir_helper}\\fail" "^&" "exit" "0" "$$escape_expand(\\n\\t)" "type" "$${outdir_helper}\\test.log" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "exit" "42" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 7:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Debug): +# outdir_helper = "debug" + +#### Keys ignored in scope 8:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Release): +# outdir_helper = "release" + +#### Keys ignored in scope 9:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 10:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "set" "\"QT_LOGGING_RULES=$$LOGGING_RULES\"" + +#### Keys ignored in scope 11:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "export" "PATH=\"$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin:$$shell_path$$[QT_INSTALL_BINS]:$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}PATH\"" "$$escape_expand(\\n\\t)" "export" "QT_PLUGIN_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/plugins$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_PLUGINS]$${QMAKE_DIRLIST_SEP}$(QT_PLUGIN_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QML2_IMPORT_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/qml$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_QML]$${QMAKE_DIRLIST_SEP}$(QML2_IMPORT_PATH)\"" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 12:.:../common:../common/nut-lib.pri:win32-g++: +# QMAKE_DIRLIST_SEP = ";" + +#### Keys ignored in scope 13:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "QT_LOGGING_RULES=\"$$LOGGING_RULES\"" + +#### Keys ignored in scope 15:.:../common:../common/nut-lib.pri:LINUX OR win32-g++: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "LD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_LIBS]$${QMAKE_DIRLIST_SEP}$(LD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QT_QPA_PLATFORM=minimal" + +#### Keys ignored in scope 17:.:../common:../common/nut-lib.pri:APPLE: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "DYLD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "DYLD_FRAMEWORK_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_FRAMEWORK_PATH)\"" + +#### Keys ignored in scope 19:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 20:.:../common:../common/nut-lib.pri:else: +# runtarget.commands = "$$escape_expand(\\n\\t)" "./$(TARGET)" + +#### Keys ignored in scope 21:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(TARGET)" diff --git a/tests/auto/tst_quuid/test.h b/tests/auto/tst_quuid/test.h index e960c5f..a02b970 100644 --- a/tests/auto/tst_quuid/test.h +++ b/tests/auto/tst_quuid/test.h @@ -5,7 +5,7 @@ #include "table.h" -class Test : public Nut::Table +class Test : public NUT_WRAP_NAMESPACE(Table) { Q_OBJECT diff --git a/tests/auto/tst_quuid/testdatabase.h b/tests/auto/tst_quuid/testdatabase.h index 1fa20d2..88bb109 100644 --- a/tests/auto/tst_quuid/testdatabase.h +++ b/tests/auto/tst_quuid/testdatabase.h @@ -4,7 +4,7 @@ #include "database.h" class Test; -class TestDatabase : public Nut::Database +class TestDatabase : public NUT_WRAP_NAMESPACE(Database) { Q_OBJECT diff --git a/tests/auto/tst_upgrades/CMakeLists.txt b/tests/auto/tst_upgrades/CMakeLists.txt new file mode 100644 index 0000000..ac986fa --- /dev/null +++ b/tests/auto/tst_upgrades/CMakeLists.txt @@ -0,0 +1,89 @@ +# Generated from tst_upgrades.pro. + +##################################################################### +## tst_upgrades Test: +##################################################################### + +if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_upgrades LANGUAGES C CXX ASM) + find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST) +endif() + +qt_internal_add_test(tst_upgrades + SOURCES + db1.cpp db1.h + db2.cpp db2.h + db3.cpp db3.h + table1.cpp table1.h + table2.cpp table2.h + table3.cpp table3.h + tst_upgrades.cpp tst_upgrades.h + DEFINES + NUT_PATH=\\\"${CMAKE_CURRENT_SOURCE_DIR}/../../\\\" + INCLUDE_DIRECTORIES + ../common/../common + PUBLIC_LIBRARIES + Qt::Gui + Qt::Sql + nut +) + +#### Keys ignored in scope 1:.:.:tst_upgrades.pro:: +# TEMPLATE = "app" + +## Scopes: +##################################################################### + +#### Keys ignored in scope 4:.:../common:../common/nut-lib.pri:debug_and_release AND NOT ReleaseBuild AND NOT DebugBuild: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.CONFIG = "recursive" +# runtarget.recurse_target = "run-tests" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 5:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "oneshell" +# oneshell.target = ".ONESHELL" + +#### Keys ignored in scope 6:.:../common:../common/nut-lib.pri:WIN32 AND NOT win32-g++: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "set" "PATH=$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin;$$shell_path$$[QT_INSTALL_BINS];$(PATH)" "$$escape_expand(\\n\\t)" "set" "QT_PLUGIN_PATH=$$shadowed$$dirname_QMAKE_CONF_/plugins;$$[QT_INSTALL_PLUGINS];$(QT_PLUGIN_PATH)" "$$escape_expand(\\n\\t)" "set" "QML2_IMPORT_PATH=$$shadowed$$dirname_QMAKE_CONF_/qml;$$[QT_INSTALL_QML];$(QML2_IMPORT_PATH)" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "del" "$${outdir_helper}\\fail" "$$escape_expand(\\n\\t)" "start" "/w" "call" "$(DESTDIR_TARGET)" "^>" "$${outdir_helper}\\test.log" "^|^|" "echo" "FAIL" "^>" "$${outdir_helper}\\fail" "^&" "exit" "0" "$$escape_expand(\\n\\t)" "type" "$${outdir_helper}\\test.log" "$$escape_expand(\\n\\t)" "if" "exist" "$${outdir_helper}\\fail" "exit" "42" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 7:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Debug): +# outdir_helper = "debug" + +#### Keys ignored in scope 8:.:../common:../common/nut-lib.pri:(CMAKE_BUILD_TYPE STREQUAL Release): +# outdir_helper = "release" + +#### Keys ignored in scope 9:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 10:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "set" "\"QT_LOGGING_RULES=$$LOGGING_RULES\"" + +#### Keys ignored in scope 11:.:../common:../common/nut-lib.pri:else: +# QMAKE_EXTRA_TARGETS = "runtarget" +# runtarget.commands = "export" "PATH=\"$$shell_path$$shadowed$$dirname_QMAKE_CONF_/bin:$$shell_path$$[QT_INSTALL_BINS]:$${LITERAL_DOLLAR}$${LITERAL_DOLLAR}PATH\"" "$$escape_expand(\\n\\t)" "export" "QT_PLUGIN_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/plugins$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_PLUGINS]$${QMAKE_DIRLIST_SEP}$(QT_PLUGIN_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QML2_IMPORT_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/qml$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_QML]$${QMAKE_DIRLIST_SEP}$(QML2_IMPORT_PATH)\"" +# runtarget.target = "run-tests" + +#### Keys ignored in scope 12:.:../common:../common/nut-lib.pri:win32-g++: +# QMAKE_DIRLIST_SEP = ";" + +#### Keys ignored in scope 13:.:../common:../common/nut-lib.pri:NOT LOGGING_RULES_ISEMPTY: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "QT_LOGGING_RULES=\"$$LOGGING_RULES\"" + +#### Keys ignored in scope 15:.:../common:../common/nut-lib.pri:LINUX OR win32-g++: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "LD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib$${QMAKE_DIRLIST_SEP}$$[QT_INSTALL_LIBS]$${QMAKE_DIRLIST_SEP}$(LD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "QT_QPA_PLATFORM=minimal" + +#### Keys ignored in scope 17:.:../common:../common/nut-lib.pri:APPLE: +# runtarget.commands = "$$escape_expand(\\n\\t)" "export" "DYLD_LIBRARY_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_LIBRARY_PATH)\"" "$$escape_expand(\\n\\t)" "export" "DYLD_FRAMEWORK_PATH=\"$$shadowed$$dirname_QMAKE_CONF_/lib:$$[QT_INSTALL_LIBS]:$(DYLD_FRAMEWORK_PATH)\"" + +#### Keys ignored in scope 19:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(DESTDIR_TARGET)" + +#### Keys ignored in scope 20:.:../common:../common/nut-lib.pri:else: +# runtarget.commands = "$$escape_expand(\\n\\t)" "./$(TARGET)" + +#### Keys ignored in scope 21:.:../common:../common/nut-lib.pri:NOT compat_test: +# runtarget.depends = "$(TARGET)" diff --git a/tests/auto/tst_upgrades/db1.h b/tests/auto/tst_upgrades/db1.h index 0f7e74b..e1330fb 100644 --- a/tests/auto/tst_upgrades/db1.h +++ b/tests/auto/tst_upgrades/db1.h @@ -5,7 +5,7 @@ class Table1; -class DB1 : public Nut::Database +class DB1 : public NUT_WRAP_NAMESPACE(Database) { Q_OBJECT diff --git a/tests/auto/tst_upgrades/db2.h b/tests/auto/tst_upgrades/db2.h index 5f72875..2367216 100644 --- a/tests/auto/tst_upgrades/db2.h +++ b/tests/auto/tst_upgrades/db2.h @@ -5,7 +5,7 @@ class Table2; -class DB2 : public Nut::Database +class DB2 : public NUT_WRAP_NAMESPACE(Database) { Q_OBJECT diff --git a/tests/auto/tst_upgrades/db3.h b/tests/auto/tst_upgrades/db3.h index 018a4d7..d51835a 100644 --- a/tests/auto/tst_upgrades/db3.h +++ b/tests/auto/tst_upgrades/db3.h @@ -5,7 +5,7 @@ class Table3; -class DB3 : public Nut::Database +class DB3 : public NUT_WRAP_NAMESPACE(Database) { Q_OBJECT diff --git a/tests/auto/tst_upgrades/table1.h b/tests/auto/tst_upgrades/table1.h index 727b73a..0c5ce23 100644 --- a/tests/auto/tst_upgrades/table1.h +++ b/tests/auto/tst_upgrades/table1.h @@ -3,7 +3,7 @@ #include "table.h" -class Table1 : public Nut::Table +class Table1 : public NUT_WRAP_NAMESPACE(Table) { Q_OBJECT diff --git a/tests/auto/tst_upgrades/table2.h b/tests/auto/tst_upgrades/table2.h index 1b4f06e..c576fc8 100644 --- a/tests/auto/tst_upgrades/table2.h +++ b/tests/auto/tst_upgrades/table2.h @@ -3,7 +3,7 @@ #include "table.h" -class Table2 : public Nut::Table +class Table2 : public NUT_WRAP_NAMESPACE(Table) { Q_OBJECT diff --git a/tests/auto/tst_upgrades/table3.h b/tests/auto/tst_upgrades/table3.h index b0c3458..e9825f3 100644 --- a/tests/auto/tst_upgrades/table3.h +++ b/tests/auto/tst_upgrades/table3.h @@ -3,7 +3,7 @@ #include "table.h" -class Table3 : public Nut::Table +class Table3 : public NUT_WRAP_NAMESPACE(Table) { Q_OBJECT