Skip to content

Commit 331615d

Browse files
authored
Fix compiler crash (#12)
- Fix compiler crash - Bump version
1 parent 543e7db commit 331615d

3 files changed

Lines changed: 111 additions & 41 deletions

File tree

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
Postgres driver implementation for the abstract [Feather Database](https://github.com/feather-framework/feather-database) Swift API package.
44

55
[
6-
![Release: 1.0.0-beta.5](https://img.shields.io/badge/Release-1%2E0%2E0--beta%2E5-F05138)
6+
![Release: 1.0.0-beta.6](https://img.shields.io/badge/Release-1%2E0%2E0--beta%2E6-F05138)
77
](
8-
https://github.com/feather-framework/feather-database-postgres/releases/tag/1.0.0-beta.5
8+
https://github.com/feather-framework/feather-database-postgres/releases/tag/1.0.0-beta.6
99
)
1010

1111
## Features
@@ -37,7 +37,7 @@ Postgres driver implementation for the abstract [Feather Database](https://githu
3737
Add the dependency to your `Package.swift`:
3838

3939
```swift
40-
.package(url: "https://github.com/feather-framework/feather-database-postgres", exact: "1.0.0-beta.5"),
40+
.package(url: "https://github.com/feather-framework/feather-database-postgres", exact: "1.0.0-beta.6"),
4141
```
4242

4343
Then add `FeatherDatabasePostgres` to your target dependencies:

Sources/FeatherDatabasePostgres/DatabaseClientPostgres.swift

Lines changed: 78 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public struct DatabaseClientPostgres: DatabaseClient {
1616
public typealias Connection = DatabaseConnectionPostgres
1717

1818
var client: PostgresNIO.PostgresClient
19-
var logger: Logger
19+
let logger: Logger
2020

2121
/// Create a Postgres database client.
2222
///
@@ -44,14 +44,18 @@ public struct DatabaseClientPostgres: DatabaseClient {
4444
public func withConnection<T>(
4545
_ closure: (Connection) async throws -> T,
4646
) async throws(DatabaseError) -> T {
47-
do {
48-
return try await client.withConnection { connection in
49-
let databaseConnection = DatabaseConnectionPostgres(
47+
let logger = self.logger
48+
let body: (PostgresConnection) async throws -> T = { connection in
49+
try await closure(
50+
DatabaseConnectionPostgres(
5051
connection: connection,
5152
logger: logger
5253
)
53-
return try await closure(databaseConnection)
54-
}
54+
)
55+
}
56+
57+
do {
58+
return try await client.withConnection(body)
5559
}
5660
catch let error as DatabaseError {
5761
throw error
@@ -71,23 +75,81 @@ public struct DatabaseClientPostgres: DatabaseClient {
7175
public func withTransaction<T>(
7276
_ closure: (Connection) async throws -> T,
7377
) async throws(DatabaseError) -> T {
78+
let logger = self.logger
79+
let beginQuery = PostgresQuery(unsafeSQL: "BEGIN", binds: .init())
80+
let commitQuery = PostgresQuery(unsafeSQL: "COMMIT", binds: .init())
81+
let rollbackQuery = PostgresQuery(unsafeSQL: "ROLLBACK", binds: .init())
82+
7483
do {
75-
return try await client.withTransaction(
76-
logger: logger
77-
) { connection in
84+
return try await client.withConnection { connection in
7885
let databaseConnection = DatabaseConnectionPostgres(
7986
connection: connection,
8087
logger: logger
8188
)
82-
return try await closure(databaseConnection)
89+
90+
do {
91+
_ = try await connection.query(beginQuery, logger: logger)
92+
}
93+
catch {
94+
throw DatabaseError.transaction(
95+
DatabaseTransactionErrorPostgres(
96+
beginError: error
97+
)
98+
)
99+
}
100+
101+
do {
102+
let result = try await closure(databaseConnection)
103+
do {
104+
_ = try await connection.query(
105+
commitQuery,
106+
logger: logger
107+
)
108+
return result
109+
}
110+
catch {
111+
let commitError = error
112+
var rollbackError: (any Error)?
113+
do {
114+
_ = try await connection.query(
115+
rollbackQuery,
116+
logger: logger
117+
)
118+
}
119+
catch {
120+
rollbackError = error
121+
}
122+
throw DatabaseError.transaction(
123+
DatabaseTransactionErrorPostgres(
124+
commitError: commitError,
125+
rollbackError: rollbackError
126+
)
127+
)
128+
}
129+
}
130+
catch {
131+
let closureError = error
132+
var rollbackError: (any Error)?
133+
do {
134+
_ = try await connection.query(
135+
rollbackQuery,
136+
logger: logger
137+
)
138+
}
139+
catch {
140+
rollbackError = error
141+
}
142+
throw DatabaseError.transaction(
143+
DatabaseTransactionErrorPostgres(
144+
closureError: closureError,
145+
rollbackError: rollbackError
146+
)
147+
)
148+
}
83149
}
84150
}
85-
catch let error as PostgresTransactionError {
86-
throw .transaction(
87-
DatabaseTransactionErrorPostgres(
88-
underlyingError: error
89-
)
90-
)
151+
catch let error as DatabaseError {
152+
throw error
91153
}
92154
catch {
93155
throw .connection(error)

Sources/FeatherDatabasePostgres/DatabaseTransactionErrorPostgres.swift

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,37 @@ import PostgresNIO
1010

1111
public struct DatabaseTransactionErrorPostgres: DatabaseTransactionError {
1212

13-
var underlyingError: PostgresTransactionError
14-
15-
public var file: String {
16-
underlyingError.file
17-
}
18-
19-
public var line: Int {
20-
underlyingError.line
21-
}
22-
23-
public var beginError: (any Error)? {
24-
underlyingError.beginError
25-
}
26-
27-
public var closureError: (any Error)? {
28-
underlyingError.closureError
29-
}
30-
31-
public var commitError: (any Error)? {
32-
underlyingError.commitError
13+
public let file: String
14+
public let line: Int
15+
public let beginError: (any Error)?
16+
public let closureError: (any Error)?
17+
public let commitError: (any Error)?
18+
public let rollbackError: (any Error)?
19+
20+
init(
21+
file: String = #fileID,
22+
line: Int = #line,
23+
beginError: (any Error)? = nil,
24+
closureError: (any Error)? = nil,
25+
commitError: (any Error)? = nil,
26+
rollbackError: (any Error)? = nil
27+
) {
28+
self.file = file
29+
self.line = line
30+
self.beginError = beginError
31+
self.closureError = closureError
32+
self.commitError = commitError
33+
self.rollbackError = rollbackError
3334
}
3435

35-
public var rollbackError: (any Error)? {
36-
underlyingError.rollbackError
36+
init(
37+
underlyingError: PostgresTransactionError
38+
) {
39+
self.file = underlyingError.file
40+
self.line = underlyingError.line
41+
self.beginError = underlyingError.beginError
42+
self.closureError = underlyingError.closureError
43+
self.commitError = underlyingError.commitError
44+
self.rollbackError = underlyingError.rollbackError
3745
}
3846
}

0 commit comments

Comments
 (0)