nawak_app.nim 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import strtabs, strutils, math, algorithm
  2. import nawak_mongrel, jdump
  3. # The following import belongs to the stdlib, but has been updated to support
  4. # queries with parameters (that are safer to counter SQL injections) and
  5. # prepared queries.
  6. # It will be merged eventually. For now, I included it in the repository.
  7. import lib/db_postgres_redone
  8. type THello = tuple[message: string]
  9. type TWorld = tuple[id: int, randomNumber: int]
  10. type TFortune* = tuple[id: int, message: string]
  11. proc unrowTWorld(x: TRow): TWorld =
  12. result.id = parseInt(x[0])
  13. result.randomNumber = parseInt(x[1])
  14. proc unrowTFortune(x: TRow): TFortune =
  15. return (x[0].parseInt, x[1])
  16. import fortunes_tmpl # Needs TFortune to be defined first
  17. var db = open("", "benchmarkdbuser", "benchmarkdbpass", "host=localhost port=5432 dbname=hello_world")
  18. const qworld = "SELECT id, randomNumber FROM World WHERE id = $1"
  19. const qfortunes = "SELECT id, message FROM Fortune"
  20. const qupdates = "UPDATE World SET randomNumber = $1 WHERE id = $2"
  21. # prepare queries
  22. let qworld_prepared = db.prepare("world", qworld, 1)
  23. let qfortunes_prepared = db.prepare("fortunes", qfortunes, 0)
  24. let qupdates_prepared = db.prepare("updates", qupdates, 2)
  25. get "/json":
  26. var j: THello
  27. j.message = "Hello, World!"
  28. # jdump serialize any tuple as json
  29. return response(jdump(j), "application/json")
  30. get "/plaintext":
  31. return response("Hello, World!", "text/plain")
  32. get "/db":
  33. let row = db.getPRow(qworld_prepared, random(10_000)+1)
  34. var r = unrowTWorld(row)
  35. return response(jdump(r), "application/json")
  36. #get "/db_unprepared":
  37. # ## Yes, prepared queries are faster than unprepared ones
  38. # var r = unrowTWorld( db.getRow(qworld, random(10_000) + 1) )
  39. # return response(jdump(r), "application/json")
  40. get "/queries":
  41. var queries = 1
  42. if request.query.hasKey("queries"):
  43. try:
  44. queries = parseInt(request.query["queries"])
  45. except EInvalidValue: discard
  46. if queries < 1: queries = 1
  47. elif queries > 500: queries = 500
  48. var world: seq[TWorld]
  49. world.newSeq(queries)
  50. for i in 0.. <queries:
  51. let row = db.getPRow(qworld_prepared, random(10_000) + 1)
  52. world[i] = unrowTWorld(row)
  53. return response(jdump(world), "application/json")
  54. get "/fortunes":
  55. let rows = db.getAllPRows(qfortunes_prepared)
  56. var fortunes: seq[TFortune]
  57. fortunes.newSeq(rows.len)
  58. for j, row in rows.pairs:
  59. fortunes[j] = unrowTFortune(row)
  60. let new_fortune: TFortune = (id: 0,
  61. message: "Additional fortune added at request time.")
  62. fortunes.add new_fortune
  63. sort(fortunes, proc(x, y: TFortune): int =
  64. return cmp(x.message, y.message))
  65. return response(fortunes_tmpl(fortunes), "text/html; charset=utf-8")
  66. get "/updates":
  67. var queries = 1
  68. if request.query.hasKey("queries"):
  69. try:
  70. queries = parseInt(request.query["queries"])
  71. except EInvalidValue: discard
  72. if queries < 1: queries = 1
  73. elif queries > 500: queries = 500
  74. var world: seq[TWorld]
  75. world.newSeq(queries)
  76. for i in 0.. <queries:
  77. world[i] = unrowTWorld(db.getPRow(qworld_prepared, random(10_000) + 1))
  78. world[i].randomNumber = random(10_000) + 1
  79. db.Exec(qupdates_prepared, $world[i].randomNumber, $world[i].id)
  80. return response(jdump(world), "application/json")
  81. run()