aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/plugins/scriptingsql.cpp
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2023-04-30 18:30:36 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2023-04-30 18:30:36 -0400
commit3565aad630864ecdbe53fdaa501ea708555b3c7c (patch)
treec743e4ad0bad39ebdb2f514c7cc52d34a257ebbe /SQLiteStudio3/coreSQLiteStudio/plugins/scriptingsql.cpp
parent1fdc150116cad39aae5c5da407c3312b47a59e3a (diff)
New upstream version 3.4.4+dfsg.upstream/3.4.4+dfsg
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/plugins/scriptingsql.cpp')
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/plugins/scriptingsql.cpp29
1 files changed, 24 insertions, 5 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/plugins/scriptingsql.cpp b/SQLiteStudio3/coreSQLiteStudio/plugins/scriptingsql.cpp
index 93a6d91..7edd7e7 100644
--- a/SQLiteStudio3/coreSQLiteStudio/plugins/scriptingsql.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/plugins/scriptingsql.cpp
@@ -38,7 +38,7 @@ void ScriptingSql::resetContext(ScriptingPlugin::Context* context)
dynamic_cast<SqlContext*>(context)->errorText.clear();
}
-QVariant ScriptingSql::evaluate(ScriptingPlugin::Context* context, const QString& code, const QList<QVariant>& args, Db* db, bool locking)
+QVariant ScriptingSql::evaluate(ScriptingPlugin::Context* context, const QString& code, const FunctionInfo& funcInfo, const QList<QVariant>& args, Db* db, bool locking)
{
SqlContext* ctx = dynamic_cast<SqlContext*>(context);
ctx->errorText.clear();
@@ -58,14 +58,15 @@ QVariant ScriptingSql::evaluate(ScriptingPlugin::Context* context, const QString
QString sql = code;
if (ctx->variables.size() > 0)
{
- QString value;
for (const QString& key : ctx->variables.keys())
{
- value = "'" + ctx->variables[key].toString() + "'";
+ QString value = "'" + ctx->variables[key].toString() + "'";
sql.replace(":" + key, value).replace("@" + key, value).replace("$" + key, value);
}
}
+ replaceNamedArgs(sql, funcInfo, args);
+
SqlQueryPtr result = theDb->exec(sql, args, execFlags);
if (result->isError())
{
@@ -76,7 +77,7 @@ QVariant ScriptingSql::evaluate(ScriptingPlugin::Context* context, const QString
return result->getSingleCell();
}
-QVariant ScriptingSql::evaluate(const QString& code, const QList<QVariant>& args, Db* db, bool locking, QString* errorMessage)
+QVariant ScriptingSql::evaluate(const QString& code, const FunctionInfo& funcInfo, const QList<QVariant>& args, Db* db, bool locking, QString* errorMessage)
{
Db* theDb = nullptr;
@@ -91,7 +92,10 @@ QVariant ScriptingSql::evaluate(const QString& code, const QList<QVariant>& args
if (!locking)
execFlags |= Db::Flag::NO_LOCK;
- SqlQueryPtr result = theDb->exec(code, args, execFlags);
+ QString sql = code;
+ replaceNamedArgs(sql, funcInfo, args);
+
+ SqlQueryPtr result = theDb->exec(sql, args, execFlags);
if (result->isError())
{
*errorMessage = result->getErrorText();
@@ -144,3 +148,18 @@ void ScriptingSql::deinit()
safe_delete(memDb);
}
+
+void ScriptingSql::replaceNamedArgs(QString& sql, const ScriptingPlugin::FunctionInfo& funcInfo, const QList<QVariant>& args)
+{
+ int i = 0;
+ for (const QString& key : funcInfo.getArguments())
+ {
+ if (i >= args.size())
+ break;
+
+ QString value = "'" + args[i++].toString() + "'";
+ sql.replace(":" + key, value)
+ .replace("@" + key, value)
+ .replace("$" + key, value);
+ }
+}