|
@@ -1,7 +1,9 @@
|
|
import Hummingbird
|
|
import Hummingbird
|
|
-import PostgresKit
|
|
|
|
|
|
+import PostgresNIO
|
|
|
|
+
|
|
|
|
+struct WorldController {
|
|
|
|
+ let connectionPoolGroup: HBConnectionPoolGroup<PostgresConnectionSource>
|
|
|
|
|
|
-class WorldController {
|
|
|
|
func add(to router: HBRouter) {
|
|
func add(to router: HBRouter) {
|
|
router.get("db", use: single)
|
|
router.get("db", use: single)
|
|
router.get("queries", use: multiple)
|
|
router.get("queries", use: multiple)
|
|
@@ -10,14 +12,14 @@ class WorldController {
|
|
|
|
|
|
func single(request: HBRequest) -> EventLoopFuture<World> {
|
|
func single(request: HBRequest) -> EventLoopFuture<World> {
|
|
let id = Int32.random(in: 1...10_000)
|
|
let id = Int32.random(in: 1...10_000)
|
|
- return request.db.query("SELECT id, randomnumber FROM World WHERE id = $1", [
|
|
|
|
- PostgresData(int32: id)
|
|
|
|
- ]).flatMapThrowing { result -> World in
|
|
|
|
|
|
+ return self.connection(for: request) { connection in
|
|
|
|
+ return connection.query("SELECT id, randomnumber FROM World WHERE id = $1", [
|
|
|
|
+ PostgresData(int32: id)
|
|
|
|
+ ])
|
|
|
|
+ }.flatMapThrowing { result -> World in
|
|
guard let firstResult = result.first else { throw HBHTTPError(.notFound) }
|
|
guard let firstResult = result.first else { throw HBHTTPError(.notFound) }
|
|
- return World(
|
|
|
|
- id: id,
|
|
|
|
- randomNumber: firstResult.column("randomnumber")?.int32 ?? 0
|
|
|
|
- )
|
|
|
|
|
|
+ let result = try firstResult.decode((Int32, Int32).self, context: .default)
|
|
|
|
+ return World(id: result.0, randomNumber: result.1)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -25,14 +27,14 @@ class WorldController {
|
|
let queries = (request.uri.queryParameters.get("queries", as: Int.self) ?? 1).bound(1, 500)
|
|
let queries = (request.uri.queryParameters.get("queries", as: Int.self) ?? 1).bound(1, 500)
|
|
let futures: [EventLoopFuture<World>] = (0 ..< queries).map { _ -> EventLoopFuture<World> in
|
|
let futures: [EventLoopFuture<World>] = (0 ..< queries).map { _ -> EventLoopFuture<World> in
|
|
let id = Int32.random(in: 1...10_000)
|
|
let id = Int32.random(in: 1...10_000)
|
|
- return request.db.query("SELECT id, randomnumber FROM World WHERE id = $1", [
|
|
|
|
- PostgresData(int32: id)
|
|
|
|
- ]).flatMapThrowing { result -> World in
|
|
|
|
|
|
+ return self.connection(for: request) { connection in
|
|
|
|
+ return connection.query("SELECT id, randomnumber FROM World WHERE id = $1", [
|
|
|
|
+ PostgresData(int32: id)
|
|
|
|
+ ])
|
|
|
|
+ }.flatMapThrowing { result -> World in
|
|
guard let firstResult = result.first else { throw HBHTTPError(.notFound) }
|
|
guard let firstResult = result.first else { throw HBHTTPError(.notFound) }
|
|
- return World(
|
|
|
|
- id: id,
|
|
|
|
- randomNumber: firstResult.column("randomnumber")?.int32 ?? 0
|
|
|
|
- )
|
|
|
|
|
|
+ let result = try firstResult.decode((Int32, Int32).self, context: .default)
|
|
|
|
+ return World(id: result.0, randomNumber: result.1)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return EventLoopFuture.whenAllSucceed(futures, on: request.eventLoop)
|
|
return EventLoopFuture.whenAllSucceed(futures, on: request.eventLoop)
|
|
@@ -44,17 +46,23 @@ class WorldController {
|
|
let futures: [EventLoopFuture<World>] = ids.map { _ -> EventLoopFuture<World> in
|
|
let futures: [EventLoopFuture<World>] = ids.map { _ -> EventLoopFuture<World> in
|
|
let id = Int32.random(in: 1...10_000)
|
|
let id = Int32.random(in: 1...10_000)
|
|
let randomNumber = Int32.random(in: 1...10_000)
|
|
let randomNumber = Int32.random(in: 1...10_000)
|
|
- return request.db.query("SELECT id, randomnumber FROM World WHERE id = $1", [
|
|
|
|
- PostgresData(int32: id)
|
|
|
|
- ]).flatMap { result in
|
|
|
|
- return request.db.query("UPDATE World SET randomnumber = $1 WHERE id = $2", [
|
|
|
|
- PostgresData(int32: randomNumber),
|
|
|
|
|
|
+ return self.connection(for: request) { connection in
|
|
|
|
+ return connection.query("SELECT id, randomnumber FROM World WHERE id = $1", [
|
|
PostgresData(int32: id)
|
|
PostgresData(int32: id)
|
|
- ])
|
|
|
|
|
|
+ ]).flatMap { result in
|
|
|
|
+ return connection.query("UPDATE World SET randomnumber = $1 WHERE id = $2", [
|
|
|
|
+ PostgresData(int32: randomNumber),
|
|
|
|
+ PostgresData(int32: id)
|
|
|
|
+ ])
|
|
|
|
+ }
|
|
}.map { _ in
|
|
}.map { _ in
|
|
return World(id: id, randomNumber: randomNumber)
|
|
return World(id: id, randomNumber: randomNumber)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return EventLoopFuture.whenAllSucceed(futures, on: request.eventLoop)
|
|
return EventLoopFuture.whenAllSucceed(futures, on: request.eventLoop)
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @discardableResult func connection<NewValue>(for request: HBRequest, closure: @escaping (PostgresConnection) -> EventLoopFuture<NewValue>) -> EventLoopFuture<NewValue> {
|
|
|
|
+ return self.connectionPoolGroup.lease(on: request.eventLoop, logger: request.logger, process: closure)
|
|
|
|
+ }
|
|
}
|
|
}
|