From 1fdc150116cad39aae5c5da407c3312b47a59e3a Mon Sep 17 00:00:00 2001 From: Unit 193 Date: Fri, 17 Dec 2021 07:06:30 -0500 Subject: New upstream version 3.3.3+dfsg1. --- SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h | 48 +++++++++++++++++++++---- 1 file changed, 42 insertions(+), 6 deletions(-) (limited to 'SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h') diff --git a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h index f45e475..72c1614 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h @@ -46,6 +46,7 @@ class AbstractDb3 : public AbstractDb bool loadExtension(const QString& filePath, const QString& initFunc = QString()); bool isComplete(const QString& sql) const; + QList columnsForQuery(const QString& query); protected: bool isOpenInternal(); @@ -343,6 +344,41 @@ bool AbstractDb3::isComplete(const QString& sql) const return T::complete(sql.toUtf8().constData()); } +template +QList AbstractDb3::columnsForQuery(const QString& query) +{ + QList result; + const char* tail; + QByteArray queryBytes = query.toUtf8(); + typename T::stmt* stmt = nullptr; + int res = T::prepare_v2(dbHandle, queryBytes.constData(), queryBytes.size(), &stmt, &tail); + if (res != T::OK) + { + stmt = nullptr; + extractLastError(); + T::finalize(stmt); + return result; + } + + if (tail && !QString::fromUtf8(tail).trimmed().isEmpty()) + qWarning() << "Executed query left with tailing contents:" << tail << ", while finding columns for query:" << query; + + + int colCount = T::column_count(stmt); + for (int i = 0; i < colCount; i++) + { + AliasedColumn col; + col.setDatabase(QString::fromUtf8(T::column_database_name(stmt, i))); + col.setTable(QString::fromUtf8(T::column_table_name(stmt, i))); + col.setColumn(QString::fromUtf8(T::column_origin_name(stmt, i))); + col.setAlias(QString::fromUtf8(T::column_name(stmt, i))); + result << col; + } + + T::finalize(stmt); + return result; +} + template bool AbstractDb3::isOpenInternal() { @@ -534,7 +570,7 @@ template void AbstractDb3::resetError() { dbErrorCode = 0; - dbErrorMessage = QString::null; + dbErrorMessage = QString(); } template @@ -868,7 +904,7 @@ template int AbstractDb3::Query::resetStmt() { errorCode = 0; - errorMessage = QString::null; + errorMessage = QString(); affected = 0; colCount = -1; rowAvailable = false; @@ -889,7 +925,7 @@ bool AbstractDb3::Query::execInternal(const QList& args) if (!checkDbState()) return false; - ReadWriteLocker locker(&(db->dbOperLock), query, Dialect::Sqlite3, flags.testFlag(Db::Flag::NO_LOCK)); + ReadWriteLocker locker(&(db->dbOperLock), query, flags.testFlag(Db::Flag::NO_LOCK)); logSql(db.data(), query, args, flags); int res; @@ -904,7 +940,7 @@ bool AbstractDb3::Query::execInternal(const QList& args) int maxParamIdx = args.size(); if (!flags.testFlag(Db::Flag::SKIP_PARAM_COUNTING)) { - QueryWithParamCount queryWithParams = getQueryWithParamCount(query, Dialect::Sqlite3); + QueryWithParamCount queryWithParams = getQueryWithParamCount(query); maxParamIdx = qMin(maxParamIdx, queryWithParams.second); } @@ -932,10 +968,10 @@ bool AbstractDb3::Query::execInternal(const QHash& args) if (!checkDbState()) return false; - ReadWriteLocker locker(&(db->dbOperLock), query, Dialect::Sqlite3, flags.testFlag(Db::Flag::NO_LOCK)); + ReadWriteLocker locker(&(db->dbOperLock), query, flags.testFlag(Db::Flag::NO_LOCK)); logSql(db.data(), query, args, flags); - QueryWithParamNames queryWithParams = getQueryWithParamNames(query, Dialect::Sqlite3); + QueryWithParamNames queryWithParams = getQueryWithParamNames(query); int res; if (stmt) -- cgit v1.2.3