benchmark_controller.nim 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import std/algorithm
  2. import std/json
  3. import std/random
  4. import std/strutils
  5. import std/sequtils
  6. # framework
  7. import basolato/controller
  8. # databse
  9. import db_connector/db_postgres
  10. import allographer/query_builder
  11. import ../../../config/database
  12. # model
  13. import ../../models/fortune
  14. # view
  15. import ../views/pages/fortune_scf_view
  16. const range1_10000 = 1..10000
  17. let getFirstPrepare = stdRdb.prepare("getFirst", sql""" SELECT * FROM "World" WHERE id = $1 LIMIT 1 """, 1)
  18. let getFortunePrepare = stdRdb.prepare("getFortunes", sql""" SELECT * FROM "Fortune" ORDER BY message ASC """, 0)
  19. proc plaintext*(context:Context, params:Params):Future[Response] {.async.} =
  20. let headers = newHttpHeaders()
  21. headers.add("Content-Type", "text/plain; charset=UTF-8")
  22. return render("Hello, World!", headers)
  23. proc json*(context:Context, params:Params):Future[Response] {.async.} =
  24. return render(%*{"message":"Hello, World!"})
  25. proc db*(context:Context, params:Params):Future[Response] {.async.} =
  26. let i = rand(1..10000)
  27. let res = stdRdb.getRow(getFirstPrepare, i)
  28. return render(%*{"id": res[0].parseInt, "randomNumber": res[1].parseInt})
  29. proc query*(context:Context, params:Params):Future[Response] {.async.} =
  30. var countNum =
  31. try:
  32. params.getInt("queries")
  33. except:
  34. 1
  35. if countNum < 1:
  36. countNum = 1
  37. elif countNum > 500:
  38. countNum = 500
  39. var resp:seq[Row]
  40. for i in 1..countNum:
  41. let n = rand(range1_10000)
  42. resp.add(stdRdb.getRow(getFirstPrepare, n))
  43. let response = resp.map(
  44. proc(x:Row):JsonNode =
  45. %*{"id": x[0].parseInt, "randomNumber": x[1].parseInt}
  46. )
  47. return render(%response)
  48. proc fortune*(context:Context, params:Params):Future[Response] {.async.} =
  49. let results = stdRdb.getAllRows(getFortunePrepare)
  50. var rows = results.map(
  51. proc(x:seq[string]):Fortune =
  52. return Fortune(id: x[0].parseInt, message: x[1])
  53. )
  54. rows.add(
  55. Fortune(
  56. id: 0,
  57. message: "Additional fortune added at request time."
  58. )
  59. )
  60. rows = rows.sortedByIt(it.message)
  61. return render(fortuneScfView(rows).await)
  62. proc update*(context:Context, params:Params):Future[Response] {.async.} =
  63. var countNum =
  64. try:
  65. params.getInt("queries")
  66. except:
  67. 1
  68. if countNum < 1:
  69. countNum = 1
  70. elif countNum > 500:
  71. countNum = 500
  72. var response = newSeq[JsonNode](countNum)
  73. var futures = newSeq[Future[void]](countNum)
  74. for i in 1..countNum:
  75. let index = rand(range1_10000)
  76. let number = rand(range1_10000)
  77. response[i-1] = %*{"id": index, "randomNumber": number}
  78. futures[i-1] = (
  79. proc():Future[void] {.async.} =
  80. discard stdRdb.getRow(getFirstPrepare, i)
  81. rdb.raw(""" UPDATE "World" SET "randomnumber" = ? WHERE id = ? """, %*[number, index]).exec()
  82. )()
  83. all(futures).await
  84. return render(%response)