main.swift 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import PostgresKit
  2. import Vapor
  3. var env = try Environment.detect()
  4. try LoggingSystem.bootstrap(from: &env)
  5. let app = Application(env)
  6. defer { app.shutdown() }
  7. app.http.server.configuration.serverName = "Vapor"
  8. app.logger.notice("💧 VAPOR")
  9. app.logger.notice("System.coreCount: \(System.coreCount)")
  10. app.logger.notice("System.maxConnectionsPerEventLoop: \(System.maxConnectionsPerEventLoop)")
  11. let pools = EventLoopGroupConnectionPool(
  12. source: PostgresConnectionSource(configuration: .init(
  13. hostname: "tfb-database",
  14. username: "benchmarkdbuser",
  15. password: "benchmarkdbpass",
  16. database: "hello_world"
  17. )),
  18. maxConnectionsPerEventLoop: System.maxConnectionsPerEventLoop,
  19. on: app.eventLoopGroup
  20. )
  21. extension Request {
  22. func db(_ pools: EventLoopGroupConnectionPool<PostgresConnectionSource>) -> PostgresDatabase {
  23. pools.pool(for: self.eventLoop).database(logger: self.logger)
  24. }
  25. }
  26. app.get("db") { req async throws -> World in
  27. let rows = try await req.db(pools).query("SELECT id, randomnumber FROM World WHERE id = $1", [
  28. PostgresData(int32: .random(in: 1...10_000))]).get()
  29. if (rows.count == 0) {
  30. throw Abort(.notFound)
  31. }
  32. let world = World(
  33. id: rows[0].column("id")?.int32 ?? 0,
  34. randomnumber: rows[0].column("randomnumber")?.int ?? 0
  35. )
  36. return world
  37. }
  38. app.get("queries") { req async throws -> [World] in
  39. let queries = (req.query["queries"] ?? 1).bounded(to: 1...500)
  40. var worlds: [World] = []
  41. for _ in queries {
  42. let rows = try await req.db(pools).query("SELECT id, randomnumber FROM World WHERE id = $1", [
  43. PostgresData(int32: .random(in: 1...10_000))]).get()
  44. if (rows.count == 0) {
  45. throw Abort(.notFound)
  46. }
  47. let world = World(
  48. id: rows[0].column("id")?.int32 ?? 0,
  49. randomnumber: rows[0].column("randomnumber")?.int ?? 0
  50. )
  51. worlds.append(world)
  52. }
  53. return worlds
  54. }
  55. // Database Updates test
  56. //
  57. app.get("updates") { req async throws -> [World] in
  58. let queries = (req.query["queries"] ?? 1).bounded(to: 1...500)
  59. var worlds: [World] = []
  60. let db = req.db(pools)
  61. for _ in queries {
  62. // Get
  63. //
  64. let rows = try await db.query(
  65. "SELECT id, randomnumber FROM World WHERE id = $1 LIMIT 1",
  66. [PostgresData(int32: .random(in: 1...10_000))]
  67. ).get()
  68. guard let row = rows.first else {
  69. throw Abort(.notFound)
  70. }
  71. var world = World(
  72. id: row.column("id")!.int32!,
  73. randomnumber: row.column("randomnumber")!.int!
  74. )
  75. // Update
  76. //
  77. world.randomnumber = .random(in: 1...10_000)
  78. _ = try await db.query(
  79. "UPDATE World SET randomnumber = $1 WHERE id = $2",
  80. [PostgresData(int: world.randomnumber), PostgresData(int32: world.id!)]
  81. ).get()
  82. worlds.append(world)
  83. }
  84. return worlds
  85. }
  86. extension Int: Sequence {
  87. public func makeIterator() -> CountableRange<Int>.Iterator {
  88. return (0..<self).makeIterator()
  89. }
  90. }
  91. try app.run()