new tests

This commit is contained in:
Mark Gregory
2026-10-19 10:40:04 +01:00
parent f46f598baf
commit 3307bd90e4
4 changed files with 128 additions and 52 deletions
+32
View File
@@ -9,6 +9,32 @@ struct ConnectionProfile: Identifiable, Codable, Hashable {
var port = 3306
var username = "root"
var database = ""
// Optional SSH transport. Existing saved profiles decode with these defaults.
var useSSHTunnel = false
var sshHost = ""
var sshPort = 22
var sshUser = ""
var sshIdentityFile = ""
enum CodingKeys: String, CodingKey { case id, name, host, port, username, database, useSSHTunnel, sshHost, sshPort, sshUser, sshIdentityFile }
init(id: UUID = UUID(), name: String = "Local MySQL", host: String = "127.0.0.1", port: Int = 3306, username: String = "root", database: String = "", useSSHTunnel: Bool = false, sshHost: String = "", sshPort: Int = 22, sshUser: String = "", sshIdentityFile: String = "") {
self.id = id; self.name = name; self.host = host; self.port = port; self.username = username; self.database = database
self.useSSHTunnel = useSSHTunnel; self.sshHost = sshHost; self.sshPort = sshPort; self.sshUser = sshUser; self.sshIdentityFile = sshIdentityFile
}
init(from decoder: Decoder) throws {
let c = try decoder.container(keyedBy: CodingKeys.self)
id = try c.decode(UUID.self, forKey: .id)
name = try c.decode(String.self, forKey: .name)
host = try c.decode(String.self, forKey: .host)
port = try c.decode(Int.self, forKey: .port)
username = try c.decode(String.self, forKey: .username)
database = try c.decode(String.self, forKey: .database)
useSSHTunnel = try c.decodeIfPresent(Bool.self, forKey: .useSSHTunnel) ?? false
sshHost = try c.decodeIfPresent(String.self, forKey: .sshHost) ?? ""
sshPort = try c.decodeIfPresent(Int.self, forKey: .sshPort) ?? 22
sshUser = try c.decodeIfPresent(String.self, forKey: .sshUser) ?? ""
sshIdentityFile = try c.decodeIfPresent(String.self, forKey: .sshIdentityFile) ?? ""
}
}
struct QueryResult {
var columns: [String] = []
@@ -651,7 +677,10 @@ final class DatabaseModel: ObservableObject {
func selectConnection(_ id: UUID) {
guard let profile = profiles.first(where: { $0.id == id }) else { return }
guard selectedID != id else { return }
saveActiveQuery()
if let oldID = selectedID { NativeMySQLRunner.disconnect(profileID: oldID) }
result = QueryResult()
selectedID = id
UserDefaults.standard.set(id.uuidString, forKey: "DBSyn.selectedConnectionID")
selectedDatabase = profile.database
@@ -673,10 +702,12 @@ final class DatabaseModel: ObservableObject {
if let i = profiles.firstIndex(where: { $0.id == profile.id }) { profiles[i] = profile }
else { profiles.append(profile) }
PasswordStore.save(password, id: profile.id)
NativeMySQLRunner.disconnect(profileID: profile.id)
selectedID = profile.id
selectedDatabase = profile.database
UserDefaults.standard.set(profile.id.uuidString, forKey: "DBSyn.selectedConnectionID")
persist()
loadDatabases()
}
private func persist() {
if let data = try? JSONEncoder().encode(profiles) { UserDefaults.standard.set(data, forKey: storageKey) }
@@ -854,6 +885,7 @@ final class DatabaseModel: ObservableObject {
introspect(database: usedSchema)
}
}
guard selectedID == profile.id else { isRunning = false; return }
if listingDatabases {
databases = lastResult.rows.compactMap { $0.first }
status = "Connected to \(profile.name)"