7 #include <QLoggingCategory>
10 #include <QJsonObject>
14 #include <QtSql/QSqlQuery>
15 #include <QtSql/QSqlError>
16 #include <QtSql/QSqlRecord>
18 Q_LOGGING_CATEGORY(C_SQL,
"cutelyst.utils.sql", QtWarningMsg)
22 QVariantHash Sql::queryToHashObject(QSqlQuery &query)
26 const QSqlRecord record = query.record();
27 const int columns = record.count();
28 for (
int i = 0; i < columns; ++i) {
29 ret.insert(record.fieldName(i), query.value(i));
35 QVariantList Sql::queryToHashList(QSqlQuery &query)
38 const QSqlRecord record = query.record();
39 const int columns = record.count();
41 for (
int i = 0; i < columns; ++i) {
42 cols.append(record.fieldName(i));
45 while (query.next()) {
47 for (
int i = 0; i < columns; ++i) {
48 line.insert(cols.at(i), query.value(i));
55 QVariantMap Sql::queryToMapObject(QSqlQuery &query)
59 const QSqlRecord record = query.record();
60 const int columns = record.count();
61 for (
int i = 0; i < columns; ++i) {
62 ret.insert(record.fieldName(i), query.value(i));
68 QJsonObject Sql::queryToJsonObject(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), QJsonValue::fromVariant(query.value(i)));
81 QVariantList Sql::queryToMapList(QSqlQuery &query)
84 const QSqlRecord record = query.record();
85 const int columns = record.count();
87 for (
int i = 0; i < columns; ++i) {
88 cols.append(record.fieldName(i));
91 while (query.next()) {
93 for (
int i = 0; i < columns; ++i) {
94 line.insert(cols.at(i), query.value(i));
101 QJsonArray Sql::queryToJsonObjectArray(QSqlQuery &query)
104 const QSqlRecord record = query.record();
105 const int columns = record.count();
107 for (
int i = 0; i < columns; ++i) {
108 cols.append(record.fieldName(i));
111 while (query.next()) {
113 for (
int i = 0; i < columns; ++i) {
114 line.insert(cols.at(i), QJsonValue::fromVariant(query.value(i)));
121 QVariantList Sql::queryToList(QSqlQuery &query)
125 const int columns = query.record().count();
126 while (query.next()) {
128 for (
int i = 0; i < columns; ++i) {
129 line.append(query.value(i));
131 ret.append(QVariant::fromValue(line));
137 QJsonArray Sql::queryToJsonArray(QSqlQuery &query)
141 const int columns = query.record().count();
142 while (query.next()) {
144 for (
int i = 0; i < columns; ++i) {
145 array.append(QJsonValue::fromVariant(query.value(i)));
153 QVariantHash Sql::queryToIndexedHash(QSqlQuery &query,
const QString &key)
157 const QSqlRecord record = query.record();
158 int index = record.indexOf(key);
160 qCCritical(C_SQL) <<
"Field Name " << key <<
161 " not found in result set";
165 const int columns = record.count();
168 for (
int i = 0; i < columns; ++i) {
169 cols.append(record.fieldName(i));
172 while (query.next()) {
174 for (
int i = 0; i < columns; ++i) {
176 line.insert(cols.at(i), query.value(i));
180 ret.insert(query.value(index).toString(), line);
186 QJsonObject Sql::queryToIndexedJsonObject(QSqlQuery &query,
const QString &key)
190 const QSqlRecord record = query.record();
191 int index = record.indexOf(key);
193 qCCritical(C_SQL) <<
"Field Name " << key <<
194 " not found in result set";
198 const int columns = record.count();
201 for (
int i = 0; i < columns; ++i) {
202 cols.append(record.fieldName(i));
205 while (query.next()) {
207 for (
int i = 0; i < columns; ++i) {
209 obj.insert(cols.at(i), QJsonValue::fromVariant(query.value(i)));
213 ret.insert(query.value(index).toString(), obj);
221 auto it = params.constBegin();
223 while (it != params.constEnd()) {
224 if (it.value().isNull()) {
225 query.bindValue(u
':' + it.key(), QVariant());
227 query.bindValue(u
':' + it.key(), it.value().toHtmlEscaped());
232 while (it != params.constEnd()) {
233 if (it.value().isNull()) {
234 query.bindValue(u
':' + it.key(), QVariant());
236 query.bindValue(u
':' + it.key(), it.value());
243 QSqlQuery Sql::preparedQuery(
const QString &query, QSqlDatabase db,
bool forwardOnly)
245 QSqlQuery sqlQuery(db);
246 sqlQuery.setForwardOnly(forwardOnly);
247 if (!sqlQuery.prepare(query)) {
248 qCCritical(C_SQL) <<
"Failed to prepare query:" << query << sqlQuery.lastError().databaseText();
253 QSqlQuery Sql::preparedQueryThread(
const QString &query,
const QString &dbName,
bool forwardOnly)
255 QSqlQuery sqlQuery(QSqlDatabase::database(databaseNameThread(dbName)));
256 sqlQuery.setForwardOnly(forwardOnly);
257 if (!sqlQuery.prepare(query)) {
258 qCCritical(C_SQL) <<
"Failed to prepare query:" << query << sqlQuery.lastError().databaseText();
263 QString Sql::databaseNameThread(
const QString &dbName)
265 return dbName + u
'-' + QThread::currentThread()->objectName();
268 QSqlDatabase Sql::databaseThread(
const QString &dbName)
270 return QSqlDatabase::database(databaseNameThread(dbName));
275 m_transactionRunning = m_db.transaction();
280 m_transactionRunning = m_db.transaction();
283 Sql::Transaction::~Transaction()
285 if (m_transactionRunning) {
290 bool Sql::Transaction::transaction()
const
292 return m_transactionRunning;
295 bool Sql::Transaction::commit()
298 m_transactionRunning = !m_db.commit();
299 return !m_transactionRunning;
302 bool Sql::Transaction::rollback()
304 m_transactionRunning =
false;
305 return m_db.rollback();
Transaction(const QString &databaseName=QString())
The Cutelyst namespace holds all public Cutelyst API.
QMultiMap< QString, QString > ParamsMultiMap