databaseupdatestest.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "databaseupdatestest.h"
  2. #include <Cutelyst/Plugins/Utils/Sql>
  3. #include <QSqlQuery>
  4. #include <QJsonDocument>
  5. #include <QJsonObject>
  6. #include <QJsonArray>
  7. DatabaseUpdatesTest::DatabaseUpdatesTest(QObject *parent) : Controller(parent)
  8. {
  9. }
  10. void DatabaseUpdatesTest::updates_postgres(Context *c)
  11. {
  12. QSqlQuery query = CPreparedSqlQueryThreadForDB(
  13. QLatin1String("SELECT randomNumber FROM world WHERE id = :id"),
  14. QStringLiteral("postgres"));
  15. QSqlQuery updateQuery = CPreparedSqlQueryThreadForDB(
  16. QLatin1String("UPDATE world SET randomNumber = :randomNumber WHERE id = :id"),
  17. QStringLiteral("postgres"));
  18. processQuery(c, query, updateQuery);
  19. }
  20. void DatabaseUpdatesTest::updates_mysql(Context *c)
  21. {
  22. QSqlQuery query = CPreparedSqlQueryThreadForDB(
  23. QLatin1String("SELECT randomNumber FROM world WHERE id = :id"),
  24. QStringLiteral("mysql"));
  25. QSqlQuery updateQuery = CPreparedSqlQueryThreadForDB(
  26. QLatin1String("UPDATE world SET randomNumber = :randomNumber WHERE id = :id"),
  27. QStringLiteral("mysql"));
  28. processQuery(c, query, updateQuery);
  29. }
  30. void DatabaseUpdatesTest::processQuery(Context *c, QSqlQuery &query, QSqlQuery &updateQuery)
  31. {
  32. QJsonArray array;
  33. int queries = c->request()->queryParam(QStringLiteral("queries"), QStringLiteral("1")).toInt();
  34. if (queries < 1) {
  35. queries = 1;
  36. } else if (queries > 500) {
  37. queries = 500;
  38. }
  39. QVariantList ids, randomNumbers;
  40. ids.reserve(queries);
  41. randomNumbers.reserve(queries);
  42. for (int i = 0; i < queries; ++i) {
  43. int id = (qrand() % 10000) + 1;
  44. query.bindValue(QStringLiteral(":id"), id);
  45. if (Q_UNLIKELY(!query.exec() || !query.next())) {
  46. c->res()->setStatus(Response::InternalServerError);
  47. return;
  48. }
  49. int randomNumber = (qrand() % 10000) + 1;
  50. ids.append(id);
  51. randomNumbers.append(randomNumber);
  52. array.append(QJsonObject{
  53. {QStringLiteral("id"), id},
  54. {QStringLiteral("randomNumber"), randomNumber}
  55. });
  56. }
  57. updateQuery.bindValue(QStringLiteral(":id"), ids);
  58. updateQuery.bindValue(QStringLiteral(":randomNumber"), randomNumbers);
  59. if (Q_LIKELY(updateQuery.execBatch())) {
  60. c->response()->setJsonArrayBody(array);
  61. } else {
  62. c->res()->setStatus(Response::InternalServerError);
  63. }
  64. }