20 #include <QLoggingCategory>
23 #include <QJsonObject>
27 #include <QtSql/QSqlQuery>
28 #include <QtSql/QSqlError>
29 #include <QtSql/QSqlRecord>
31 Q_LOGGING_CATEGORY(C_SQL,
"cutelyst.utils.sql", QtWarningMsg)
35 QVariantHash Sql::queryToHashObject(QSqlQuery &query)
39 const QSqlRecord record = query.record();
40 const int columns = record.count();
41 for (
int i = 0; i < columns; ++i) {
42 ret.insert(record.fieldName(i), query.value(i));
48 QVariantList Sql::queryToHashList(QSqlQuery &query)
51 const QSqlRecord record = query.record();
52 const int columns = record.count();
54 for (
int i = 0; i < columns; ++i) {
55 cols.append(record.fieldName(i));
58 while (query.next()) {
60 for (
int i = 0; i < columns; ++i) {
61 line.insert(cols.at(i), query.value(i));
68 QVariantMap Sql::queryToMapObject(QSqlQuery &query)
72 const QSqlRecord record = query.record();
73 const int columns = record.count();
74 for (
int i = 0; i < columns; ++i) {
75 ret.insert(record.fieldName(i), query.value(i));
81 QJsonObject Sql::queryToJsonObject(QSqlQuery &query)
85 const QSqlRecord record = query.record();
86 const int columns = record.count();
87 for (
int i = 0; i < columns; ++i) {
88 ret.insert(record.fieldName(i), QJsonValue::fromVariant(query.value(i)));
94 QVariantList Sql::queryToMapList(QSqlQuery &query)
97 const QSqlRecord record = query.record();
98 const int columns = record.count();
100 for (
int i = 0; i < columns; ++i) {
101 cols.append(record.fieldName(i));
104 while (query.next()) {
106 for (
int i = 0; i < columns; ++i) {
107 line.insert(cols.at(i), query.value(i));
114 QJsonArray Sql::queryToJsonObjectArray(QSqlQuery &query)
117 const QSqlRecord record = query.record();
118 const int columns = record.count();
120 for (
int i = 0; i < columns; ++i) {
121 cols.append(record.fieldName(i));
124 while (query.next()) {
126 for (
int i = 0; i < columns; ++i) {
127 line.insert(cols.at(i), QJsonValue::fromVariant(query.value(i)));
134 QVariantList Sql::queryToList(QSqlQuery &query)
138 const int columns = query.record().count();
139 while (query.next()) {
141 for (
int i = 0; i < columns; ++i) {
142 line.append(query.value(i));
144 ret.append(QVariant::fromValue(line));
150 QJsonArray Sql::queryToJsonArray(QSqlQuery &query)
154 const int columns = query.record().count();
155 while (query.next()) {
157 for (
int i = 0; i < columns; ++i) {
158 array.append(QJsonValue::fromVariant(query.value(i)));
166 QVariantHash Sql::queryToIndexedHash(QSqlQuery &query,
const QString &key)
170 const QSqlRecord record = query.record();
171 int index = record.indexOf(key);
173 qCCritical(C_SQL) <<
"Field Name " << key <<
174 " not found in result set";
178 const int columns = record.count();
181 for (
int i = 0; i < columns; ++i) {
182 cols.append(record.fieldName(i));
185 while (query.next()) {
187 for (
int i = 0; i < columns; ++i) {
189 line.insertMulti(cols.at(i), query.value(i));
193 ret.insertMulti(query.value(index).toString(), line);
199 QJsonObject Sql::queryToIndexedJsonObject(QSqlQuery &query,
const QString &key)
203 const QSqlRecord record = query.record();
204 int index = record.indexOf(key);
206 qCCritical(C_SQL) <<
"Field Name " << key <<
207 " not found in result set";
211 const int columns = record.count();
214 for (
int i = 0; i < columns; ++i) {
215 cols.append(record.fieldName(i));
218 while (query.next()) {
220 for (
int i = 0; i < columns; ++i) {
222 obj.insert(cols.at(i), QJsonValue::fromVariant(query.value(i)));
226 ret.insert(query.value(index).toString(), obj);
234 auto it = params.constBegin();
236 while (it != params.constEnd()) {
237 if (it.value().isNull()) {
238 query.bindValue(QLatin1Char(
':') + it.key(), QVariant());
240 query.bindValue(QLatin1Char(
':') + it.key(), it.value().toHtmlEscaped());
245 while (it != params.constEnd()) {
246 if (it.value().isNull()) {
247 query.bindValue(QLatin1Char(
':') + it.key(), QVariant());
249 query.bindValue(QLatin1Char(
':') + it.key(), it.value());
256 QSqlQuery Sql::preparedQuery(
const QString &query, QSqlDatabase db,
bool forwardOnly)
258 QSqlQuery sqlQuery(db);
259 sqlQuery.setForwardOnly(forwardOnly);
260 if (!sqlQuery.prepare(query)) {
261 qCCritical(C_SQL) <<
"Failed to prepare query:" << query << sqlQuery.lastError().databaseText();
266 QSqlQuery Sql::preparedQueryThread(
const QString &query,
const QString &dbName,
bool forwardOnly)
268 QSqlQuery sqlQuery(QSqlDatabase::database(databaseNameThread(dbName)));
269 sqlQuery.setForwardOnly(forwardOnly);
270 if (!sqlQuery.prepare(query)) {
271 qCCritical(C_SQL) <<
"Failed to prepare query:" << query << sqlQuery.lastError().databaseText();
276 QString Sql::databaseNameThread(
const QString &dbName)
278 return dbName + QLatin1Char(
'-') + QThread::currentThread()->objectName();
281 QSqlDatabase Sql::databaseThread(
const QString &dbName)
283 return QSqlDatabase::database(databaseNameThread(dbName));
288 m_transactionRunning = m_db.transaction();
293 m_transactionRunning = m_db.transaction();
296 Sql::Transaction::~Transaction()
298 if (m_transactionRunning) {
303 bool Sql::Transaction::transaction()
const
305 return m_transactionRunning;
308 bool Sql::Transaction::commit()
311 m_transactionRunning = !m_db.commit();
312 return !m_transactionRunning;
315 bool Sql::Transaction::rollback()
317 m_transactionRunning =
false;
318 return m_db.rollback();