1 #ifndef SCRIPTINGQT_H
2 #define SCRIPTINGQT_H
3 
4 #include "builtinplugin.h"
5 #include "scriptingplugin.h"
6 #include <QHash>
7 #include <QVariant>
8 #include <QCache>
9 #include <QScriptValue>
10 #include <QScriptProgram>
11 
12 class QScriptEngine;
13 class QMutex;
14 class QScriptContext;
15 class ScriptingQtDbProxy;
16 
17 class ScriptingQt : public BuiltInPlugin, public DbAwareScriptingPlugin
18 {
19     Q_OBJECT
20 
21     SQLITESTUDIO_PLUGIN_TITLE("Qt scripting")
22     SQLITESTUDIO_PLUGIN_DESC("Qt scripting support.")
23     SQLITESTUDIO_PLUGIN_VERSION(10000)
24     SQLITESTUDIO_PLUGIN_AUTHOR("sqlitestudio.pl")
25 
26     public:
27         ScriptingQt();
28         ~ScriptingQt();
29 
30         QString getLanguage() const;
31         Context* createContext();
32         void releaseContext(Context* context);
33         void resetContext(Context* context);
34         QVariant evaluate(const QString& code, const QList<QVariant>& args, Db* db, bool locking = false, QString* errorMessage = nullptr);
35         QVariant evaluate(Context* context, const QString& code, const QList<QVariant>& args, Db* db, bool locking = false);
36         void setVariable(Context* context, const QString& name, const QVariant& value);
37         QVariant getVariable(Context* context, const QString& name);
38         bool hasError(Context* context) const;
39         QString getErrorMessage(Context* context) const;
40         QString getIconPath() const;
41         bool init();
42         void deinit();
43 
44     private:
45         using DbAwareScriptingPlugin::evaluate;
46 
47         class ContextQt : public ScriptingPlugin::Context
48         {
49             public:
50                 ContextQt();
51                 ~ContextQt();
52 
53                 QScriptEngine* engine = nullptr;
54                 QCache<QString,QScriptProgram> scriptCache;
55                 QString error;
56                 ScriptingQtDbProxy* dbProxy = nullptr;
57                 QScriptValue dbProxyScriptValue;
58         };
59 
60         ContextQt* getContext(ScriptingPlugin::Context* context) const;
61         QScriptValue getFunctionValue(ContextQt* ctx, const QString& code);
62         QVariant evaluate(ContextQt* ctx, QScriptContext* engineContext, const QString& code, const QList<QVariant>& args, Db* db, bool locking);
63         QVariant convertVariant(const QVariant& value, bool wrapStrings = false);
64 
65         static const constexpr int cacheSize = 5;
66 
67         ContextQt* mainContext = nullptr;
68         QList<Context*> contexts;
69         QMutex* mainEngineMutex = nullptr;
70 };
71 
72 #endif // SCRIPTINGQT_H
73