* Replaced the nested export form with a scrollable layout.
* Made the table selection checkboxes directly visible.
* Preserved the Select All and Select None buttons.
* Kept the view selection controls.
* Cleared stale table selections when switching databases.
* Added automatic database loading when the application opens.
* Preserved the existing SQL editor and administration functionality.
This commit is contained in:
Mark Gregory
2026-10-16 21:51:45 +01:00
parent 86df4fb185
commit 819e5cf46e
20 changed files with 263 additions and 150 deletions
+94 -23
View File
@@ -68,6 +68,11 @@ struct MainView: View {
) == "dark" ? .dark : .light ) == "dark" ? .dark : .light
) )
.background(Color(nsColor: .windowBackgroundColor)) .background(Color(nsColor: .windowBackgroundColor))
.task {
if model.databases.isEmpty, model.selected != nil {
model.loadDatabases()
}
}
.sheet(isPresented: $showingDatabaseTransfer) { .sheet(isPresented: $showingDatabaseTransfer) {
WorkbenchDatabaseTransferView(model: model) WorkbenchDatabaseTransferView(model: model)
} }
@@ -1572,6 +1577,9 @@ struct WorkbenchDatabaseTransferView: View {
@State private var exportStructure = true @State private var exportStructure = true
@State private var exportData = true @State private var exportData = true
@State private var includeDrop = false @State private var includeDrop = false
@State private var includeViews = true
@State private var availableViews: [String] = []
@State private var selectedViews: Set<String> = []
@State private var loadingTables = false @State private var loadingTables = false
@State private var availableDatabases: [String] = [] @State private var availableDatabases: [String] = []
@State private var loadingDatabases = false @State private var loadingDatabases = false
@@ -1593,8 +1601,10 @@ struct WorkbenchDatabaseTransferView: View {
.pickerStyle(.segmented) .pickerStyle(.segmented)
.padding(20) .padding(20)
Form { ScrollView {
Section("MySQL Connection") { VStack(alignment: .leading, spacing: 16) {
GroupBox("MySQL Connection") {
VStack(alignment: .leading, spacing: 10) {
LabeledContent("Connection") { LabeledContent("Connection") {
Text(selectedProfile?.name ?? "Not selected") Text(selectedProfile?.name ?? "Not selected")
} }
@@ -1613,14 +1623,18 @@ struct WorkbenchDatabaseTransferView: View {
} }
.disabled(loadingDatabases || selectedProfile == nil) .disabled(loadingDatabases || selectedProfile == nil)
} }
}
} }
if selectedMode == 0 { if selectedMode == 0 {
Section("Export Options") { GroupBox("Export Options") {
VStack(alignment: .leading, spacing: 10) {
Toggle("Table structure", isOn: $exportStructure) Toggle("Table structure", isOn: $exportStructure)
Toggle("Table data", isOn: $exportData) Toggle("Table data", isOn: $exportData)
Toggle("Add DROP TABLE IF EXISTS", isOn: $includeDrop) Toggle("Add DROP TABLE IF EXISTS", isOn: $includeDrop)
.disabled(!exportStructure) .disabled(!exportStructure)
Toggle("Include views (definitions)", isOn: $includeViews)
.disabled(!exportStructure)
HStack { HStack {
Text("Tables (\(selectedTables.count) selected)") Text("Tables (\(selectedTables.count) selected)")
Spacer() Spacer()
@@ -1630,25 +1644,43 @@ struct WorkbenchDatabaseTransferView: View {
.disabled(loadingTables) .disabled(loadingTables)
} }
if loadingTables { ProgressView("Loading tables…") } if loadingTables { ProgressView("Loading tables…") }
ScrollView { if availableTables.isEmpty && !loadingTables {
LazyVStack(alignment: .leading) { Text("No tables found. Select a database or refresh the list.")
ForEach(availableTables, id: \.self) { table in .foregroundStyle(.secondary)
Toggle(table, isOn: Binding( }
get: { selectedTables.contains(table) }, ForEach(availableTables, id: \.self) { table in
set: { checked in Toggle(table, isOn: Binding(
if checked { selectedTables.insert(table) } get: { selectedTables.contains(table) },
else { selectedTables.remove(table) } set: { checked in
} if checked { selectedTables.insert(table) }
)) else { selectedTables.remove(table) }
} }
))
}
if includeViews && exportStructure {
HStack {
Text("Views (\(selectedViews.count) selected)")
Spacer()
Button("All") { selectedViews = Set(availableViews) }
Button("None") { selectedViews.removeAll() }
}
ForEach(availableViews, id: \.self) { view in
Toggle(view, isOn: Binding(
get: { selectedViews.contains(view) },
set: { checked in
if checked { selectedViews.insert(view) }
else { selectedViews.remove(view) }
}
))
} }
} }
.frame(maxHeight: 180) Text("Exports base tables and selected views. Triggers, routines, consistent snapshots and guaranteed row ordering are not yet supported.")
Text("Exports base tables with batched INSERT statements. Views, triggers, routines and transaction-consistent snapshots are not included.")
.font(.caption).foregroundStyle(.secondary) .font(.caption).foregroundStyle(.secondary)
} }
}
} else { } else {
Section("Import Options") { GroupBox("Import Options") {
VStack(alignment: .leading, spacing: 10) {
Text("Import SQL statements into the selected database.") Text("Import SQL statements into the selected database.")
.foregroundStyle(.secondary) .foregroundStyle(.secondary)
@@ -1656,9 +1688,11 @@ struct WorkbenchDatabaseTransferView: View {
.font(.caption) .font(.caption)
.foregroundStyle(.secondary) .foregroundStyle(.secondary)
} }
}
} }
Section("Progress") { GroupBox("Progress") {
VStack(alignment: .leading, spacing: 10) {
ProgressView(value: progress) ProgressView(value: progress)
.frame(maxWidth: .infinity) .frame(maxWidth: .infinity)
@@ -1666,9 +1700,12 @@ struct WorkbenchDatabaseTransferView: View {
.font(.caption) .font(.caption)
.foregroundStyle(.secondary) .foregroundStyle(.secondary)
.textSelection(.enabled) .textSelection(.enabled)
}
}
} }
} }
.formStyle(.grouped) .frame(maxWidth: .infinity, alignment: .leading)
.padding(20)
Divider() Divider()
@@ -1701,7 +1738,7 @@ struct WorkbenchDatabaseTransferView: View {
.disabled( .disabled(
selectedProfile == nil || selectedProfile == nil ||
database.isEmpty || database.isEmpty ||
(selectedMode == 0 && (selectedTables.isEmpty || (!exportStructure && !exportData))) (selectedMode == 0 && ((!exportStructure && !exportData) || (selectedTables.isEmpty && !(exportStructure && includeViews && !selectedViews.isEmpty))))
) )
} }
} }
@@ -1719,6 +1756,10 @@ struct WorkbenchDatabaseTransferView: View {
await loadTransferDatabases() await loadTransferDatabases()
} }
.task(id: database) { .task(id: database) {
availableTables = []
selectedTables = []
availableViews = []
selectedViews = []
if !database.isEmpty { await loadTables() } if !database.isEmpty { await loadTables() }
} }
.confirmationDialog( .confirmationDialog(
@@ -1846,7 +1887,11 @@ struct WorkbenchDatabaseTransferView: View {
@MainActor @MainActor
private func loadTables() async { private func loadTables() async {
guard !database.isEmpty else { availableTables = []; selectedTables = []; return } guard !database.isEmpty else {
availableTables = []; selectedTables = []
availableViews = []; selectedViews = []
return
}
loadingTables = true loadingTables = true
defer { loadingTables = false } defer { loadingTables = false }
do { do {
@@ -1855,10 +1900,16 @@ struct WorkbenchDatabaseTransferView: View {
row.count > 1 && row[1].uppercased() == "BASE TABLE" ? row[0] : nil row.count > 1 && row[1].uppercased() == "BASE TABLE" ? row[0] : nil
} }
selectedTables = Set(availableTables) selectedTables = Set(availableTables)
availableViews = rows.rows.compactMap { row in
row.count > 1 && row[1].uppercased() == "VIEW" ? row[0] : nil
}
selectedViews = Set(availableViews)
} catch { } catch {
status = "Cannot list tables: \(error.localizedDescription)" status = "Cannot list tables: \(error.localizedDescription)"
availableTables = [] availableTables = []
selectedTables = [] selectedTables = []
availableViews = []
selectedViews = []
} }
} }
@@ -1866,7 +1917,11 @@ struct WorkbenchDatabaseTransferView: View {
// preserved rather than reconstructed from QueryResult's String values. // preserved rather than reconstructed from QueryResult's String values.
@MainActor @MainActor
private func exportSQL(to url: URL) async { private func exportSQL(to url: URL) async {
guard !selectedTables.isEmpty, exportStructure || exportData else { return } guard exportStructure || exportData else { return }
let views = exportStructure && includeViews
? availableViews.filter { selectedViews.contains($0) }
: []
guard !selectedTables.isEmpty || !views.isEmpty else { return }
isWorking = true isWorking = true
progress = 0 progress = 0
let tables = availableTables.filter { selectedTables.contains($0) } let tables = availableTables.filter { selectedTables.contains($0) }
@@ -1937,7 +1992,23 @@ struct WorkbenchDatabaseTransferView: View {
if batch.rows.count < 250 { break } if batch.rows.count < 250 { break }
} }
} }
progress = Double(index + 1) / Double(tables.count) progress = Double(index + 1) / Double(max(tables.count + views.count, 1))
}
// Views are exported after base tables so dependencies exist on restore.
// The server's SHOW CREATE VIEW response may contain a DEFINER clause;
// importing under a different MySQL account can require extra privileges.
for (index, view) in views.enumerated() {
try Task.checkCancellation()
let qualified = "\(db).\(quoteIdentifier(view))"
status = "Exporting view \(view)"
let definition = try await execute("SHOW CREATE VIEW \(qualified)")
guard let row = definition.rows.first, row.count > 1 else {
throw WorkbenchTransferError.message("Missing CREATE VIEW for \(view)")
}
try write("\n-- View \(qualified)\n")
if includeDrop { try write("DROP VIEW IF EXISTS \(qualified);\n") }
try write(row[1] + ";\n")
progress = Double(tables.count + index + 1) / Double(max(tables.count + views.count, 1))
} }
try Task.checkCancellation() try Task.checkCancellation()
try handle?.close() try handle?.close()
@@ -1948,7 +2019,7 @@ struct WorkbenchDatabaseTransferView: View {
try FileManager.default.moveItem(at: tempURL, to: url) try FileManager.default.moveItem(at: tempURL, to: url)
} }
progress = 1 progress = 1
status = "Export complete: \(tables.count) tables" status = "Export complete: \(tables.count) tables, \(views.count) views"
} catch is CancellationError { } catch is CancellationError {
status = "Export cancelled; no final backup was written" status = "Export cancelled; no final backup was written"
} catch { } catch {
@@ -7,7 +7,7 @@
"key": "MySQL Workbench", "key": "MySQL Workbench",
"location": { "location": {
"startingColumn": 18, "startingColumn": 18,
"startingLine": 93 "startingLine": 98
} }
}, },
{ {
@@ -15,7 +15,7 @@
"key": "Navigator", "key": "Navigator",
"location": { "location": {
"startingColumn": 20, "startingColumn": 20,
"startingLine": 182 "startingLine": 187
} }
}, },
{ {
@@ -23,7 +23,7 @@
"key": "Administration", "key": "Administration",
"location": { "location": {
"startingColumn": 22, "startingColumn": 22,
"startingLine": 183 "startingLine": 188
} }
}, },
{ {
@@ -31,7 +31,7 @@
"key": "Schemas", "key": "Schemas",
"location": { "location": {
"startingColumn": 22, "startingColumn": 22,
"startingLine": 184 "startingLine": 189
} }
}, },
{ {
@@ -39,7 +39,7 @@
"key": "SCHEMAS", "key": "SCHEMAS",
"location": { "location": {
"startingColumn": 22, "startingColumn": 22,
"startingLine": 204 "startingLine": 209
} }
}, },
{ {
@@ -47,7 +47,7 @@
"key": "Edit Connection", "key": "Edit Connection",
"location": { "location": {
"startingColumn": 36, "startingColumn": 36,
"startingLine": 258 "startingLine": 263
} }
}, },
{ {
@@ -55,7 +55,7 @@
"key": "Set as Default Schema", "key": "Set as Default Schema",
"location": { "location": {
"startingColumn": 24, "startingColumn": 24,
"startingLine": 375 "startingLine": 380
} }
}, },
{ {
@@ -63,7 +63,7 @@
"key": "Refresh Tables", "key": "Refresh Tables",
"location": { "location": {
"startingColumn": 24, "startingColumn": 24,
"startingLine": 379 "startingLine": 384
} }
}, },
{ {
@@ -71,7 +71,7 @@
"key": "Load Tables", "key": "Load Tables",
"location": { "location": {
"startingColumn": 28, "startingColumn": 28,
"startingLine": 449 "startingLine": 454
} }
}, },
{ {
@@ -79,7 +79,7 @@
"key": "Tables", "key": "Tables",
"location": { "location": {
"startingColumn": 22, "startingColumn": 22,
"startingLine": 422 "startingLine": 427
} }
}, },
{ {
@@ -87,7 +87,7 @@
"key": "Select First 100 Rows", "key": "Select First 100 Rows",
"location": { "location": {
"startingColumn": 20, "startingColumn": 20,
"startingLine": 505 "startingLine": 510
} }
}, },
{ {
@@ -95,7 +95,7 @@
"key": "New Query Tab", "key": "New Query Tab",
"location": { "location": {
"startingColumn": 19, "startingColumn": 19,
"startingLine": 626 "startingLine": 631
} }
}, },
{ {
@@ -103,7 +103,7 @@
"key": "Default Schema:", "key": "Default Schema:",
"location": { "location": {
"startingColumn": 18, "startingColumn": 18,
"startingLine": 651 "startingLine": 656
} }
}, },
{ {
@@ -111,7 +111,7 @@
"key": "SQL Editor", "key": "SQL Editor",
"location": { "location": {
"startingColumn": 18, "startingColumn": 18,
"startingLine": 661 "startingLine": 666
} }
}, },
{ {
@@ -119,7 +119,7 @@
"key": "Execute SQL", "key": "Execute SQL",
"location": { "location": {
"startingColumn": 19, "startingColumn": 19,
"startingLine": 639 "startingLine": 644
} }
}, },
{ {
@@ -127,7 +127,7 @@
"key": "Format SQL", "key": "Format SQL",
"location": { "location": {
"startingColumn": 19, "startingColumn": 19,
"startingLine": 646 "startingLine": 651
} }
}, },
{ {
@@ -135,7 +135,7 @@
"key": "%lld", "key": "%lld",
"location": { "location": {
"startingColumn": 26, "startingColumn": 26,
"startingLine": 701 "startingLine": 706
} }
}, },
{ {
@@ -143,7 +143,7 @@
"key": "Result Grid", "key": "Result Grid",
"location": { "location": {
"startingColumn": 22, "startingColumn": 22,
"startingLine": 733 "startingLine": 738
} }
}, },
{ {
@@ -151,7 +151,7 @@
"key": "No query results", "key": "No query results",
"location": { "location": {
"startingColumn": 26, "startingColumn": 26,
"startingLine": 751 "startingLine": 756
} }
}, },
{ {
@@ -159,7 +159,7 @@
"key": "Action Output", "key": "Action Output",
"location": { "location": {
"startingColumn": 22, "startingColumn": 22,
"startingLine": 773 "startingLine": 778
} }
}, },
{ {
@@ -167,7 +167,7 @@
"key": "UTF-8", "key": "UTF-8",
"location": { "location": {
"startingColumn": 18, "startingColumn": 18,
"startingLine": 848 "startingLine": 853
} }
}, },
{ {
@@ -175,7 +175,7 @@
"key": "Connection Settings", "key": "Connection Settings",
"location": { "location": {
"startingColumn": 18, "startingColumn": 18,
"startingLine": 1023 "startingLine": 1028
} }
}, },
{ {
@@ -183,7 +183,7 @@
"key": "Connection Name", "key": "Connection Name",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 1028 "startingLine": 1033
} }
}, },
{ {
@@ -191,7 +191,7 @@
"key": "Hostname", "key": "Hostname",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 1033 "startingLine": 1038
} }
}, },
{ {
@@ -199,7 +199,7 @@
"key": "Port", "key": "Port",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 1038 "startingLine": 1043
} }
}, },
{ {
@@ -207,7 +207,7 @@
"key": "Username", "key": "Username",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 1044 "startingLine": 1049
} }
}, },
{ {
@@ -215,7 +215,7 @@
"key": "Password (macOS Keychain)", "key": "Password (macOS Keychain)",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 1049 "startingLine": 1054
} }
}, },
{ {
@@ -223,7 +223,7 @@
"key": "Default Schema", "key": "Default Schema",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 1054 "startingLine": 1059
} }
}, },
{ {
@@ -231,7 +231,7 @@
"key": "Cancel", "key": "Cancel",
"location": { "location": {
"startingColumn": 24, "startingColumn": 24,
"startingLine": 1062 "startingLine": 1067
} }
}, },
{ {
@@ -239,7 +239,7 @@
"key": "Save", "key": "Save",
"location": { "location": {
"startingColumn": 24, "startingColumn": 24,
"startingLine": 1066 "startingLine": 1071
} }
}, },
{ {
@@ -247,7 +247,7 @@
"key": "The server did not return any columns.", "key": "The server did not return any columns.",
"location": { "location": {
"startingColumn": 25, "startingColumn": 25,
"startingLine": 1388 "startingLine": 1393
} }
}, },
{ {
@@ -255,7 +255,7 @@
"key": "Loading %@…", "key": "Loading %@…",
"location": { "location": {
"startingColumn": 30, "startingColumn": 30,
"startingLine": 1366 "startingLine": 1371
} }
}, },
{ {
@@ -263,7 +263,7 @@
"key": "No Data", "key": "No Data",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 1385 "startingLine": 1390
} }
}, },
{ {
@@ -271,7 +271,7 @@
"key": "Unable to Load %@", "key": "Unable to Load %@",
"location": { "location": {
"startingColumn": 25, "startingColumn": 25,
"startingLine": 1372 "startingLine": 1377
} }
}, },
{ {
@@ -279,7 +279,7 @@
"key": "Retry", "key": "Retry",
"location": { "location": {
"startingColumn": 28, "startingColumn": 28,
"startingLine": 1378 "startingLine": 1383
} }
}, },
{ {
@@ -287,7 +287,7 @@
"key": "Refresh", "key": "Refresh",
"location": { "location": {
"startingColumn": 23, "startingColumn": 23,
"startingLine": 1427 "startingLine": 1432
} }
}, },
{ {
@@ -295,7 +295,7 @@
"key": "SQL Editor", "key": "SQL Editor",
"location": { "location": {
"startingColumn": 23, "startingColumn": 23,
"startingLine": 1434 "startingLine": 1439
} }
}, },
{ {
@@ -303,7 +303,7 @@
"key": "Not loaded", "key": "Not loaded",
"location": { "location": {
"startingColumn": 22, "startingColumn": 22,
"startingLine": 1512 "startingLine": 1517
} }
}, },
{ {
@@ -311,7 +311,7 @@
"key": "Updated %@", "key": "Updated %@",
"location": { "location": {
"startingColumn": 21, "startingColumn": 21,
"startingLine": 1509 "startingLine": 1514
} }
}, },
{ {
@@ -319,7 +319,7 @@
"key": "%lld rows", "key": "%lld rows",
"location": { "location": {
"startingColumn": 18, "startingColumn": 18,
"startingLine": 1517 "startingLine": 1522
} }
}, },
{ {
@@ -327,7 +327,7 @@
"key": "Import SQL into %@?", "key": "Import SQL into %@?",
"location": { "location": {
"startingColumn": 13, "startingColumn": 13,
"startingLine": 1725 "startingLine": 1766
} }
}, },
{ {
@@ -335,7 +335,7 @@
"key": "Operation", "key": "Operation",
"location": { "location": {
"startingColumn": 20, "startingColumn": 20,
"startingLine": 1589 "startingLine": 1597
} }
}, },
{ {
@@ -343,7 +343,7 @@
"key": "Data Export", "key": "Data Export",
"location": { "location": {
"startingColumn": 22, "startingColumn": 22,
"startingLine": 1590 "startingLine": 1598
} }
}, },
{ {
@@ -351,39 +351,39 @@
"key": "Data Import / Restore", "key": "Data Import / Restore",
"location": { "location": {
"startingColumn": 22, "startingColumn": 22,
"startingLine": 1591 "startingLine": 1599
} }
}, },
{ {
"comment": "", "comment": "",
"key": "MySQL Connection", "key": "MySQL Connection",
"location": { "location": {
"startingColumn": 25, "startingColumn": 26,
"startingLine": 1597 "startingLine": 1606
} }
}, },
{ {
"comment": "", "comment": "",
"key": "Export Options", "key": "Export Options",
"location": { "location": {
"startingColumn": 29, "startingColumn": 30,
"startingLine": 1619 "startingLine": 1630
} }
}, },
{ {
"comment": "", "comment": "",
"key": "Import Options", "key": "Import Options",
"location": { "location": {
"startingColumn": 29, "startingColumn": 30,
"startingLine": 1651 "startingLine": 1682
} }
}, },
{ {
"comment": "", "comment": "",
"key": "Progress", "key": "Progress",
"location": { "location": {
"startingColumn": 25, "startingColumn": 26,
"startingLine": 1661 "startingLine": 1694
} }
}, },
{ {
@@ -391,7 +391,7 @@
"key": "Connection", "key": "Connection",
"location": { "location": {
"startingColumn": 36, "startingColumn": 36,
"startingLine": 1598 "startingLine": 1608
} }
}, },
{ {
@@ -399,7 +399,7 @@
"key": "Database", "key": "Database",
"location": { "location": {
"startingColumn": 28, "startingColumn": 28,
"startingLine": 1602 "startingLine": 1612
} }
}, },
{ {
@@ -407,7 +407,7 @@
"key": "Select Database", "key": "Select Database",
"location": { "location": {
"startingColumn": 30, "startingColumn": 30,
"startingLine": 1603 "startingLine": 1613
} }
}, },
{ {
@@ -415,15 +415,23 @@
"key": "Refresh Databases", "key": "Refresh Databases",
"location": { "location": {
"startingColumn": 32, "startingColumn": 32,
"startingLine": 1611 "startingLine": 1621
} }
}, },
{ {
"comment": "", "comment": "",
"key": "Exports base tables with batched INSERT statements. Views, triggers, routines and transaction-consistent snapshots are not included.", "key": "No tables found. Select a database or refresh the list.",
"location": {
"startingColumn": 34,
"startingLine": 1648
}
},
{
"comment": "",
"key": "Exports base tables and selected views. Triggers, routines, consistent snapshots and guaranteed row ordering are not yet supported.",
"location": { "location": {
"startingColumn": 30, "startingColumn": 30,
"startingLine": 1647 "startingLine": 1677
} }
}, },
{ {
@@ -431,7 +439,7 @@
"key": "Table structure", "key": "Table structure",
"location": { "location": {
"startingColumn": 32, "startingColumn": 32,
"startingLine": 1620 "startingLine": 1632
} }
}, },
{ {
@@ -439,7 +447,7 @@
"key": "Table data", "key": "Table data",
"location": { "location": {
"startingColumn": 32, "startingColumn": 32,
"startingLine": 1621 "startingLine": 1633
} }
}, },
{ {
@@ -447,7 +455,15 @@
"key": "Add DROP TABLE IF EXISTS", "key": "Add DROP TABLE IF EXISTS",
"location": { "location": {
"startingColumn": 32, "startingColumn": 32,
"startingLine": 1622 "startingLine": 1634
}
},
{
"comment": "",
"key": "Include views (definitions)",
"location": {
"startingColumn": 32,
"startingLine": 1636
} }
}, },
{ {
@@ -455,7 +471,7 @@
"key": "Loading tables…", "key": "Loading tables…",
"location": { "location": {
"startingColumn": 57, "startingColumn": 57,
"startingLine": 1632 "startingLine": 1646
} }
}, },
{ {
@@ -463,7 +479,7 @@
"key": "Tables (%lld selected)", "key": "Tables (%lld selected)",
"location": { "location": {
"startingColumn": 34, "startingColumn": 34,
"startingLine": 1625 "startingLine": 1639
} }
}, },
{ {
@@ -471,7 +487,7 @@
"key": "All", "key": "All",
"location": { "location": {
"startingColumn": 36, "startingColumn": 36,
"startingLine": 1627 "startingLine": 1641
} }
}, },
{ {
@@ -479,7 +495,7 @@
"key": "None", "key": "None",
"location": { "location": {
"startingColumn": 36, "startingColumn": 36,
"startingLine": 1628 "startingLine": 1642
} }
}, },
{ {
@@ -487,7 +503,31 @@
"key": "Refresh", "key": "Refresh",
"location": { "location": {
"startingColumn": 36, "startingColumn": 36,
"startingLine": 1629 "startingLine": 1643
}
},
{
"comment": "",
"key": "Views (%lld selected)",
"location": {
"startingColumn": 38,
"startingLine": 1662
}
},
{
"comment": "",
"key": "All",
"location": {
"startingColumn": 40,
"startingLine": 1664
}
},
{
"comment": "",
"key": "None",
"location": {
"startingColumn": 40,
"startingLine": 1665
} }
}, },
{ {
@@ -495,7 +535,7 @@
"key": "Import SQL statements into the selected database.", "key": "Import SQL statements into the selected database.",
"location": { "location": {
"startingColumn": 30, "startingColumn": 30,
"startingLine": 1652 "startingLine": 1684
} }
}, },
{ {
@@ -503,7 +543,7 @@
"key": "Supports ordinary SQL statements. Dumps using custom DELIMITER directives or stored routines are not supported yet.", "key": "Supports ordinary SQL statements. Dumps using custom DELIMITER directives or stored routines are not supported yet.",
"location": { "location": {
"startingColumn": 30, "startingColumn": 30,
"startingLine": 1655 "startingLine": 1687
} }
}, },
{ {
@@ -511,7 +551,7 @@
"key": "Close", "key": "Close",
"location": { "location": {
"startingColumn": 24, "startingColumn": 24,
"startingLine": 1676 "startingLine": 1713
} }
}, },
{ {
@@ -519,7 +559,7 @@
"key": "Cancel", "key": "Cancel",
"location": { "location": {
"startingColumn": 28, "startingColumn": 28,
"startingLine": 1684 "startingLine": 1721
} }
}, },
{ {
@@ -527,7 +567,7 @@
"key": "Export SQL…", "key": "Export SQL…",
"location": { "location": {
"startingColumn": 31, "startingColumn": 31,
"startingLine": 1691 "startingLine": 1728
} }
}, },
{ {
@@ -535,7 +575,7 @@
"key": "Import SQL…", "key": "Import SQL…",
"location": { "location": {
"startingColumn": 31, "startingColumn": 31,
"startingLine": 1692 "startingLine": 1729
} }
}, },
{ {
@@ -543,7 +583,7 @@
"key": "Import SQL", "key": "Import SQL",
"location": { "location": {
"startingColumn": 20, "startingColumn": 20,
"startingLine": 1728 "startingLine": 1769
} }
}, },
{ {
@@ -551,7 +591,7 @@
"key": "Cancel", "key": "Cancel",
"location": { "location": {
"startingColumn": 20, "startingColumn": 20,
"startingLine": 1736 "startingLine": 1777
} }
}, },
{ {
@@ -559,7 +599,7 @@
"key": "SQL files can modify or delete existing database objects and data. Ensure you have a backup before continuing.", "key": "SQL files can modify or delete existing database objects and data. Ensure you have a backup before continuing.",
"location": { "location": {
"startingColumn": 17, "startingColumn": 17,
"startingLine": 1741 "startingLine": 1782
} }
}, },
{ {
@@ -567,7 +607,7 @@
"key": "Database Import / Export", "key": "Database Import / Export",
"location": { "location": {
"startingColumn": 22, "startingColumn": 22,
"startingLine": 1753 "startingLine": 1794
} }
}, },
{ {
@@ -575,7 +615,7 @@
"key": "Built-in native MySQL database tools", "key": "Built-in native MySQL database tools",
"location": { "location": {
"startingColumn": 22, "startingColumn": 22,
"startingLine": 1756 "startingLine": 1797
} }
} }
] ]
@@ -7,3 +7,5 @@
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app /Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
@@ -19,7 +19,7 @@
<dict> <dict>
<key>cdhash</key> <key>cdhash</key>
<data> <data>
kACWojMyCPE6G6Uw22tGzRrP2x4= Iv3+eGn5ABjizzuIQDv3FNnVrWE=
</data> </data>
<key>requirement</key> <key>requirement</key>
<string>identifier "WorkbenchReplacement.debug" and anchor apple generic and certificate leaf[subject.CN] = "Apple Development: Mark Gregory (FLBRJ3BYDD)" and certificate 1[field.1.2.840.113635.100.6.2.1] /* exists */</string> <string>identifier "WorkbenchReplacement.debug" and anchor apple generic and certificate leaf[subject.CN] = "Apple Development: Mark Gregory (FLBRJ3BYDD)" and certificate 1[field.1.2.840.113635.100.6.2.1] /* exists */</string>
+47 -47
View File
@@ -48,7 +48,7 @@
<key>uniqueIdentifier</key> <key>uniqueIdentifier</key>
<string>087CD1E0-7E94-4934-A62E-C6C070CD1577</string> <string>087CD1E0-7E94-4934-A62E-C6C070CD1577</string>
</dict> </dict>
<key>AD44F407-7FE5-46AE-A82F-8FAC1CA2720B</key> <key>20B4B0A0-41A0-44A0-BA02-3E5707BABE60</key>
<dict> <dict>
<key>className</key> <key>className</key>
<string>IDECommandLineBuildLog</string> <string>IDECommandLineBuildLog</string>
@@ -57,7 +57,7 @@
<key>domainType</key> <key>domainType</key>
<string>Xcode.IDEActivityLogDomainType.BuildLog</string> <string>Xcode.IDEActivityLogDomainType.BuildLog</string>
<key>fileName</key> <key>fileName</key>
<string>AD44F407-7FE5-46AE-A82F-8FAC1CA2720B.xcactivitylog</string> <string>20B4B0A0-41A0-44A0-BA02-3E5707BABE60.xcactivitylog</string>
<key>hasPrimaryLog</key> <key>hasPrimaryLog</key>
<true/> <true/>
<key>primaryObservable</key> <key>primaryObservable</key>
@@ -82,13 +82,55 @@
<key>signature</key> <key>signature</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string> <string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>timeStartedRecording</key> <key>timeStartedRecording</key>
<real>813875703.86912405</real> <real>813876442.84578598</real>
<key>timeStoppedRecording</key> <key>timeStoppedRecording</key>
<real>813875715.47182798</real> <real>813876454.95874095</real>
<key>title</key> <key>title</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string> <string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>uniqueIdentifier</key> <key>uniqueIdentifier</key>
<string>AD44F407-7FE5-46AE-A82F-8FAC1CA2720B</string> <string>20B4B0A0-41A0-44A0-BA02-3E5707BABE60</string>
</dict>
<key>705B952B-2A37-40D9-B731-8E2290C15462</key>
<dict>
<key>className</key>
<string>IDECommandLineBuildLog</string>
<key>documentTypeString</key>
<string>&lt;nil&gt;</string>
<key>domainType</key>
<string>Xcode.IDEActivityLogDomainType.BuildLog</string>
<key>fileName</key>
<string>705B952B-2A37-40D9-B731-8E2290C15462.xcactivitylog</string>
<key>hasPrimaryLog</key>
<true/>
<key>primaryObservable</key>
<dict>
<key>highLevelStatus</key>
<string>S</string>
<key>totalNumberOfAnalyzerIssues</key>
<integer>0</integer>
<key>totalNumberOfErrors</key>
<integer>0</integer>
<key>totalNumberOfTestFailures</key>
<integer>0</integer>
<key>totalNumberOfWarnings</key>
<integer>0</integer>
</dict>
<key>schemeIdentifier-containerName</key>
<string>WorkbenchReplacement project</string>
<key>schemeIdentifier-schemeName</key>
<string>WorkbenchReplacement</string>
<key>schemeIdentifier-sharedScheme</key>
<integer>1</integer>
<key>signature</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>timeStartedRecording</key>
<real>813876591.82079995</real>
<key>timeStoppedRecording</key>
<real>813876604.10285401</real>
<key>title</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>uniqueIdentifier</key>
<string>705B952B-2A37-40D9-B731-8E2290C15462</string>
</dict> </dict>
<key>AF582207-87B3-4A2E-A532-DA0FD8F61FBD</key> <key>AF582207-87B3-4A2E-A532-DA0FD8F61FBD</key>
<dict> <dict>
@@ -132,48 +174,6 @@
<key>uniqueIdentifier</key> <key>uniqueIdentifier</key>
<string>AF582207-87B3-4A2E-A532-DA0FD8F61FBD</string> <string>AF582207-87B3-4A2E-A532-DA0FD8F61FBD</string>
</dict> </dict>
<key>BA4E5983-8DAA-49CA-A677-11E73E67F0B0</key>
<dict>
<key>className</key>
<string>IDECommandLineBuildLog</string>
<key>documentTypeString</key>
<string>&lt;nil&gt;</string>
<key>domainType</key>
<string>Xcode.IDEActivityLogDomainType.BuildLog</string>
<key>fileName</key>
<string>BA4E5983-8DAA-49CA-A677-11E73E67F0B0.xcactivitylog</string>
<key>hasPrimaryLog</key>
<true/>
<key>primaryObservable</key>
<dict>
<key>highLevelStatus</key>
<string>S</string>
<key>totalNumberOfAnalyzerIssues</key>
<integer>0</integer>
<key>totalNumberOfErrors</key>
<integer>0</integer>
<key>totalNumberOfTestFailures</key>
<integer>0</integer>
<key>totalNumberOfWarnings</key>
<integer>0</integer>
</dict>
<key>schemeIdentifier-containerName</key>
<string>WorkbenchReplacement project</string>
<key>schemeIdentifier-schemeName</key>
<string>WorkbenchReplacement</string>
<key>schemeIdentifier-sharedScheme</key>
<integer>1</integer>
<key>signature</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>timeStartedRecording</key>
<real>813875867.553792</real>
<key>timeStoppedRecording</key>
<real>813875879.94755697</real>
<key>title</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>uniqueIdentifier</key>
<string>BA4E5983-8DAA-49CA-A677-11E73E67F0B0</string>
</dict>
</dict> </dict>
</dict> </dict>
</plist> </plist>
@@ -1 +1 @@
1792183470.9957151: Module build session file for module cache at Path(str: "/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex") 1792183792.223736: Module build session file for module cache at Path(str: "/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex")
+1 -1
View File
@@ -3,7 +3,7 @@
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>LastAccessedDate</key> <key>LastAccessedDate</key>
<date>2026-10-16T20:44:30Z</date> <date>2026-10-16T20:49:52Z</date>
<key>WorkspacePath</key> <key>WorkspacePath</key>
<string>/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement.xcodeproj</string> <string>/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement.xcodeproj</string>
</dict> </dict>