Db.scala 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package com.ibm.techempower
  2. import java.util.concurrent.ThreadLocalRandom.{ current => random }
  3. import scala.language.implicitConversions
  4. import scala.language.postfixOps
  5. import com.ibm.plain.rest.{ Form, Resource }
  6. import com.ibm.plain.json.{ Json => J }
  7. import com.ibm.plain.jdbc.withConnection
  8. import com.ibm.plain.jdbc.ConnectionHelper._
  9. final class Db
  10. extends DbResource {
  11. Get { get(None) }
  12. Get { form: Form => get(Some(form)) }
  13. }
  14. final class Update
  15. extends DbResource {
  16. Get { form: Form => update(form) }
  17. }
  18. sealed abstract class DbResource
  19. extends Resource {
  20. @inline protected[this] final def get(form: Option[Form]): J = {
  21. var list: List[J] = Nil
  22. val q = form match { case None => 1 case Some(f) => queries(f) }
  23. withConnection(datasource) {
  24. implicit connection => for (i <- 1 to q) { for (j <- selectsql << next <<! asJson) { list = j :: list } }
  25. }
  26. form match { case None => list.head case _ => J(list) }
  27. }
  28. @inline protected[this] final def update(form: Form): J = {
  29. var list: List[J] = Nil
  30. val q = queries(form)
  31. withConnection(datasource) {
  32. implicit connection =>
  33. for (i <- 1 to q) {
  34. val id = next
  35. val randomNumber = next
  36. updatesql << randomNumber << id <<!!;
  37. list = asJson(id, randomNumber) :: list
  38. }
  39. }
  40. J(list)
  41. }
  42. @inline private[this] final def queries(form: Form) = try {
  43. form.get("queries").get.head.toInt match {
  44. case q if 1 > q => 1
  45. case q if 500 < q => 500
  46. case q => q
  47. }
  48. } catch {
  49. case _: Throwable => 1
  50. }
  51. @inline private[this] final def asJson = (r: RichResultSet) => J(Map("id" -> r.nextInt.get, "randomNumber" -> r.nextInt.get))
  52. @inline private[this] final def asJson(id: Int, randomNumber: Int) = J(Map("id" -> id, "randomNumber" -> randomNumber))
  53. @inline private[this] final def next = random.nextInt(1, 10001)
  54. private[this] final val selectsql = "select id, randomNumber from World where id = ?"
  55. private[this] final val updatesql = "update World set randomNumber = ? where id = ?"
  56. private[this] final val datasource = "MysqlBenchmark"
  57. }