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