diff --git a/DBSyn/DatabaseModel.swift b/DBSyn/DatabaseModel.swift index 5f49079..82a9c19 100644 --- a/DBSyn/DatabaseModel.swift +++ b/DBSyn/DatabaseModel.swift @@ -902,6 +902,9 @@ final class DatabaseModel: ObservableObject { recordQuery(statement, profile: profile, database: activeDB, succeeded: true, detail: status) } } catch { + // An old connection must not overwrite the newly selected + // connection's state when its request finishes later. + guard selectedID == profile.id else { return } status = "Error" result = QueryResult(message: error.localizedDescription) if !listingDatabases { diff --git a/DBSyn/MySQLProtocol.swift b/DBSyn/MySQLProtocol.swift index 9993ac5..1a3ece0 100644 --- a/DBSyn/MySQLProtocol.swift +++ b/DBSyn/MySQLProtocol.swift @@ -523,7 +523,11 @@ enum NativeMySQLRunner { }.value } + // Connection shutdown may wait behind a slow network operation on the + // session's serial queue. Never make the SwiftUI main thread wait for it. static func disconnect(profileID: UUID) { - PersistentMySQLSessions.shared.disconnect(profileID: profileID) + Task.detached(priority: .utility) { + PersistentMySQLSessions.shared.disconnect(profileID: profileID) + } } }