Browse Source

Swift vapor async (#6926)

Dragos Varovici 3 years ago
parent
commit
cdeb463a73

+ 1 - 1
frameworks/Swift/vapor/README.md

@@ -12,7 +12,7 @@ PostgreSQL
 
 ## Versions
 
-[Swift 5.1](https://swift.org/)
+[Swift 5.5](https://swift.org/)
 [Vapor 4](https://vapor.codes/)
 
 ## Test URLs: `vapor`

+ 9 - 6
frameworks/Swift/vapor/vapor-default/Package.swift

@@ -1,20 +1,23 @@
-// swift-tools-version:5.1
+// swift-tools-version:5.5
 import PackageDescription
 
 let package = Package(
     name: "vapor-default",
     platforms: [
-        .macOS(.v10_15)
+        .macOS(.v12)
     ],
     products: [
         .executable(name: "app", targets: ["App"])
     ],
     dependencies: [
-        .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"),
+        .package(url: "https://github.com/vapor/vapor.git", from: "4.52.2")
     ],
     targets: [
-        .target(name: "App", dependencies: [
-            "Vapor",
-        ], path: "Sources")
+        .executableTarget(
+            name: "App",
+            dependencies: [
+                .product(name: "Vapor", package: "vapor"),
+            ],
+            path: "Sources"),
     ]
 )

+ 2 - 2
frameworks/Swift/vapor/vapor-default/Sources/main.swift

@@ -12,11 +12,11 @@ app.http.server.configuration.supportPipelining = false
 app.logger.notice("💧 VAPOR")
 app.logger.notice("System.coreCount: \(System.coreCount)")
 
-app.get("plaintext") { req in
+app.get("plaintext") { req async in
     "Hello, world!"
 }
 
-app.get("json") { req in
+app.get("json") { req async in
     ["message": "Hello, world!"]
 }
 

+ 14 - 11
frameworks/Swift/vapor/vapor-fluent/Package.swift

@@ -1,24 +1,27 @@
-// swift-tools-version:5.1
+// swift-tools-version:5.5
 import PackageDescription
 
 let package = Package(
     name: "vapor-fluent",
     platforms: [
-        .macOS(.v10_15)
+        .macOS(.v12)
     ],
     products: [
         .executable(name: "app", targets: ["App"])
     ],
     dependencies: [
-        .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"),
-        .package(url: "https://github.com/vapor/fluent.git", from: "4.0.0"),
-        .package(url: "https://github.com/vapor/fluent-postgres-driver.git", from: "2.0.0"),
+        .package(url: "https://github.com/vapor/vapor.git", from: "4.52.2"),
+        .package(url: "https://github.com/vapor/fluent.git", from: "4.4.0"),
+        .package(url: "https://github.com/vapor/fluent-postgres-driver.git", from: "2.2.1"),
     ],
     targets: [
-        .target(name: "App", dependencies: [
-            "Fluent",
-            "FluentPostgresDriver",
-            "Vapor"
-        ], path: "Sources")
+        .executableTarget(
+            name: "App",
+            dependencies: [
+                .product(name: "Fluent", package: "fluent"),
+                .product(name: "FluentPostgresDriver", package: "fluent-postgres-driver"),
+                .product(name: "Vapor", package: "vapor"),
+            ],
+            path: "Sources"),
     ]
-)
+)

+ 24 - 14
frameworks/Swift/vapor/vapor-fluent/Sources/main.swift

@@ -22,25 +22,35 @@ app.databases.use(.postgres(
     maxConnectionsPerEventLoop: System.maxConnectionsPerEventLoop
 ), as: .psql)
 
-app.get("plaintext") { req in
-    "Hello, world!"
-}
 
-app.get("json") { req in
-    ["message": "Hello, world!"]
-}
+app.get("db") { req async throws -> World in
+    guard let world = try await World.find(.random(in: 1...10_000), on: req.db) else {
+        throw Abort(.notFound)
+    }
 
-app.get("db") { req in
-    World.find(.random(in: 1...10_000), on: req.db)
-        .unwrap(or: Abort(.notFound))
+    return world
 }
 
-app.get("queries") { req -> EventLoopFuture<[World]> in
+app.get("queries") { req async throws -> [World] in
     let queries = (req.query["queries"] ?? 1).bounded(to: 1...500)
-    return (0 ..< queries).map { _ -> EventLoopFuture<World> in
-        World.find(.random(in: 1...10_000), on: req.db)
-            .unwrap(or: Abort(.notFound))
-    }.flatten(on: req.eventLoop)
+
+    var worlds: [World] = []
+
+    for _ in queries {
+        guard let world = try await World.find(.random(in: 1...10_000), on: req.db) else {
+            throw Abort(.notFound)
+        }
+
+        worlds.append(world)
+    }
+
+    return worlds
+}
+
+extension Int: Sequence {
+    public func makeIterator() -> CountableRange<Int>.Iterator {
+        return (0..<self).makeIterator()
+    }
 }
 
 try app.run()

+ 12 - 9
frameworks/Swift/vapor/vapor-postgres/Package.swift

@@ -1,22 +1,25 @@
-// swift-tools-version:5.1
+// swift-tools-version:5.5
 import PackageDescription
 
 let package = Package(
-    name: "vapor-sql-kit",
+    name: "vapor-postgres",
     platforms: [
-        .macOS(.v10_15)
+        .macOS(.v12)
     ],
     products: [
         .executable(name: "app", targets: ["App"])
     ],
     dependencies: [
-        .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"),
-        .package(url: "https://github.com/vapor/postgres-kit.git", from: "2.0.0"),
+        .package(url: "https://github.com/vapor/vapor.git", from: "4.52.2"),
+        .package(url: "https://github.com/vapor/postgres-kit.git", from: "2.4.0"),
     ],
     targets: [
-        .target(name: "App", dependencies: [
-            "PostgresKit",
-            "Vapor"
-        ], path: "Sources")
+        .executableTarget(
+            name: "App",
+            dependencies: [
+                .product(name: "PostgresKit", package: "postgres-kit"),
+                .product(name: "Vapor", package: "vapor"),
+            ],
+            path: "Sources"),
     ]
 )

+ 39 - 23
frameworks/Swift/vapor/vapor-postgres/Sources/main.swift

@@ -30,34 +30,50 @@ extension Request {
     }
 }
 
-app.get("db") { req in
-    req.db(pools).query("SELECT id, randomnumber FROM World WHERE id = $1", [
-        PostgresData(int32: .random(in: 1...10_000))
-    ]).map {
-        $0.first
-    }.unwrap(or: Abort(.notFound)).map {
-        World(
-            id: $0.column("id")?.int32 ?? 0,
-            randomnumber: $0.column("randomnumber")?.int ?? 0
-        )
+app.get("db") { req async throws -> World in
+    let rows = try await req.db(pools).query("SELECT id, randomnumber FROM World WHERE id = $1", [
+        PostgresData(int32: .random(in: 1...10_000))]).get()
+        
+    if (rows.count == 0) {  
+           throw Abort(.notFound)
     }
+
+    let world =  World(
+            id: rows[0].column("id")?.int32 ?? 0,
+            randomnumber: rows[0].column("randomnumber")?.int ?? 0
+        )
+
+    return world
 }
 
-app.get("queries") { req -> EventLoopFuture<[World]> in
+app.get("queries") { req async throws -> [World] in
     let queries = (req.query["queries"] ?? 1).bounded(to: 1...500)
-    let db = req.db(pools)
-    return (0 ..< queries).map { _ -> EventLoopFuture<World> in
-        db.query("SELECT id, randomnumber FROM World WHERE id = $1", [
-            PostgresData(int32: .random(in: 1...10_000))
-        ]).map {
-            $0.first
-        }.unwrap(or: Abort(.notFound)).map {
-            World(
-                id: $0.column("id")?.int32 ?? 0,
-                randomnumber: $0.column("randomnumber")?.int ?? 0
-            )
+
+    var worlds: [World] = []
+
+    for _ in queries {
+        let rows = try await req.db(pools).query("SELECT id, randomnumber FROM World WHERE id = $1", [
+            PostgresData(int32: .random(in: 1...10_000))]).get()
+            
+        if (rows.count == 0) {  
+            throw Abort(.notFound)
         }
-    }.flatten(on: req.eventLoop)
+
+        let world =  World(
+                id: rows[0].column("id")?.int32 ?? 0,
+                randomnumber: rows[0].column("randomnumber")?.int ?? 0
+            )
+
+        worlds.append(world)
+    }
+
+    return worlds
+}
+
+extension Int: Sequence {
+    public func makeIterator() -> CountableRange<Int>.Iterator {
+        return (0..<self).makeIterator()
+    }
 }
 
 try app.run()

+ 11 - 8
frameworks/Swift/vapor/vapor-sql-kit/Package.swift

@@ -1,22 +1,25 @@
-// swift-tools-version:5.1
+// swift-tools-version:5.5
 import PackageDescription
 
 let package = Package(
     name: "vapor-sql-kit",
     platforms: [
-        .macOS(.v10_15)
+        .macOS(.v12)
     ],
     products: [
         .executable(name: "app", targets: ["App"])
     ],
     dependencies: [
-        .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"),
-        .package(url: "https://github.com/vapor/postgres-kit.git", from: "2.0.0"),
+        .package(url: "https://github.com/vapor/vapor.git", from: "4.52.2"),
+        .package(url: "https://github.com/vapor/postgres-kit.git", from: "2.4.0"),
     ],
     targets: [
-        .target(name: "App", dependencies: [
-            "PostgresKit",
-            "Vapor"
-        ], path: "Sources")
+        .executableTarget(
+            name: "App",
+            dependencies: [
+                .product(name: "PostgresKit", package: "postgres-kit"),
+                .product(name: "Vapor", package: "vapor"),
+            ],
+            path: "Sources"),
     ]
 )

+ 29 - 9
frameworks/Swift/vapor/vapor-sql-kit/Sources/main.swift

@@ -30,28 +30,48 @@ extension Request {
     }
 }
 
-app.get("db") { req in
-    req.sql(pools).select()
+app.get("db") { req async throws -> World in
+    guard let world = try await req.sql(pools).select()
         .column("id")
         .column("randomnumber")
         .from("World")
         .where("id", .equal, Int32.random(in: 1...10_000))
         .first(decoding: World.self)
-        .unwrap(or: Abort(.notFound))
+        .get() 
+        else {  
+            throw Abort(.notFound)
+        }
+
+    return world
 }
 
-app.get("queries") { req -> EventLoopFuture<[World]> in
+app.get("queries") { req async throws -> [World] in
     let queries = (req.query["queries"] ?? 1).bounded(to: 1...500)
+
+    var worlds: [World] = []
+
     let db = req.sql(pools)
-    return (0 ..< queries).map { _ -> EventLoopFuture<World> in
-        db.select()
+
+    for _ in queries {
+        guard let world = try await db.select()
             .column("id")
             .column("randomnumber")
             .from("World")
             .where("id", .equal, Int32.random(in: 1...10_000))
-            .first(decoding: World.self)
-            .unwrap(or: Abort(.notFound))
-    }.flatten(on: req.eventLoop)
+            .first(decoding: World.self).get() else {
+            throw Abort(.notFound)
+        }
+
+        worlds.append(world)
+    }
+
+    return worlds
+}
+
+extension Int: Sequence {
+    public func makeIterator() -> CountableRange<Int>.Iterator {
+        return (0..<self).makeIterator()
+    }
 }
 
 try app.run()