fortunetest.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "fortunetest.h"
  2. #include <Cutelyst/Plugins/Utils/Sql>
  3. #include <QStringBuilder>
  4. #include <QtSql/QSqlQuery>
  5. #include <QtCore/QThread>
  6. #include <QtCore/QJsonDocument>
  7. #include <QtCore/QJsonObject>
  8. #include <QtCore/QJsonArray>
  9. FortuneTest::FortuneTest(QObject *parent) : Controller(parent)
  10. {
  11. }
  12. void FortuneTest::fortunes_raw_postgres(Context *c)
  13. {
  14. QSqlQuery query = postgresQuery();
  15. auto fortunes = processQuery(c, query);
  16. renderRaw(c, fortunes);
  17. }
  18. void FortuneTest::fortunes_raw_mysql(Context *c)
  19. {
  20. QSqlQuery query = mysqlQuery();
  21. auto fortunes = processQuery(c, query);
  22. renderRaw(c, fortunes);
  23. }
  24. QSqlQuery FortuneTest::postgresQuery()
  25. {
  26. return CPreparedSqlQueryForDatabase(
  27. QLatin1String("SELECT id, message FROM fortune"),
  28. QSqlDatabase::database(QLatin1String("postgres")));
  29. }
  30. QSqlQuery FortuneTest::mysqlQuery()
  31. {
  32. return CPreparedSqlQueryForDatabase(
  33. QLatin1String("SELECT id, message FROM fortune"),
  34. QSqlDatabase::database(QLatin1String("mysql")));
  35. }
  36. static bool caseSensitiveLessThan(const Fortune &a1, const Fortune &a2)
  37. {
  38. return a1.second < a2.second;
  39. }
  40. FortuneList FortuneTest::processQuery(Context *c, QSqlQuery &query)
  41. {
  42. FortuneList fortunes;
  43. if (!query.exec()) {
  44. c->res()->setStatus(Response::InternalServerError);
  45. return fortunes;
  46. }
  47. while (query.next()) {
  48. fortunes.append(qMakePair(query.value(0).toInt(), query.value(1).toString()));
  49. }
  50. fortunes.append(qMakePair(0, QStringLiteral("Additional fortune added at request time.")));
  51. qSort(fortunes.begin(), fortunes.end(), caseSensitiveLessThan);
  52. c->response()->setContentType(QStringLiteral("text/html; charset=UTF-8"));
  53. return fortunes;
  54. }
  55. void FortuneTest::renderRaw(Context *c, const FortuneList &fortunes)
  56. {
  57. QString out;
  58. out.append(QStringLiteral("<!DOCTYPE html>"
  59. "<html>"
  60. "<head><title>Fortunes</title></head>"
  61. "<body>"
  62. "<table>"
  63. "<tr><th>id</th><th>message</th></tr>"));
  64. Q_FOREACH (const Fortune &fortune, fortunes) {
  65. out.append(QLatin1String("<tr><td>") % QString::number(fortune.first) % QLatin1String("</td><td>") % fortune.second.toHtmlEscaped() % QLatin1String("</td></tr>"));
  66. }
  67. out.append(QStringLiteral("</table></body></html>"));
  68. c->response()->setBody(out);
  69. }