diff --git a/Package.swift b/Package.swift index d7b4511c..2879cc3f 100644 --- a/Package.swift +++ b/Package.swift @@ -23,7 +23,7 @@ let package = Package( .package(url: "https://github.com/apple/swift-nio.git", from: "1.0.0"), // *️⃣ Build SQL queries in Swift. Extensible, protocol-based design that supports DQL, DML, and DDL. - .package(url: "https://github.com/vapor/sql.git", from: "2.0.0-beta.3"), + .package(url: "https://github.com/vapor/sql.git", from: "2.0.2"), ], targets: [ .target(name: "PostgreSQL", dependencies: ["Async", "Bits", "Core", "Crypto", "DatabaseKit", "NIO", "Service", "SQL"]), diff --git a/Sources/PostgreSQL/Connection/PostgreSQLConnection+TableNameCache.swift b/Sources/PostgreSQL/Connection/PostgreSQLConnection+TableNameCache.swift index 3a79def2..58adbc52 100644 --- a/Sources/PostgreSQL/Connection/PostgreSQLConnection+TableNameCache.swift +++ b/Sources/PostgreSQL/Connection/PostgreSQLConnection+TableNameCache.swift @@ -47,8 +47,9 @@ extension PostgreSQLConnection { var oid: UInt32 var relname: String } - return select().column("oid").column("relname").from(PGClass.self).all(decoding: PGClass.self).map { rows in + return select().column("oid").column("relname").from(PGClass.self).all().map { rows in var cache: [UInt32: String] = [:] + let rows = try rows.map { try self.decode(PGClass.self, from: $0, table: nil) } for row in rows { cache[row.oid] = row.relname } diff --git a/Sources/PostgreSQL/SQL/PostgreSQLBinaryOperator.swift b/Sources/PostgreSQL/SQL/PostgreSQLBinaryOperator.swift index 49e887cf..4f13961e 100644 --- a/Sources/PostgreSQL/SQL/PostgreSQLBinaryOperator.swift +++ b/Sources/PostgreSQL/SQL/PostgreSQLBinaryOperator.swift @@ -20,6 +20,9 @@ public enum PostgreSQLBinaryOperator: SQLBinaryOperator, Equatable { /// See `SQLBinaryOperator`. public static var like: PostgreSQLBinaryOperator { return ._like } + /// See `SQLBinaryOperator`. + public static var notLike: PostgreSQLBinaryOperator { return ._notLike } + /// See `SQLBinaryOperator`. public static var `in`: PostgreSQLBinaryOperator { return ._in } @@ -32,6 +35,25 @@ public enum PostgreSQLBinaryOperator: SQLBinaryOperator, Equatable { /// See `SQLBinaryOperator`. public static var or: PostgreSQLBinaryOperator { return ._or } + /// See `SQLBinaryOperator`. + public static var concatenate: PostgreSQLBinaryOperator { return ._concatenate } + + /// See `SQLBinaryOperator`. + public static var multiply: PostgreSQLBinaryOperator { return ._multiply } + + /// See `SQLBinaryOperator`. + public static var divide: PostgreSQLBinaryOperator { return ._divide } + + /// See `SQLBinaryOperator`. + public static var modulo: PostgreSQLBinaryOperator { return ._modulo } + + /// See `SQLBinaryOperator`. + public static var add: PostgreSQLBinaryOperator { return ._add } + + /// See `SQLBinaryOperator`. + public static var subtract: PostgreSQLBinaryOperator { return ._subtract } + + /// `||` case _concatenate diff --git a/Sources/PostgreSQL/SQL/PostgreSQLDefault.swift b/Sources/PostgreSQL/SQL/PostgreSQLDefault.swift index 25cfc5a4..a0a711ce 100644 --- a/Sources/PostgreSQL/SQL/PostgreSQLDefault.swift +++ b/Sources/PostgreSQL/SQL/PostgreSQLDefault.swift @@ -1,6 +1,6 @@ public struct PostgreSQLDefaultLiteral: SQLDefaultLiteral { /// See `SQLDefaultLiteral`. - public static func `default`() -> PostgreSQLDefaultLiteral { + public static var `default`: PostgreSQLDefaultLiteral { return .init() } diff --git a/Sources/PostgreSQL/SQL/PostgreSQLDropIndex.swift b/Sources/PostgreSQL/SQL/PostgreSQLDropIndex.swift index 3a12d99f..40697be2 100644 --- a/Sources/PostgreSQL/SQL/PostgreSQLDropIndex.swift +++ b/Sources/PostgreSQL/SQL/PostgreSQLDropIndex.swift @@ -11,7 +11,7 @@ public struct PostgreSQLDropIndex: SQLDropIndex { } public final class PostgreSQLDropIndexBuilder: SQLQueryBuilder - where Connection: DatabaseQueryable, Connection.Query == PostgreSQLQuery + where Connection: SQLConnection, Connection.Query == PostgreSQLQuery { /// `AlterTable` query being built. public var dropIndex: PostgreSQLDropIndex @@ -32,7 +32,7 @@ public final class PostgreSQLDropIndexBuilder: SQLQueryBuilder } -extension DatabaseQueryable where Query == PostgreSQLQuery { +extension SQLConnection where Query == PostgreSQLQuery { public func drop(index identifier: PostgreSQLIdentifier) -> PostgreSQLDropIndexBuilder { return .init(PostgreSQLDropIndex(identifier: identifier), on: self) } diff --git a/Sources/PostgreSQL/SQL/PostgreSQLGeneric.swift b/Sources/PostgreSQL/SQL/PostgreSQLGeneric.swift index 7033f17c..64c0c049 100644 --- a/Sources/PostgreSQL/SQL/PostgreSQLGeneric.swift +++ b/Sources/PostgreSQL/SQL/PostgreSQLGeneric.swift @@ -20,7 +20,7 @@ public typealias PostgreSQLColumnIdentifier = GenericSQLColumnIdentifier< /// See `SQLQuery`. public typealias PostgreSQLCreateIndex = GenericSQLCreateIndex< - PostgreSQLIndexModifier, PostgreSQLIdentifier, PostgreSQLTableIdentifier + PostgreSQLIndexModifier, PostgreSQLIdentifier, PostgreSQLColumnIdentifier > /// See `SQLQuery`. @@ -84,7 +84,7 @@ public typealias PostgreSQLSelect = GenericSQLSelect< > /// See `SQLQuery`. -public typealias PostgreSQLSelectExpression = GenericSQLSelectExpression +public typealias PostgreSQLSelectExpression = GenericSQLSelectExpression /// See `SQLQuery`. public typealias PostgreSQLTableConstraintAlgorithm = GenericSQLTableConstraintAlgorithm< diff --git a/Tests/PostgreSQLTests/PostgreSQLConnectionTests.swift b/Tests/PostgreSQLTests/PostgreSQLConnectionTests.swift index 7aab4bdb..888bb8b5 100644 --- a/Tests/PostgreSQLTests/PostgreSQLConnectionTests.swift +++ b/Tests/PostgreSQLTests/PostgreSQLConnectionTests.swift @@ -183,54 +183,52 @@ class PostgreSQLConnectionTests: XCTestCase { CREATE TABLE "users" ("id" UUID PRIMARY KEY, "name" TEXT NOT NULL, "username" TEXT NOT NULL) """).wait() defer { _ = try! client.simpleQuery("DROP TABLE users").wait() } - let _ = try client.query(""" + let _ = try client.raw(""" CREATE TABLE "acronyms" ("id" \(idtype) PRIMARY KEY, "short" TEXT NOT NULL, "long" TEXT NOT NULL, "userID" UUID NOT NULL, FOREIGN KEY ("userID") REFERENCES "users" ("id"), FOREIGN KEY ("userID") REFERENCES "users" ("id")) - """).wait() + """).run().wait() defer { _ = try! client.simpleQuery("DROP TABLE acronyms").wait() } - let _ = try client.query(""" + let _ = try client.raw(""" CREATE TABLE "categories" ("id" \(idtype) PRIMARY KEY, "name" TEXT NOT NULL) - """).wait() + """).run().wait() defer { _ = try! client.simpleQuery("DROP TABLE categories").wait() } - let _ = try client.query(""" + let _ = try client.raw(""" CREATE TABLE "acronym+category" ("id" UUID PRIMARY KEY, "acronymID" BIGINT NOT NULL, "categoryID" BIGINT NOT NULL, FOREIGN KEY ("acronymID") REFERENCES "acronyms" ("id"), FOREIGN KEY ("categoryID") REFERENCES "categories" ("id"), FOREIGN KEY ("acronymID") REFERENCES "acronyms" ("id"), FOREIGN KEY ("categoryID") REFERENCES "categories" ("id")) - """).wait() + """).run().wait() defer { _ = try! client.simpleQuery("DROP TABLE \"acronym+category\"").wait() } /// INSERT let userUUID = UUID() - let _ = try client.query( - """ - INSERT INTO "users" ("id", "name", "username") VALUES ($1, $2, $3) - """, - [userUUID, "Vapor Test", "vapor" ] - ).wait() - let _ = try client.query( - """ - INSERT INTO "acronyms" ("id", "userID", "short", "long") VALUES ($1, $2, $3, $4) - """, - [1, userUUID, "ilv", "i love vapor"] - ).wait() - let _ = try client.query( - """ - INSERT INTO "categories" ("id", "name") VALUES ($1, $2); - """, - [1, "all"] - ).wait() + let _ = try client.raw( + """ + INSERT INTO "users" ("id", "name", "username") VALUES ($1, $2, $3) + """) + .bind(userUUID).bind("Vapor Test").bind("vapor") + .run().wait() + let _ = try client.raw( + """ + INSERT INTO "acronyms" ("id", "userID", "short", "long") VALUES ($1, $2, $3, $4) + """) + .bind(1).bind(userUUID).bind("ilv").bind("i love vapor") + .run().wait() + let _ = try client.raw( + """ + INSERT INTO "categories" ("id", "name") VALUES ($1, $2); + """) + .bind(1).bind("all") + .run().wait() /// SELECT - let acronyms = client.query( - """ - SELECT "acronyms".* FROM "acronyms" WHERE ("acronyms"."id" = $1) LIMIT 1 OFFSET 0 - """, - [1] - ) - let categories = client.query( - """ - SELECT "categories".* FROM "categories" WHERE ("categories"."id" = $1) LIMIT 1 OFFSET 0 - """, - [1] - ) + let acronyms = client.raw( + """ + SELECT "acronyms".* FROM "acronyms" WHERE ("acronyms"."id" = $1) LIMIT 1 OFFSET 0 + """) + .bind(1).run() + let categories = client.raw( + """ + SELECT "categories".* FROM "categories" WHERE ("categories"."id" = $1) LIMIT 1 OFFSET 0 + """) + .bind(1).run() _ = try acronyms.wait() _ = try categories.wait()