model_postgre.nim 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import strutils
  2. # The following import belongs to the stdlib, but has been updated to support
  3. # queries with parameters (that are safer to counter SQL injections) and
  4. # prepared queries.
  5. # It will be merged eventually. For now, I included it in the repository.
  6. import lib/db_postgres_redone
  7. import model
  8. export model
  9. const qworld = "SELECT id, randomNumber FROM World WHERE id = $1"
  10. const qfortunes = "SELECT id, message FROM Fortune"
  11. const qupdates = "UPDATE World SET randomNumber = $1 WHERE id = $2"
  12. var db {.threadvar.}: TDbConn
  13. var qworld_prepared {.threadvar.}: TPreparedId
  14. var qfortunes_prepared {.threadvar.}: TPreparedId
  15. var qupdates_prepared {.threadvar.}: TPreparedId
  16. proc init_db*() {.procvar.} =
  17. db = open("", "benchmarkdbuser", "benchmarkdbpass",
  18. "host=localhost port=5432 dbname=hello_world")
  19. # prepare queries
  20. qworld_prepared = db.prepare("world", qworld, 1)
  21. qfortunes_prepared = db.prepare("fortunes", qfortunes, 0)
  22. qupdates_prepared = db.prepare("updates", qupdates, 2)
  23. proc getWorld*(n: int): TWorld =
  24. #let row = db.getRow(qworld, n)
  25. ## Yes, prepared queries are faster than unprepared ones
  26. let row = db.getPRow(qworld_prepared, n)
  27. result.id = parseInt(row[0])
  28. result.randomNumber = parseInt(row[1])
  29. proc updateWorld*(w: TWorld) =
  30. db.Exec(qupdates_prepared, $w.randomNumber, $w.id)
  31. proc getAllFortunes*(): seq[TFortune] =
  32. let rows = db.getAllPRows(qfortunes_prepared)
  33. result.newSeq(rows.len)
  34. for j, row in rows.pairs:
  35. result[j] = (row[0].parseInt, row[1])