#include "scriptingqtdbproxy.h" #include "db/db.h" #include "db/sqlquery.h" #include #include ScriptingQtDbProxy::ScriptingQtDbProxy(QObject *parent) : QObject(parent) { } Db* ScriptingQtDbProxy::getDb() const { return db; } void ScriptingQtDbProxy::setDb(Db* value) { db = value; } bool ScriptingQtDbProxy::getUseDbLocking() const { return useDbLocking; } void ScriptingQtDbProxy::setUseDbLocking(bool value) { useDbLocking = value; } QHash ScriptingQtDbProxy::mapToHash(const QMap& map) { QHash hash; QMapIterator it(map); while (it.hasNext()) { it.next(); hash[it.key()] = it.value(); } return hash; } QVariant ScriptingQtDbProxy::evalInternal(const QString& sql, const QList& listArgs, const QMap& mapArgs, bool singleCell, const QScriptValue* funcPtr) { if (!db) { QString funcName = singleCell ? QStringLiteral("db.onecolumn()") : QStringLiteral("db.eval()"); context()->throwError(tr("No database available in current context, while called QtScript's %1 command.").arg(funcName)); return evalInternalErrorResult(singleCell); } Db::Flags flags; if (!useDbLocking) flags |= Db::Flag::NO_LOCK; SqlQueryPtr results; if (listArgs.size() > 0) results = db->exec(sql, listArgs, flags); else results = db->exec(sql, mapToHash(mapArgs), flags); if (results->isError()) { QString funcName = singleCell ? QStringLiteral("db.onecolumn()") : QStringLiteral("db.eval()"); context()->throwError(tr("Error from %1: %2").arg(funcName, results->getErrorText())); return evalInternalErrorResult(singleCell); } if (singleCell) { return results->getSingleCell(); } else if (funcPtr) { QScriptValue func(*funcPtr); SqlResultsRowPtr row; QScriptValue funcArgs; QScriptValue funcResult; while (results->hasNext()) { row = results->next(); funcArgs = context()->engine()->toScriptValue(row->valueList()); funcResult = func.call(context()->thisObject(), funcArgs); if (!funcResult.isUndefined()) break; } return funcResult.toVariant(); } else { QList evalResults; SqlResultsRowPtr row; while (results->hasNext()) { row = results->next(); evalResults << QVariant(row->valueList()); } return evalResults; } } QVariant ScriptingQtDbProxy::evalInternalErrorResult(bool singleCell) { QList result; if (singleCell) result << QVariant(); return result; } QVariant ScriptingQtDbProxy::eval(const QString& sql) { return evalInternal(sql, QList(), QMap(), false); } QVariant ScriptingQtDbProxy::eval(const QString& sql, const QList& args) { return evalInternal(sql, args, QMap(), false); } QVariant ScriptingQtDbProxy::eval(const QString& sql, const QMap& args) { return evalInternal(sql, QList(), args, false); } QVariant ScriptingQtDbProxy::eval(const QString& sql, const QList& args, const QScriptValue& func) { return evalInternal(sql, args, QMap(), false, &func); } QVariant ScriptingQtDbProxy::eval(const QString& sql, const QMap& args, const QScriptValue& func) { return evalInternal(sql, QList(), args, false, &func); } QVariant ScriptingQtDbProxy::onecolumn(const QString& sql, const QList& args) { return evalInternal(sql, args, QMap(), true); } QVariant ScriptingQtDbProxy::onecolumn(const QString& sql, const QMap& args) { return evalInternal(sql, QList(), args, true); }