diff options
| author | 2023-04-30 18:30:36 -0400 | |
|---|---|---|
| committer | 2023-04-30 18:30:36 -0400 | |
| commit | 3565aad630864ecdbe53fdaa501ea708555b3c7c (patch) | |
| tree | c743e4ad0bad39ebdb2f514c7cc52d34a257ebbe /Plugins/ScriptingPython/scriptingpython.h | |
| parent | 1fdc150116cad39aae5c5da407c3312b47a59e3a (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.h | 96 |
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 |
