server-postgres.cr 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. require "kemal"
  2. require "pg"
  3. # Compose Objects (like Hash) to have a to_json method
  4. require "json/to_json"
  5. APPDB = DB.open("postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world")
  6. class CONTENT
  7. UTF8 = "; charset=UTF-8"
  8. JSON = "application/json"
  9. PLAIN = "text/plain"
  10. HTML = "text/html" + UTF8
  11. end
  12. ID_MAXIMUM = 10_000
  13. private def random_world
  14. id = rand(1..ID_MAXIMUM)
  15. random_number = APPDB.query_one("SELECT randomNumber FROM world WHERE id = $1", id, as: Int32)
  16. {id: id, randomNumber: random_number}
  17. end
  18. private def set_world(world)
  19. APPDB.exec("UPDATE world SET randomNumber = $1 WHERE id = $2", world[:randomNumber], world[:id])
  20. world
  21. end
  22. private def fortunes
  23. data = Array(NamedTuple(id: Int32, message: String)).new
  24. APPDB.query_each("SELECT id, message FROM Fortune") do |rs|
  25. data.push({id: rs.read(Int32), message: rs.read(String)})
  26. end
  27. data
  28. end
  29. private def sanitized_query_count(request)
  30. queries = request.params.query["queries"].as(String)
  31. queries = queries.to_i? || 1
  32. queries.clamp(1..500)
  33. end
  34. before_all do |env|
  35. env.response.headers["Server"] = "Kemal"
  36. env.response.headers["Date"] = HTTP.format_time(Time.now)
  37. end
  38. #
  39. # Basic Tests
  40. #
  41. # Test 1: JSON Serialization
  42. get "/json" do |env|
  43. env.response.content_type = CONTENT::JSON
  44. {message: "Hello, World!"}.to_json
  45. end
  46. # Test 6: Plaintext
  47. get "/plaintext" do |env|
  48. env.response.content_type = CONTENT::PLAIN
  49. "Hello, World!"
  50. end
  51. #
  52. # Postgres DatabaseTests
  53. #
  54. # Postgres Test 2: Single database query
  55. get "/db" do |env|
  56. env.response.content_type = CONTENT::JSON
  57. random_world.to_json
  58. end
  59. # Postgres Test 3: Multiple database query
  60. get "/queries" do |env|
  61. results = (1..sanitized_query_count(env)).map do
  62. random_world
  63. end
  64. env.response.content_type = CONTENT::JSON
  65. results.to_json
  66. end
  67. # Postgres Test 4: Fortunes
  68. get "/fortunes" do |env|
  69. env.response.content_type = CONTENT::HTML
  70. data = fortunes
  71. additional_fortune = {
  72. id: 0,
  73. message: "Additional fortune added at request time.",
  74. }
  75. data.push(additional_fortune)
  76. data.sort_by! { |fortune| fortune[:message] }
  77. render "views/fortunes.ecr"
  78. end
  79. # Postgres Test 5: Database Updates
  80. get "/updates" do |env|
  81. updated = (1..sanitized_query_count(env)).map do
  82. set_world({id: random_world[:id], randomNumber: rand(1..ID_MAXIMUM)})
  83. end
  84. env.response.content_type = CONTENT::JSON
  85. updated.to_json
  86. end
  87. Kemal.config do |cfg|
  88. cfg.serve_static = false
  89. cfg.logging = false
  90. cfg.powered_by_header = false
  91. end
  92. Kemal.run { |cfg| cfg.server.not_nil!.bind_tcp(cfg.host_binding, cfg.port, reuse_port: true) }