Skip to content

Commit b5da9d5

Browse files
authored
Merge pull request #77 from vapor/alter-table-drop
add support for ALTER TABLE drop actions
2 parents 8a0d67c + 01e07e5 commit b5da9d5

File tree

3 files changed

+81
-21
lines changed

3 files changed

+81
-21
lines changed

Sources/FluentPostgreSQL/PostgreSQLDatabase+QuerySupporting.swift

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -115,25 +115,4 @@ extension PostgreSQLDatabase: QuerySupporting {
115115

116116
return conn.future(model)
117117
}
118-
119-
/// See `SchemaSupporting`.
120-
public static func schemaExecute(_ fluent: FluentPostgreSQLSchema, on conn: PostgreSQLConnection) -> Future<Void> {
121-
let query: PostgreSQLQuery
122-
switch fluent.statement {
123-
case ._createTable:
124-
var createTable: PostgreSQLCreateTable = .createTable(fluent.table)
125-
createTable.columns = fluent.columns
126-
createTable.tableConstraints = fluent.constraints
127-
query = ._createTable(createTable)
128-
case ._alterTable:
129-
var alterTable: PostgreSQLAlterTable = .alterTable(fluent.table)
130-
alterTable.columns = fluent.columns
131-
alterTable.constraints = fluent.constraints
132-
query = ._alterTable(alterTable)
133-
case ._dropTable:
134-
let dropTable: PostgreSQLDropTable = .dropTable(fluent.table)
135-
query = ._dropTable(dropTable)
136-
}
137-
return conn.query(query).transform(to: ())
138-
}
139118
}

Sources/FluentPostgreSQL/PostgreSQLDatabase+SchemaSupporting.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,34 @@ extension PostgreSQLDatabase: SchemaSupporting {
2424
/// See `SchemaSupporting`.
2525
public typealias SchemaReferenceAction = PostgreSQLForeignKeyAction
2626

27+
/// See `SchemaSupporting`.
28+
public static func schemaExecute(_ fluent: FluentPostgreSQLSchema, on conn: PostgreSQLConnection) -> Future<Void> {
29+
let query: PostgreSQLQuery
30+
switch fluent.statement {
31+
case ._createTable:
32+
var createTable: PostgreSQLCreateTable = .createTable(fluent.table)
33+
createTable.columns = fluent.columns
34+
createTable.tableConstraints = fluent.constraints
35+
query = ._createTable(createTable)
36+
case ._alterTable:
37+
var alterTable: PostgreSQLAlterTable = .alterTable(fluent.table)
38+
alterTable.columns = fluent.columns
39+
alterTable.constraints = fluent.constraints
40+
alterTable.dropActions += fluent.deleteColumns.map { .init(.column, $0.identifier) }
41+
alterTable.dropActions += fluent.deleteConstraints.map {
42+
guard let id = $0.identifier else {
43+
fatalError("Cannot drop constraint without identifier: \($0).")
44+
}
45+
return .init(.constraint, id)
46+
}
47+
query = ._alterTable(alterTable)
48+
case ._dropTable:
49+
let dropTable: PostgreSQLDropTable = .dropTable(fluent.table)
50+
query = ._dropTable(dropTable)
51+
}
52+
return conn.query(query).transform(to: ())
53+
}
54+
2755
/// See `SchemaSupporting`.
2856
public static func schemaField(for type: Any.Type, isIdentifier: Bool, _ column: PostgreSQLColumnIdentifier) -> PostgreSQLColumnDefinition {
2957
var constraints: [PostgreSQLColumnConstraint] = []

Tests/FluentPostgreSQLTests/FluentPostgreSQLTests.swift

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,59 @@ class FluentPostgreSQLTests: XCTestCase {
406406
XCTAssertEqual(b.id, 1)
407407
}
408408

409+
func testAlterDrop() throws {
410+
struct A: PostgreSQLMigration {
411+
static func prepare(on conn: PostgreSQLConnection) -> Future<Void> {
412+
return PostgreSQLDatabase.create(Planet.self, on: conn) { builder in
413+
builder.field(for: \.id)
414+
}
415+
}
416+
417+
static func revert(on conn: PostgreSQLConnection) -> Future<Void> {
418+
return PostgreSQLDatabase.delete(Planet.self, on: conn)
419+
}
420+
}
421+
struct B: PostgreSQLMigration {
422+
static func prepare(on conn: PostgreSQLConnection) -> Future<Void> {
423+
return PostgreSQLDatabase.update(Planet.self, on: conn) { builder in
424+
builder.field(for: \.name)
425+
builder.deleteField(for: \.id)
426+
}
427+
}
428+
429+
static func revert(on conn: PostgreSQLConnection) -> Future<Void> {
430+
return PostgreSQLDatabase.update(Planet.self, on: conn) { builder in
431+
builder.deleteField(for: \.name)
432+
builder.field(for: \.id)
433+
}
434+
}
435+
}
436+
struct C: PostgreSQLMigration {
437+
static func prepare(on conn: PostgreSQLConnection) -> Future<Void> {
438+
return PostgreSQLDatabase.update(Planet.self, on: conn) { builder in
439+
builder.unique(on: \.name)
440+
}
441+
}
442+
443+
static func revert(on conn: PostgreSQLConnection) -> Future<Void> {
444+
return PostgreSQLDatabase.update(Planet.self, on: conn) { builder in
445+
builder.deleteUnique(from: \.name)
446+
}
447+
}
448+
}
449+
450+
let conn = try benchmarker.pool.requestConnection().wait()
451+
conn.logger = DatabaseLogger(database: .psql, handler: PrintLogHandler())
452+
defer { benchmarker.pool.releaseConnection(conn) }
453+
454+
try A.prepare(on: conn).wait()
455+
defer { try? A.revert(on: conn).wait() }
456+
try B.prepare(on: conn).wait()
457+
defer { try? B.revert(on: conn).wait() }
458+
try C.prepare(on: conn).wait()
459+
defer { try? C.revert(on: conn).wait() }
460+
}
461+
409462
static let allTests = [
410463
("testBenchmark", testBenchmark),
411464
("testNestedStruct", testNestedStruct),

0 commit comments

Comments
 (0)