summaryrefslogtreecommitdiffstats
path: root/Plugins/ScriptingTcl/scriptingtcl.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 /Plugins/ScriptingTcl/scriptingtcl.cpp
parent1fdc150116cad39aae5c5da407c3312b47a59e3a (diff)
New upstream version 3.4.4+dfsg.upstream/3.4.4+dfsg
Diffstat (limited to 'Plugins/ScriptingTcl/scriptingtcl.cpp')
-rw-r--r--Plugins/ScriptingTcl/scriptingtcl.cpp59
1 files changed, 38 insertions, 21 deletions
diff --git a/Plugins/ScriptingTcl/scriptingtcl.cpp b/Plugins/ScriptingTcl/scriptingtcl.cpp
index cc48aa0..2754afe 100644
--- a/Plugins/ScriptingTcl/scriptingtcl.cpp
+++ b/Plugins/ScriptingTcl/scriptingtcl.cpp
@@ -20,7 +20,7 @@ ScriptingTcl::~ScriptingTcl()
bool ScriptingTcl::init()
{
- Q_INIT_RESOURCE(scriptingtcl);
+ SQLS_INIT_RESOURCE(scriptingtcl);
QMutexLocker locker(mainInterpMutex);
mainContext = new ContextTcl();
return true;
@@ -31,7 +31,7 @@ void ScriptingTcl::deinit()
QMutexLocker locker(mainInterpMutex);
safe_delete(mainContext);
Tcl_Finalize();
- Q_CLEANUP_RESOURCE(scriptingtcl);
+ SQLS_CLEANUP_RESOURCE(scriptingtcl);
}
QString ScriptingTcl::getLanguage() const
@@ -106,21 +106,21 @@ QString ScriptingTcl::getIconPath() const
return ":/scriptingtcl/scriptingtcl.png";
}
-QVariant ScriptingTcl::evaluate(ScriptingPlugin::Context* context, const QString& code, const QList<QVariant>& args, Db* db, bool locking)
+QVariant ScriptingTcl::evaluate(ScriptingPlugin::Context* context, const QString& code, const FunctionInfo& funcInfo,
+ const QList<QVariant>& args, Db* db, bool locking)
{
ContextTcl* ctx = getContext(context);
if (!ctx)
return QVariant();
- setArgs(ctx, args);
- return compileAndEval(ctx, code, db, locking);
+ return compileAndEval(ctx, code, funcInfo, args, db, locking);
}
-QVariant ScriptingTcl::evaluate(const QString& code, const QList<QVariant>& args, Db* db, bool locking, QString* errorMessage)
+QVariant ScriptingTcl::evaluate(const QString& code, const FunctionInfo& funcInfo, const QList<QVariant>& args,
+ Db* db, bool locking, QString* errorMessage)
{
QMutexLocker locker(mainInterpMutex);
- setArgs(mainContext, args);
- QVariant results = compileAndEval(mainContext, code, db, locking);
+ QVariant results = compileAndEval(mainContext, code, funcInfo, args, db, locking);
if (errorMessage && !mainContext->error.isEmpty())
*errorMessage = mainContext->error;
@@ -137,21 +137,25 @@ ScriptingTcl::ContextTcl* ScriptingTcl::getContext(ScriptingPlugin::Context* con
return ctx;
}
-QVariant ScriptingTcl::compileAndEval(ScriptingTcl::ContextTcl* ctx, const QString& code, Db* db, bool locking)
+QVariant ScriptingTcl::compileAndEval(ScriptingTcl::ContextTcl* ctx, const QString& code, const FunctionInfo& funcInfo,
+ const QList<QVariant>& args, Db* db, bool locking)
{
- ScriptObject* scriptObj = nullptr;
- if (!ctx->scriptCache.contains(code))
- {
- scriptObj = new ScriptObject(code);
- ctx->scriptCache.insert(code, scriptObj);
- }
- else
- {
- scriptObj = ctx->scriptCache[code];
- }
+ ScriptObject* scriptObj = getScript(code, funcInfo, ctx);
+
Tcl_ResetResult(ctx->interp);
ctx->error.clear();
+ setArgs(ctx, args);
+
+ int i = 0;
+ for (const QString& key : funcInfo.getArguments())
+ {
+ if (i >= args.size())
+ break;
+
+ setVariable(ctx, key, args[i++]);
+ }
+
ctx->db = db;
ctx->useDbLocking = locking;
@@ -180,6 +184,19 @@ void ScriptingTcl::setArgs(ScriptingTcl::ContextTcl* ctx, const QList<QVariant>&
setVariable(ctx, "argv", args);
}
+ScriptingTcl::ScriptObject* ScriptingTcl::getScript(const QString code, const ScriptingPlugin::FunctionInfo& funcInfo, ContextTcl* ctx)
+{
+ static const QString keyTpl = QStringLiteral("{%1} %2");
+
+ QString key = keyTpl.arg(funcInfo.getArguments().join(" "), code);
+ if (ctx->scriptCache.contains(key))
+ return ctx->scriptCache[key];
+
+ ScriptObject* scriptObj = new ScriptObject(code);
+ ctx->scriptCache.insert(key, scriptObj);
+ return scriptObj;
+}
+
Tcl_Obj* ScriptingTcl::argsToList(const QList<QVariant>& args)
{
Tcl_Obj** objArray = new Tcl_Obj*[args.size()];
@@ -431,7 +448,7 @@ int ScriptingTcl::dbCommand(ClientData clientData, Tcl_Interp* interp, int objc,
return dbEvalOneColumn(ctx, interp, objv);
}
- result = Tcl_NewStringObj(tr("Invalid '%1' command sytax. Should be: %2").arg("db", "db eval sql").toUtf8().constData(), -1);
+ result = Tcl_NewStringObj(tr("Invalid '%1' command syntax. Should be: %2").arg("db", "db eval sql").toUtf8().constData(), -1);
Tcl_SetObjResult(interp, result);
return TCL_ERROR;
}
@@ -443,7 +460,7 @@ int ScriptingTcl::initTclCommand(ClientData clientData, Tcl_Interp* interp, int
if (objc > 1)
{
- Tcl_Obj* result = Tcl_NewStringObj(tr("Error from Tcl's' '%1' command: %2").arg("tcl_init", "invalid # args: tcl_init").toUtf8().constData(), -1);
+ Tcl_Obj* result = Tcl_NewStringObj(tr("Error from Tcl's '%1' command: %2").arg("tcl_init", "invalid # args: tcl_init").toUtf8().constData(), -1);
Tcl_SetObjResult(interp, result);
return TCL_ERROR;
}