Improved progress display
Previously, the progress bar updated only after completing an entire table. For large tables such as LIBARC, this could make the application appear to have stopped responding. Phase 10 updates the interface while rows are being exported.
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
# Phase 13 — Administration enhancements
|
||||
|
||||
- Added Server Error Log view (reads `performance_schema.error_log`, available on supported MySQL versions and with appropriate privileges).
|
||||
- Added filter/search for administration result tables.
|
||||
- Added optional 5-second auto-refresh of administration data.
|
||||
- Added account selection and read-only `SHOW GRANTS` inspector to Users and Privileges.
|
||||
- Existing backup/restore functionality preserved.
|
||||
- No user account or server mutations are performed by these features.
|
||||
|
||||
**Validation:** Source-level checks and ZIP integrity only; full macOS Xcode build and live-server tests are still required.
|
||||
@@ -282,7 +282,8 @@ struct MainView: View {
|
||||
.serverStatus,
|
||||
.clientConnections,
|
||||
.users,
|
||||
.variables
|
||||
.variables,
|
||||
.serverLogs
|
||||
]
|
||||
)
|
||||
|
||||
@@ -1272,11 +1273,13 @@ enum WorkbenchAdminPage: String, CaseIterable, Identifiable {
|
||||
case dashboard = "Dashboard"
|
||||
case performanceReports = "Performance Reports"
|
||||
case performanceSchema = "Performance Schema Setup"
|
||||
case serverLogs = "Server Error Log"
|
||||
|
||||
var id: String { rawValue }
|
||||
|
||||
var icon: String {
|
||||
switch self {
|
||||
case .serverLogs: return "text.alignleft"
|
||||
case .serverStatus: return "server.rack"
|
||||
case .clientConnections: return "person.2"
|
||||
case .users: return "person.crop.circle.badge.checkmark"
|
||||
@@ -1289,6 +1292,8 @@ enum WorkbenchAdminPage: String, CaseIterable, Identifiable {
|
||||
|
||||
var statement: String {
|
||||
switch self {
|
||||
case .serverLogs:
|
||||
return "SELECT LOGGED, PRIO, ERROR_CODE, SUBSYSTEM, DATA FROM performance_schema.error_log ORDER BY LOGGED DESC LIMIT 500"
|
||||
case .serverStatus:
|
||||
return """
|
||||
SHOW GLOBAL STATUS WHERE Variable_name IN (
|
||||
@@ -1359,6 +1364,19 @@ struct WorkbenchAdministrationView: View {
|
||||
@State private var loading = false
|
||||
@State private var errorMessage: String?
|
||||
@State private var lastUpdated: Date?
|
||||
@State private var searchText = ""
|
||||
@State private var autoRefresh = false
|
||||
@State private var selectedAccount: String? = nil
|
||||
@State private var grants: [String] = []
|
||||
@State private var grantsError: String? = nil
|
||||
@State private var showingGrants = false
|
||||
|
||||
private var filteredRows: [[String]] {
|
||||
guard !searchText.isEmpty else { return result.rows }
|
||||
return result.rows.filter { row in
|
||||
row.contains { $0.localizedCaseInsensitiveContains(searchText) }
|
||||
}
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
VStack(spacing: 0) {
|
||||
@@ -1399,6 +1417,31 @@ struct WorkbenchAdministrationView: View {
|
||||
resultContent
|
||||
}
|
||||
|
||||
if page == .users && !result.rows.isEmpty {
|
||||
HStack {
|
||||
Picker("Account", selection: $selectedAccount) {
|
||||
Text("Select account").tag(String?.none)
|
||||
ForEach(result.rows.indices, id: \.self) { i in
|
||||
let row = result.rows[i]
|
||||
if row.count >= 2 {
|
||||
Text("\(row[0])@\(row[1])")
|
||||
.tag(Optional("\(row[0])\u{001f}\(row[1])"))
|
||||
}
|
||||
}
|
||||
}
|
||||
.frame(maxWidth: 320)
|
||||
Button("Show Grants") {
|
||||
Task { await showGrants() }
|
||||
}
|
||||
.disabled(selectedAccount == nil)
|
||||
Spacer()
|
||||
Text("Read-only account inspection")
|
||||
.foregroundStyle(.secondary)
|
||||
}
|
||||
.padding(.horizontal, 16)
|
||||
.padding(.vertical, 8)
|
||||
}
|
||||
|
||||
Divider()
|
||||
|
||||
footer
|
||||
@@ -1407,6 +1450,32 @@ struct WorkbenchAdministrationView: View {
|
||||
.task(id: "\(page.id)-\(profile?.id.uuidString ?? "")") {
|
||||
await refresh()
|
||||
}
|
||||
.task(id: "\(page.id)-\(autoRefresh)-\(profile?.id.uuidString ?? "")") {
|
||||
while autoRefresh && !Task.isCancelled {
|
||||
try? await Task.sleep(for: .seconds(5))
|
||||
if Task.isCancelled || !autoRefresh { break }
|
||||
await refresh()
|
||||
}
|
||||
}
|
||||
.sheet(isPresented: $showingGrants) {
|
||||
VStack(alignment: .leading, spacing: 12) {
|
||||
Text("Grants: \(selectedAccount ?? "")")
|
||||
.font(.title2.bold())
|
||||
if let grantsError {
|
||||
Text(grantsError).foregroundStyle(.red)
|
||||
} else {
|
||||
ScrollView {
|
||||
Text(grants.joined(separator: "\n\n"))
|
||||
.font(.system(.body, design: .monospaced))
|
||||
.textSelection(.enabled)
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
}
|
||||
}
|
||||
Button("Close") { showingGrants = false }
|
||||
}
|
||||
.padding(20)
|
||||
.frame(minWidth: 580, minHeight: 300)
|
||||
}
|
||||
}
|
||||
|
||||
private var header: some View {
|
||||
@@ -1427,6 +1496,16 @@ struct WorkbenchAdministrationView: View {
|
||||
|
||||
Spacer()
|
||||
|
||||
if page != .dashboard && page != .serverStatus {
|
||||
TextField("Filter results", text: $searchText)
|
||||
.textFieldStyle(.roundedBorder)
|
||||
.frame(width: 175)
|
||||
}
|
||||
|
||||
Toggle("Auto-refresh", isOn: $autoRefresh)
|
||||
.toggleStyle(.checkbox)
|
||||
.help("Refresh every five seconds")
|
||||
|
||||
Button {
|
||||
Task { await refresh() }
|
||||
} label: {
|
||||
@@ -1499,7 +1578,7 @@ struct WorkbenchAdministrationView: View {
|
||||
} else {
|
||||
NativeResultGrid(
|
||||
columns: result.columns,
|
||||
rows: result.rows
|
||||
rows: filteredRows
|
||||
)
|
||||
.frame(
|
||||
maxWidth: .infinity,
|
||||
@@ -1528,6 +1607,29 @@ struct WorkbenchAdministrationView: View {
|
||||
.frame(height: 30)
|
||||
}
|
||||
|
||||
@MainActor
|
||||
private func showGrants() async {
|
||||
guard let profile, let selectedAccount else { return }
|
||||
let components = selectedAccount.split(separator: "\u{001f}", omittingEmptySubsequences: false)
|
||||
guard components.count == 2 else { return }
|
||||
func quoted(_ text: String) -> String {
|
||||
"'" + text.replacingOccurrences(of: "'", with: "''") + "'"
|
||||
}
|
||||
grants = []
|
||||
grantsError = nil
|
||||
showingGrants = true
|
||||
do {
|
||||
let sql = "SHOW GRANTS FOR \(quoted(String(components[0])))@\(quoted(String(components[1])))"
|
||||
let response = try await NativeMySQLRunner.run(
|
||||
profile: profile, database: "",
|
||||
password: PasswordStore.read(profile.id), sql: sql
|
||||
)
|
||||
grants = response.rows.compactMap { $0.first }
|
||||
} catch {
|
||||
grantsError = error.localizedDescription
|
||||
}
|
||||
}
|
||||
|
||||
@MainActor
|
||||
private func refresh() async {
|
||||
guard let profile else {
|
||||
|
||||
BIN
Binary file not shown.
+401
-305
@@ -55,7 +55,7 @@
|
||||
"key": "Set as Default Schema",
|
||||
"location": {
|
||||
"startingColumn": 24,
|
||||
"startingLine": 381
|
||||
"startingLine": 382
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -63,7 +63,7 @@
|
||||
"key": "Refresh Tables",
|
||||
"location": {
|
||||
"startingColumn": 24,
|
||||
"startingLine": 385
|
||||
"startingLine": 386
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -71,7 +71,7 @@
|
||||
"key": "Load Tables",
|
||||
"location": {
|
||||
"startingColumn": 28,
|
||||
"startingLine": 455
|
||||
"startingLine": 456
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -79,7 +79,7 @@
|
||||
"key": "Tables",
|
||||
"location": {
|
||||
"startingColumn": 22,
|
||||
"startingLine": 428
|
||||
"startingLine": 429
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -87,7 +87,7 @@
|
||||
"key": "Select First 100 Rows",
|
||||
"location": {
|
||||
"startingColumn": 20,
|
||||
"startingLine": 511
|
||||
"startingLine": 512
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -95,7 +95,7 @@
|
||||
"key": "New Query Tab",
|
||||
"location": {
|
||||
"startingColumn": 19,
|
||||
"startingLine": 632
|
||||
"startingLine": 633
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -103,7 +103,7 @@
|
||||
"key": "Default Schema:",
|
||||
"location": {
|
||||
"startingColumn": 18,
|
||||
"startingLine": 657
|
||||
"startingLine": 658
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -111,7 +111,7 @@
|
||||
"key": "SQL Editor",
|
||||
"location": {
|
||||
"startingColumn": 18,
|
||||
"startingLine": 667
|
||||
"startingLine": 668
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -119,7 +119,7 @@
|
||||
"key": "Execute SQL",
|
||||
"location": {
|
||||
"startingColumn": 19,
|
||||
"startingLine": 645
|
||||
"startingLine": 646
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -127,7 +127,7 @@
|
||||
"key": "Format SQL",
|
||||
"location": {
|
||||
"startingColumn": 19,
|
||||
"startingLine": 652
|
||||
"startingLine": 653
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -135,7 +135,7 @@
|
||||
"key": "%lld",
|
||||
"location": {
|
||||
"startingColumn": 26,
|
||||
"startingLine": 707
|
||||
"startingLine": 708
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -143,7 +143,7 @@
|
||||
"key": "Result Grid",
|
||||
"location": {
|
||||
"startingColumn": 22,
|
||||
"startingLine": 739
|
||||
"startingLine": 740
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -151,7 +151,7 @@
|
||||
"key": "No query results",
|
||||
"location": {
|
||||
"startingColumn": 26,
|
||||
"startingLine": 757
|
||||
"startingLine": 758
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -159,7 +159,7 @@
|
||||
"key": "Action Output",
|
||||
"location": {
|
||||
"startingColumn": 22,
|
||||
"startingLine": 779
|
||||
"startingLine": 780
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -167,7 +167,7 @@
|
||||
"key": "UTF-8",
|
||||
"location": {
|
||||
"startingColumn": 18,
|
||||
"startingLine": 854
|
||||
"startingLine": 855
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -175,7 +175,7 @@
|
||||
"key": "Connection Settings",
|
||||
"location": {
|
||||
"startingColumn": 18,
|
||||
"startingLine": 1029
|
||||
"startingLine": 1030
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -183,7 +183,7 @@
|
||||
"key": "Connection Name",
|
||||
"location": {
|
||||
"startingColumn": 21,
|
||||
"startingLine": 1034
|
||||
"startingLine": 1035
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -191,7 +191,7 @@
|
||||
"key": "Hostname",
|
||||
"location": {
|
||||
"startingColumn": 21,
|
||||
"startingLine": 1039
|
||||
"startingLine": 1040
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -199,7 +199,7 @@
|
||||
"key": "Port",
|
||||
"location": {
|
||||
"startingColumn": 21,
|
||||
"startingLine": 1044
|
||||
"startingLine": 1045
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -207,7 +207,7 @@
|
||||
"key": "Username",
|
||||
"location": {
|
||||
"startingColumn": 21,
|
||||
"startingLine": 1050
|
||||
"startingLine": 1051
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -215,7 +215,7 @@
|
||||
"key": "Password (macOS Keychain)",
|
||||
"location": {
|
||||
"startingColumn": 21,
|
||||
"startingLine": 1055
|
||||
"startingLine": 1056
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -223,7 +223,7 @@
|
||||
"key": "Default Schema",
|
||||
"location": {
|
||||
"startingColumn": 21,
|
||||
"startingLine": 1060
|
||||
"startingLine": 1061
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -231,7 +231,7 @@
|
||||
"key": "Cancel",
|
||||
"location": {
|
||||
"startingColumn": 24,
|
||||
"startingLine": 1068
|
||||
"startingLine": 1069
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -239,7 +239,7 @@
|
||||
"key": "Save",
|
||||
"location": {
|
||||
"startingColumn": 24,
|
||||
"startingLine": 1072
|
||||
"startingLine": 1073
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -247,7 +247,7 @@
|
||||
"key": "The server did not return any columns.",
|
||||
"location": {
|
||||
"startingColumn": 25,
|
||||
"startingLine": 1394
|
||||
"startingLine": 1412
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -255,7 +255,7 @@
|
||||
"key": "Loading %@…",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1372
|
||||
"startingLine": 1390
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -263,7 +263,7 @@
|
||||
"key": "No Data",
|
||||
"location": {
|
||||
"startingColumn": 21,
|
||||
"startingLine": 1391
|
||||
"startingLine": 1409
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -271,7 +271,7 @@
|
||||
"key": "Unable to Load %@",
|
||||
"location": {
|
||||
"startingColumn": 25,
|
||||
"startingLine": 1378
|
||||
"startingLine": 1396
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -279,295 +279,55 @@
|
||||
"key": "Retry",
|
||||
"location": {
|
||||
"startingColumn": 28,
|
||||
"startingLine": 1384
|
||||
"startingLine": 1402
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Refresh",
|
||||
"key": "Read-only account inspection",
|
||||
"location": {
|
||||
"startingColumn": 23,
|
||||
"startingColumn": 26,
|
||||
"startingLine": 1438
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Account",
|
||||
"location": {
|
||||
"startingColumn": 28,
|
||||
"startingLine": 1422
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Show Grants",
|
||||
"location": {
|
||||
"startingColumn": 28,
|
||||
"startingLine": 1433
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "SQL Editor",
|
||||
"location": {
|
||||
"startingColumn": 23,
|
||||
"startingLine": 1440
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Not loaded",
|
||||
"location": {
|
||||
"startingColumn": 22,
|
||||
"startingLine": 1518
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Updated %@",
|
||||
"location": {
|
||||
"startingColumn": 21,
|
||||
"startingLine": 1515
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "%lld rows",
|
||||
"location": {
|
||||
"startingColumn": 18,
|
||||
"startingLine": 1523
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Import SQL into %@?",
|
||||
"location": {
|
||||
"startingColumn": 13,
|
||||
"startingLine": 1789
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Operation",
|
||||
"location": {
|
||||
"startingColumn": 20,
|
||||
"startingLine": 1603
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Data Export",
|
||||
"location": {
|
||||
"startingColumn": 22,
|
||||
"startingLine": 1604
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Data Import / Restore",
|
||||
"location": {
|
||||
"startingColumn": 22,
|
||||
"startingLine": 1605
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "MySQL Connection",
|
||||
"location": {
|
||||
"startingColumn": 26,
|
||||
"startingLine": 1612
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Export Options",
|
||||
"key": "Select account",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1636
|
||||
"startingLine": 1423
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Import Options",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1692
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Progress",
|
||||
"location": {
|
||||
"startingColumn": 26,
|
||||
"startingLine": 1704
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Connection",
|
||||
"location": {
|
||||
"startingColumn": 36,
|
||||
"startingLine": 1614
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Database",
|
||||
"location": {
|
||||
"startingColumn": 28,
|
||||
"startingLine": 1618
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Select Database",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1619
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Refresh Databases",
|
||||
"location": {
|
||||
"startingColumn": 32,
|
||||
"startingLine": 1627
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "No tables found. Select a database or refresh the list.",
|
||||
"location": {
|
||||
"startingColumn": 34,
|
||||
"startingLine": 1658
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "InnoDB data is exported using a consistent snapshot and a single streamed query per table. Tables without unique indexes are supported.",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1687
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Table structure",
|
||||
"location": {
|
||||
"startingColumn": 32,
|
||||
"startingLine": 1638
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Table data",
|
||||
"location": {
|
||||
"startingColumn": 32,
|
||||
"startingLine": 1639
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Add DROP TABLE IF EXISTS",
|
||||
"location": {
|
||||
"startingColumn": 32,
|
||||
"startingLine": 1640
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Include views (definitions)",
|
||||
"location": {
|
||||
"startingColumn": 32,
|
||||
"startingLine": 1642
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Include triggers",
|
||||
"location": {
|
||||
"startingColumn": 32,
|
||||
"startingLine": 1644
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Include stored procedures and functions",
|
||||
"location": {
|
||||
"startingColumn": 32,
|
||||
"startingLine": 1646
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Loading tables…",
|
||||
"location": {
|
||||
"startingColumn": 57,
|
||||
"startingLine": 1656
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Tables (%lld selected)",
|
||||
"location": {
|
||||
"startingColumn": 34,
|
||||
"startingLine": 1649
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "All",
|
||||
"location": {
|
||||
"startingColumn": 36,
|
||||
"startingLine": 1651
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "None",
|
||||
"location": {
|
||||
"startingColumn": 36,
|
||||
"startingLine": 1652
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Refresh",
|
||||
"location": {
|
||||
"startingColumn": 36,
|
||||
"startingLine": 1653
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Views (%lld selected)",
|
||||
"key": "%@@%@",
|
||||
"location": {
|
||||
"startingColumn": 38,
|
||||
"startingLine": 1672
|
||||
"startingLine": 1427
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "All",
|
||||
"key": "Grants: %@",
|
||||
"location": {
|
||||
"startingColumn": 40,
|
||||
"startingLine": 1674
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "None",
|
||||
"location": {
|
||||
"startingColumn": 40,
|
||||
"startingLine": 1675
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Import SQL statements into the selected database.",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1694
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Supports MySQL DELIMITER directives, triggers and stored routines. Import is not transactional; use a verified backup before restoring.",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1697
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Current table: %@ / %@ rows · Total exported: %@",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1715
|
||||
"startingColumn": 22,
|
||||
"startingLine": 1462
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -575,7 +335,327 @@
|
||||
"key": "Close",
|
||||
"location": {
|
||||
"startingColumn": 24,
|
||||
"startingLine": 1729
|
||||
"startingLine": 1474
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Filter results",
|
||||
"location": {
|
||||
"startingColumn": 27,
|
||||
"startingLine": 1500
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Auto-refresh",
|
||||
"location": {
|
||||
"startingColumn": 20,
|
||||
"startingLine": 1505
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Refresh every five seconds",
|
||||
"location": {
|
||||
"startingColumn": 23,
|
||||
"startingLine": 1507
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Refresh",
|
||||
"location": {
|
||||
"startingColumn": 23,
|
||||
"startingLine": 1512
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "SQL Editor",
|
||||
"location": {
|
||||
"startingColumn": 23,
|
||||
"startingLine": 1519
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Not loaded",
|
||||
"location": {
|
||||
"startingColumn": 22,
|
||||
"startingLine": 1597
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Updated %@",
|
||||
"location": {
|
||||
"startingColumn": 21,
|
||||
"startingLine": 1594
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "%lld rows",
|
||||
"location": {
|
||||
"startingColumn": 18,
|
||||
"startingLine": 1602
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Import SQL into %@?",
|
||||
"location": {
|
||||
"startingColumn": 13,
|
||||
"startingLine": 1904
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Operation",
|
||||
"location": {
|
||||
"startingColumn": 20,
|
||||
"startingLine": 1707
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Data Export",
|
||||
"location": {
|
||||
"startingColumn": 22,
|
||||
"startingLine": 1708
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Data Import / Restore",
|
||||
"location": {
|
||||
"startingColumn": 22,
|
||||
"startingLine": 1709
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "MySQL Connection",
|
||||
"location": {
|
||||
"startingColumn": 26,
|
||||
"startingLine": 1716
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Export Options",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1740
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Import Options",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1796
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Progress",
|
||||
"location": {
|
||||
"startingColumn": 26,
|
||||
"startingLine": 1808
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Connection",
|
||||
"location": {
|
||||
"startingColumn": 36,
|
||||
"startingLine": 1718
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Database",
|
||||
"location": {
|
||||
"startingColumn": 28,
|
||||
"startingLine": 1722
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Select Database",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1723
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Refresh Databases",
|
||||
"location": {
|
||||
"startingColumn": 32,
|
||||
"startingLine": 1731
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "No tables found. Select a database or refresh the list.",
|
||||
"location": {
|
||||
"startingColumn": 34,
|
||||
"startingLine": 1762
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "InnoDB data is exported using a consistent snapshot and a single streamed query per table. Tables without unique indexes are supported.",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1791
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Table structure",
|
||||
"location": {
|
||||
"startingColumn": 32,
|
||||
"startingLine": 1742
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Table data",
|
||||
"location": {
|
||||
"startingColumn": 32,
|
||||
"startingLine": 1743
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Add DROP TABLE IF EXISTS",
|
||||
"location": {
|
||||
"startingColumn": 32,
|
||||
"startingLine": 1744
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Include views (definitions)",
|
||||
"location": {
|
||||
"startingColumn": 32,
|
||||
"startingLine": 1746
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Include triggers",
|
||||
"location": {
|
||||
"startingColumn": 32,
|
||||
"startingLine": 1748
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Include stored procedures and functions",
|
||||
"location": {
|
||||
"startingColumn": 32,
|
||||
"startingLine": 1750
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Loading tables…",
|
||||
"location": {
|
||||
"startingColumn": 57,
|
||||
"startingLine": 1760
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Tables (%lld selected)",
|
||||
"location": {
|
||||
"startingColumn": 34,
|
||||
"startingLine": 1753
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "All",
|
||||
"location": {
|
||||
"startingColumn": 36,
|
||||
"startingLine": 1755
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "None",
|
||||
"location": {
|
||||
"startingColumn": 36,
|
||||
"startingLine": 1756
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Refresh",
|
||||
"location": {
|
||||
"startingColumn": 36,
|
||||
"startingLine": 1757
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Views (%lld selected)",
|
||||
"location": {
|
||||
"startingColumn": 38,
|
||||
"startingLine": 1776
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "All",
|
||||
"location": {
|
||||
"startingColumn": 40,
|
||||
"startingLine": 1778
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "None",
|
||||
"location": {
|
||||
"startingColumn": 40,
|
||||
"startingLine": 1779
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Import SQL statements into the selected database.",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1798
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Supports MySQL DELIMITER directives, triggers and stored routines. Import is not transactional; use a verified backup before restoring.",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1801
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Current table: %@ / %@ rows · Total exported: %@",
|
||||
"location": {
|
||||
"startingColumn": 30,
|
||||
"startingLine": 1825
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Close",
|
||||
"location": {
|
||||
"startingColumn": 24,
|
||||
"startingLine": 1839
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -583,7 +663,7 @@
|
||||
"key": "Verify Backup…",
|
||||
"location": {
|
||||
"startingColumn": 28,
|
||||
"startingLine": 1737
|
||||
"startingLine": 1847
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -591,7 +671,23 @@
|
||||
"key": "Verify an SQL file against its SHA-256 checksum sidecar",
|
||||
"location": {
|
||||
"startingColumn": 27,
|
||||
"startingLine": 1740
|
||||
"startingLine": 1850
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Verify Restored Database…",
|
||||
"location": {
|
||||
"startingColumn": 28,
|
||||
"startingLine": 1851
|
||||
}
|
||||
},
|
||||
{
|
||||
"comment": "",
|
||||
"key": "Compare restored table row counts and object names with the export manifest",
|
||||
"location": {
|
||||
"startingColumn": 27,
|
||||
"startingLine": 1855
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -599,7 +695,7 @@
|
||||
"key": "Cancel",
|
||||
"location": {
|
||||
"startingColumn": 28,
|
||||
"startingLine": 1744
|
||||
"startingLine": 1859
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -607,7 +703,7 @@
|
||||
"key": "Export SQL…",
|
||||
"location": {
|
||||
"startingColumn": 31,
|
||||
"startingLine": 1751
|
||||
"startingLine": 1866
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -615,7 +711,7 @@
|
||||
"key": "Import SQL…",
|
||||
"location": {
|
||||
"startingColumn": 31,
|
||||
"startingLine": 1752
|
||||
"startingLine": 1867
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -623,7 +719,7 @@
|
||||
"key": "Import SQL",
|
||||
"location": {
|
||||
"startingColumn": 20,
|
||||
"startingLine": 1792
|
||||
"startingLine": 1907
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -631,7 +727,7 @@
|
||||
"key": "Cancel",
|
||||
"location": {
|
||||
"startingColumn": 20,
|
||||
"startingLine": 1800
|
||||
"startingLine": 1915
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -639,7 +735,7 @@
|
||||
"key": "SQL files can modify or delete existing database objects and data. Ensure you have a backup before continuing.",
|
||||
"location": {
|
||||
"startingColumn": 17,
|
||||
"startingLine": 1805
|
||||
"startingLine": 1920
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -647,7 +743,7 @@
|
||||
"key": "Database Import / Export",
|
||||
"location": {
|
||||
"startingColumn": 22,
|
||||
"startingLine": 1817
|
||||
"startingLine": 1932
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -655,7 +751,7 @@
|
||||
"key": "Built-in native MySQL database tools",
|
||||
"location": {
|
||||
"startingColumn": 22,
|
||||
"startingLine": 1820
|
||||
"startingLine": 1935
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
@@ -17,3 +17,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
|
||||
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
+1
-1
@@ -19,7 +19,7 @@
|
||||
<dict>
|
||||
<key>cdhash</key>
|
||||
<data>
|
||||
NSM7hOCoNX+DMsteke6Yge2XHGs=
|
||||
lXsCGsMbs4xf0Myx5xVMRot9mP8=
|
||||
</data>
|
||||
<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>
|
||||
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
@@ -90,6 +90,48 @@
|
||||
<key>uniqueIdentifier</key>
|
||||
<string>B2C949DC-0503-4157-BC15-F74641625B50</string>
|
||||
</dict>
|
||||
<key>B8940B11-E198-4118-908A-6DCC06A473A1</key>
|
||||
<dict>
|
||||
<key>className</key>
|
||||
<string>IDECommandLineBuildLog</string>
|
||||
<key>documentTypeString</key>
|
||||
<string><nil></string>
|
||||
<key>domainType</key>
|
||||
<string>Xcode.IDEActivityLogDomainType.BuildLog</string>
|
||||
<key>fileName</key>
|
||||
<string>B8940B11-E198-4118-908A-6DCC06A473A1.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>813878192.18681705</real>
|
||||
<key>timeStoppedRecording</key>
|
||||
<real>813878206.57349706</real>
|
||||
<key>title</key>
|
||||
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
|
||||
<key>uniqueIdentifier</key>
|
||||
<string>B8940B11-E198-4118-908A-6DCC06A473A1</string>
|
||||
</dict>
|
||||
<key>D705A532-F8F7-4B72-94B4-3464B760E3E3</key>
|
||||
<dict>
|
||||
<key>className</key>
|
||||
@@ -132,48 +174,6 @@
|
||||
<key>uniqueIdentifier</key>
|
||||
<string>D705A532-F8F7-4B72-94B4-3464B760E3E3</string>
|
||||
</dict>
|
||||
<key>EB994874-BDA8-4BAC-BAF2-6EB6F20E2468</key>
|
||||
<dict>
|
||||
<key>className</key>
|
||||
<string>IDECommandLineBuildLog</string>
|
||||
<key>documentTypeString</key>
|
||||
<string><nil></string>
|
||||
<key>domainType</key>
|
||||
<string>Xcode.IDEActivityLogDomainType.BuildLog</string>
|
||||
<key>fileName</key>
|
||||
<string>EB994874-BDA8-4BAC-BAF2-6EB6F20E2468.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>813877513.105088</real>
|
||||
<key>timeStoppedRecording</key>
|
||||
<real>813877526.28998804</real>
|
||||
<key>title</key>
|
||||
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
|
||||
<key>uniqueIdentifier</key>
|
||||
<string>EB994874-BDA8-4BAC-BAF2-6EB6F20E2468</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -1 +1 @@
|
||||
1792185273.801373: Module build session file for module cache at Path(str: "/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex")
|
||||
1792185392.568994: Module build session file for module cache at Path(str: "/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex")
|
||||
|
||||
BIN
Binary file not shown.
+1
-1
@@ -3,7 +3,7 @@
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>LastAccessedDate</key>
|
||||
<date>2026-10-16T21:14:33Z</date>
|
||||
<date>2026-10-16T21:16:32Z</date>
|
||||
<key>WorkspacePath</key>
|
||||
<string>/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement.xcodeproj</string>
|
||||
</dict>
|
||||
|
||||
Reference in New Issue
Block a user