From c135a1e7b3930a928b6af78ecc06fe40bb191aa6 Mon Sep 17 00:00:00 2001 From: tanner0101 Date: Mon, 16 Jul 2018 19:35:43 -0400 Subject: [PATCH 1/4] sql 2.0 updates --- Package.swift | 2 +- .../SQL/PostgreSQLBinaryOperator.swift | 22 +++++++++++++++++++ .../PostgreSQL/SQL/PostgreSQLDefault.swift | 2 +- .../PostgreSQL/SQL/PostgreSQLDropIndex.swift | 4 ++-- .../PostgreSQL/SQL/PostgreSQLGeneric.swift | 4 ++-- 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/Package.swift b/Package.swift index d7b4511c..7b219aae 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.0"), ], targets: [ .target(name: "PostgreSQL", dependencies: ["Async", "Bits", "Core", "Crypto", "DatabaseKit", "NIO", "Service", "SQL"]), diff --git a/Sources/PostgreSQL/SQL/PostgreSQLBinaryOperator.swift b/Sources/PostgreSQL/SQL/PostgreSQLBinaryOperator.swift index 2f58f4c5..e631a15c 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< From 5ba6c09335e313453a10c831c31802cd2fdeebfc Mon Sep 17 00:00:00 2001 From: tanner0101 Date: Mon, 16 Jul 2018 19:38:55 -0400 Subject: [PATCH 2/4] fix tests --- .../PostgreSQLConnectionTests.swift | 70 +++++++++---------- 1 file changed, 34 insertions(+), 36 deletions(-) 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() From b1aabefc786d931667a9a93d8b4a2a492ad8d082 Mon Sep 17 00:00:00 2001 From: tanner0101 Date: Mon, 16 Jul 2018 19:41:21 -0400 Subject: [PATCH 3/4] fix table name cache row decoding --- .../Connection/PostgreSQLConnection+TableNameCache.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 } From 33303284bd1385817abb6c0a3dcff990cbdc3327 Mon Sep 17 00:00:00 2001 From: tanner0101 Date: Mon, 16 Jul 2018 19:52:04 -0400 Subject: [PATCH 4/4] update package swift --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 7b219aae..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"), + .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"]),