Skip to content

Commit 5fa0ec4

Browse files
committed
fix: check driver.supportsTransactions before wrapping saves in transactions
1 parent 8a91f31 commit 5fa0ec4

3 files changed

Lines changed: 29 additions & 16 deletions

File tree

TablePro/Core/Database/DatabaseManager+Schema.swift

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,20 @@ extension DatabaseManager {
6060
)
6161
let statements = try generator.generate(changes: changes)
6262

63-
// Execute in transaction
64-
try await driver.beginTransaction()
63+
let useTransaction = driver.supportsTransactions
64+
65+
if useTransaction {
66+
try await driver.beginTransaction()
67+
}
6568

6669
do {
6770
for stmt in statements {
6871
_ = try await driver.execute(query: stmt.sql)
6972
}
7073

71-
try await driver.commitTransaction()
74+
if useTransaction {
75+
try await driver.commitTransaction()
76+
}
7277

7378
// Record each statement in query history
7479
let connId = connectionId
@@ -87,10 +92,12 @@ extension DatabaseManager {
8792
// Post notification to refresh UI
8893
NotificationCenter.default.post(name: .refreshData, object: nil)
8994
} catch {
90-
do {
91-
try await driver.rollbackTransaction()
92-
} catch {
93-
Self.logger.error("Rollback failed after schema change error: \(error.localizedDescription)")
95+
if useTransaction {
96+
do {
97+
try await driver.rollbackTransaction()
98+
} catch {
99+
Self.logger.error("Rollback failed after schema change error: \(error.localizedDescription)")
100+
}
94101
}
95102
throw DatabaseError.queryFailed("Schema change failed: \(error.localizedDescription)")
96103
}

TablePro/Views/Main/Extensions/MainContentCoordinator+Discard.swift

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ extension MainContentCoordinator {
3535
throw DatabaseError.notConnected
3636
}
3737

38-
try await driver.beginTransaction()
38+
let useTransaction = driver.supportsTransactions
39+
40+
if useTransaction {
41+
try await driver.beginTransaction()
42+
}
3943

4044
do {
4145
for stmt in statements {
@@ -45,12 +49,16 @@ extension MainContentCoordinator {
4549
_ = try await driver.executeParameterized(query: stmt.sql, parameters: stmt.parameters)
4650
}
4751
}
48-
try await driver.commitTransaction()
52+
if useTransaction {
53+
try await driver.commitTransaction()
54+
}
4955
} catch {
50-
do {
51-
try await driver.rollbackTransaction()
52-
} catch {
53-
discardLogger.error("Rollback failed: \(error.localizedDescription, privacy: .public)")
56+
if useTransaction {
57+
do {
58+
try await driver.rollbackTransaction()
59+
} catch {
60+
discardLogger.error("Rollback failed: \(error.localizedDescription, privacy: .public)")
61+
}
5462
}
5563
throw error
5664
}

TablePro/Views/Main/Extensions/MainContentCoordinator+SaveChanges.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,9 +187,7 @@ extension MainContentCoordinator {
187187
throw DatabaseError.notConnected
188188
}
189189

190-
// Redis MULTI/EXEC is not a true transaction (no rollback on failure),
191-
// so execute statements individually without wrapping.
192-
let useTransaction = dbType != .redis
190+
let useTransaction = driver.supportsTransactions
193191

194192
if useTransaction {
195193
try await driver.beginTransaction()

0 commit comments

Comments
 (0)