From 32d396f9d70e1d8da51d755cbe3eb3c963e6aa05 Mon Sep 17 00:00:00 2001 From: Tibor Bodecs Date: Mon, 2 Mar 2026 14:08:02 +0100 Subject: [PATCH 1/3] fix compiler crash --- .../DatabaseClientPostgres.swift | 91 +++++++++++++++---- .../DatabaseTransactionErrorPostgres.swift | 52 ++++++----- 2 files changed, 105 insertions(+), 38 deletions(-) diff --git a/Sources/FeatherDatabasePostgres/DatabaseClientPostgres.swift b/Sources/FeatherDatabasePostgres/DatabaseClientPostgres.swift index 3bde7dd..e9ec0ed 100644 --- a/Sources/FeatherDatabasePostgres/DatabaseClientPostgres.swift +++ b/Sources/FeatherDatabasePostgres/DatabaseClientPostgres.swift @@ -16,7 +16,7 @@ public struct DatabaseClientPostgres: DatabaseClient { public typealias Connection = DatabaseConnectionPostgres var client: PostgresNIO.PostgresClient - var logger: Logger + let logger: Logger /// Create a Postgres database client. /// @@ -44,14 +44,18 @@ public struct DatabaseClientPostgres: DatabaseClient { public func withConnection( _ closure: (Connection) async throws -> T, ) async throws(DatabaseError) -> T { - do { - return try await client.withConnection { connection in - let databaseConnection = DatabaseConnectionPostgres( + let logger = self.logger + let body: (PostgresConnection) async throws -> T = { connection in + try await closure( + DatabaseConnectionPostgres( connection: connection, logger: logger ) - return try await closure(databaseConnection) - } + ) + } + + do { + return try await client.withConnection(body) } catch let error as DatabaseError { throw error @@ -71,23 +75,78 @@ public struct DatabaseClientPostgres: DatabaseClient { public func withTransaction( _ closure: (Connection) async throws -> T, ) async throws(DatabaseError) -> T { + let logger = self.logger + let beginQuery = PostgresQuery(unsafeSQL: "BEGIN", binds: .init()) + let commitQuery = PostgresQuery(unsafeSQL: "COMMIT", binds: .init()) + let rollbackQuery = PostgresQuery(unsafeSQL: "ROLLBACK", binds: .init()) + do { - return try await client.withTransaction( - logger: logger - ) { connection in + return try await client.withConnection { connection in let databaseConnection = DatabaseConnectionPostgres( connection: connection, logger: logger ) - return try await closure(databaseConnection) + + do { + _ = try await connection.query(beginQuery, logger: logger) + } + catch { + throw DatabaseError.transaction( + DatabaseTransactionErrorPostgres( + beginError: error + ) + ) + } + + do { + let result = try await closure(databaseConnection) + do { + _ = try await connection.query(commitQuery, logger: logger) + return result + } + catch { + let commitError = error + var rollbackError: (any Error)? + do { + _ = try await connection.query( + rollbackQuery, + logger: logger + ) + } + catch { + rollbackError = error + } + throw DatabaseError.transaction( + DatabaseTransactionErrorPostgres( + commitError: commitError, + rollbackError: rollbackError + ) + ) + } + } + catch { + let closureError = error + var rollbackError: (any Error)? + do { + _ = try await connection.query( + rollbackQuery, + logger: logger + ) + } + catch { + rollbackError = error + } + throw DatabaseError.transaction( + DatabaseTransactionErrorPostgres( + closureError: closureError, + rollbackError: rollbackError + ) + ) + } } } - catch let error as PostgresTransactionError { - throw .transaction( - DatabaseTransactionErrorPostgres( - underlyingError: error - ) - ) + catch let error as DatabaseError { + throw error } catch { throw .connection(error) diff --git a/Sources/FeatherDatabasePostgres/DatabaseTransactionErrorPostgres.swift b/Sources/FeatherDatabasePostgres/DatabaseTransactionErrorPostgres.swift index ab96c35..95dfc6c 100644 --- a/Sources/FeatherDatabasePostgres/DatabaseTransactionErrorPostgres.swift +++ b/Sources/FeatherDatabasePostgres/DatabaseTransactionErrorPostgres.swift @@ -10,29 +10,37 @@ import PostgresNIO public struct DatabaseTransactionErrorPostgres: DatabaseTransactionError { - var underlyingError: PostgresTransactionError - - public var file: String { - underlyingError.file - } - - public var line: Int { - underlyingError.line - } - - public var beginError: (any Error)? { - underlyingError.beginError - } - - public var closureError: (any Error)? { - underlyingError.closureError - } - - public var commitError: (any Error)? { - underlyingError.commitError + public let file: String + public let line: Int + public let beginError: (any Error)? + public let closureError: (any Error)? + public let commitError: (any Error)? + public let rollbackError: (any Error)? + + init( + file: String = #fileID, + line: Int = #line, + beginError: (any Error)? = nil, + closureError: (any Error)? = nil, + commitError: (any Error)? = nil, + rollbackError: (any Error)? = nil + ) { + self.file = file + self.line = line + self.beginError = beginError + self.closureError = closureError + self.commitError = commitError + self.rollbackError = rollbackError } - public var rollbackError: (any Error)? { - underlyingError.rollbackError + init( + underlyingError: PostgresTransactionError + ) { + self.file = underlyingError.file + self.line = underlyingError.line + self.beginError = underlyingError.beginError + self.closureError = underlyingError.closureError + self.commitError = underlyingError.commitError + self.rollbackError = underlyingError.rollbackError } } From 29b7702acb64084ba092ff4e5fac34ae39c814e7 Mon Sep 17 00:00:00 2001 From: Tibor Bodecs Date: Mon, 2 Mar 2026 14:08:45 +0100 Subject: [PATCH 2/3] bump version --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4f17727..6ee166f 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,9 @@ Postgres driver implementation for the abstract [Feather Database](https://github.com/feather-framework/feather-database) Swift API package. [ - ![Release: 1.0.0-beta.5](https://img.shields.io/badge/Release-1%2E0%2E0--beta%2E5-F05138) + ![Release: 1.0.0-beta.6](https://img.shields.io/badge/Release-1%2E0%2E0--beta%2E6-F05138) ]( - https://github.com/feather-framework/feather-database-postgres/releases/tag/1.0.0-beta.5 + https://github.com/feather-framework/feather-database-postgres/releases/tag/1.0.0-beta.6 ) ## Features @@ -37,7 +37,7 @@ Postgres driver implementation for the abstract [Feather Database](https://githu Add the dependency to your `Package.swift`: ```swift -.package(url: "https://github.com/feather-framework/feather-database-postgres", exact: "1.0.0-beta.5"), +.package(url: "https://github.com/feather-framework/feather-database-postgres", exact: "1.0.0-beta.6"), ``` Then add `FeatherDatabasePostgres` to your target dependencies: From 3d59d65dcd5ad3676fee821c5447bfd5b784cc76 Mon Sep 17 00:00:00 2001 From: Tibor Bodecs Date: Mon, 2 Mar 2026 14:09:32 +0100 Subject: [PATCH 3/3] apply format --- Sources/FeatherDatabasePostgres/DatabaseClientPostgres.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Sources/FeatherDatabasePostgres/DatabaseClientPostgres.swift b/Sources/FeatherDatabasePostgres/DatabaseClientPostgres.swift index e9ec0ed..6d2b807 100644 --- a/Sources/FeatherDatabasePostgres/DatabaseClientPostgres.swift +++ b/Sources/FeatherDatabasePostgres/DatabaseClientPostgres.swift @@ -101,7 +101,10 @@ public struct DatabaseClientPostgres: DatabaseClient { do { let result = try await closure(databaseConnection) do { - _ = try await connection.query(commitQuery, logger: logger) + _ = try await connection.query( + commitQuery, + logger: logger + ) return result } catch {