aboutsummaryrefslogtreecommitdiffstats
path: root/Plugins/ScriptingPython/scriptingpython.h
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/ScriptingPython/scriptingpython.h
parent1fdc150116cad39aae5c5da407c3312b47a59e3a (diff)
New upstream version 3.4.4+dfsg.upstream/3.4.4+dfsg
Diffstat (limited to 'Plugins/ScriptingPython/scriptingpython.h')
-rw-r--r--Plugins/ScriptingPython/scriptingpython.h96
1 files changed, 96 insertions, 0 deletions
diff --git a/Plugins/ScriptingPython/scriptingpython.h b/Plugins/ScriptingPython/scriptingpython.h
new file mode 100644
index 0000000..ef88a20
--- /dev/null
+++ b/Plugins/ScriptingPython/scriptingpython.h
@@ -0,0 +1,96 @@
+#ifndef SCRIPTINGPYTHON_H
+#define SCRIPTINGPYTHON_H
+
+#include <Python.h>
+
+#include "scriptingpython_global.h"
+#include "plugins/genericplugin.h"
+#include "plugins/scriptingplugin.h"
+#include "db/sqlquery.h"
+#include <QCache>
+
+class QMutex;
+
+class SCRIPTINGPYTHONSHARED_EXPORT ScriptingPython : public GenericPlugin, public DbAwareScriptingPlugin
+{
+ Q_OBJECT
+ SQLITESTUDIO_PLUGIN("scriptingpython.json")
+
+ public:
+ static PyObject* dbEval(PyObject *self, PyObject* const* args, Py_ssize_t nargs);
+
+ ScriptingPython();
+ ~ScriptingPython();
+
+ bool init();
+ void deinit();
+ QString getLanguage() const;
+ Context* createContext();
+ void releaseContext(Context* context);
+ void resetContext(Context* context);
+ void setVariable(Context* context, const QString& name, const QVariant& value);
+ QVariant getVariable(Context* context, const QString& name);
+ bool hasError(Context* context) const;
+ QString getErrorMessage(Context* context) const;
+ QString getIconPath() const;
+ QVariant evaluate(Context* context, const QString& code, const FunctionInfo& funcInfo, const QList<QVariant>& args, Db* db, bool locking = false);
+ QVariant evaluate(const QString& code, const FunctionInfo& funcInfo, const QList<QVariant>& args, Db* db, bool locking = false, QString* errorMessage = nullptr);
+
+ private:
+ class ContextPython;
+ class ScriptObject
+ {
+ public:
+ ScriptObject(const QString& code, const FunctionInfo& funcInfo, ContextPython* context);
+ ~ScriptObject();
+
+ PyObject* getCompiled() const;
+
+ private:
+ PyObject* compiled = nullptr;
+ };
+
+ class ContextPython : public ScriptingPlugin::Context
+ {
+ public:
+ ContextPython();
+ ~ContextPython();
+
+ void reset();
+
+ PyThreadState* interp = nullptr;
+ PyObject* mainModule = nullptr;
+ PyObject* envDict = nullptr;
+ QCache<QString, ScriptObject> scriptCache;
+ QString error;
+ Db* db = nullptr;
+ bool useDbLocking = false;
+
+ private:
+ void init();
+ void clear();
+ };
+
+ ContextPython* getContext(ScriptingPlugin::Context* context) const;
+ QVariant compileAndEval(ContextPython* ctx, const QString& code, const FunctionInfo& funcInfo,
+ const QList<QVariant>& args, Db* db, bool locking);
+ void clearError(ContextPython* ctx);
+ ScriptObject* getScriptObject(const QString code, const ScriptingPlugin::FunctionInfo& funcInfo, ContextPython* ctx);
+
+ static QString extractError();
+ static PyObject* argsToPyArgs(const QVariantList& args, const QStringList& namedParameters);
+ static QVariant pythonObjToVariant(PyObject* obj);
+ static QString pythonObjToString(PyObject* obj);
+ static PyObject* variantToPythonObj(const QVariant& value);
+ static PyObject* stringToPythonObj(const QString& value);
+ static SqlQueryPtr dbCommonEval(PyObject* sqlArg, const char* fnName);
+ static QVariant getVariable(const QString& name);
+
+ static const constexpr int cacheSize = 5;
+ static QHash<PyThreadState*, ContextPython*> contexts;
+
+ ContextPython* mainContext = nullptr;
+ QMutex* mainInterpMutex = nullptr;
+};
+
+#endif // SCRIPTINGPYTHON_H