new tests
This commit is contained in:
@@ -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)"
|
||||
|
||||
Reference in New Issue
Block a user