diff options
| author | 2023-04-30 18:31:18 -0400 | |
|---|---|---|
| committer | 2023-04-30 18:31:18 -0400 | |
| commit | 4de57f628bc74f00ba1885e91c84ea07c5405d8f (patch) | |
| tree | 5d91900751e826d491ff1b2ebc571a787e84f864 /Plugins/ScriptingPython/scriptingpython.h | |
| parent | 74d881cefa9097e58e129e37b9c44d680d8c7dfe (diff) | |
| parent | 3565aad630864ecdbe53fdaa501ea708555b3c7c (diff) | |
Update upstream source from tag 'upstream/3.4.4+dfsg'
Update to upstream version '3.4.4+dfsg'
with Debian dir 482614bd23f0ef52dabc9803477204ad88e917ed
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 |
