sqlquery.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. Copyright 2017 Herik Lima de Castro and Marcelo Medeiros Eler
  3. Distributed under MIT license, or public domain if desired and
  4. recognized in your jurisdiction.
  5. See file LICENSE for detail.
  6. */
  7. #include "sqlquery.h"
  8. #include <QSqlDriver>
  9. #include "qjsonvalue.h"
  10. CWF_BEGIN_NAMESPACE
  11. SqlQuery::SqlQuery(CWF::SqlDatabaseStorage &dbStorage)
  12. : QSqlQuery(dbStorage.getDatabase())
  13. {}
  14. void SqlQuery::makeBinds(const QVector<QVariant> &col, const QString &sql)
  15. {
  16. prepare(sql);
  17. int total = col.size();
  18. for (int i = 0; i < total; ++i) {
  19. bindValue(i, col[i]);
  20. }
  21. }
  22. QJsonObject SqlQuery::validate(const QJsonObject &json, const QString &table)
  23. {
  24. if (json.isEmpty()) {
  25. return QJsonObject{{"success", false}, {"message", "JSON is empty"}};
  26. }
  27. if (table.isEmpty()) {
  28. return QJsonObject{{"success", false}, {"message", "Table name is empty"}};
  29. }
  30. return QJsonObject{{"success", true}};
  31. }
  32. void SqlQuery::loadColumns()
  33. {
  34. int total = record().count();
  35. columns.resize(total);
  36. for (int i = 0; i < total; ++i) {
  37. columns[i] = record().fieldName(i);
  38. }
  39. }
  40. QJsonObject SqlQuery::exec()
  41. {
  42. if (QSqlQuery::exec()) {
  43. return QJsonObject{{"success", true}, {"message", "Success"}};
  44. }
  45. return QJsonObject{{"success", false}, {"message", lastError().text()}};
  46. }
  47. QJsonObject SqlQuery::exec(const QString &query)
  48. {
  49. if (QSqlQuery::exec(query)) {
  50. return QJsonObject{{"success", true}, {"message", "Success"}};
  51. }
  52. return QJsonObject{{"success", false}, {"message", lastError().text()}};
  53. }
  54. QJsonArray SqlQuery::toJson()
  55. {
  56. QJsonArray array;
  57. QString error(lastError().text());
  58. if (!error.trimmed().isEmpty()) {
  59. array.push_back(QJsonObject{{"success", false}, {"message", error}});
  60. } else if (isSelect()) {
  61. loadColumns();
  62. first();
  63. int total = columns.size();
  64. while (isValid()) {
  65. QJsonObject json;
  66. for (int i = 0; i < total; ++i) {
  67. bool isNull = record().isNull(i);
  68. if (isNull) {
  69. json[columns[i]] = QJsonValue();
  70. } else {
  71. const QVariant var = record().value(i);
  72. if (var.type() == QVariant::Bool)
  73. json[columns[i]] = var.toBool();
  74. else if (var.type() == QVariant::Int)
  75. json[columns[i]] = var.toInt();
  76. else if (var.type() == QVariant::LongLong)
  77. json[columns[i]] = var.toLongLong();
  78. else if (var.type() == QVariant::Double)
  79. json[columns[i]] = var.toDouble();
  80. else {
  81. json[columns[i]] = var.toString();
  82. }
  83. }
  84. }
  85. array.push_back(json);
  86. next();
  87. }
  88. first();
  89. }
  90. return array;
  91. }
  92. QJsonObject SqlQuery::deleteRecord(const QString &table, const QString &condition)
  93. {
  94. return exec("delete from " + table + " where " + condition);
  95. }
  96. QJsonObject SqlQuery::insertFromJson(const QJsonObject &json, const QString &table)
  97. {
  98. QJsonObject status(validate(json, table));
  99. if (status["success"].toBool()) {
  100. QString firstSql, secondSql;
  101. const QString comma(","), questionMark("?");
  102. QVector<QVariant> values;
  103. values.reserve(json.count());
  104. for (auto it = json.begin(); it != json.end(); ++it) {
  105. const QString &key = it.key();
  106. firstSql += key + comma;
  107. secondSql += questionMark + comma;
  108. values.push_back(it.value().toVariant());
  109. }
  110. firstSql.remove(firstSql.size() - 1, 1);
  111. secondSql.remove(secondSql.size() - 1, 1);
  112. makeBinds(values, "insert into " + table + "(" + firstSql + ") values(" + secondSql + ");");
  113. return exec();
  114. }
  115. return status;
  116. }
  117. QJsonObject SqlQuery::updateFromJson(const QJsonObject &json,
  118. const QString &table,
  119. const QString &condition)
  120. {
  121. QJsonObject status(validate(json, table));
  122. if (status["success"].toBool()) {
  123. QString sets;
  124. const QString comma(","), questionMark("?"), equal("=");
  125. QVector<QVariant> values;
  126. values.reserve(json.count());
  127. for (auto it = json.begin(); it != json.end(); ++it) {
  128. const QString &key = it.key();
  129. sets += key + equal + questionMark + comma;
  130. values.push_back(it.value().toVariant());
  131. }
  132. sets.remove(sets.size() - 1, 1);
  133. makeBinds(values, "update " + table + " set " + sets + " where " + condition);
  134. return exec();
  135. }
  136. return status;
  137. }
  138. CWF_END_NAMESPACE