diff options
Diffstat (limited to 'Plugins/ScriptingTcl/scriptingtcl.cpp')
| -rw-r--r-- | Plugins/ScriptingTcl/scriptingtcl.cpp | 59 |
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; } |
