diff options
| author | 2021-12-17 07:06:30 -0500 | |
|---|---|---|
| committer | 2021-12-17 07:06:30 -0500 | |
| commit | 1fdc150116cad39aae5c5da407c3312b47a59e3a (patch) | |
| tree | 123c79a4d7ad2d45781ba03ce939f7539fb428d8 /SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h | |
| parent | feda8a7db8d1d7c5439aa8f8feef7cc0dd2b59a0 (diff) | |
New upstream version 3.3.3+dfsg1.upstream/3.3.3+dfsg1
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h')
| -rw-r--r-- | SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h | 48 |
1 files changed, 42 insertions, 6 deletions
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<AliasedColumn> columnsForQuery(const QString& query); protected: bool isOpenInternal(); @@ -343,6 +344,41 @@ bool AbstractDb3<T>::isComplete(const QString& sql) const return T::complete(sql.toUtf8().constData()); } +template<class T> +QList<AliasedColumn> AbstractDb3<T>::columnsForQuery(const QString& query) +{ + QList<AliasedColumn> 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 <class T> bool AbstractDb3<T>::isOpenInternal() { @@ -534,7 +570,7 @@ template <class T> void AbstractDb3<T>::resetError() { dbErrorCode = 0; - dbErrorMessage = QString::null; + dbErrorMessage = QString(); } template <class T> @@ -868,7 +904,7 @@ template <class T> int AbstractDb3<T>::Query::resetStmt() { errorCode = 0; - errorMessage = QString::null; + errorMessage = QString(); affected = 0; colCount = -1; rowAvailable = false; @@ -889,7 +925,7 @@ bool AbstractDb3<T>::Query::execInternal(const QList<QVariant>& 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<T>::Query::execInternal(const QList<QVariant>& 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<T>::Query::execInternal(const QHash<QString, QVariant>& 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) |
