aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2021-12-17 07:06:30 -0500
committerLibravatarUnit 193 <unit193@unit193.net>2021-12-17 07:06:30 -0500
commit1fdc150116cad39aae5c5da407c3312b47a59e3a (patch)
tree123c79a4d7ad2d45781ba03ce939f7539fb428d8 /SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h
parentfeda8a7db8d1d7c5439aa8f8feef7cc0dd2b59a0 (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.h48
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)