diff --git a/include/orm/query/querybuilder.hpp b/include/orm/query/querybuilder.hpp index 03f770f5a..0f1db8cb4 100644 --- a/include/orm/query/querybuilder.hpp +++ b/include/orm/query/querybuilder.hpp @@ -12,6 +12,7 @@ TINY_SYSTEM_HEADER #include "orm/ormconcepts.hpp" #include "orm/ormtypes.hpp" #include "orm/query/grammars/grammar.hpp" +#include "orm/utils/query.hpp" TINYORM_BEGIN_COMMON_NAMESPACE @@ -29,7 +30,10 @@ namespace Orm::Query /*! Database query builder. */ class SHAREDLIB_EXPORT Builder // clazy:exclude=copyable-polymorphic { + /*! Alias for the query grammar. */ using QueryGrammar = Query::Grammars::Grammar; + /*! Alias for query utils. */ + using QueryUtils = Orm::Utils::Query; public: /*! Constructor. */ @@ -708,7 +712,7 @@ namespace Orm::Query the results and get the exact data that was requested for the query. */ auto query = get({column, key}); - const auto size = query.size(); + const auto size = QueryUtils::queryResultSize(query, m_connection); // Empty result if (size == 0) diff --git a/include/orm/utils/query.hpp b/include/orm/utils/query.hpp index 0d6dec3ad..23cc50e9e 100644 --- a/include/orm/utils/query.hpp +++ b/include/orm/utils/query.hpp @@ -15,7 +15,11 @@ class QSqlQuery; TINYORM_BEGIN_COMMON_NAMESPACE -namespace Orm::Utils +namespace Orm +{ + class DatabaseConnection; + +namespace Utils { /*! Library class for database query. */ @@ -43,9 +47,13 @@ namespace Orm::Utils static QVector zipForInsert(const QVector &columns, const QVector> &values); + + /*! Returns the size of the result (number of rows returned). */ + static int queryResultSize(QSqlQuery &query, DatabaseConnection &connection); }; -} // namespace Orm::Utils +} // namespace Utils +} // namespace Orm TINYORM_END_COMMON_NAMESPACE diff --git a/src/orm/query/querybuilder.cpp b/src/orm/query/querybuilder.cpp index 97fc70d91..c503c0c56 100644 --- a/src/orm/query/querybuilder.cpp +++ b/src/orm/query/querybuilder.cpp @@ -73,7 +73,7 @@ QVector Builder::pluck(const QString &column) and get the exact data that was requested for the query. */ auto query = get({column}); - const auto size = query.size(); + const auto size = QueryUtils::queryResultSize(query, m_connection); // Empty result if (size == 0) diff --git a/src/orm/schema/schemabuilder.cpp b/src/orm/schema/schemabuilder.cpp index 0e5768c08..278de1fd4 100644 --- a/src/orm/schema/schemabuilder.cpp +++ b/src/orm/schema/schemabuilder.cpp @@ -7,6 +7,9 @@ #include "orm/databaseconnection.hpp" #include "orm/exceptions/logicerror.hpp" +#include "orm/utils/query.hpp" + +using QueryUtils = Orm::Utils::Query; TINYORM_BEGIN_COMMON_NAMESPACE @@ -165,15 +168,7 @@ bool SchemaBuilder::hasTable(const QString &table) const auto query = m_connection.selectFromWriteConnection( m_grammar.compileTableExists(), {table_}); - if (m_connection.driver()->hasFeature(QSqlDriver::QuerySize)) - return query.size() > 0; - - // Count manually - auto size = 0; - while (query.next()) - ++size; - - return size > 0; + return QueryUtils::queryResultSize(query, m_connection) > 0; } // CUR schema, test in functional tests silverqx diff --git a/src/orm/utils/query.cpp b/src/orm/utils/query.cpp index 2c97c0657..65589696a 100644 --- a/src/orm/utils/query.cpp +++ b/src/orm/utils/query.cpp @@ -1,8 +1,10 @@ #include "orm/utils/query.hpp" #include +#include #include +#include "orm/databaseconnection.hpp" #include "orm/exceptions/invalidargumenterror.hpp" #include "orm/utils/type.hpp" @@ -115,6 +117,23 @@ Query::zipForInsert(const QVector &columns, return zippedValues; } +int Query::queryResultSize(QSqlQuery &query, DatabaseConnection &connection) +{ + if (connection.driver()->hasFeature(QSqlDriver::QuerySize)) + return query.size(); + + query.seek(QSql::BeforeFirstRow); + + // Count manually + int size = 0; + while (query.next()) + ++size; + + query.seek(QSql::BeforeFirstRow); + + return size; +} + } // namespace Orm::Utils TINYORM_END_COMMON_NAMESPACE