1 #include "scriptingsql.h"
2 #include "common/unused.h"
3 #include "db/db.h"
4 #include "db/sqlquery.h"
5 #include "services/dbmanager.h"
6
ScriptingSql()7 ScriptingSql::ScriptingSql()
8 {
9 }
10
~ScriptingSql()11 ScriptingSql::~ScriptingSql()
12 {
13 }
14
getLanguage() const15 QString ScriptingSql::getLanguage() const
16 {
17 return "SQL";
18 }
19
createContext()20 ScriptingPlugin::Context* ScriptingSql::createContext()
21 {
22 SqlContext* ctx = new SqlContext();
23 contexts << ctx;
24 return ctx;
25 }
26
releaseContext(ScriptingPlugin::Context * context)27 void ScriptingSql::releaseContext(ScriptingPlugin::Context* context)
28 {
29 if (!contexts.contains(context))
30 return;
31
32 delete context;
33 contexts.removeOne(context);
34 }
35
resetContext(ScriptingPlugin::Context * context)36 void ScriptingSql::resetContext(ScriptingPlugin::Context* context)
37 {
38 dynamic_cast<SqlContext*>(context)->errorText.clear();
39 }
40
evaluate(ScriptingPlugin::Context * context,const QString & code,const QList<QVariant> & args,Db * db,bool locking)41 QVariant ScriptingSql::evaluate(ScriptingPlugin::Context* context, const QString& code, const QList<QVariant>& args, Db* db, bool locking)
42 {
43 SqlContext* ctx = dynamic_cast<SqlContext*>(context);
44 ctx->errorText.clear();
45
46 Db* theDb = nullptr;
47 if (db && db->isValid())
48 theDb = db;
49 else if (memDb)
50 theDb = memDb;
51 else
52 return QVariant();
53
54 Db::Flags execFlags;
55 if (!locking)
56 execFlags |= Db::Flag::NO_LOCK;
57
58 QString sql = code;
59 if (ctx->variables.size() > 0)
60 {
61 QString value;
62 for (const QString& key : ctx->variables.keys())
63 {
64 value = "'" + ctx->variables[key].toString() + "'";
65 sql.replace(":" + key, value).replace("@" + key, value).replace("$" + key, value);
66 }
67 }
68
69 SqlQueryPtr result = theDb->exec(sql, args, execFlags);
70 if (result->isError())
71 {
72 dynamic_cast<SqlContext*>(context)->errorText = result->getErrorText();
73 return QVariant();
74 }
75
76 return result->getSingleCell();
77 }
78
evaluate(const QString & code,const QList<QVariant> & args,Db * db,bool locking,QString * errorMessage)79 QVariant ScriptingSql::evaluate(const QString& code, const QList<QVariant>& args, Db* db, bool locking, QString* errorMessage)
80 {
81 Db* theDb = nullptr;
82
83 if (db && db->isValid())
84 theDb = db;
85 else if (memDb)
86 theDb = memDb;
87 else
88 return QVariant();
89
90 Db::Flags execFlags;
91 if (!locking)
92 execFlags |= Db::Flag::NO_LOCK;
93
94 SqlQueryPtr result = theDb->exec(code, args, execFlags);
95 if (result->isError())
96 {
97 *errorMessage = result->getErrorText();
98 return QVariant();
99 }
100
101 return result->getSingleCell();
102 }
103
setVariable(ScriptingPlugin::Context * context,const QString & name,const QVariant & value)104 void ScriptingSql::setVariable(ScriptingPlugin::Context* context, const QString& name, const QVariant& value)
105 {
106 dynamic_cast<SqlContext*>(context)->variables[name] = value;
107 }
108
getVariable(ScriptingPlugin::Context * context,const QString & name)109 QVariant ScriptingSql::getVariable(ScriptingPlugin::Context* context, const QString& name)
110 {
111 if (dynamic_cast<SqlContext*>(context)->variables.contains(name))
112 return dynamic_cast<SqlContext*>(context)->variables[name];
113
114 return QVariant();
115 }
116
hasError(ScriptingPlugin::Context * context) const117 bool ScriptingSql::hasError(ScriptingPlugin::Context* context) const
118 {
119 return !getErrorMessage(context).isNull();
120 }
121
getErrorMessage(ScriptingPlugin::Context * context) const122 QString ScriptingSql::getErrorMessage(ScriptingPlugin::Context* context) const
123 {
124 return dynamic_cast<SqlContext*>(context)->errorText;
125 }
126
getIconPath() const127 QString ScriptingSql::getIconPath() const
128 {
129 return ":/images/plugins/scriptingsql.png";
130 }
131
init()132 bool ScriptingSql::init()
133 {
134 memDb = DBLIST->createInMemDb();
135 return memDb != nullptr;
136 }
137
deinit()138 void ScriptingSql::deinit()
139 {
140 for (Context* context : contexts)
141 delete context;
142
143 contexts.clear();
144
145 safe_delete(memDb);
146 }
147