julia_server.jl 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. using Pkg
  2. Pkg.activate(@__DIR__)
  3. using Dates
  4. using HTTP
  5. using MySQL
  6. using JSON3
  7. using StructTypes
  8. struct jsonMsgObj
  9. message
  10. end
  11. struct jsonObj
  12. id
  13. randomNumber
  14. end
  15. StructTypes.StructType(::Type{jsonMsgObj}) = StructTypes.Struct()
  16. StructTypes.StructType(::Type{jsonObj}) = StructTypes.Struct()
  17. function plaintext(req::HTTP.Request)
  18. headers = [ "Content-Type" => "text/plain",
  19. "Server" => "Julia-HTTP",
  20. "Date" => Dates.format(Dates.now(), Dates.RFC1123Format) * " GMT" ]
  21. return HTTP.Response(200, headers, body = "Hello, World!")
  22. end
  23. function jsonSerialization(req::HTTP.Request)
  24. headers = [ "Content-Type" => "application/json",
  25. "Server" => "Julia-HTTP",
  26. "Date" => Dates.format(Dates.now(), Dates.RFC1123Format) * " GMT" ]
  27. return HTTP.Response(200, headers, body = JSON3.write(jsonMsgObj("Hello, World!")))
  28. end
  29. function singleQuery(req::HTTP.Request)
  30. headers = [ "Content-Type" => "application/json",
  31. "Server" => "Julia-HTTP",
  32. "Date" => Dates.format(Dates.now(), Dates.RFC1123Format) * " GMT" ]
  33. randNum = rand(1:10000)
  34. conn = DBInterface.connect(MySQL.Connection, "tfb-database", "benchmarkdbuser", "benchmarkdbpass", db="hello_world")
  35. sqlQuery = "SELECT * FROM World WHERE id = $randNum"
  36. results = DBInterface.execute(conn, sqlQuery)
  37. row = first(results)
  38. dbNumber = row[2]
  39. DBInterface.close!(conn)
  40. return HTTP.Response(200, headers, body = JSON3.write(jsonObj(randNum, dbNumber)))
  41. end
  42. function multipleQueries(req::HTTP.Request)
  43. headers = [ "Content-Type" => "application/json",
  44. "Server" => "Julia-HTTP",
  45. "Date" => Dates.format(Dates.now(), Dates.RFC1123Format) * " GMT" ]
  46. numQueries = -1
  47. try
  48. numQueries = parse(Int64, (split(req.target, "="))[2])
  49. catch ArgumentError
  50. numQueries = 1
  51. finally
  52. if numQueries > 500
  53. numQueries = 500
  54. end
  55. if numQueries < 1
  56. numQueries = 1
  57. end
  58. end
  59. conn = DBInterface.connect(MySQL.Connection, "tfb-database", "benchmarkdbuser", "benchmarkdbpass", db="hello_world")
  60. responseArray = Array{jsonObj}(undef, numQueries)
  61. for i in 1:numQueries
  62. # randNum = randNumList[i]
  63. randNum = rand(1:10000)
  64. sqlQuery = "SELECT * FROM World WHERE id = $randNum"
  65. results = DBInterface.execute(conn, sqlQuery)
  66. row = first(results)
  67. dbNumber = row[2]
  68. responseArray[i] = jsonObj(randNum, dbNumber)
  69. end
  70. DBInterface.close!(conn)
  71. return HTTP.Response(200, headers, body = JSON3.write(responseArray))
  72. end
  73. function updates(req::HTTP.Request)
  74. headers = [ "Content-Type" => "application/json",
  75. "Server" => "Julia-HTTP",
  76. "Date" => Dates.format(Dates.now(), Dates.RFC1123Format) * " GMT" ]
  77. numQueries = -1
  78. try
  79. numQueries = parse(Int64, (split(req.target, "="))[2])
  80. catch ArgumentError
  81. numQueries = 1
  82. finally
  83. if numQueries > 500
  84. numQueries = 500
  85. end
  86. if numQueries < 1
  87. numQueries = 1
  88. end
  89. end
  90. conn = DBInterface.connect(MySQL.Connection, "tfb-database", "benchmarkdbuser", "benchmarkdbpass", db="hello_world")
  91. responseArray = Array{jsonObj}(undef, numQueries)
  92. for i in 1:numQueries
  93. randId = rand(1:10000)
  94. randNum = rand(1:10000)
  95. sqlQuery = "SELECT * FROM World WHERE id = $randId"
  96. results = DBInterface.execute(conn, sqlQuery)
  97. row = first(results)
  98. dbNumber = row[2]
  99. sqlQuery = "UPDATE World SET randomnumber = $randNum WHERE id = $randId"
  100. results = DBInterface.execute(conn, sqlQuery)
  101. responseArray[i] = jsonObj(randId, randNum)
  102. end
  103. DBInterface.close!(conn)
  104. return HTTP.Response(200, headers, body = JSON3.write(responseArray))
  105. end
  106. function fortunes(req::HTTP.Request)
  107. headers = [ "Content-Type" => "text/html; charset=utf-8",
  108. "Server" => "Julia-HTTP",
  109. "Date" => Dates.format(Dates.now(), Dates.RFC1123Format) * " GMT" ]
  110. fortunesList = []
  111. sqlQuery = "SELECT * FROM fortune"
  112. output = "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>"
  113. conn = DBInterface.connect(MySQL.Connection, "tfb-database", "benchmarkdbuser", "benchmarkdbpass", db="hello_world")
  114. results = DBInterface.execute(conn, sqlQuery)
  115. for row in results
  116. push!(fortunesList, [string(row[1]), row[2]])
  117. end
  118. push!(fortunesList, [string(0), "Additional fortune added at request time."])
  119. sort!(fortunesList, by = x -> x[2])
  120. for fortune in fortunesList
  121. id = fortune[1]
  122. message = HTTP.Strings.escapehtml(fortune[2])
  123. output = string(output, "<tr><td>$id</td><td>$message</td></tr>")
  124. end
  125. output = string(output, "</table></body></html>")
  126. DBInterface.close!(conn)
  127. return HTTP.Response(200, headers, body = output)
  128. end
  129. const ROUTER = HTTP.Router()
  130. HTTP.@register(ROUTER, "GET", "/plaintext", plaintext)
  131. HTTP.@register(ROUTER, "GET", "/json", jsonSerialization)
  132. HTTP.@register(ROUTER, "GET", "/db", singleQuery)
  133. HTTP.@register(ROUTER, "GET", "/queries", multipleQueries)
  134. HTTP.@register(ROUTER, "GET", "/updates", updates)
  135. HTTP.@register(ROUTER, "GET", "/fortunes", fortunes)
  136. HTTP.serve(ROUTER, "0.0.0.0" , 8080, reuseaddr=true)