aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2018-07-27 23:51:12 -0400
committerLibravatarUnit 193 <unit193@ubuntu.com>2018-07-27 23:51:12 -0400
commitfeda8a7db8d1d7c5439aa8f8feef7cc0dd2b59a0 (patch)
tree1e50f5f666f419143f510d5ded00fe2006b7bd85 /SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h
parentd9aa870e5d509cc7309ab82dd102a937ab58613a (diff)
New upstream version 3.2.1+dfsg1upstream/3.2.1+dfsg1
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h')
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h40
1 files changed, 36 insertions, 4 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h
index db9bc02..f45e475 100644
--- a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h
+++ b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h
@@ -44,6 +44,9 @@ class AbstractDb3 : public AbstractDb
AbstractDb3(const QString& name, const QString& path, const QHash<QString, QVariant>& connOptions);
~AbstractDb3();
+ bool loadExtension(const QString& filePath, const QString& initFunc = QString());
+ bool isComplete(const QString& sql) const;
+
protected:
bool isOpenInternal();
void interruptExecution();
@@ -315,6 +318,31 @@ AbstractDb3<T>::~AbstractDb3()
closeInternal();
}
+template<class T>
+bool AbstractDb3<T>::loadExtension(const QString& filePath, const QString& initFunc)
+{
+ char* errMsg = nullptr;
+ int res = T::load_extension(dbHandle, filePath.toUtf8().constData(), initFunc.isEmpty() ? nullptr : initFunc.toUtf8().constData(), &errMsg);
+ if (res != T::OK)
+ {
+ dbErrorMessage = QObject::tr("Could not load extension %1: %2").arg(filePath, extractLastError());
+ dbErrorCode = res;
+ if (errMsg)
+ {
+ dbErrorMessage = QObject::tr("Could not load extension %1: %2").arg(filePath, QString::fromUtf8(errMsg));
+ T::free(errMsg);
+ }
+ return false;
+ }
+ return true;
+}
+
+template<class T>
+bool AbstractDb3<T>::isComplete(const QString& sql) const
+{
+ return T::complete(sql.toUtf8().constData());
+}
+
template <class T>
bool AbstractDb3<T>::isOpenInternal()
{
@@ -358,6 +386,7 @@ bool AbstractDb3<T>::openInternal()
return false;
}
dbHandle = handle;
+ T::enable_load_extension(dbHandle, 1);
return true;
}
@@ -392,7 +421,6 @@ bool AbstractDb3<T>::initAfterCreated()
template <class T>
void AbstractDb3<T>::initAfterOpen()
{
- T::enable_load_extension(dbHandle, true);
registerDefaultCollationRequestHandler();;
exec("PRAGMA foreign_keys = 1;", Flag::NO_LOCK);
exec("PRAGMA recursive_triggers = 1;", Flag::NO_LOCK);
@@ -864,8 +892,6 @@ bool AbstractDb3<T>::Query::execInternal(const QList<QVariant>& args)
ReadWriteLocker locker(&(db->dbOperLock), query, Dialect::Sqlite3, flags.testFlag(Db::Flag::NO_LOCK));
logSql(db.data(), query, args, flags);
- QueryWithParamCount queryWithParams = getQueryWithParamCount(query, Dialect::Sqlite3);
-
int res;
if (stmt)
res = resetStmt();
@@ -875,8 +901,14 @@ bool AbstractDb3<T>::Query::execInternal(const QList<QVariant>& args)
if (res != T::OK)
return false;
+ int maxParamIdx = args.size();
+ if (!flags.testFlag(Db::Flag::SKIP_PARAM_COUNTING))
+ {
+ QueryWithParamCount queryWithParams = getQueryWithParamCount(query, Dialect::Sqlite3);
+ maxParamIdx = qMin(maxParamIdx, queryWithParams.second);
+ }
- for (int paramIdx = 1, argCount = args.size(); paramIdx <= queryWithParams.second && paramIdx <= argCount; paramIdx++)
+ for (int paramIdx = 1; paramIdx <= maxParamIdx; paramIdx++)
{
res = bindParam(paramIdx, args[paramIdx-1]);
if (res != T::OK)