diff --git a/include/orm/query/processors/mysqlprocessor.hpp b/include/orm/query/processors/mysqlprocessor.hpp index 5e884b9fa..82ef6845c 100644 --- a/include/orm/query/processors/mysqlprocessor.hpp +++ b/include/orm/query/processors/mysqlprocessor.hpp @@ -16,6 +16,9 @@ namespace Orm::Query::Processors public: MySqlProcessor() = default; + + /*! Process the results of a column listing query. */ + QStringList processColumnListing(QSqlQuery &query) const override; }; } // namespace Orm::Query::Processors diff --git a/include/orm/query/processors/processor.hpp b/include/orm/query/processors/processor.hpp index eda83b33f..567e9c917 100644 --- a/include/orm/query/processors/processor.hpp +++ b/include/orm/query/processors/processor.hpp @@ -24,7 +24,7 @@ namespace Orm::Query::Processors inline virtual ~Processor() = default; /*! Process the results of a column listing query. */ - QStringList processColumnListing(QSqlQuery &query) const; + virtual QStringList processColumnListing(QSqlQuery &query) const; }; } // namespace Orm::Query::Processors diff --git a/include/orm/query/processors/sqliteprocessor.hpp b/include/orm/query/processors/sqliteprocessor.hpp index 1f009bfc4..1d114d431 100644 --- a/include/orm/query/processors/sqliteprocessor.hpp +++ b/include/orm/query/processors/sqliteprocessor.hpp @@ -16,6 +16,9 @@ namespace Orm::Query::Processors public: SQLiteProcessor() = default; + + /*! Process the results of a column listing query. */ + QStringList processColumnListing(QSqlQuery &query) const override; }; } // namespace Orm::Query::Processors diff --git a/src/orm/query/processors/mysqlprocessor.cpp b/src/orm/query/processors/mysqlprocessor.cpp index c30524a57..e4430ce0e 100644 --- a/src/orm/query/processors/mysqlprocessor.cpp +++ b/src/orm/query/processors/mysqlprocessor.cpp @@ -1,11 +1,25 @@ #include "orm/query/processors/mysqlprocessor.hpp" +#include +#include + #ifdef TINYORM_COMMON_NAMESPACE namespace TINYORM_COMMON_NAMESPACE { #endif namespace Orm::Query::Processors { + +QStringList MySqlProcessor::processColumnListing(QSqlQuery &query) const +{ + QStringList columns; + + while (query.next()) + columns.append(query.value("column_name").value()); + + return columns; +} + } // namespace Orm::Query::Processors #ifdef TINYORM_COMMON_NAMESPACE } // namespace TINYORM_COMMON_NAMESPACE diff --git a/src/orm/query/processors/processor.cpp b/src/orm/query/processors/processor.cpp index 773f54bae..ef1588166 100644 --- a/src/orm/query/processors/processor.cpp +++ b/src/orm/query/processors/processor.cpp @@ -1,7 +1,7 @@ #include "orm/query/processors/processor.hpp" -#include -#include +#include "orm/runtimeerror.hpp" +#include "orm/utils/type.hpp" #ifdef TINYORM_COMMON_NAMESPACE namespace TINYORM_COMMON_NAMESPACE @@ -10,14 +10,10 @@ namespace TINYORM_COMMON_NAMESPACE namespace Orm::Query::Processors { -QStringList Processor::processColumnListing(QSqlQuery &query) const +QStringList Processor::processColumnListing(QSqlQuery &) const { - QStringList columns; - - while (query.next()) - columns.append(query.value(0).value()); - - return columns; + throw RuntimeError(QStringLiteral("Method %1() is not implemented.") + .arg(__tiny_func__)); } } // namespace Orm::Query::Processors diff --git a/src/orm/query/processors/sqliteprocessor.cpp b/src/orm/query/processors/sqliteprocessor.cpp index 02ae99760..a3997d097 100644 --- a/src/orm/query/processors/sqliteprocessor.cpp +++ b/src/orm/query/processors/sqliteprocessor.cpp @@ -1,11 +1,25 @@ #include "orm/query/processors/sqliteprocessor.hpp" +#include +#include + #ifdef TINYORM_COMMON_NAMESPACE namespace TINYORM_COMMON_NAMESPACE { #endif namespace Orm::Query::Processors { + +QStringList SQLiteProcessor::processColumnListing(QSqlQuery &query) const +{ + QStringList columns; + + while (query.next()) + columns.append(query.value("name").value()); + + return columns; +} + } // namespace Orm::Query::Processors #ifdef TINYORM_COMMON_NAMESPACE } // namespace TINYORM_COMMON_NAMESPACE diff --git a/src/orm/query/querybuilder.cpp b/src/orm/query/querybuilder.cpp index 074e07340..47372d6b6 100644 --- a/src/orm/query/querybuilder.cpp +++ b/src/orm/query/querybuilder.cpp @@ -158,7 +158,6 @@ void Builder::truncate() m_connection.statement(sql, bindings); } -// CUR try with 'as' - select('name', 'email as user_email') and add tests silverqx Builder &Builder::select(const QStringList &columns) { // FEATURE expression, add Query::Expression overload, find all occurences of Illuminate\Database\Query\Expression in the Eloquent and add support to TinyORM, I will need to add overloads for some methods, for columns and also for values silverqx diff --git a/src/orm/schema/grammars/mysqlschemagrammar.cpp b/src/orm/schema/grammars/mysqlschemagrammar.cpp index 142037370..1286000bd 100644 --- a/src/orm/schema/grammars/mysqlschemagrammar.cpp +++ b/src/orm/schema/grammars/mysqlschemagrammar.cpp @@ -9,7 +9,8 @@ namespace Orm::Schema::Grammars QString MySqlSchemaGrammar::compileColumnListing(const QString &) const { - return "select `column_name` from `information_schema`.`columns` " + return "select `column_name` as `column_name` " + "from `information_schema`.`columns` " "where `table_schema` = ? and `table_name` = ?"; } diff --git a/tests/auto/functional/orm/tiny/model/tst_model.cpp b/tests/auto/functional/orm/tiny/model/tst_model.cpp index 2e89c29e5..22d9330f5 100644 --- a/tests/auto/functional/orm/tiny/model/tst_model.cpp +++ b/tests/auto/functional/orm/tiny/model/tst_model.cpp @@ -76,7 +76,7 @@ private slots: void truncate() const; - void massAssignment_NotGuardableColumn() const; + void massAssignment_isGuardableColumn() const; }; void tst_Model::initTestCase_data() const @@ -1225,7 +1225,7 @@ void tst_Model::truncate() const QCOMPARE(Setting::all().size(), 0); } -void tst_Model::massAssignment_NotGuardableColumn() const +void tst_Model::massAssignment_isGuardableColumn() const { /* This test has to be here because it internally calls columns listing against database, so it is connection-dependent. */ @@ -1233,11 +1233,12 @@ void tst_Model::massAssignment_NotGuardableColumn() const ConnectionOverride::connection = connection; - Torrent_GuardedAttribute torrent; + Torrent_GuardableColumn torrent; - torrent.fill({{"dummy-NON_EXISTENT", "foo"}}); + torrent.fill({{"updated_at", QDateTime::currentDateTime()}}); - QCOMPARE(torrent.getAttributes().size(), 0); + QVERIFY(!torrent.exists); + QCOMPARE(torrent.getAttributes().size(), 1); } QTEST_MAIN(tst_Model) diff --git a/tests/auto/functional/orm/tiny/models/models/massassignmentmodels.hpp b/tests/auto/functional/orm/tiny/models/models/massassignmentmodels.hpp index 2f1912a0f..6a64a6394 100644 --- a/tests/auto/functional/orm/tiny/models/models/massassignmentmodels.hpp +++ b/tests/auto/functional/orm/tiny/models/models/massassignmentmodels.hpp @@ -52,4 +52,17 @@ class Torrent_AllowedMassAssignment final : inline static QStringList u_guarded {}; // disabled }; +class Torrent_GuardableColumn final : + public Model +{ + friend Model; + using Model::Model; + + /*! The table associated with the model. */ + QString u_table {"torrents"}; + + /*! The attributes that aren't mass assignable. */ + inline static QStringList u_guarded {"xyz"}; +}; + #endif // MASSASSIGNMENTMODELS_HPP