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