From 4da2ead3557c38a5fe72e35445c28ff36d921671 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Wed, 7 Jan 2026 17:06:45 +0700 Subject: [PATCH 01/10] Add Intel Mac (x86_64) support with separate build strategy - Add architecture-specific linker flags for ARM64 and x86_64 - Add Intel Homebrew paths (/usr/local/opt) for cross-compilation - Add build-release.sh script to create separate architecture builds - Add BUILD.md with build instructions and distribution recommendations - Update .gitignore to exclude build artifacts - Restore ARM64-only libmariadb.a as default (9.4MB vs 19MB universal) Separate builds reduce download size by ~50% (9.5MB each vs 19MB universal). Users can now build for specific architectures or create universal binaries. --- .gitignore | 7 ++ BUILD.md | 111 +++++++++++++++++++++++++++++ Libs/libmariadb.a | Bin 407784 -> 405184 bytes TablePro.xcodeproj/project.pbxproj | 30 ++++++-- build-release.sh | 93 ++++++++++++++++++++++++ 5 files changed, 237 insertions(+), 4 deletions(-) create mode 100644 BUILD.md create mode 100755 build-release.sh diff --git a/.gitignore b/.gitignore index 630e29af..46329625 100644 --- a/.gitignore +++ b/.gitignore @@ -132,3 +132,10 @@ Sourcery/GeneratedMocks # XCFilelists *.xcfilelists + +# Build artifacts +build/ +*.xcarchive +Libs/libmariadb_universal.a +Libs/libmariadb_arm64.a +Libs/libmariadb_x86_64.a diff --git a/BUILD.md b/BUILD.md new file mode 100644 index 00000000..d57c4143 --- /dev/null +++ b/BUILD.md @@ -0,0 +1,111 @@ +# Building TablePro + +## Architecture Support + +TablePro supports both Apple Silicon (ARM64) and Intel (x86_64) Macs. + +### Build Options + +#### Option 1: Separate Builds (Recommended for Distribution) + +Build architecture-specific binaries to minimize download size: + +```bash +# Build Apple Silicon version only (9.4MB) +./build-release.sh arm64 + +# Build Intel version only (9.5MB) +./build-release.sh x86_64 + +# Build both +./build-release.sh both +``` + +**Output:** +- `build/Release/TablePro-arm64.app` - For Apple Silicon Macs +- `build/Release/TablePro-x86_64.app` - For Intel Macs + +**Benefits:** +- ✅ Smaller file size (~9.5MB each vs 19MB universal) +- ✅ Users only download what they need +- ✅ Faster downloads +- ✅ Less disk space + +#### Option 2: Universal Binary (Single Build) + +Build one app that runs on both architectures: + +```bash +xcodebuild -project TablePro.xcodeproj \ + -scheme TablePro \ + -configuration Release \ + -arch arm64 -arch x86_64 \ + ONLY_ACTIVE_ARCH=NO \ + build +``` + +**Output:** +- `TablePro.app` - Runs on both Apple Silicon and Intel (~19MB) + +**Benefits:** +- ✅ One download for all users +- ✅ Simpler distribution +- ❌ 2x file size + +## Size Comparison + +| Build Type | Size | Notes | +|------------|------|-------| +| ARM64-only | 9.4MB | Apple Silicon Macs only | +| x86_64-only | 9.5MB | Intel Macs only | +| Universal | 19MB | Both architectures | + +## Dependencies + +### Apple Silicon Mac (ARM64) +```bash +brew install mariadb-connector-c libpq +``` + +### Intel Mac (x86_64) +```bash +# Install Rosetta first +softwareupdate --install-rosetta + +# Install x86_64 Homebrew +arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + +# Install dependencies +arch -x86_64 /usr/local/bin/brew install mariadb-connector-c libpq +``` + +### Building on Apple Silicon for Intel + +To build Intel binaries on an Apple Silicon Mac, you need both Homebrew installations: +1. ARM64 Homebrew at `/opt/homebrew` (default) +2. x86_64 Homebrew at `/usr/local` (for cross-compilation) + +## Distribution Recommendations + +**For GitHub Releases:** +``` +✅ TablePro-v0.1.13-arm64.dmg (Apple Silicon) +✅ TablePro-v0.1.13-x86_64.dmg (Intel) +``` + +**For simple distribution:** +``` +✅ TablePro-v0.1.13-universal.dmg (Both architectures) +``` + +Most modern apps (Discord, Slack, VSCode) distribute separate builds to save bandwidth. + +## Quick Start + +```bash +# Development (current architecture) +xcodebuild -project TablePro.xcodeproj -scheme TablePro build + +# Release builds +./build-release.sh both +``` diff --git a/Libs/libmariadb.a b/Libs/libmariadb.a index 86adde50c146762c32f4c97e17f19e8eda9f4889..5a969b639ab39b4ed37d17c0cadff0228b9416ef 100644 GIT binary patch literal 405184 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%0D?V|W`7v%n(O_2!CM%| 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

fCwV zsasNI?(#_4CT#m9kuw2SzY&i4z4liwSh_gsbXe^E3fBvKLvPP`kEOD|LigZ3eea?D zaW-Jld7{O2yZsf}(^7AL<)@rXT4YZqvtM<-B|uG)mcP5y8u#ql=?^(uP!E$Uo4 zBdTavVx~q-{GMYk@|OMHBn6cn@?`xp?iH*4vSM#L&xo{9JAWD6>v0S*AuvnJqipKp zPs?ij^`~UG1}a_N>k`=CcumLFh8{itwa(1g<4L#&Oxvn=!v>yT-eUcHCVhn#-W5In z6OGp_-_+1UpO*JT$CkDc>X^6b)RVLDJ;6zwi%df z&FNUy*t1P`8E-4yj5hW;`|{hrH=B1cK5+T%amAs*=&k(Hq&3DP3^O+46#9=I#(P#9ui1E~)$=XV z#7)1;iLZMc;yI-2M$+{S{O4nDIri?EDox)aP0u!I+Hm5oLX#&=NyipD9alT?`Mi^d zVUD$feQYNlfy%U0nweuPev$qRd8NEl9@%NRVe0a*ow%0D!v`CBirNR|VamK$JoOIw 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 z
-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%0D?V|W`7v%n(O_2!CM%| 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 F{vSh*_L~3z literal 0 HcmV?d00001 diff --git a/TablePro/AppDelegate.swift b/TablePro/AppDelegate.swift index f6a275ad..67246933 100644 --- a/TablePro/AppDelegate.swift +++ b/TablePro/AppDelegate.swift @@ -28,10 +28,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { // Close any restored main windows (no active connection on fresh launch) // macOS may restore window state from previous session DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - for window in NSApp.windows { - if window.identifier?.rawValue.contains("main") == true { - window.close() - } + for window in NSApp.windows where window.identifier?.rawValue.contains("main") == true { + window.close() } } @@ -42,7 +40,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { name: NSWindow.didBecomeKeyNotification, object: nil ) - + // Observe for main window being closed NotificationCenter.default.addObserver( self, @@ -50,10 +48,10 @@ class AppDelegate: NSObject, NSApplicationDelegate { name: NSWindow.willCloseNotification, object: nil ) - } - @objc private func windowWillClose(_ notification: Notification) { + @objc + private func windowWillClose(_ notification: Notification) { guard let window = notification.object as? NSWindow else { return } // Clean up window tracking @@ -69,7 +67,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { // This is more elegant than Thread.sleep as it processes pending events // rather than blocking the main thread entirely RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.05)) - + // NOTE: We do NOT call saveAllTabStates() here because: // 1. MainContentView already flushed the correct state via the notification above // 2. By this point, SwiftUI may have torn down views and session.tabs could be stale/empty @@ -106,29 +104,28 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } } - + private func isMainWindow(_ window: NSWindow) -> Bool { // Main window has identifier containing "main" (from WindowGroup(id: "main")) // This excludes temporary windows like context menus, panels, popovers, etc. guard let identifier = window.identifier?.rawValue else { return false } return identifier.contains("main") } - + private func openWelcomeWindow() { // Check if welcome window already exists and is visible - for window in NSApp.windows { - if isWelcomeWindow(window) { - window.makeKeyAndOrderFront(nil) - return - } + for window in NSApp.windows where isWelcomeWindow(window) { + window.makeKeyAndOrderFront(nil) + return } - + // If no welcome window exists, we need to create one via SwiftUI's openWindow // Post a notification that SwiftUI can handle NotificationCenter.default.post(name: .openWelcomeWindow, object: nil) } - - @objc private func windowDidBecomeKey(_ notification: Notification) { + + @objc + private func windowDidBecomeKey(_ notification: Notification) { guard let window = notification.object as? NSWindow else { return } let windowId = ObjectIdentifier(window) @@ -144,52 +141,50 @@ class AppDelegate: NSObject, NSApplicationDelegate { configuredWindows.insert(windowId) } } - + private func configureWelcomeWindow() { // Find and configure the welcome window after a brief delay to ensure SwiftUI has created it DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in - for window in NSApp.windows { - if self?.isWelcomeWindow(window) == true { - self?.configureWelcomeWindowStyle(window) - } + for window in NSApp.windows where self?.isWelcomeWindow(window) == true { + self?.configureWelcomeWindowStyle(window) } } } - + private func isWelcomeWindow(_ window: NSWindow) -> Bool { // Check by window identifier or title - return window.identifier?.rawValue == "welcome" || - window.title.lowercased().contains("welcome") + window.identifier?.rawValue == "welcome" || + window.title.lowercased().contains("welcome") } - + private func configureWelcomeWindowStyle(_ window: NSWindow) { // Remove miniaturize (yellow) button functionality window.standardWindowButton(.miniaturizeButton)?.isHidden = true - - // Remove zoom (green) button functionality + + // Remove zoom (green) button functionality window.standardWindowButton(.zoomButton)?.isHidden = true - + // Remove these capabilities from the window's style mask // This prevents the actions even if buttons were visible window.styleMask.remove(.miniaturizable) - + // Prevent full screen window.collectionBehavior.remove(.fullScreenPrimary) window.collectionBehavior.insert(.fullScreenNone) - + // Keep the window non-resizable (already set via SwiftUI, but reinforce here) if !window.styleMask.contains(.resizable) == false { window.styleMask.remove(.resizable) } } - + private func isConnectionFormWindow(_ window: NSWindow) -> Bool { // Check by window identifier or title // WindowGroup uses "connection-form-X" format for identifiers - return window.identifier?.rawValue.contains("connection-form") == true || - window.title == "Connection" + window.identifier?.rawValue.contains("connection-form") == true || + window.title == "Connection" } - + private func configureConnectionFormWindowStyle(_ window: NSWindow) { // Remove miniaturize (yellow) button functionality window.standardWindowButton(.miniaturizeButton)?.isHidden = true diff --git a/TablePro/ContentView.swift b/TablePro/ContentView.swift index 0a1da55b..649f04a8 100644 --- a/TablePro/ContentView.swift +++ b/TablePro/ContentView.swift @@ -5,9 +5,12 @@ // Created by Ngo Quoc Dat on 16/12/25. // +import os import SwiftUI struct ContentView: View { + private static let logger = Logger(subsystem: "com.tablepro", category: "ContentView") + @StateObject private var dbManager = DatabaseManager.shared @State private var connections: [DatabaseConnection] = [] @State private var columnVisibility: NavigationSplitViewVisibility = .all @@ -21,18 +24,20 @@ struct ContentView: View { @State private var hasLoaded = false @State private var escapeKeyMonitor: Any? @State private var isInspectorPresented = false // Right sidebar (inspector) visibility - - @Environment(\.openWindow) private var openWindow - @Environment(\.dismissWindow) private var dismissWindow + + @Environment(\.openWindow) + private var openWindow + @Environment(\.dismissWindow) + private var dismissWindow @EnvironmentObject private var appState: AppState private let storage = ConnectionStorage.shared - + // Get current session from database manager private var currentSession: ConnectionSession? { dbManager.currentSession } - + // Get all sessions as array private var sessions: [ConnectionSession] { Array(dbManager.activeSessions.values) @@ -108,7 +113,7 @@ struct ContentView: View { columnVisibility = newSessionId == nil ? .detailOnly : .all } AppState.shared.isConnected = newSessionId != nil - + // When all sessions are closed, return to Welcome window if newSessionId == nil { openWindow(id: "welcome") @@ -117,12 +122,12 @@ struct ContentView: View { } } } - + // MARK: - View Components - + @ViewBuilder private var mainContent: some View { - if currentSession != nil { + if let currentSession = currentSession { NavigationSplitView(columnVisibility: $columnVisibility) { // MARK: - Sidebar (Left) - Table Browser VStack(spacing: 0) { @@ -147,11 +152,11 @@ struct ContentView: View { } ) } - + SidebarView( tables: sessionTablesBinding, selectedTables: sessionSelectedTablesBinding, - activeTableName: currentSession?.selectedTables.first?.name, + activeTableName: currentSession.selectedTables.first?.name, onTablePro: { _ in }, onShowAllTables: { showAllTablesMetadata() @@ -159,14 +164,14 @@ struct ContentView: View { pendingTruncates: sessionPendingTruncatesBinding, pendingDeletes: sessionPendingDeletesBinding, tableOperationOptions: sessionTableOperationOptionsBinding, - databaseType: currentSession?.connection.type ?? .sqlite + databaseType: currentSession.connection.type ) } .navigationSplitViewColumnWidth(min: 200, ideal: 250, max: 350) } detail: { // MARK: - Detail (Main workspace with optional right sidebar) MainContentView( - connection: currentSession!.connection, + connection: currentSession.connection, tables: sessionTablesBinding, selectedTables: sessionSelectedTablesBinding, pendingTruncates: sessionPendingTruncatesBinding, @@ -174,14 +179,14 @@ struct ContentView: View { tableOperationOptions: sessionTableOperationOptionsBinding, isInspectorPresented: $isInspectorPresented ) - .id(currentSession!.id) + .id(currentSession.id) } } else { // No active session yet - show loading while connecting VStack(spacing: 16) { ProgressView() .scaleEffect(1.5) - + Text("Connecting...") .font(.headline) .foregroundStyle(.secondary) @@ -190,12 +195,12 @@ struct ContentView: View { .toolbar(.hidden) } } - + // Removed: newConnectionSheet and editConnectionSheet helpers // Connection forms are now handled by the separate connection-form window // MARK: - Session State Bindings - + /// Generic helper to create bindings that update session state private func createSessionBinding( get: @escaping (ConnectionSession) -> T, @@ -219,7 +224,7 @@ struct ContentView: View { } ) } - + private var sessionTablesBinding: Binding<[TableInfo]> { createSessionBinding( get: { $0.tables }, @@ -227,7 +232,7 @@ struct ContentView: View { defaultValue: [] ) } - + private var sessionSelectedTablesBinding: Binding> { createSessionBinding( get: { $0.selectedTables }, @@ -235,7 +240,7 @@ struct ContentView: View { defaultValue: [] ) } - + private var sessionPendingTruncatesBinding: Binding> { createSessionBinding( get: { $0.pendingTruncates }, @@ -243,7 +248,7 @@ struct ContentView: View { defaultValue: [] ) } - + private var sessionPendingDeletesBinding: Binding> { createSessionBinding( get: { $0.pendingDeletes }, @@ -267,17 +272,17 @@ struct ContentView: View { do { try await dbManager.connectToSession(connection) } catch { - print("Failed to connect: \(error)") + Self.logger.error("Failed to connect: \(error.localizedDescription)") } } } - + private func handleCloseSession(_ sessionId: UUID) { Task { await dbManager.disconnectSession(sessionId) } } - + private func saveCurrentSessionState() { // State is automatically saved through bindings } @@ -308,9 +313,9 @@ struct ContentView: View { storage.deleteConnection(connection) storage.saveConnections(connections) } - + // MARK: - Escape Key Monitor - + private func setupEscapeKeyMonitor() { escapeKeyMonitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { event in // Escape key code is 53 @@ -335,12 +340,12 @@ struct ContentView: View { return event } } - + private func showAllTablesMetadata() { // Post notification for MainContentView to handle NotificationCenter.default.post(name: .showAllTables, object: nil) } - + private func removeEscapeKeyMonitor() { if let monitor = escapeKeyMonitor { NSEvent.removeMonitor(monitor) diff --git a/TablePro/Core/Autocomplete/CompletionEngine.swift b/TablePro/Core/Autocomplete/CompletionEngine.swift index cc6ed90a..0bca47aa 100644 --- a/TablePro/Core/Autocomplete/CompletionEngine.swift +++ b/TablePro/Core/Autocomplete/CompletionEngine.swift @@ -16,19 +16,18 @@ struct CompletionContext { /// Stateless completion engine that generates suggestions final class CompletionEngine { - // MARK: - Properties - + private let provider: SQLCompletionProvider - + // MARK: - Initialization - + init(schemaProvider: SQLSchemaProvider) { self.provider = SQLCompletionProvider(schemaProvider: schemaProvider) } - + // MARK: - Public API - + /// Get completions for the given text and cursor position /// This is a pure function - no side effects func getCompletions( @@ -40,17 +39,17 @@ final class CompletionEngine { text: text, cursorPosition: cursorPosition ) - + // Don't return empty results guard !items.isEmpty else { return nil } - + // Calculate replacement range let replaceStart = context.prefixRange.lowerBound let replaceEnd = context.prefixRange.upperBound let replacementRange = NSRange(location: replaceStart, length: replaceEnd - replaceStart) - + return CompletionContext( items: items, replacementRange: replacementRange, diff --git a/TablePro/Core/Autocomplete/SQLCompletionItem.swift b/TablePro/Core/Autocomplete/SQLCompletionItem.swift index 9a1c025e..ca9f49e9 100644 --- a/TablePro/Core/Autocomplete/SQLCompletionItem.swift +++ b/TablePro/Core/Autocomplete/SQLCompletionItem.swift @@ -5,12 +5,12 @@ // Model for SQL autocomplete suggestions // -import Foundation import AppKit +import Foundation /// Category of completion item @MainActor -enum SQLCompletionKind: String, CaseIterable, Sendable { +enum SQLCompletionKind: String, CaseIterable { case keyword // SELECT, FROM, WHERE, etc. case table // Database tables case view // Database views @@ -19,7 +19,7 @@ enum SQLCompletionKind: String, CaseIterable, Sendable { case schema // Database/schema names case alias // Table aliases case `operator` // Operators (=, <>, LIKE, etc.) - + /// SF Symbol for display var iconName: String { switch self { @@ -33,7 +33,7 @@ enum SQLCompletionKind: String, CaseIterable, Sendable { case .operator: return "equal.circle.fill" } } - + /// Color for the icon var iconColor: NSColor { switch self { @@ -47,7 +47,7 @@ enum SQLCompletionKind: String, CaseIterable, Sendable { case .operator: return .systemIndigo } } - + /// Base sort priority (lower = higher priority in same context) var basePriority: Int { switch self { @@ -74,7 +74,7 @@ struct SQLCompletionItem: Identifiable, Hashable { let documentation: String? // Tooltip/description var sortPriority: Int // For ranking (lower = higher priority) let filterText: String // Text used for matching - + init( label: String, kind: SQLCompletionKind, @@ -93,14 +93,14 @@ struct SQLCompletionItem: Identifiable, Hashable { self.sortPriority = sortPriority ?? kind.basePriority self.filterText = filterText ?? label.lowercased() } - + // MARK: - Hashable - + func hash(into hasher: inout Hasher) { hasher.combine(label) hasher.combine(kind) } - + static func == (lhs: SQLCompletionItem, rhs: SQLCompletionItem) -> Bool { lhs.label == rhs.label && lhs.kind == rhs.kind } @@ -118,7 +118,7 @@ extension SQLCompletionItem { documentation: documentation ) } - + /// Create a table completion item static func table(_ name: String, isView: Bool = false) -> SQLCompletionItem { SQLCompletionItem( @@ -128,7 +128,7 @@ extension SQLCompletionItem { detail: isView ? "View" : "Table" ) } - + /// Create a column completion item static func column(_ name: String, dataType: String?, tableName: String? = nil) -> SQLCompletionItem { SQLCompletionItem( @@ -139,7 +139,7 @@ extension SQLCompletionItem { documentation: tableName.map { "Column from \($0)" } ) } - + /// Create a function completion item static func function(_ name: String, signature: String? = nil, documentation: String? = nil) -> SQLCompletionItem { let insertText = signature != nil ? "\(name)(" : name @@ -151,7 +151,7 @@ extension SQLCompletionItem { documentation: documentation ) } - + /// Create an operator completion item static func `operator`(_ op: String, documentation: String? = nil) -> SQLCompletionItem { SQLCompletionItem( diff --git a/TablePro/Core/Autocomplete/SQLCompletionProvider.swift b/TablePro/Core/Autocomplete/SQLCompletionProvider.swift index 6b18e243..0dc2ed13 100644 --- a/TablePro/Core/Autocomplete/SQLCompletionProvider.swift +++ b/TablePro/Core/Autocomplete/SQLCompletionProvider.swift @@ -9,26 +9,25 @@ import Foundation /// Main provider for SQL autocomplete suggestions final class SQLCompletionProvider { - // MARK: - Properties - + private let contextAnalyzer = SQLContextAnalyzer() private let schemaProvider: SQLSchemaProvider - + /// Minimum prefix length to trigger suggestions private let minPrefixLength = 1 - + /// Maximum number of suggestions to return private let maxSuggestions = 20 - + // MARK: - Init - + init(schemaProvider: SQLSchemaProvider) { self.schemaProvider = schemaProvider } - + // MARK: - Public API - + /// Get completion suggestions for the current cursor position func getCompletions( text: String, @@ -36,35 +35,35 @@ final class SQLCompletionProvider { ) async -> (items: [SQLCompletionItem], context: SQLContext) { // Analyze context let context = contextAnalyzer.analyze(query: text, cursorPosition: cursorPosition) - + // Don't complete inside strings or comments if context.isInsideString || context.isInsideComment { return ([], context) } - + // Get candidates based on context var candidates = await getCandidates(for: context) - + // Filter by prefix if !context.prefix.isEmpty { candidates = filterByPrefix(candidates, prefix: context.prefix) } - + // Rank results candidates = rankResults(candidates, prefix: context.prefix, context: context) - + // Limit results let limited = Array(candidates.prefix(maxSuggestions)) - + return (limited, context) } - + // MARK: - Candidate Generation - + /// Get candidate completions based on context private func getCandidates(for context: SQLContext) async -> [SQLCompletionItem] { var items: [SQLCompletionItem] = [] - + // If we have a dot prefix, we're looking for columns of a specific table if let dotPrefix = context.dotPrefix { // Resolve the table name from alias or direct reference @@ -73,7 +72,7 @@ final class SQLCompletionProvider { } return items } - + // Add items based on clause type switch context.clauseType { case .from, .join, .into: @@ -84,67 +83,67 @@ final class SQLCompletionProvider { "LEFT OUTER JOIN", "RIGHT OUTER JOIN", "FULL OUTER JOIN", "CROSS JOIN", "JOIN", "ON", "WHERE", "ORDER BY", "GROUP BY", "LIMIT" ]) - + case .select: // Columns, functions, keywords (SELECT, DISTINCT, etc.) items += await schemaProvider.allColumnsInScope(for: context.tableReferences) items += SQLKeywords.functionItems() items += filterKeywords(["DISTINCT", "ALL", "AS", "FROM", "CASE", "WHEN"]) - + case .where_, .and, .on, .having: // Columns, operators, logical keywords items += await schemaProvider.allColumnsInScope(for: context.tableReferences) items += SQLKeywords.operatorItems() items += filterKeywords(["AND", "OR", "NOT", "IN", "LIKE", "BETWEEN", "IS", "NULL", "TRUE", "FALSE", "EXISTS"]) items += SQLKeywords.functionItems() - + case .groupBy, .orderBy: // Columns only items += await schemaProvider.allColumnsInScope(for: context.tableReferences) if context.clauseType == .orderBy { items += filterKeywords(["ASC", "DESC", "NULLS", "FIRST", "LAST"]) } - + case .set: // Columns for UPDATE SET clause if let firstTable = context.tableReferences.first { items = await schemaProvider.columnCompletionItems(for: firstTable.tableName) } - + case .insertColumns: // Columns for INSERT column list if let firstTable = context.tableReferences.first { items = await schemaProvider.columnCompletionItems(for: firstTable.tableName) } - + case .values: // Functions and keywords for VALUES items = SQLKeywords.functionItems() items += filterKeywords(["NULL", "DEFAULT", "TRUE", "FALSE"]) - + case .functionArg: // Inside function arguments - suggest columns and other functions items += await schemaProvider.allColumnsInScope(for: context.tableReferences) items += SQLKeywords.functionItems() items += filterKeywords(["NULL", "TRUE", "FALSE", "DISTINCT"]) - + case .caseExpression: // Inside CASE expression items += await schemaProvider.allColumnsInScope(for: context.tableReferences) items += filterKeywords(["WHEN", "THEN", "ELSE", "END", "AND", "OR", "IS", "NULL", "TRUE", "FALSE"]) items += SQLKeywords.operatorItems() items += SQLKeywords.functionItems() - + case .inList: // Inside IN (...) list - suggest values, subqueries, columns items += await schemaProvider.allColumnsInScope(for: context.tableReferences) items += filterKeywords(["SELECT", "NULL", "TRUE", "FALSE"]) items += SQLKeywords.functionItems() - + case .limit: // After LIMIT/OFFSET - typically just numbers, but could include variables items += filterKeywords(["OFFSET", "FETCH", "NEXT", "ROWS", "ONLY"]) - + case .alterTable: // After ALTER TABLE tablename - suggest DDL operations items = filterKeywords([ @@ -152,14 +151,14 @@ final class SQLCompletionProvider { "COLUMN", "INDEX", "PRIMARY", "FOREIGN", "KEY", "CONSTRAINT", "ENGINE", "CHARSET", "COLLATE" ]) - + case .alterTableColumn: // After ALTER TABLE tablename DROP/MODIFY/CHANGE COLUMN - suggest column names if let firstTable = context.tableReferences.first { items = await schemaProvider.columnCompletionItems(for: firstTable.tableName) } items += filterKeywords(["COLUMN", "FIRST", "AFTER"]) - + case .createTable: // Inside CREATE TABLE (...) - suggest constraints and data types items = filterKeywords([ @@ -168,7 +167,7 @@ final class SQLCompletionProvider { "CHECK", "CONSTRAINT", "INDEX" ]) items += dataTypeKeywords() - + case .columnDef: // Typing column data type (after ADD COLUMN name) items = dataTypeKeywords() @@ -177,16 +176,16 @@ final class SQLCompletionProvider { "PRIMARY", "KEY", "UNIQUE", "REFERENCES", "CHECK", "UNSIGNED", "SIGNED", "FIRST", "AFTER" ]) - + case .unknown: // Start of query - suggest statement keywords and tables items = filterKeywords(["SELECT", "INSERT", "UPDATE", "DELETE", "CREATE", "ALTER", "DROP", "SHOW", "DESCRIBE", "EXPLAIN", "WITH", "TRUNCATE"]) items += await schemaProvider.tableCompletionItems() } - + return items } - + /// SQL data type keywords private func dataTypeKeywords() -> [SQLCompletionItem] { filterKeywords([ @@ -203,78 +202,78 @@ final class SQLCompletionProvider { "UUID", "BINARY", "VARBINARY", "ENUM", "SET" ]) } - + /// Filter to specific keywords private func filterKeywords(_ keywords: [String]) -> [SQLCompletionItem] { keywords.map { SQLCompletionItem.keyword($0) } } - + // MARK: - Filtering - + /// Filter candidates by prefix (case-insensitive) with fuzzy matching support private func filterByPrefix(_ items: [SQLCompletionItem], prefix: String) -> [SQLCompletionItem] { guard !prefix.isEmpty else { return items } - + let lowerPrefix = prefix.lowercased() - + return items.filter { item in // Exact prefix match if item.filterText.hasPrefix(lowerPrefix) { return true } - + // Contains match if item.filterText.contains(lowerPrefix) { return true } - + // Fuzzy match: check if all characters appear in order return fuzzyMatch(pattern: lowerPrefix, target: item.filterText) } } - + /// Fuzzy matching: checks if all pattern characters appear in target in order private func fuzzyMatch(pattern: String, target: String) -> Bool { var patternIndex = pattern.startIndex var targetIndex = target.startIndex - + while patternIndex < pattern.endIndex && targetIndex < target.endIndex { if pattern[patternIndex] == target[targetIndex] { patternIndex = pattern.index(after: patternIndex) } targetIndex = target.index(after: targetIndex) } - + return patternIndex == pattern.endIndex } - + // MARK: - Ranking - + /// Rank results by relevance private func rankResults(_ items: [SQLCompletionItem], prefix: String, context: SQLContext) -> [SQLCompletionItem] { let lowerPrefix = prefix.lowercased() - + return items.sorted { a, b in let aScore = calculateScore(for: a, prefix: lowerPrefix, context: context) let bScore = calculateScore(for: b, prefix: lowerPrefix, context: context) return aScore < bScore // Lower score = higher priority } } - + /// Calculate ranking score for an item (lower = better) private func calculateScore(for item: SQLCompletionItem, prefix: String, context: SQLContext) -> Int { var score = item.sortPriority - + // Exact prefix match bonus if item.filterText.hasPrefix(prefix) { score -= 500 } - + // Exact match bonus if item.filterText == prefix { - score -= 1000 + score -= 1_000 } - + // Context-appropriate bonuses switch context.clauseType { case .from, .join, .into: @@ -292,10 +291,10 @@ final class SQLCompletionProvider { default: break } - + // Shorter names slightly preferred score += item.label.count - + return score } } diff --git a/TablePro/Core/Autocomplete/SQLContextAnalyzer.swift b/TablePro/Core/Autocomplete/SQLContextAnalyzer.swift index abda8f80..824c1fd1 100644 --- a/TablePro/Core/Autocomplete/SQLContextAnalyzer.swift +++ b/TablePro/Core/Autocomplete/SQLContextAnalyzer.swift @@ -37,7 +37,7 @@ enum SQLClauseType { struct TableReference: Equatable, Sendable { let tableName: String let alias: String? - + /// Returns the identifier that should be used to reference this table var identifier: String { alias ?? tableName @@ -53,13 +53,13 @@ struct SQLContext { let tableReferences: [TableReference] // All tables in scope let isInsideString: Bool // Inside a string literal let isInsideComment: Bool // Inside a comment - + // Enhanced context for smarter completions let cteNames: [String] // Common Table Expression names in scope let nestingLevel: Int // Subquery nesting level (0 = main query) let currentFunction: String? // If inside function args, the function name let isAfterComma: Bool // True if immediately after a comma - + init( clauseType: SQLClauseType, prefix: String, @@ -89,9 +89,8 @@ struct SQLContext { /// Analyzes SQL query to determine completion context final class SQLContextAnalyzer { - // MARK: - Cached Regex Patterns (Compiled Once at Class Load) - + /// Pre-compiled clause detection patterns for performance /// ORDER MATTERS: More specific patterns must come before general ones private static let clauseRegexes: [(regex: NSRegularExpression, clause: SQLClauseType)] = { @@ -134,7 +133,7 @@ final class SQLContextAnalyzer { return (regex, clause) } }() - + /// Pre-compiled regex for removing strings and comments (force-unwrap safe: simple patterns) private static let singleQuoteStringRegex: NSRegularExpression = { if let regex = try? NSRegularExpression(pattern: "'[^']*'") { @@ -144,7 +143,7 @@ final class SQLContextAnalyzer { // Fallback to a regex that matches nothing return try! NSRegularExpression(pattern: "(?!)") }() - + private static let doubleQuoteStringRegex: NSRegularExpression = { if let regex = try? NSRegularExpression(pattern: "\"[^\"]*\"") { return regex @@ -153,7 +152,7 @@ final class SQLContextAnalyzer { // Fallback to a regex that matches nothing return try! NSRegularExpression(pattern: "(?!)") }() - + private static let blockCommentRegex: NSRegularExpression = { if let regex = try? NSRegularExpression(pattern: "/\\*[\\s\\S]*?\\*/") { return regex @@ -162,7 +161,7 @@ final class SQLContextAnalyzer { // Fallback to a regex that matches nothing return try! NSRegularExpression(pattern: "(?!)") }() - + private static let lineCommentRegex: NSRegularExpression = { if let regex = try? NSRegularExpression(pattern: "--[^\n]*") { return regex @@ -171,19 +170,19 @@ final class SQLContextAnalyzer { // Fallback to a regex that matches nothing return try! NSRegularExpression(pattern: "(?!)") }() - + // MARK: - Main Analysis - + /// Analyze the query at the given cursor position func analyze(query: String, cursorPosition: Int) -> SQLContext { let safePosition = min(cursorPosition, query.count) - + // Extract the current statement for multi-statement queries let (currentStatement, statementOffset) = extractCurrentStatement(from: query, cursorPosition: safePosition) let adjustedPosition = safePosition - statementOffset - + let textBeforeCursor = String(currentStatement.prefix(max(0, adjustedPosition))) - + // Check if inside string or comment if isInsideString(textBeforeCursor) { return SQLContext( @@ -196,7 +195,7 @@ final class SQLContextAnalyzer { isInsideComment: false ) } - + if isInsideComment(textBeforeCursor) { return SQLContext( clauseType: .unknown, @@ -208,16 +207,16 @@ final class SQLContextAnalyzer { isInsideComment: true ) } - + // Extract prefix and dot prefix let (prefix, prefixStart, dotPrefix) = extractPrefix(from: textBeforeCursor) - + // Find all table references in the current statement var tableReferences = extractTableReferences(from: currentStatement) - + // Extract CTEs from the current statement let cteNames = extractCTENames(from: currentStatement) - + // Add CTE names as table references for cteName in cteNames { let cteRef = TableReference(tableName: cteName, alias: nil) @@ -225,7 +224,7 @@ final class SQLContextAnalyzer { tableReferences.append(cteRef) } } - + // Extract ALTER TABLE table name and add to references if let alterTableName = extractAlterTableName(from: currentStatement) { let alterRef = TableReference(tableName: alterTableName, alias: nil) @@ -233,19 +232,19 @@ final class SQLContextAnalyzer { tableReferences.append(alterRef) } } - + // Calculate nesting level (subquery depth) let nestingLevel = calculateNestingLevel(in: textBeforeCursor) - + // Detect function context let currentFunction = detectFunctionContext(in: textBeforeCursor) - + // Check if immediately after comma let isAfterComma = checkIfAfterComma(textBeforeCursor) - + // Determine clause type let clauseType = determineClauseType(textBeforeCursor: textBeforeCursor, dotPrefix: dotPrefix, currentFunction: currentFunction) - + return SQLContext( clauseType: clauseType, prefix: prefix, @@ -260,9 +259,9 @@ final class SQLContextAnalyzer { isAfterComma: isAfterComma ) } - + // MARK: - Multi-Statement Support - + /// Extract the current SQL statement containing the cursor private func extractCurrentStatement(from query: String, cursorPosition: Int) -> (statement: String, offset: Int) { // Find statement boundaries (semicolons not inside strings/comments) @@ -271,13 +270,13 @@ final class SQLContextAnalyzer { var inString = false var inComment = false var prevChar: Character = "\0" - + for (index, char) in query.enumerated() { // Track string state if char == "'" && prevChar != "\\" && !inComment { inString.toggle() } - + // Track comment state (simple line comment detection) if char == "-" && prevChar == "-" && !inString { inComment = true @@ -285,7 +284,7 @@ final class SQLContextAnalyzer { if char == "\n" && inComment { inComment = false } - + // Found statement boundary if char == ";" && !inString && !inComment { let startIndex = query.index(query.startIndex, offsetBy: currentStart) @@ -294,40 +293,40 @@ final class SQLContextAnalyzer { statements.append((range: currentStart..<(index + 1), text: statementText)) currentStart = index + 1 } - + prevChar = char } - + // Add the last statement (may not end with ;) if currentStart < query.count { let startIndex = query.index(query.startIndex, offsetBy: currentStart) let statementText = String(query[startIndex...]) statements.append((range: currentStart.. [String] { var cteNames: [String] = [] - + // Pattern: WITH name AS (...), name2 AS (...) // Handle both simple and recursive CTEs let pattern = "(?i)\\bWITH\\s+(?:RECURSIVE\\s+)?([\\w]+)\\s+AS\\s*\\(" let commaPattern = "(?i),\\s*([\\w]+)\\s+AS\\s*\\(" - + // Find first CTE if let regex = try? NSRegularExpression(pattern: pattern) { let range = NSRange(query.startIndex..., in: query) @@ -336,7 +335,7 @@ final class SQLContextAnalyzer { cteNames.append(String(query[nameRange])) } } - + // Find additional CTEs (comma-separated) if let regex = try? NSRegularExpression(pattern: commaPattern) { let range = NSRange(query.startIndex..., in: query) @@ -347,23 +346,23 @@ final class SQLContextAnalyzer { } } } - + return cteNames } - + // MARK: - Subquery Support - + /// Calculate the nesting level (subquery depth) at cursor position private func calculateNestingLevel(in textBeforeCursor: String) -> Int { var level = 0 var inString = false var prevChar: Character = "\0" - + for char in textBeforeCursor { if char == "'" && prevChar != "\\" { inString.toggle() } - + if !inString { if char == "(" { level += 1 @@ -371,28 +370,28 @@ final class SQLContextAnalyzer { level = max(0, level - 1) } } - + prevChar = char } - + return level } - + // MARK: - Function Context - + /// Detect if cursor is inside a function call and return the function name private func detectFunctionContext(in textBeforeCursor: String) -> String? { var parenStack: [(position: Int, precedingWord: String?)] = [] var inString = false var prevChar: Character = "\0" var currentWord = "" - var lastWord: String? = nil - + var lastWord: String? + for (index, char) in textBeforeCursor.enumerated() { if char == "'" && prevChar != "\\" { inString.toggle() } - + if !inString { if char.isLetter || char.isNumber || char == "_" { currentWord.append(char) @@ -401,7 +400,7 @@ final class SQLContextAnalyzer { lastWord = currentWord currentWord = "" } - + if char == "(" { parenStack.append((position: index, precedingWord: lastWord)) lastWord = nil @@ -412,46 +411,46 @@ final class SQLContextAnalyzer { } } } - + prevChar = char } - + // If we're inside parentheses, check if it's a function call if let lastParen = parenStack.last, let funcName = lastParen.precedingWord { // Check if it looks like a function (not a subquery) let upperFunc = funcName.uppercased() - let sqlFunctions = ["COUNT", "SUM", "AVG", "MIN", "MAX", "COALESCE", "IFNULL", - "CONCAT", "SUBSTRING", "UPPER", "LOWER", "NOW", "DATE", - "CAST", "CONVERT", "ROUND", "ABS", "LENGTH", "TRIM", - "GROUP_CONCAT", "DATE_FORMAT", "YEAR", "MONTH", "DAY"] - + let sqlFunctions = ["COUNT", "SUM", "AVG", "MIN", "MAX", "COALESCE", "IFNULL", + "CONCAT", "SUBSTRING", "UPPER", "LOWER", "NOW", "DATE", + "CAST", "CONVERT", "ROUND", "ABS", "LENGTH", "TRIM", + "GROUP_CONCAT", "DATE_FORMAT", "YEAR", "MONTH", "DAY"] + // Either known function or doesn't look like SELECT/subquery keywords - if sqlFunctions.contains(upperFunc) || - (!["SELECT", "FROM", "WHERE", "IN", "EXISTS", "NOT"].contains(upperFunc)) { + if sqlFunctions.contains(upperFunc) || + (!["SELECT", "FROM", "WHERE", "IN", "EXISTS", "NOT"].contains(upperFunc)) { return funcName } } - + return nil } - + // MARK: - Comma Detection - + /// Check if the cursor is immediately after a comma (for multi-column contexts) private func checkIfAfterComma(_ text: String) -> Bool { let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) return trimmed.hasSuffix(",") } - + // MARK: - Helper Methods - + /// Check if cursor is inside a string literal private func isInsideString(_ text: String) -> Bool { var inSingleQuote = false var inDoubleQuote = false var prevChar: Character = "\0" - + for char in text { if char == "'" && prevChar != "\\" && !inDoubleQuote { inSingleQuote.toggle() @@ -460,10 +459,10 @@ final class SQLContextAnalyzer { } prevChar = char } - + return inSingleQuote || inDoubleQuote } - + /// Check if cursor is inside a comment private func isInsideComment(_ text: String) -> Bool { // Check for line comment @@ -474,7 +473,7 @@ final class SQLContextAnalyzer { let dashIndex = currentLine.range(of: "--")!.lowerBound // Check if -- is before current position in line if currentLine[.. closeCount } - + /// Extract the current word prefix and any dot prefix (table.column) private func extractPrefix(from text: String) -> (prefix: String, start: Int, dotPrefix: String?) { guard !text.isEmpty else { return ("", 0, nil) } - + // Find start of current identifier var prefixStart = text.count var foundDot = false var dotPosition = -1 - + // Scan backwards to find start of identifier let chars = Array(text) for i in stride(from: chars.count - 1, through: 0, by: -1) { let char = chars[i] - + if char == "." && !foundDot { foundDot = true dotPosition = i continue } - + if char.isLetter || char.isNumber || char == "_" || char == "`" { prefixStart = i } else if foundDot && (char.isLetter || char.isNumber || char == "_" || char == "`") { @@ -525,15 +524,15 @@ final class SQLContextAnalyzer { break } } - + let prefix: String let dotPrefix: String? - + if foundDot && dotPosition > prefixStart { // Has dot prefix like "users.na" or "u.na" let beforeDot = String(text[text.index(text.startIndex, offsetBy: prefixStart).. [TableReference] { var references: [TableReference] = [] - + // SQL keywords that should NOT be treated as table names let sqlKeywords: Set = [ "LEFT", "RIGHT", "INNER", "OUTER", "FULL", "CROSS", "NATURAL", "JOIN", "ON", "AND", "OR", "WHERE", "SELECT", "FROM", "AS" ] - + // Pattern for FROM/JOIN table references with optional alias // Updated to handle: LEFT JOIN table, INNER JOIN table, etc. let patterns = [ @@ -565,23 +564,23 @@ final class SQLContextAnalyzer { // UPDATE table [AS] alias "(?i)\\bUPDATE\\s+[`\"']?([\\w]+)[`\"']?(?:\\s+(?:AS\\s+)?[`\"']?([\\w]+)[`\"']?)?" ] - + for pattern in patterns { guard let regex = try? NSRegularExpression(pattern: pattern) else { continue } - + let range = NSRange(query.startIndex..., in: query) regex.enumerateMatches(in: query, range: range) { match, _, _ in guard let match = match else { return } - + // Group 1: table name if let tableRange = Range(match.range(at: 1), in: query) { let tableName = String(query[tableRange]) - + // Skip SQL keywords guard !sqlKeywords.contains(tableName.uppercased()) else { return } - + // Group 2: alias (optional) - var alias: String? = nil + var alias: String? if match.numberOfRanges > 2, let aliasRange = Range(match.range(at: 2), in: query) { let aliasCandidate = String(query[aliasRange]) // Skip SQL keywords as aliases @@ -589,7 +588,7 @@ final class SQLContextAnalyzer { alias = aliasCandidate } } - + // Don't add duplicates let ref = TableReference(tableName: tableName, alias: alias) if !references.contains(ref) { @@ -598,47 +597,47 @@ final class SQLContextAnalyzer { } } } - + return references } - + /// Pre-compiled regex for extracting table name from ALTER TABLE statements private static let alterTableRegex: NSRegularExpression? = { // Pattern: ALTER TABLE tablename (supports optional quoting and special characters) let pattern = "(?i)\\bALTER\\s+TABLE\\s+[`\"']?([^`\"']+)[`\"']?" return try? NSRegularExpression(pattern: pattern) }() - + /// Extract table name from ALTER TABLE statement private func extractAlterTableName(from query: String) -> String? { guard let regex = Self.alterTableRegex else { return nil } - + let range = NSRange(query.startIndex..., in: query) if let match = regex.firstMatch(in: query, range: range), let tableRange = Range(match.range(at: 1), in: query) { return String(query[tableRange]) } - + return nil } - + /// Determine the clause type based on text before cursor private func determineClauseType(textBeforeCursor: String, dotPrefix: String?, currentFunction: String? = nil) -> SQLClauseType { // If we have a dot prefix, we're looking for columns if dotPrefix != nil { return .select // Column context } - + // If inside a function, return function arg context if currentFunction != nil { return .functionArg } - + let upper = textBeforeCursor.uppercased() - + // Remove string literals and comments for analysis let cleaned = removeStringsAndComments(from: upper) - + // Use pre-compiled regex patterns for performance let range = NSRange(cleaned.startIndex..., in: cleaned) for (regex, clause) in Self.clauseRegexes { @@ -646,39 +645,39 @@ final class SQLContextAnalyzer { return clause } } - + return .unknown } - + /// Remove string literals and comments for cleaner analysis private func removeStringsAndComments(from text: String) -> String { var result = text - + // Use pre-compiled regex patterns for performance result = Self.singleQuoteStringRegex.stringByReplacingMatches( in: result, range: NSRange(result.startIndex..., in: result), withTemplate: "''" ) - + result = Self.doubleQuoteStringRegex.stringByReplacingMatches( in: result, range: NSRange(result.startIndex..., in: result), withTemplate: "\"\"" ) - + result = Self.blockCommentRegex.stringByReplacingMatches( in: result, range: NSRange(result.startIndex..., in: result), withTemplate: "" ) - + result = Self.lineCommentRegex.stringByReplacingMatches( in: result, range: NSRange(result.startIndex..., in: result), withTemplate: "" ) - + return result } } diff --git a/TablePro/Core/Autocomplete/SQLKeywords.swift b/TablePro/Core/Autocomplete/SQLKeywords.swift index 2b1517eb..54569def 100644 --- a/TablePro/Core/Autocomplete/SQLKeywords.swift +++ b/TablePro/Core/Autocomplete/SQLKeywords.swift @@ -9,44 +9,43 @@ import Foundation /// Static catalogue of SQL language elements for autocomplete enum SQLKeywords { - // MARK: - Keywords - + /// Primary SQL keywords static let keywords: [String] = [ // DQL "SELECT", "FROM", "WHERE", "AND", "OR", "NOT", "AS", "DISTINCT", "ALL", "TOP", - + // Joins "JOIN", "INNER", "LEFT", "RIGHT", "FULL", "OUTER", "CROSS", "ON", "USING", - + // Ordering & Grouping "ORDER", "BY", "ASC", "DESC", "NULLS", "FIRST", "LAST", "GROUP", "HAVING", - + // Limiting "LIMIT", "OFFSET", "FETCH", "NEXT", "ROWS", "ONLY", - + // Set operations "UNION", "INTERSECT", "EXCEPT", "MINUS", - + // Subqueries "IN", "EXISTS", "ANY", "SOME", - + // DML "INSERT", "INTO", "VALUES", "DEFAULT", "UPDATE", "SET", "DELETE", "TRUNCATE", - + // DDL "CREATE", "ALTER", "DROP", "RENAME", "MODIFY", "TABLE", "VIEW", "INDEX", "DATABASE", "SCHEMA", "COLUMN", "CONSTRAINT", "PRIMARY", "FOREIGN", "KEY", "REFERENCES", "UNIQUE", "CHECK", "DEFAULT", "AUTO_INCREMENT", "AUTOINCREMENT", "SERIAL", - + // Data types (common) "INT", "INTEGER", "BIGINT", "SMALLINT", "TINYINT", "DECIMAL", "NUMERIC", "FLOAT", "DOUBLE", "REAL", @@ -55,26 +54,26 @@ enum SQLKeywords { "BOOLEAN", "BOOL", "BIT", "JSON", "JSONB", "XML", "UUID", "BINARY", "VARBINARY", - + // Conditionals "CASE", "WHEN", "THEN", "ELSE", "END", "IF", "IFNULL", "NULLIF", "COALESCE", - + // Comparison "BETWEEN", "LIKE", "ILIKE", "SIMILAR", "REGEXP", "RLIKE", "IS", "NULL", "TRUE", "FALSE", "UNKNOWN", - + // Transactions "BEGIN", "COMMIT", "ROLLBACK", "SAVEPOINT", "TRANSACTION", - + // Other "WITH", "RECURSIVE", "TEMPORARY", "TEMP", "IF", "CASCADE", "RESTRICT", "NO", "ACTION", "EXPLAIN", "ANALYZE", "DESCRIBE", "SHOW" ] - + // MARK: - Functions - + /// Aggregate functions static let aggregateFunctions: [(name: String, signature: String, doc: String)] = [ ("COUNT", "COUNT(expr)", "Count rows or non-null values"), @@ -86,7 +85,7 @@ enum SQLKeywords { ("STRING_AGG", "STRING_AGG(expr, sep)", "PostgreSQL string aggregation"), ("ARRAY_AGG", "ARRAY_AGG(expr)", "Aggregate into array"), ] - + /// Date/Time functions static let dateTimeFunctions: [(name: String, signature: String, doc: String)] = [ ("NOW", "NOW()", "Current date and time"), @@ -121,7 +120,7 @@ enum SQLKeywords { ("UNIX_TIMESTAMP", "UNIX_TIMESTAMP(date)", "Unix timestamp"), ("FROM_UNIXTIME", "FROM_UNIXTIME(ts)", "Date from Unix timestamp"), ] - + /// String functions static let stringFunctions: [(name: String, signature: String, doc: String)] = [ ("CONCAT", "CONCAT(str1, str2, ...)", "Concatenate strings"), @@ -153,7 +152,7 @@ enum SQLKeywords { ("SHA1", "SHA1(str)", "SHA1 hash"), ("SHA2", "SHA2(str, bits)", "SHA2 hash"), ] - + /// Numeric functions static let numericFunctions: [(name: String, signature: String, doc: String)] = [ ("ABS", "ABS(n)", "Absolute value"), @@ -175,7 +174,7 @@ enum SQLKeywords { ("GREATEST", "GREATEST(v1, v2, ...)", "Greatest value"), ("LEAST", "LEAST(v1, v2, ...)", "Least value"), ] - + /// Null handling functions static let nullFunctions: [(name: String, signature: String, doc: String)] = [ ("COALESCE", "COALESCE(v1, v2, ...)", "First non-null value"), @@ -184,14 +183,14 @@ enum SQLKeywords { ("NVL", "NVL(expr, alt)", "Return alt if expr is null (Oracle)"), ("ISNULL", "ISNULL(expr)", "Check if null"), ] - + /// Type conversion functions static let conversionFunctions: [(name: String, signature: String, doc: String)] = [ ("CAST", "CAST(expr AS type)", "Convert to type"), ("CONVERT", "CONVERT(expr, type)", "Convert to type"), ("BINARY", "BINARY(str)", "Convert to binary string"), ] - + /// Window functions static let windowFunctions: [(name: String, signature: String, doc: String)] = [ ("ROW_NUMBER", "ROW_NUMBER() OVER(...)", "Sequential row number"), @@ -206,7 +205,7 @@ enum SQLKeywords { ("PERCENT_RANK", "PERCENT_RANK() OVER(...)", "Relative rank (0-1)"), ("CUME_DIST", "CUME_DIST() OVER(...)", "Cumulative distribution"), ] - + /// JSON functions (MySQL/PostgreSQL) static let jsonFunctions: [(name: String, signature: String, doc: String)] = [ ("JSON_EXTRACT", "JSON_EXTRACT(json, path)", "Extract value from JSON"), @@ -223,16 +222,16 @@ enum SQLKeywords { ("JSON_REMOVE", "JSON_REMOVE(json, path)", "Remove from JSON"), ("JSON_UNQUOTE", "JSON_UNQUOTE(json)", "Unquote JSON string"), ] - + /// All functions combined static var allFunctions: [(name: String, signature: String, doc: String)] { aggregateFunctions + dateTimeFunctions + stringFunctions + - numericFunctions + nullFunctions + conversionFunctions + - windowFunctions + jsonFunctions + numericFunctions + nullFunctions + conversionFunctions + + windowFunctions + jsonFunctions } - + // MARK: - Operators - + /// Comparison operators static let operators: [(symbol: String, doc: String)] = [ ("=", "Equal to"), @@ -244,21 +243,21 @@ enum SQLKeywords { (">=", "Greater than or equal"), ("<=>", "Null-safe equal (MySQL)"), ] - + // MARK: - Completion Items - + /// Get all keyword completion items static func keywordItems() -> [SQLCompletionItem] { keywords.map { SQLCompletionItem.keyword($0) } } - + /// Get all function completion items static func functionItems() -> [SQLCompletionItem] { allFunctions.map { fn in SQLCompletionItem.function(fn.name, signature: fn.signature, documentation: fn.doc) } } - + /// Get all operator completion items static func operatorItems() -> [SQLCompletionItem] { operators.map { op in diff --git a/TablePro/Core/Autocomplete/SQLSchemaProvider.swift b/TablePro/Core/Autocomplete/SQLSchemaProvider.swift index 7d43077f..5d6caaa9 100644 --- a/TablePro/Core/Autocomplete/SQLSchemaProvider.swift +++ b/TablePro/Core/Autocomplete/SQLSchemaProvider.swift @@ -9,7 +9,6 @@ import Foundation /// Provides cached database schema information for autocomplete actor SQLSchemaProvider { - // MARK: - Properties private var tables: [TableInfo] = [] diff --git a/TablePro/Core/ChangeTracking/DataChangeManager.swift b/TablePro/Core/ChangeTracking/DataChangeManager.swift index 91133395..88582a27 100644 --- a/TablePro/Core/ChangeTracking/DataChangeManager.swift +++ b/TablePro/Core/ChangeTracking/DataChangeManager.swift @@ -509,20 +509,20 @@ final class DataChangeManager: ObservableObject { deletedRowIndices: deletedRowIndices, insertedRowIndices: insertedRowIndices ) - + // Count expected UPDATE statements (DELETEs can work without PK using full row match) let expectedUpdates = changes.filter { $0.type == .update }.count let actualUpdates = statements.filter { $0.hasPrefix("UPDATE") }.count - + // Check if any UPDATE statements were skipped due to missing primary key // Note: DELETEs are allowed without PK (they match all columns) if expectedUpdates > 0 && actualUpdates < expectedUpdates { throw DatabaseError.queryFailed( "Cannot save UPDATE changes to table '\(tableName)' without a primary key. " + - "Please add a primary key to this table or use raw SQL queries instead." + "Please add a primary key to this table or use raw SQL queries instead." ) } - + return statements } diff --git a/TablePro/Core/ChangeTracking/DataChangeModels.swift b/TablePro/Core/ChangeTracking/DataChangeModels.swift index 5bda808f..d17abe0d 100644 --- a/TablePro/Core/ChangeTracking/DataChangeModels.swift +++ b/TablePro/Core/ChangeTracking/DataChangeModels.swift @@ -65,12 +65,12 @@ struct RowChange: Identifiable, Equatable { /// Represents an action that can be undone enum UndoAction { case cellEdit( - rowIndex: Int, - columnIndex: Int, - columnName: String, - previousValue: String?, - newValue: String? - ) + rowIndex: Int, + columnIndex: Int, + columnName: String, + previousValue: String?, + newValue: String? + ) case rowInsertion(rowIndex: Int) case rowDeletion(rowIndex: Int, originalRow: [String?]) /// Batch deletion of multiple rows (for undo as a single action) diff --git a/TablePro/Core/ChangeTracking/SQLStatementGenerator.swift b/TablePro/Core/ChangeTracking/SQLStatementGenerator.swift index 733ebd37..75655be8 100644 --- a/TablePro/Core/ChangeTracking/SQLStatementGenerator.swift +++ b/TablePro/Core/ChangeTracking/SQLStatementGenerator.swift @@ -272,9 +272,9 @@ struct SQLStatementGenerator { print("⚠️ WARNING: Skipping UPDATE for table '\(tableName)' - no primary key defined") return nil } - + // Try to get PK value from originalRow first - var pkValue: String? = nil + var pkValue: String? if let originalRow = change.originalRow, pkColumnIndex < originalRow.count { pkValue = originalRow[pkColumnIndex].map { "'\(escapeSQLString($0))'" } } @@ -282,19 +282,19 @@ struct SQLStatementGenerator { else if let pkChange = change.cellChanges.first(where: { $0.columnName == pkColumn }) { pkValue = pkChange.oldValue.map { "'\(escapeSQLString($0))'" } } - + // CRITICAL: Require valid PK value - do NOT fall back to WHERE 1=1 guard let pkValue = pkValue else { print("⚠️ WARNING: Skipping UPDATE for table '\(tableName)' - cannot determine primary key value for row") return nil } - + let whereClause = "\(databaseType.quoteIdentifier(pkColumn)) = \(pkValue)" - + // Add LIMIT 1 for MySQL/MariaDB to ensure only one row is updated (TablePlus-style safety) // PostgreSQL doesn't support LIMIT in UPDATE, but the PK constraint ensures single row let limitClause = (databaseType == .mysql || databaseType == .mariadb) ? " LIMIT 1" : "" - + return "UPDATE \(databaseType.quoteIdentifier(tableName)) SET \(setClauses) WHERE \(whereClause)\(limitClause)" } @@ -304,64 +304,63 @@ struct SQLStatementGenerator { /// Example: DELETE FROM table WHERE id = 1 OR id = 2 OR id = 3 private func generateBatchDeleteSQL(for changes: [RowChange]) -> String? { guard !changes.isEmpty else { return nil } - + // If we have a primary key, use it for efficient deletion if let pkColumn = primaryKeyColumn, let pkIndex = columns.firstIndex(of: pkColumn) { - // Build OR conditions for all rows using PK var conditions: [String] = [] - + for change in changes { guard let originalRow = change.originalRow, pkIndex < originalRow.count else { continue } - + let pkValue = originalRow[pkIndex].map { "'\(escapeSQLString($0))'" } ?? "NULL" conditions.append("\(databaseType.quoteIdentifier(pkColumn)) = \(pkValue)") } - + guard !conditions.isEmpty else { return nil } - + // Combine all conditions with OR let whereClause = conditions.joined(separator: " OR ") return "DELETE FROM \(databaseType.quoteIdentifier(tableName)) WHERE \(whereClause)" } - + // Fallback: No primary key - generate individual DELETE statements matching all columns // This is safe but requires exact row matching return nil // Return nil to trigger individual DELETE generation } - + /// Generate individual DELETE statement for a single row (used when no PK or as fallback) /// Matches all column values to ensure we delete the exact row private func generateDeleteSQL(for change: RowChange) -> String? { guard let originalRow = change.originalRow else { return nil } - + // Build WHERE clause matching ALL columns to uniquely identify the row var conditions: [String] = [] - + for (index, columnName) in columns.enumerated() { guard index < originalRow.count else { continue } - + let value = originalRow[index] let quotedColumn = databaseType.quoteIdentifier(columnName) - + if let value = value { conditions.append("\(quotedColumn) = '\(escapeSQLString(value))'") } else { conditions.append("\(quotedColumn) IS NULL") } } - + guard !conditions.isEmpty else { return nil } - + let whereClause = conditions.joined(separator: " AND ") - + // Add LIMIT 1 for MySQL/MariaDB to be extra safe let limitClause = (databaseType == .mysql || databaseType == .mariadb) ? " LIMIT 1" : "" - + return "DELETE FROM \(databaseType.quoteIdentifier(tableName)) WHERE \(whereClause)\(limitClause)" } diff --git a/TablePro/Core/Database/DatabaseDriver.swift b/TablePro/Core/Database/DatabaseDriver.swift index 99f0c377..6beb3807 100644 --- a/TablePro/Core/Database/DatabaseDriver.swift +++ b/TablePro/Core/Database/DatabaseDriver.swift @@ -9,21 +9,42 @@ import Foundation /// Protocol defining database driver operations protocol DatabaseDriver: AnyObject { + // MARK: - Properties + /// The connection configuration var connection: DatabaseConnection { get } /// Current connection status var status: ConnectionStatus { get } + /// Server version string (e.g., "8.0.35" for MySQL) + /// Optional - not all drivers may implement this + var serverVersion: String? { get } + + // MARK: - Connection Management + /// Connect to the database func connect() async throws /// Disconnect from the database func disconnect() + /// Test the connection (connect and immediately disconnect) + func testConnection() async throws -> Bool + + // MARK: - Query Execution + /// Execute a SQL query and return results func execute(query: String) async throws -> QueryResult + /// Fetch total row count for a query (wraps with COUNT(*)) + func fetchRowCount(query: String) async throws -> Int + + /// Fetch rows with LIMIT/OFFSET pagination + func fetchRows(query: String, offset: Int, limit: Int) async throws -> QueryResult + + // MARK: - Schema Operations + /// Fetch all tables in the database func fetchTables() async throws -> [TableInfo] @@ -39,23 +60,6 @@ protocol DatabaseDriver: AnyObject { /// Fetch the DDL (CREATE TABLE statement) for a specific table func fetchTableDDL(table: String) async throws -> String - /// Test the connection (connect and immediately disconnect) - func testConnection() async throws -> Bool - - // MARK: - Server Information - - /// Server version string (e.g., "8.0.35" for MySQL) - /// Optional - not all drivers may implement this - var serverVersion: String? { get } - - // MARK: - Paginated Query Support - - /// Fetch total row count for a query (wraps with COUNT(*)) - func fetchRowCount(query: String) async throws -> Int - - /// Fetch rows with LIMIT/OFFSET pagination - func fetchRows(query: String, offset: Int, limit: Int) async throws -> QueryResult - /// Fetch table metadata (size, comment, engine, etc.) func fetchTableMetadata(tableName: String) async throws -> TableMetadata @@ -65,6 +69,10 @@ protocol DatabaseDriver: AnyObject { /// Default implementation for common operations extension DatabaseDriver { + /// Default implementation returns nil + /// Override in drivers that support version querying + var serverVersion: String? { nil } + func testConnection() async throws -> Bool { do { try await connect() @@ -74,10 +82,6 @@ extension DatabaseDriver { throw error } } - - /// Default implementation returns nil - /// Override in drivers that support version querying - var serverVersion: String? { nil } } /// Factory for creating database drivers diff --git a/TablePro/Core/Database/DatabaseManager.swift b/TablePro/Core/Database/DatabaseManager.swift index 5944dee7..875ff666 100644 --- a/TablePro/Core/Database/DatabaseManager.swift +++ b/TablePro/Core/Database/DatabaseManager.swift @@ -19,21 +19,21 @@ final class DatabaseManager: ObservableObject { /// All active connection sessions @Published private(set) var activeSessions: [UUID: ConnectionSession] = [:] - + /// Currently selected session ID (displayed in UI) @Published private(set) var currentSessionId: UUID? - + /// Current session (computed from currentSessionId) var currentSession: ConnectionSession? { guard let sessionId = currentSessionId else { return nil } return activeSessions[sessionId] } - + /// Current driver (for convenience) var activeDriver: DatabaseDriver? { currentSession?.driver } - + /// Current connection status var status: ConnectionStatus { currentSession?.status ?? .disconnected @@ -42,7 +42,7 @@ final class DatabaseManager: ObservableObject { private init() {} // MARK: - Session Management - + /// Connect to a database and create/switch to its session /// If connection already has a session, switches to it instead func connectToSession(_ connection: DatabaseConnection) async throws { @@ -52,7 +52,7 @@ final class DatabaseManager: ObservableObject { switchToSession(connection.id) return } - + // Create new session var session = ConnectionSession(connection: connection) session.status = .connecting @@ -64,7 +64,7 @@ final class DatabaseManager: ObservableObject { if connection.sshConfig.enabled { let sshPassword = ConnectionStorage.shared.loadSSHPassword(for: connection.id) let keyPassphrase = ConnectionStorage.shared.loadKeyPassphrase(for: connection.id) - + do { let tunnelPort = try await SSHTunnelManager.shared.createTunnel( connectionId: connection.id, @@ -103,19 +103,19 @@ final class DatabaseManager: ObservableObject { do { try await driver.connect() - + // Update session with successful connection session.driver = driver session.status = driver.status activeSessions[connection.id] = session - + // Restore tab state if it exists if let tabState = TabStateStorage.shared.loadTabState(connectionId: connection.id) { let restoredTabs = tabState.tabs.map { QueryTab(from: $0) } activeSessions[connection.id]?.tabs = restoredTabs activeSessions[connection.id]?.selectedTabId = tabState.selectedTabId } - + // Post notification for reliable delivery NotificationCenter.default.post(name: .databaseDidConnect, object: nil) } catch { @@ -125,10 +125,10 @@ final class DatabaseManager: ObservableObject { try? await SSHTunnelManager.shared.closeTunnel(connectionId: connection.id) } } - + // Remove failed session completely so UI returns to Welcome window activeSessions.removeValue(forKey: connection.id) - + // Clear current session if this was it if currentSessionId == connection.id { // Switch to another session if available, otherwise clear @@ -138,26 +138,25 @@ final class DatabaseManager: ObservableObject { currentSessionId = nil } } - + throw error } } - + /// Switch to an existing session func switchToSession(_ sessionId: UUID) { - guard activeSessions[sessionId] != nil else { return } + guard var session = activeSessions[sessionId] else { return } currentSessionId = sessionId - + // Mark session as active - var session = activeSessions[sessionId]! session.markActive() activeSessions[sessionId] = session } - + /// Disconnect a specific session func disconnectSession(_ sessionId: UUID) async { guard let session = activeSessions[sessionId] else { return } - + // Close SSH tunnel if exists if session.connection.sshConfig.enabled { try? await SSHTunnelManager.shared.closeTunnel(connectionId: session.connection.id) @@ -165,7 +164,7 @@ final class DatabaseManager: ObservableObject { session.driver?.disconnect() activeSessions.removeValue(forKey: sessionId) - + // If this was the current session, switch to another or clear if currentSessionId == sessionId { if let nextSessionId = activeSessions.keys.first { @@ -176,21 +175,21 @@ final class DatabaseManager: ObservableObject { } } } - + /// Disconnect all sessions func disconnectAll() async { for sessionId in activeSessions.keys { await disconnectSession(sessionId) } } - + /// Update session state (for preserving UI state) func updateSession(_ sessionId: UUID, update: (inout ConnectionSession) -> Void) { guard var session = activeSessions[sessionId] else { return } update(&session) activeSessions[sessionId] = session } - + // MARK: - Query Execution (uses current session) /// Execute a query on the current session @@ -222,7 +221,7 @@ final class DatabaseManager: ObservableObject { /// Test a connection without keeping it open func testConnection(_ connection: DatabaseConnection, sshPassword: String? = nil) async throws - -> Bool + -> Bool { // Create SSH tunnel if needed var tunnelPort: Int? diff --git a/TablePro/Core/Database/FilterSQLGenerator.swift b/TablePro/Core/Database/FilterSQLGenerator.swift index 0aba1000..b83aace8 100644 --- a/TablePro/Core/Database/FilterSQLGenerator.swift +++ b/TablePro/Core/Database/FilterSQLGenerator.swift @@ -11,10 +11,6 @@ import Foundation struct FilterSQLGenerator { let databaseType: DatabaseType - init(databaseType: DatabaseType) { - self.databaseType = databaseType - } - // MARK: - Public API /// Generate a complete WHERE clause from filters @@ -158,10 +154,10 @@ struct FilterSQLGenerator { } // Try to detect numeric values - if let _ = Int(trimmed) { + if Int(trimmed) != nil { return trimmed } - if let _ = Double(trimmed) { + if Double(trimmed) != nil { return trimmed } @@ -195,7 +191,7 @@ struct FilterSQLGenerator { /// Parse comma-separated list values private func parseListValues(_ input: String) -> [String] { // Split by comma, trim whitespace, filter empty - return input + input .components(separatedBy: ",") .map { $0.trimmingCharacters(in: .whitespaces) } .filter { !$0.isEmpty } @@ -206,7 +202,7 @@ struct FilterSQLGenerator { extension FilterSQLGenerator { /// Generate a preview-friendly SQL string (for display, not execution) - func generatePreviewSQL(tableName: String, filters: [TableFilter], limit: Int = 1000) -> String { + func generatePreviewSQL(tableName: String, filters: [TableFilter], limit: Int = 1_000) -> String { let quotedTable = databaseType.quoteIdentifier(tableName) var sql = "SELECT * FROM \(quotedTable)" diff --git a/TablePro/Core/Database/LibPQConnection.swift b/TablePro/Core/Database/LibPQConnection.swift index 7a466159..2acac606 100644 --- a/TablePro/Core/Database/LibPQConnection.swift +++ b/TablePro/Core/Database/LibPQConnection.swift @@ -49,7 +49,6 @@ struct LibPQQueryResult { /// Thread-safe PostgreSQL connection using libpq /// All blocking C calls are dispatched to a dedicated serial queue final class LibPQConnection: @unchecked Sendable { - // MARK: - Properties /// The underlying PGconn pointer (opaque handle) @@ -102,8 +101,7 @@ final class LibPQConnection: @unchecked Sendable { /// Connect to the PostgreSQL server /// - Throws: LibPQError if connection fails func connect() async throws { - try await withCheckedThrowingContinuation { - (continuation: CheckedContinuation) in + try await withCheckedThrowingContinuation { (continuation: CheckedContinuation) in queue.async { [self] in // Build connection string var connStr = "host='\(host)' port='\(port)' dbname='\(database)'" @@ -168,8 +166,7 @@ final class LibPQConnection: @unchecked Sendable { // Capture query string to avoid potential issues with closure capture let queryToRun = String(query) - return try await withCheckedThrowingContinuation { - [self] (cont: CheckedContinuation) in + return try await withCheckedThrowingContinuation { [self] (cont: CheckedContinuation) in queue.async { [self] in // Check if shutting down guard !isShuttingDown else { @@ -306,7 +303,7 @@ final class LibPQConnection: @unchecked Sendable { // Return nil if not connected (version == 0) guard version > 0 else { return nil } // Format: XXYYYZZ where XX is major, YYY is minor, ZZ is revision - let major = version / 10000 + let major = version / 10_000 let minor = (version / 100) % 100 let revision = version % 100 return "\(major).\(minor).\(revision)" @@ -315,7 +312,7 @@ final class LibPQConnection: @unchecked Sendable { /// Get the current database name func currentDatabase() -> String { - return database + database } // MARK: - Private Helpers @@ -332,8 +329,8 @@ final class LibPQConnection: @unchecked Sendable { /// Get error from a result handle private func getResultError(from result: OpaquePointer) -> LibPQError { var message = "Unknown error" - var sqlState: String? = nil - var detail: String? = nil + var sqlState: String? + var detail: String? if let msgPtr = PQresultErrorMessage(result) { message = String(cString: msgPtr).trimmingCharacters(in: .whitespacesAndNewlines) diff --git a/TablePro/Core/Database/MariaDBConnection.swift b/TablePro/Core/Database/MariaDBConnection.swift index 7ad21f9d..1cc43fba 100644 --- a/TablePro/Core/Database/MariaDBConnection.swift +++ b/TablePro/Core/Database/MariaDBConnection.swift @@ -57,7 +57,6 @@ struct MariaDBColumnInfo { /// Thread-safe MySQL/MariaDB connection using libmariadb /// All blocking C calls are dispatched to a dedicated serial queue final class MariaDBConnection: @unchecked Sendable { - // MARK: - Properties /// The underlying MYSQL pointer (opaque handle) @@ -110,8 +109,7 @@ final class MariaDBConnection: @unchecked Sendable { /// Connect to the MySQL/MariaDB server /// - Throws: MariaDBError if connection fails func connect() async throws { - try await withCheckedThrowingContinuation { - (continuation: CheckedContinuation) in + try await withCheckedThrowingContinuation { (continuation: CheckedContinuation) in queue.async { [self] in // Initialize MySQL client guard let mysql = mysql_init(nil) else { @@ -147,7 +145,7 @@ final class MariaDBConnection: @unchecked Sendable { mysql_options(mysql, MYSQL_OPT_WRITE_TIMEOUT, &writeTimeout) // Force TCP protocol (instead of Unix socket for localhost) - var protocol_tcp: UInt32 = UInt32(MYSQL_PROTOCOL_TCP.rawValue) + var protocol_tcp = UInt32(MYSQL_PROTOCOL_TCP.rawValue) mysql_options(mysql, MYSQL_OPT_PROTOCOL, &protocol_tcp) // Disable SSL requirement - allows connection to servers without SSL @@ -335,7 +333,7 @@ final class MariaDBConnection: @unchecked Sendable { // before calling mysql_free_result var rows: [[String?]] = [] // Pre-allocate capacity for better performance - rows.reserveCapacity(1000) // Initial capacity + rows.reserveCapacity(1_000) // Initial capacity while let rowPtr = mysql_fetch_row(resultPtr) { // Get lengths for each field (needed for binary data) @@ -454,7 +452,7 @@ final class MariaDBConnection: @unchecked Sendable { /// Get the current database name func currentDatabase() -> String { - return database + database } // MARK: - Private Helpers @@ -473,7 +471,7 @@ final class MariaDBConnection: @unchecked Sendable { message = "Unknown error" } - var sqlState: String? = nil + var sqlState: String? if let statePtr = mysql_sqlstate(mysql), statePtr[0] != 0 { sqlState = String(cString: statePtr) } @@ -516,7 +514,7 @@ final class MariaDBStreamingResult: @unchecked Sendable { /// Fetch the next row, returns nil when no more rows func fetchNextRow() async -> [String?]? { - return await withCheckedContinuation { [self] (cont: CheckedContinuation<[String?]?, Never>) in + await withCheckedContinuation { [self] (cont: CheckedContinuation<[String?]?, Never>) in queue.async { [self] in let row = fetchNextRowSync() cont.resume(returning: row) diff --git a/TablePro/Core/Database/MySQLDriver.swift b/TablePro/Core/Database/MySQLDriver.swift index b1393b69..9f6347a7 100644 --- a/TablePro/Core/Database/MySQLDriver.swift +++ b/TablePro/Core/Database/MySQLDriver.swift @@ -15,7 +15,7 @@ final class MySQLDriver: DatabaseDriver { /// The underlying MariaDB connection private var mariadbConnection: MariaDBConnection? - + /// Static date formatter for parsing MySQL dates (performance optimization) private static let mysqlDateFormatter: DateFormatter = { let formatter = DateFormatter() @@ -80,9 +80,9 @@ final class MySQLDriver: DatabaseDriver { // MARK: - Query Execution func execute(query: String) async throws -> QueryResult { - return try await executeWithReconnect(query: query, isRetry: false) + try await executeWithReconnect(query: query, isRetry: false) } - + /// Execute query with automatic reconnection on connection-lost errors private func executeWithReconnect(query: String, isRetry: Bool) async throws -> QueryResult { let startTime = Date() @@ -123,24 +123,24 @@ final class MySQLDriver: DatabaseDriver { throw DatabaseError.queryFailed(error.localizedDescription) } } - + // MARK: - Auto-Reconnect - + /// Check if error indicates a lost connection that can be recovered private func isConnectionLostError(_ error: MariaDBError) -> Bool { // 2006 = Server has gone away // 2013 = Lost connection to MySQL server during query // 2055 = Lost connection to MySQL server at reading initial packet - return [2006, 2013, 2055].contains(Int(error.code)) + [2_006, 2_013, 2_055].contains(Int(error.code)) } - + /// Reconnect to the database private func reconnect() async throws { // Close existing connection mariadbConnection?.disconnect() mariadbConnection = nil status = .connecting - + // Reconnect using stored connection info try await connect() } @@ -168,8 +168,8 @@ final class MySQLDriver: DatabaseDriver { // SHOW FULL COLUMNS returns: // 0: Field, 1: Type, 2: Collation, 3: Null, 4: Key, 5: Default, 6: Extra, 7: Privileges, 8: Comment guard row.count >= 7, - let name = row[0], - let dataType = row[1] + let name = row[0], + let dataType = row[1] else { return nil } @@ -180,7 +180,7 @@ final class MySQLDriver: DatabaseDriver { let defaultValue = row[5] let extra = row[6] let comment = row.count > 8 ? row[8] : nil - + // Extract charset from collation (e.g., "utf8mb4_general_ci" -> "utf8mb4") let charset: String? = { guard let coll = collation, coll != "NULL" else { return nil } @@ -210,8 +210,8 @@ final class MySQLDriver: DatabaseDriver { for row in result.rows { guard row.count >= 11, - let indexName = row[2], // Key_name - let columnName = row[4] // Column_name + let indexName = row[2], // Key_name + let columnName = row[4] // Column_name else { continue } @@ -231,15 +231,17 @@ final class MySQLDriver: DatabaseDriver { } } - return indexMap.map { name, info in - IndexInfo( - name: name, - columns: info.columns, - isUnique: info.isUnique, - isPrimary: name == "PRIMARY", - type: info.type - ) - }.sorted { $0.isPrimary && !$1.isPrimary } // PRIMARY key first + return indexMap + .map { name, info in + IndexInfo( + name: name, + columns: info.columns, + isUnique: info.isUnique, + isPrimary: name == "PRIMARY", + type: info.type + ) + } + .sorted { $0.isPrimary && !$1.isPrimary } // PRIMARY key first } func fetchForeignKeys(table: String) async throws -> [ForeignKeyInfo] { @@ -268,10 +270,10 @@ final class MySQLDriver: DatabaseDriver { return result.rows.compactMap { row in guard row.count >= 6, - let name = row[0], - let column = row[1], - let refTable = row[2], - let refColumn = row[3] + let name = row[0], + let column = row[1], + let refTable = row[2], + let refColumn = row[3] else { return nil } @@ -299,7 +301,7 @@ final class MySQLDriver: DatabaseDriver { // identifier when needed. let query = "SHOW CREATE TABLE \(table)" let result = try await execute(query: query) - + // SHOW CREATE TABLE returns 2 columns: Table name and Create Table statement guard let firstRow = result.rows.first, firstRow.count >= 2, @@ -307,10 +309,10 @@ final class MySQLDriver: DatabaseDriver { else { throw DatabaseError.queryFailed("Failed to fetch DDL for table '\(table)'") } - + return ddl } - + func fetchTableMetadata(tableName: String) async throws -> TableMetadata { let escapedTableName = tableName.replacingOccurrences(of: "'", with: "''") // NOTE: `SHOW TABLE STATUS LIKE` expects a pattern string literal, not an @@ -320,7 +322,7 @@ final class MySQLDriver: DatabaseDriver { // by escaping single quotes above. let query = "SHOW TABLE STATUS WHERE Name = '\(escapedTableName)'" let result = try await execute(query: query) - + guard let row = result.rows.first else { return TableMetadata( tableName: tableName, @@ -336,13 +338,13 @@ final class MySQLDriver: DatabaseDriver { updateTime: nil ) } - + // SHOW TABLE STATUS columns: // 0: Name, 1: Engine, 2: Version, 3: Row_format, 4: Rows, 5: Avg_row_length, // 6: Data_length, 7: Max_data_length, 8: Index_length, 9: Data_free, // 10: Auto_increment, 11: Create_time, 12: Update_time, 13: Check_time, // 14: Collation, 15: Checksum, 16: Create_options, 17: Comment - + let engine = row.count > 1 ? row[1] : nil let rowCount = row.count > 4 ? Int64(row[4] ?? "0") : nil let avgRowLength = row.count > 5 ? Int64(row[5] ?? "0") : nil @@ -350,23 +352,23 @@ final class MySQLDriver: DatabaseDriver { let indexSize = row.count > 8 ? Int64(row[8] ?? "0") : nil let collation = row.count > 14 ? row[14] : nil let comment = row.count > 17 ? row[17] : nil - + // Parse dates using static formatter for performance let createTime: Date? = { guard row.count > 11, let dateStr = row[11] else { return nil } return Self.mysqlDateFormatter.date(from: dateStr) }() - + let updateTime: Date? = { guard row.count > 12, let dateStr = row[12] else { return nil } return Self.mysqlDateFormatter.date(from: dateStr) }() - + let totalSize: Int64? = { guard let data = dataSize, let index = indexSize else { return nil } return data + index }() - + return TableMetadata( tableName: tableName, dataSize: dataSize, @@ -393,9 +395,9 @@ final class MySQLDriver: DatabaseDriver { // Get the count from first row, first column guard let firstRow = result.rows.first, - !firstRow.isEmpty, - let countStr = firstRow[0], - let count = Int(countStr) + !firstRow.isEmpty, + let countStr = firstRow[0], + let count = Int(countStr) else { return 0 } @@ -416,8 +418,8 @@ final class MySQLDriver: DatabaseDriver { private func extractTableName(from query: String) -> String? { let pattern = "(?i)\\bFROM\\s+[`\"']?([\\w]+)[`\"']?" guard let regex = try? NSRegularExpression(pattern: pattern), - let match = regex.firstMatch(in: query, range: NSRange(query.startIndex..., in: query)), - let range = Range(match.range(at: 1), in: query) + let match = regex.firstMatch(in: query, range: NSRange(query.startIndex..., in: query)), + let range = Range(match.range(at: 1), in: query) else { return nil } @@ -430,8 +432,8 @@ final class MySQLDriver: DatabaseDriver { var columns: [String] = [] for row in result.rows { - if let columnName = row.first ?? nil { - columns.append(columnName) + if let columnName = row.first, let unwrappedName = columnName { + columns.append(unwrappedName) } } return columns diff --git a/TablePro/Core/Database/PostgreSQLDriver.swift b/TablePro/Core/Database/PostgreSQLDriver.swift index d0fc2684..2a730d37 100644 --- a/TablePro/Core/Database/PostgreSQLDriver.swift +++ b/TablePro/Core/Database/PostgreSQLDriver.swift @@ -14,7 +14,7 @@ final class PostgreSQLDriver: DatabaseDriver { /// Native libpq connection wrapper private var libpqConnection: LibPQConnection? - + /// Server version string (e.g., "16.1.0") var serverVersion: String? { libpqConnection?.serverVersion() @@ -130,8 +130,8 @@ final class PostgreSQLDriver: DatabaseDriver { return result.rows.compactMap { row in guard row.count >= 4, - let name = row[0], - let dataType = row[1] + let name = row[0], + let dataType = row[1] else { return nil } @@ -188,8 +188,8 @@ final class PostgreSQLDriver: DatabaseDriver { return result.rows.compactMap { row in guard row.count >= 5, - let name = row[0], - let columnsStr = row[1] + let name = row[0], + let columnsStr = row[1] else { return nil } @@ -235,10 +235,10 @@ final class PostgreSQLDriver: DatabaseDriver { return result.rows.compactMap { row in guard row.count >= 6, - let name = row[0], - let column = row[1], - let refTable = row[2], - let refColumn = row[3] + let name = row[0], + let column = row[1], + let refTable = row[2], + let refColumn = row[3] else { return nil } @@ -307,11 +307,11 @@ final class PostgreSQLDriver: DatabaseDriver { let paginatedQuery = "\(baseQuery) LIMIT \(limit) OFFSET \(offset)" return try await execute(query: paginatedQuery) } - + func fetchTableMetadata(tableName: String) async throws -> TableMetadata { // Escape single quotes to prevent SQL injection (string literal context) let safeTableName = tableName.replacingOccurrences(of: "'", with: "''") - + let query = """ SELECT pg_total_relation_size(c.oid) AS total_size, @@ -325,9 +325,9 @@ final class PostgreSQLDriver: DatabaseDriver { WHERE c.relname = '\(safeTableName)' AND n.nspname = 'public' """ - + let result = try await execute(query: query) - + guard let row = result.rows.first else { return TableMetadata( tableName: tableName, @@ -343,14 +343,14 @@ final class PostgreSQLDriver: DatabaseDriver { updateTime: nil ) } - - let totalSize = row.count > 0 ? Int64(row[0] ?? "0") : nil + + let totalSize = !row.isEmpty ? Int64(row[0] ?? "0") : nil let dataSize = row.count > 1 ? Int64(row[1] ?? "0") : nil let indexSize = row.count > 2 ? Int64(row[2] ?? "0") : nil let rowCount = row.count > 3 ? Int64(row[3] ?? "0") : nil let avgRowLength = row.count > 4 ? Int64(row[4] ?? "0") : nil let comment = row.count > 5 ? row[5] : nil - + return TableMetadata( tableName: tableName, dataSize: dataSize, diff --git a/TablePro/Core/Database/SQLEscaping.swift b/TablePro/Core/Database/SQLEscaping.swift index f3ffca0d..45882c52 100644 --- a/TablePro/Core/Database/SQLEscaping.swift +++ b/TablePro/Core/Database/SQLEscaping.swift @@ -10,7 +10,6 @@ import Foundation /// Centralized SQL escaping utilities to prevent SQL injection vulnerabilities enum SQLEscaping { - /// Escape a string value for use in SQL string literals (VALUES, WHERE clauses, etc.) /// /// Handles the following special characters: diff --git a/TablePro/Core/Database/SQLiteDriver.swift b/TablePro/Core/Database/SQLiteDriver.swift index 92b13283..55ef8eeb 100644 --- a/TablePro/Core/Database/SQLiteDriver.swift +++ b/TablePro/Core/Database/SQLiteDriver.swift @@ -12,49 +12,49 @@ import SQLite3 final class SQLiteDriver: DatabaseDriver { let connection: DatabaseConnection private(set) var status: ConnectionStatus = .disconnected - + private var db: OpaquePointer? - + /// Server version string (SQLite library version, e.g., "3.43.2") var serverVersion: String? { String(cString: sqlite3_libversion()) } - + init(connection: DatabaseConnection) { self.connection = connection } - + deinit { disconnect() } - + // MARK: - Connection - + func connect() async throws { guard status != .connected else { return } - + status = .connecting - + let path = expandPath(connection.database) - + // Check if file exists (for existing databases) if !FileManager.default.fileExists(atPath: path) { // Create new database file let directory = (path as NSString).deletingLastPathComponent try? FileManager.default.createDirectory(atPath: directory, withIntermediateDirectories: true) } - + let result = sqlite3_open(path, &db) - + if result != SQLITE_OK { let errorMessage = String(cString: sqlite3_errmsg(db)) status = .error(errorMessage) throw DatabaseError.connectionFailed(errorMessage) } - + status = .connected } - + func disconnect() { if db != nil { sqlite3_close(db) @@ -62,33 +62,33 @@ final class SQLiteDriver: DatabaseDriver { } status = .disconnected } - + // MARK: - Query Execution - + func execute(query: String) async throws -> QueryResult { guard status == .connected, let db = db else { throw DatabaseError.notConnected } - + let startTime = Date() var statement: OpaquePointer? - + // Prepare statement let prepareResult = sqlite3_prepare_v2(db, query, -1, &statement, nil) - + if prepareResult != SQLITE_OK { let errorMessage = String(cString: sqlite3_errmsg(db)) throw DatabaseError.queryFailed(errorMessage) } - + defer { sqlite3_finalize(statement) } - + // Get column info let columnCount = sqlite3_column_count(statement) var columns: [String] = [] - + for i in 0.. [TableInfo] { guard status == .connected else { throw DatabaseError.notConnected } - + let query = """ - SELECT name, type FROM sqlite_master - WHERE type IN ('table', 'view') + SELECT name, type FROM sqlite_master + WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%' ORDER BY name """ - + let result = try await execute(query: query) - + return result.rows.compactMap { row in guard let name = row[0] else { return nil } let typeString = row[1] ?? "table" let type: TableInfo.TableType = typeString.lowercased() == "view" ? .view : .table - + return TableInfo(name: name, type: type, rowCount: nil) } } - + func fetchColumns(table: String) async throws -> [ColumnInfo] { guard status == .connected else { throw DatabaseError.notConnected } - + let query = "PRAGMA table_info('\(table)')" let result = try await execute(query: query) - + return result.rows.compactMap { row in guard row.count >= 6, let name = row[1], let dataType = row[2] else { return nil } - + let isNullable = row[3] == "0" let isPrimaryKey = row[5] == "1" let defaultValue = row[4] - + return ColumnInfo( name: name, dataType: dataType, @@ -190,31 +190,31 @@ final class SQLiteDriver: DatabaseDriver { ) } } - + func fetchIndexes(table: String) async throws -> [IndexInfo] { guard status == .connected else { throw DatabaseError.notConnected } - + // Get list of indexes for this table let indexListQuery = "PRAGMA index_list('\(table)')" let indexListResult = try await execute(query: indexListQuery) - + var indexes: [IndexInfo] = [] - + for row in indexListResult.rows { guard row.count >= 3, let indexName = row[1] else { continue } - + let isUnique = row[2] == "1" let origin = row.count >= 4 ? (row[3] ?? "c") : "c" // c=CREATE INDEX, pk=PRIMARY KEY - + // Get columns for this index let indexInfoQuery = "PRAGMA index_info('\(indexName)')" let indexInfoResult = try await execute(query: indexInfoQuery) - + let columns = indexInfoResult.rows.compactMap { $0.count >= 3 ? $0[2] : nil } - + indexes.append(IndexInfo( name: indexName, columns: columns, @@ -223,18 +223,18 @@ final class SQLiteDriver: DatabaseDriver { type: "BTREE" )) } - + return indexes.sorted { $0.isPrimary && !$1.isPrimary } } - + func fetchForeignKeys(table: String) async throws -> [ForeignKeyInfo] { guard status == .connected else { throw DatabaseError.notConnected } - + let query = "PRAGMA foreign_key_list('\(table)')" let result = try await execute(query: query) - + return result.rows.compactMap { row in guard row.count >= 5, let refTable = row[2], @@ -242,11 +242,11 @@ final class SQLiteDriver: DatabaseDriver { let toCol = row[4] else { return nil } - + let id = row[0] ?? "0" let onUpdate = row.count >= 6 ? (row[5] ?? "NO ACTION") : "NO ACTION" let onDelete = row.count >= 7 ? (row[6] ?? "NO ACTION") : "NO ACTION" - + return ForeignKeyInfo( name: "fk_\(table)_\(id)", column: fromCol, @@ -257,26 +257,26 @@ final class SQLiteDriver: DatabaseDriver { ) } } - + func fetchTableDDL(table: String) async throws -> String { guard status == .connected else { throw DatabaseError.notConnected } - + // SQLite stores the original CREATE TABLE statement in sqlite_master let query = """ - SELECT sql FROM sqlite_master + SELECT sql FROM sqlite_master WHERE type = 'table' AND name = '\(table)' """ - + let result = try await execute(query: query) - + guard let firstRow = result.rows.first, let ddl = firstRow[0] else { throw DatabaseError.queryFailed("Failed to fetch DDL for table '\(table)'") } - + return formatDDL(ddl) } @@ -341,30 +341,30 @@ final class SQLiteDriver: DatabaseDriver { } // MARK: - Paginated Query Support - + func fetchRowCount(query: String) async throws -> Int { let baseQuery = stripLimitOffset(from: query) let countQuery = "SELECT COUNT(*) FROM (\(baseQuery))" - + let result = try await execute(query: countQuery) guard let firstRow = result.rows.first, let countStr = firstRow.first else { return 0 } return Int(countStr ?? "0") ?? 0 } - + func fetchRows(query: String, offset: Int, limit: Int) async throws -> QueryResult { let baseQuery = stripLimitOffset(from: query) let paginatedQuery = "\(baseQuery) LIMIT \(limit) OFFSET \(offset)" return try await execute(query: paginatedQuery) } - + func fetchTableMetadata(tableName: String) async throws -> TableMetadata { guard status == .connected else { throw DatabaseError.notConnected } - + // Escape table name to prevent SQL injection (escape double quotes for identifier quoting) let safeTableName = tableName.replacingOccurrences(of: "\"", with: "\"\"") - + // Get row count let countQuery = "SELECT COUNT(*) FROM \"\(safeTableName)\"" let countResult = try await execute(query: countQuery) @@ -372,7 +372,7 @@ final class SQLiteDriver: DatabaseDriver { guard let row = countResult.rows.first, let countStr = row.first else { return nil } return Int64(countStr ?? "0") }() - + // SQLite does not expose accurate per-table size information. // To avoid reporting misleading values, we leave size-related fields as nil. return TableMetadata( @@ -389,23 +389,25 @@ final class SQLiteDriver: DatabaseDriver { updateTime: nil ) } - + private func stripLimitOffset(from query: String) -> String { var result = query - + let limitPattern = "(?i)\\s+LIMIT\\s+\\d+" if let regex = try? NSRegularExpression(pattern: limitPattern) { - result = regex.stringByReplacingMatches(in: result, range: NSRange(result.startIndex..., in: result), withTemplate: "") + let range = NSRange(result.startIndex..., in: result) + result = regex.stringByReplacingMatches(in: result, range: range, withTemplate: "") } - + let offsetPattern = "(?i)\\s+OFFSET\\s+\\d+" if let regex = try? NSRegularExpression(pattern: offsetPattern) { - result = regex.stringByReplacingMatches(in: result, range: NSRange(result.startIndex..., in: result), withTemplate: "") + let range = NSRange(result.startIndex..., in: result) + result = regex.stringByReplacingMatches(in: result, range: range, withTemplate: "") } - + return result.trimmingCharacters(in: .whitespacesAndNewlines) } - + // MARK: - Helpers private func expandPath(_ path: String) -> String { @@ -419,6 +421,6 @@ final class SQLiteDriver: DatabaseDriver { func fetchDatabases() async throws -> [String] { // SQLite doesn't have a concept of multiple databases on a server // Each SQLite file is a separate database - return [] + [] } } diff --git a/TablePro/Core/SSH/SSHConfigParser.swift b/TablePro/Core/SSH/SSHConfigParser.swift index 07e25f97..99863326 100644 --- a/TablePro/Core/SSH/SSHConfigParser.swift +++ b/TablePro/Core/SSH/SSHConfigParser.swift @@ -27,7 +27,6 @@ struct SSHConfigEntry: Identifiable, Hashable { /// Parser for SSH config file (~/.ssh/config) final class SSHConfigParser { - /// Default SSH config file path static let defaultConfigPath = NSHomeDirectory() + "/.ssh/config" diff --git a/TablePro/Core/SSH/SSHTunnelManager.swift b/TablePro/Core/SSH/SSHTunnelManager.swift index cfcdd328..f6d21144 100644 --- a/TablePro/Core/SSH/SSHTunnelManager.swift +++ b/TablePro/Core/SSH/SSHTunnelManager.swift @@ -49,8 +49,8 @@ actor SSHTunnelManager { static let shared = SSHTunnelManager() private var tunnels: [UUID: SSHTunnel] = [:] - private let portRangeStart = 60000 - private let portRangeEnd = 65000 + private let portRangeStart = 60_000 + private let portRangeEnd = 65_000 private init() {} @@ -108,9 +108,9 @@ actor SSHTunnelManager { guard let keyPath = privateKeyPath, !keyPath.isEmpty else { throw SSHTunnelError.tunnelCreationFailed("Private key path is required for key authentication") } - + let expandedPath = expandPath(keyPath) - + // Validate private key exists and is readable let fileManager = FileManager.default guard fileManager.fileExists(atPath: expandedPath) else { @@ -119,13 +119,13 @@ actor SSHTunnelManager { guard fileManager.isReadableFile(atPath: expandedPath) else { throw SSHTunnelError.tunnelCreationFailed("Private key file is not readable. Check permissions (should be 600): \(expandedPath)") } - + // Force public key authentication arguments.append(contentsOf: ["-i", expandedPath]) arguments.append(contentsOf: ["-o", "PubkeyAuthentication=yes"]) arguments.append(contentsOf: ["-o", "PasswordAuthentication=no"]) arguments.append(contentsOf: ["-o", "PreferredAuthentications=publickey"]) - + case .password: // For password auth, we'll use SSH_ASKPASS with a helper script // Note: This requires ssh to be run without a TTY (which -N provides) @@ -139,8 +139,8 @@ actor SSHTunnelManager { process.arguments = arguments // Set up SSH_ASKPASS for passphrase or password - var askpassScript: String? = nil - + var askpassScript: String? + if authMethod == .privateKey, let passphrase = keyPassphrase { // Private key with passphrase - use SSH_ASKPASS to provide it askpassScript = try await createAskpassScript(password: passphrase) @@ -148,7 +148,7 @@ actor SSHTunnelManager { // Password authentication askpassScript = try await createAskpassScript(password: password) } - + if let script = askpassScript { var environment = ProcessInfo.processInfo.environment environment["SSH_ASKPASS"] = script @@ -182,29 +182,29 @@ actor SSHTunnelManager { if authMethod == .privateKey { throw SSHTunnelError.tunnelCreationFailed( "Private key authentication failed. Possible causes:\n" + - "• Private key doesn't match the public key on server\n" + - "• Wrong passphrase for encrypted private key\n" + - "• Wrong user or server\n" + - "Debug: \(errorMessage)" + "• Private key doesn't match the public key on server\n" + + "• Wrong passphrase for encrypted private key\n" + + "• Wrong user or server\n" + + "Debug: \(errorMessage)" ) } else { throw SSHTunnelError.authenticationFailed } } - + if errorMessage.contains("authentication") { throw SSHTunnelError.authenticationFailed } - + if errorMessage.contains("Connection timed out") || errorMessage.contains("Connection refused") { throw SSHTunnelError.tunnelCreationFailed( "Cannot connect to SSH server. Check:\n" + - "• Server address and port are correct\n" + - "• Server is reachable (firewall, network)\n" + - "Debug: \(errorMessage)" + "• Server address and port are correct\n" + + "• Server is reachable (firewall, network)\n" + + "Debug: \(errorMessage)" ) } - + throw SSHTunnelError.tunnelCreationFailed(errorMessage) } diff --git a/TablePro/Core/Services/CreateTableService.swift b/TablePro/Core/Services/CreateTableService.swift index f804e23c..e5e9ee01 100644 --- a/TablePro/Core/Services/CreateTableService.swift +++ b/TablePro/Core/Services/CreateTableService.swift @@ -20,7 +20,7 @@ enum CreateTableError: LocalizedError { case multipleAutoIncrement case autoIncrementNotInteger(String) case invalidSQL(String) - + var errorDescription: String? { switch self { case .emptyTableName: @@ -50,9 +50,9 @@ enum CreateTableError: LocalizedError { /// Service for generating CREATE TABLE SQL statements struct CreateTableService { let databaseType: DatabaseType - + // MARK: - Public API - + /// Generate CREATE TABLE SQL from options /// - Parameter options: Table creation configuration /// - Returns: SQL CREATE TABLE statement @@ -60,7 +60,7 @@ struct CreateTableService { func generateSQL(_ options: TableCreationOptions) throws -> String { // Validate options first try validate(options) - + // Generate database-specific SQL switch databaseType { case .mysql, .mariadb: @@ -71,7 +71,7 @@ struct CreateTableService { return try generateSQLite(options) } } - + /// Validate table creation options /// - Parameter options: Table creation configuration /// - Throws: CreateTableError if validation fails @@ -80,81 +80,81 @@ struct CreateTableService { guard !options.tableName.trimmingCharacters(in: .whitespaces).isEmpty else { throw CreateTableError.emptyTableName } - + // Database name validation (not required for SQLite) if databaseType != .sqlite { guard !options.databaseName.trimmingCharacters(in: .whitespaces).isEmpty else { throw CreateTableError.emptyDatabaseName } } - + // Must have at least one column guard !options.columns.isEmpty else { throw CreateTableError.noColumns } - + // Validate each column var columnNames = Set() var autoIncrementCount = 0 - + for (index, column) in options.columns.enumerated() { // Column name must not be empty let trimmedName = column.name.trimmingCharacters(in: .whitespaces) guard !trimmedName.isEmpty else { throw CreateTableError.emptyColumnName(index) } - + // Check for duplicate names (case-insensitive) let lowerName = trimmedName.lowercased() if columnNames.contains(lowerName) { throw CreateTableError.duplicateColumnName(trimmedName) } columnNames.insert(lowerName) - + // Validate length requirement for VARCHAR/CHAR types if requiresLength(dataType: column.dataType) && (column.length ?? 0) <= 0 { throw CreateTableError.missingLength(columnName: trimmedName, dataType: column.dataType) } - + // Validate length is a positive integer if let length = column.length, length <= 0 { throw CreateTableError.invalidLength(columnName: trimmedName, value: "\(length)") } - + // Count auto-increment columns if column.autoIncrement { autoIncrementCount += 1 - + // Auto-increment must be on integer types if !isIntegerType(column.dataType) { throw CreateTableError.autoIncrementNotInteger(trimmedName) } } } - + // Only one auto-increment column allowed (MySQL/SQLite limitation) if (databaseType == .mysql || databaseType == .mariadb || databaseType == .sqlite) && autoIncrementCount > 1 { throw CreateTableError.multipleAutoIncrement } } - + // MARK: - MySQL/MariaDB SQL Generation - + private func generateMySQL(_ options: TableCreationOptions) throws -> String { var sql = "CREATE TABLE " - + // Table name with database qualifier let quotedDatabase = databaseType.quoteIdentifier(options.databaseName) let quotedTable = databaseType.quoteIdentifier(options.tableName) sql += "\(quotedDatabase).\(quotedTable) (\n" - + // Column definitions let columnDefs = try options.columns.map { column -> String in let isPK = options.primaryKeyColumns.contains(column.name) return " " + buildColumnDefinition(column, dbType: databaseType, isPK: isPK) } sql += columnDefs.joined(separator: ",\n") - + // Primary key constraint - only include columns that actually exist let existingColumnNames = Set(options.columns.map { $0.name }) let validPKColumns = options.primaryKeyColumns.filter { existingColumnNames.contains($0) } @@ -162,53 +162,53 @@ struct CreateTableService { let pkColumns = validPKColumns.map { databaseType.quoteIdentifier($0) } sql += ",\n PRIMARY KEY (\(pkColumns.joined(separator: ", ")))" } - + // Foreign key constraints for fk in options.foreignKeys where fk.isValid { sql += ",\n " + buildForeignKeyConstraint(fk, dbType: databaseType) } - + // Unique constraints (from indexes marked as unique) for index in options.indexes where index.isUnique && index.isValid { let cols = index.columns.map { databaseType.quoteIdentifier($0) } let constraintName = index.name.isEmpty ? "" : "CONSTRAINT \(databaseType.quoteIdentifier(index.name)) " sql += ",\n \(constraintName)UNIQUE (\(cols.joined(separator: ", ")))" } - + // Check constraints for check in options.checkConstraints where check.isValid { let constraintName = databaseType.quoteIdentifier(check.name) sql += ",\n CONSTRAINT \(constraintName) CHECK (\(check.expression))" } - + sql += "\n)" - + // MySQL-specific options var tableOptions: [String] = [] - + if let engine = options.engine, !engine.isEmpty { tableOptions.append("ENGINE=\(engine)") } - + if let charset = options.charset, !charset.isEmpty { tableOptions.append("DEFAULT CHARSET=\(charset)") } - + if let collation = options.collation, !collation.isEmpty { tableOptions.append("COLLATE=\(collation)") } - + if !tableOptions.isEmpty { sql += " " + tableOptions.joined(separator: " ") } - + sql += ";" - + // Add comment as separate statement if provided if let comment = options.comment, !comment.trimmingCharacters(in: .whitespaces).isEmpty { sql += "\nALTER TABLE \(quotedDatabase).\(quotedTable) COMMENT '\(escapeSQLString(comment))';" } - + // Add indexes as separate statements (non-unique indexes) for index in options.indexes where !index.isUnique && index.isValid { let indexName = databaseType.quoteIdentifier(index.name) @@ -216,27 +216,27 @@ struct CreateTableService { let indexType = index.type == .btree ? "" : " USING \(index.type.rawValue)" sql += "\nCREATE INDEX \(indexName) ON \(quotedDatabase).\(quotedTable) (\(cols))\(indexType);" } - + return sql } - + // MARK: - PostgreSQL SQL Generation - + private func generatePostgreSQL(_ options: TableCreationOptions) throws -> String { var sql = "CREATE TABLE " - + // Table name with schema qualifier let quotedSchema = databaseType.quoteIdentifier(options.databaseName) let quotedTable = databaseType.quoteIdentifier(options.tableName) sql += "\(quotedSchema).\(quotedTable) (\n" - + // Column definitions let columnDefs = try options.columns.map { column -> String in let isPK = options.primaryKeyColumns.contains(column.name) return " " + buildColumnDefinition(column, dbType: databaseType, isPK: isPK) } sql += columnDefs.joined(separator: ",\n") - + // Primary key constraint - only include columns that actually exist let existingColumnNames = Set(options.columns.map { $0.name }) let validPKColumns = options.primaryKeyColumns.filter { existingColumnNames.contains($0) } @@ -244,37 +244,37 @@ struct CreateTableService { let pkColumns = validPKColumns.map { databaseType.quoteIdentifier($0) } sql += ",\n PRIMARY KEY (\(pkColumns.joined(separator: ", ")))" } - + // Foreign key constraints for fk in options.foreignKeys where fk.isValid { sql += ",\n " + buildForeignKeyConstraint(fk, dbType: databaseType) } - + // Unique constraints (from indexes marked as unique) for index in options.indexes where index.isUnique && index.isValid { let cols = index.columns.map { databaseType.quoteIdentifier($0) } let constraintName = index.name.isEmpty ? "" : "CONSTRAINT \(databaseType.quoteIdentifier(index.name)) " sql += ",\n \(constraintName)UNIQUE (\(cols.joined(separator: ", ")))" } - + // Check constraints for check in options.checkConstraints where check.isValid { let constraintName = databaseType.quoteIdentifier(check.name) sql += ",\n CONSTRAINT \(constraintName) CHECK (\(check.expression))" } - + sql += "\n);" - + // Add tablespace if provided if let tablespace = options.tablespace, !tablespace.trimmingCharacters(in: .whitespaces).isEmpty { sql = sql.dropLast() + " TABLESPACE \(databaseType.quoteIdentifier(tablespace));" } - + // Add comment as separate statement if provided if let comment = options.comment, !comment.trimmingCharacters(in: .whitespaces).isEmpty { sql += "\nCOMMENT ON TABLE \(quotedSchema).\(quotedTable) IS '\(escapeSQLString(comment))';" } - + // Add column comments for column in options.columns { if let comment = column.comment, !comment.trimmingCharacters(in: .whitespaces).isEmpty { @@ -282,7 +282,7 @@ struct CreateTableService { sql += "\nCOMMENT ON COLUMN \(quotedSchema).\(quotedTable).\(quotedColumn) IS '\(escapeSQLString(comment))';" } } - + // Add indexes as separate statements (non-unique indexes) for index in options.indexes where !index.isUnique && index.isValid { let indexName = databaseType.quoteIdentifier(index.name) @@ -290,48 +290,48 @@ struct CreateTableService { let indexType = index.type == .btree ? "" : " USING \(index.type.rawValue)" sql += "\nCREATE INDEX \(indexName) ON \(quotedSchema).\(quotedTable)\(indexType) (\(cols));" } - + return sql } - + // MARK: - SQLite SQL Generation - + private func generateSQLite(_ options: TableCreationOptions) throws -> String { var sql = "CREATE TABLE " - + // Table name (no database qualifier in SQLite) let quotedTable = databaseType.quoteIdentifier(options.tableName) sql += "\(quotedTable) (\n" - + // Column definitions // SQLite handles PRIMARY KEY differently for single vs composite keys // First, filter to only valid columns that exist let existingColumnNames = Set(options.columns.map { $0.name }) let validPKColumns = options.primaryKeyColumns.filter { existingColumnNames.contains($0) } - + let hasSinglePK = validPKColumns.count == 1 let singlePKColumn = hasSinglePK ? validPKColumns.first : nil - + let columnDefs = try options.columns.map { column -> String in // For single PK, add PRIMARY KEY inline let isPKInline = singlePKColumn == column.name return " " + buildColumnDefinition(column, dbType: databaseType, isPK: isPKInline) } sql += columnDefs.joined(separator: ",\n") - + // For composite keys (multiple columns), add PRIMARY KEY constraint if validPKColumns.count > 1 { let pkColumns = validPKColumns.map { databaseType.quoteIdentifier($0) } sql += ",\n PRIMARY KEY (\(pkColumns.joined(separator: ", ")))" } - + sql += "\n);" - + return sql } - + // MARK: - Column Definition Builder - + /// Build a complete column definition string /// - Parameters: /// - column: Column configuration @@ -340,13 +340,13 @@ struct CreateTableService { /// - Returns: Column definition SQL fragment private func buildColumnDefinition(_ column: ColumnDefinition, dbType: DatabaseType, isPK: Bool) -> String { var parts: [String] = [] - + // Column name parts.append(dbType.quoteIdentifier(column.name)) - + // Data type with length/precision var dataType = column.dataType.uppercased() - + // Handle SERIAL type for PostgreSQL (replaces INT + AUTO_INCREMENT) if dbType == .postgresql && column.autoIncrement && isIntegerType(column.dataType) { switch column.dataType.uppercased() { @@ -368,19 +368,19 @@ struct CreateTableService { dataType += "(\(length))" } } - + parts.append(dataType) - + // Unsigned (MySQL only) if (dbType == .mysql || dbType == .mariadb) && column.unsigned { parts.append("UNSIGNED") } - + // Zerofill (MySQL only) if (dbType == .mysql || dbType == .mariadb) && column.zerofill { parts.append("ZEROFILL") } - + // NOT NULL / NULL if column.notNull { parts.append("NOT NULL") @@ -388,7 +388,7 @@ struct CreateTableService { // PostgreSQL: explicitly add NULL for clarity (optional but good practice) parts.append("NULL") } - + // Default value if let defaultValue = column.defaultValue, !defaultValue.trimmingCharacters(in: .whitespaces).isEmpty { let trimmed = defaultValue.trimmingCharacters(in: .whitespaces) @@ -403,7 +403,7 @@ struct CreateTableService { } else { // Check if the value is already a quoted string if (trimmed.hasPrefix("'") && trimmed.hasSuffix("'")) || - (trimmed.hasPrefix("\"") && trimmed.hasSuffix("\"")) { + (trimmed.hasPrefix("\"") && trimmed.hasSuffix("\"")) { // Already quoted, use as-is parts.append("DEFAULT \(trimmed)") } else { @@ -412,7 +412,7 @@ struct CreateTableService { } } } - + // Auto-increment // PostgreSQL: handled by SERIAL type above // MySQL/MariaDB: AUTO_INCREMENT keyword @@ -428,7 +428,7 @@ struct CreateTableService { parts.append("AUTO_INCREMENT") } } - + // Primary key inline (SQLite single-column PK only) if isPK && dbType == .sqlite && column.autoIncrement { // For SQLite with autoincrement, PRIMARY KEY goes before AUTOINCREMENT @@ -437,19 +437,19 @@ struct CreateTableService { } else if isPK && dbType == .sqlite { parts.append("PRIMARY KEY") } - + // Comment (MySQL inline) if dbType == .mysql || dbType == .mariadb { if let comment = column.comment, !comment.trimmingCharacters(in: .whitespaces).isEmpty { parts.append("COMMENT '\(escapeSQLString(comment))'") } } - + return parts.joined(separator: " ") } - + // MARK: - Constraint Builders - + /// Build a foreign key constraint definition /// - Parameters: /// - fk: Foreign key constraint @@ -457,53 +457,53 @@ struct CreateTableService { /// - Returns: Foreign key constraint SQL fragment private func buildForeignKeyConstraint(_ fk: ForeignKeyConstraint, dbType: DatabaseType) -> String { var parts: [String] = [] - + // Constraint name (optional) if !fk.name.isEmpty { parts.append("CONSTRAINT \(dbType.quoteIdentifier(fk.name))") } - + // FOREIGN KEY (columns) let localCols = fk.columns.map { dbType.quoteIdentifier($0) }.joined(separator: ", ") parts.append("FOREIGN KEY (\(localCols))") - + // REFERENCES table(columns) let refTable = dbType.quoteIdentifier(fk.referencedTable) let refCols = fk.referencedColumns.map { dbType.quoteIdentifier($0) }.joined(separator: ", ") parts.append("REFERENCES \(refTable)(\(refCols))") - + // ON DELETE action if fk.onDelete != .noAction { parts.append("ON DELETE \(fk.onDelete.rawValue)") } - + // ON UPDATE action if fk.onUpdate != .noAction { parts.append("ON UPDATE \(fk.onUpdate.rawValue)") } - + return parts.joined(separator: " ") } - + // MARK: - Helper Functions - + /// Check if a data type requires a length specification private func requiresLength(dataType: String) -> Bool { let type = dataType.uppercased() return type == "VARCHAR" || type == "CHAR" || type == "VARBINARY" || type == "BINARY" } - + /// Check if a data type is an integer type (for auto-increment validation) private func isIntegerType(_ dataType: String) -> Bool { let type = dataType.uppercased() let integerTypes = ["TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT", "SERIAL", "SMALLSERIAL", "BIGSERIAL"] return integerTypes.contains(type) } - + /// Check if a string is a SQL function that should not be quoted private func isSQLFunction(_ value: String) -> Bool { let trimmed = value.trimmingCharacters(in: .whitespaces).uppercased() - + let sqlFunctions = [ "NOW()", "CURRENT_TIMESTAMP()", @@ -528,22 +528,22 @@ struct CreateTableService { "UUID()", "GEN_RANDOM_UUID()", ] - + return sqlFunctions.contains(trimmed) } - + /// Check if a value is a boolean literal private func isBooleanLiteral(_ value: String) -> Bool { let upper = value.uppercased() return upper == "TRUE" || upper == "FALSE" } - + /// Check if a value is a numeric literal private func isNumericLiteral(_ value: String) -> Bool { // Simple check: can be parsed as Int or Double - return Int(value) != nil || Double(value) != nil + Int(value) != nil || Double(value) != nil } - + /// Escape characters that can break SQL strings /// Delegates to shared SQLEscaping utility for consistent escaping across the codebase private func escapeSQLString(_ str: String) -> String { diff --git a/TablePro/Core/Services/DDLParser.swift b/TablePro/Core/Services/DDLParser.swift index e0edbfa8..f9b41ef2 100644 --- a/TablePro/Core/Services/DDLParser.swift +++ b/TablePro/Core/Services/DDLParser.swift @@ -9,43 +9,42 @@ import Foundation /// Parses CREATE TABLE DDL statements into TableCreationOptions struct DDLParser { - /// Parse a CREATE TABLE statement static func parse(_ ddl: String, databaseType: DatabaseType) throws -> TableCreationOptions { var options = TableCreationOptions() options.databaseName = "imported" - + // Extract table name if let tableName = extractTableName(from: ddl) { options.tableName = tableName } else { throw DDLParseError.invalidSyntax("Could not extract table name") } - + // Extract columns options.columns = try extractColumns(from: ddl, databaseType: databaseType) - + // Extract primary key options.primaryKeyColumns = extractPrimaryKey(from: ddl) - + // Extract engine (MySQL) if databaseType == .mysql || databaseType == .mariadb { options.engine = extractEngine(from: ddl) options.charset = extractCharset(from: ddl) } - + return options } - + // MARK: - Extraction Methods - + private static func extractTableName(from ddl: String) -> String? { // Pattern: CREATE TABLE `db`.`table` or CREATE TABLE table let patterns = [ #"CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?[`\"]?(\w+)[`\"]?\.[`\"]?(\w+)[`\"]?"#, #"CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?[`\"]?(\w+)[`\"]?"# ] - + for pattern in patterns { if let regex = try? NSRegularExpression(pattern: pattern, options: .caseInsensitive) { let nsString = ddl as NSString @@ -61,64 +60,64 @@ struct DDLParser { } } } - + return nil } - + private static func extractColumns(from ddl: String, databaseType: DatabaseType) throws -> [ColumnDefinition] { // Extract the content between parentheses guard let startIndex = ddl.firstIndex(of: "("), let endIndex = ddl.lastIndex(of: ")") else { throw DDLParseError.invalidSyntax("Missing parentheses") } - + let content = String(ddl[ddl.index(after: startIndex).. ColumnDefinition? { let parts = line.components(separatedBy: .whitespaces).filter { !$0.isEmpty } guard parts.count >= 2 else { return nil } - + // Column name (remove quotes) var name = parts[0].replacingOccurrences(of: "`", with: "").replacingOccurrences(of: "\"", with: "") - + // Data type (may include length) var dataType = parts[1].uppercased() - var length: Int? = nil - var precision: Int? = nil - + var length: Int? + var precision: Int? + // Extract length/precision from type (e.g., VARCHAR(255) or DECIMAL(10,2)) if let openParen = dataType.firstIndex(of: "("), let closeParen = dataType.firstIndex(of: ")") { let typeBase = String(dataType[.. [String] { // Pattern: PRIMARY KEY (`col1`, `col2`) let pattern = #"PRIMARY\s+KEY\s*\(([^)]+)\)"# - + guard let regex = try? NSRegularExpression(pattern: pattern, options: .caseInsensitive), let match = regex.firstMatch(in: ddl, range: NSRange(ddl.startIndex..., in: ddl)) else { return [] } - + let nsString = ddl as NSString let columnsPart = nsString.substring(with: match.range(at: 1)) - + return columnsPart.components(separatedBy: ",") .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) .replacingOccurrences(of: "`", with: "") @@ -177,38 +176,38 @@ struct DDLParser { } .filter { !$0.isEmpty } } - + private static func extractEngine(from ddl: String) -> String? { let pattern = #"ENGINE\s*=\s*(\w+)"# - + guard let regex = try? NSRegularExpression(pattern: pattern, options: .caseInsensitive), let match = regex.firstMatch(in: ddl, range: NSRange(ddl.startIndex..., in: ddl)) else { return nil } - + let nsString = ddl as NSString return nsString.substring(with: match.range(at: 1)) } - + private static func extractCharset(from ddl: String) -> String? { let pattern = #"(?:DEFAULT\s+)?CHARSET\s*=\s*(\w+)"# - + guard let regex = try? NSRegularExpression(pattern: pattern, options: .caseInsensitive), let match = regex.firstMatch(in: ddl, range: NSRange(ddl.startIndex..., in: ddl)) else { return nil } - + let nsString = ddl as NSString return nsString.substring(with: match.range(at: 1)) } - + // MARK: - Helper Methods - + private static func splitByComma(_ str: String) -> [String] { var result: [String] = [] var current = "" var depth = 0 - + for char in str { if char == "(" { depth += 1 @@ -223,11 +222,11 @@ struct DDLParser { current.append(char) } } - + if !current.isEmpty { result.append(current) } - + return result } } @@ -236,7 +235,7 @@ struct DDLParser { enum DDLParseError: LocalizedError { case invalidSyntax(String) - + var errorDescription: String? { switch self { case .invalidSyntax(let message): diff --git a/TablePro/Core/Services/ExportService.swift b/TablePro/Core/Services/ExportService.swift index d186a8c4..b392daa5 100644 --- a/TablePro/Core/Services/ExportService.swift +++ b/TablePro/Core/Services/ExportService.swift @@ -55,7 +55,6 @@ private extension String { /// Service responsible for exporting table data to various formats @MainActor final class ExportService: ObservableObject { - // MARK: - Published State @Published var isExporting: Bool = false @@ -95,7 +94,7 @@ final class ExportService: ObservableObject { // MARK: - Progress Throttling /// Number of rows to process before updating UI - private let progressUpdateInterval: Int = 1000 + private let progressUpdateInterval: Int = 1_000 /// Internal counter for processed rows (updated every row) private var internalProcessedRows: Int = 0 @@ -454,10 +453,10 @@ final class ExportService: ObservableObject { // (important when convertLineBreakToSpace is enabled - original line breaks // mean the field should still be quoted even after conversion to spaces) let needsQuotes = processed.contains(options.delimiter.actualValue) || - processed.contains("\"") || - processed.contains("\n") || - processed.contains("\r") || - originalHadLineBreaks + processed.contains("\"") || + processed.contains("\n") || + processed.contains("\r") || + originalHadLineBreaks if needsQuotes { let escaped = processed.replacingOccurrences(of: "\"", with: "\"\"") return "\"\(escaped)\"" @@ -497,10 +496,10 @@ final class ExportService: ObservableObject { try fileHandle.write(contentsOf: "\(indent)\"\(escapedTableName)\": [\(newline)".toUTF8Data()) // Stream rows in batches to avoid loading the entire table into memory - let batchSize = 1000 + let batchSize = 1_000 var offset = 0 var hasWrittenRow = false - var columns: [String]? = nil + var columns: [String]? batchLoop: while true { try checkCancellation() @@ -640,7 +639,7 @@ final class ExportService: ObservableObject { } if let doubleVal = Double(val), !val.contains("e") && !val.contains("E") { // Avoid scientific notation issues - let jsMaxSafeInteger = 9007199254740991.0 // 2^53 - 1, JavaScript's Number.MAX_SAFE_INTEGER + let jsMaxSafeInteger = 9_007_199_254_740_991.0 // 2^53 - 1, JavaScript's Number.MAX_SAFE_INTEGER if doubleVal.truncatingRemainder(dividingBy: 1) == 0 && !val.contains(".") { // For integral values, only convert to Int when within both Int and JS safe integer bounds @@ -867,7 +866,7 @@ final class ExportService: ObservableObject { guard FileManager.default.isExecutableFile(atPath: gzipPath) else { throw ExportError.exportFailed( "Compression unavailable: gzip not found at \(gzipPath). " + - "Please install gzip or disable compression in export options." + "Please install gzip or disable compression in export options." ) } diff --git a/TablePro/Core/Services/ImportService.swift b/TablePro/Core/Services/ImportService.swift index 51e0422d..abf30e28 100644 --- a/TablePro/Core/Services/ImportService.swift +++ b/TablePro/Core/Services/ImportService.swift @@ -14,7 +14,6 @@ import Foundation /// Service responsible for importing SQL files @MainActor final class ImportService: ObservableObject { - // MARK: - Published State @Published var isImporting: Bool = false @@ -171,7 +170,6 @@ final class ImportService: ObservableObject { executedCount += 1 progress = Double(executedCount) / Double(totalStatements) - } catch { // Statement execution failed failedStatement = statement @@ -208,13 +206,12 @@ final class ImportService: ObservableObject { _ = try await driver.execute(query: stmt) } } - } catch { // Rollback on error - this is CRITICAL and must not fail silently if config.wrapInTransaction { do { _ = try await driver.execute(query: rollbackStatement(for: connection.type)) - } catch let rollbackError { + } catch { // Rollback failed - database may be in inconsistent state // This is a critical error that MUST be reported to the user throw ImportError.rollbackFailed(rollbackError.localizedDescription) @@ -228,7 +225,7 @@ final class ImportService: ObservableObject { for stmt in fkEnableStmts { do { _ = try await driver.execute(query: stmt) - } catch let fkError { + } catch { // FK re-enable failed - warn user but don't override original error // Store this as a warning that should be shown alongside the original error let message = fkError.localizedDescription @@ -280,7 +277,7 @@ final class ImportService: ObservableObject { } private func decompressIfNeeded(_ url: URL) async throws -> URL { - return try await FileDecompressor.decompressIfNeeded(url, fileSystemPath: fileSystemPath) + try await FileDecompressor.decompressIfNeeded(url, fileSystemPath: fileSystemPath) } private func checkCancellation() throws { @@ -322,10 +319,10 @@ final class ImportService: ObservableObject { } private func commitStatement(for dbType: DatabaseType) -> String { - return "COMMIT" + "COMMIT" } private func rollbackStatement(for dbType: DatabaseType) -> String { - return "ROLLBACK" + "ROLLBACK" } } diff --git a/TablePro/Core/Services/QueryExecutionService.swift b/TablePro/Core/Services/QueryExecutionService.swift index fd408010..b72d0c6a 100644 --- a/TablePro/Core/Services/QueryExecutionService.swift +++ b/TablePro/Core/Services/QueryExecutionService.swift @@ -12,7 +12,6 @@ import Foundation /// Service for executing database queries and parsing SQL @MainActor final class QueryExecutionService: ObservableObject { - // MARK: - Published State @Published var isExecuting: Bool = false @@ -65,7 +64,7 @@ final class QueryExecutionService: ObservableObject { // Fetch column defaults and total row count if editable table var columnDefaults: [String: String?] = [:] - var totalRowCount: Int? = nil + var totalRowCount: Int? if isEditable, let tableName = tableName { if let driver = DatabaseManager.shared.activeDriver { @@ -135,7 +134,6 @@ final class QueryExecutionService: ObservableObject { } await onSuccess(safeResult) - } catch { guard capturedGeneration == queryGeneration else { return } diff --git a/TablePro/Core/Services/RowOperationsManager.swift b/TablePro/Core/Services/RowOperationsManager.swift index 0cd682f2..3b9093cb 100644 --- a/TablePro/Core/Services/RowOperationsManager.swift +++ b/TablePro/Core/Services/RowOperationsManager.swift @@ -12,7 +12,6 @@ import Foundation /// Manager for row operations in the data grid @MainActor final class RowOperationsManager { - // MARK: - Dependencies private let changeManager: DataChangeManager @@ -176,7 +175,7 @@ final class RowOperationsManager { func undoLastChange(resultRows: inout [QueryResultRow]) -> Set? { guard let result = changeManager.undoLastChange() else { return nil } - var adjustedSelection: Set? = nil + var adjustedSelection: Set? switch result.action { case .cellEdit(let rowIndex, let columnIndex, _, let previousValue, _): @@ -190,11 +189,11 @@ final class RowOperationsManager { adjustedSelection = Set() } - case .rowDeletion(_, _): + case .rowDeletion: // Row is restored in changeManager - visual indicator will be removed break - case .batchRowDeletion(_): + case .batchRowDeletion: // All rows are restored in changeManager break @@ -234,11 +233,11 @@ final class RowOperationsManager { resultRows.insert(newRow, at: rowIndex) } - case .rowDeletion(_, _): + case .rowDeletion: // Row is re-marked as deleted in changeManager break - case .batchRowDeletion(_): + case .batchRowDeletion: // Rows are re-marked as deleted break diff --git a/TablePro/Core/Services/TabPersistenceService.swift b/TablePro/Core/Services/TabPersistenceService.swift index 12580525..f33d381f 100644 --- a/TablePro/Core/Services/TabPersistenceService.swift +++ b/TablePro/Core/Services/TabPersistenceService.swift @@ -12,7 +12,6 @@ import Foundation /// Service for managing tab state persistence @MainActor final class TabPersistenceService: ObservableObject { - // MARK: - Constants private static let saveDebounceDelay: UInt64 = 500_000_000 // 500ms in nanoseconds diff --git a/TablePro/Core/Services/TableQueryBuilder.swift b/TablePro/Core/Services/TableQueryBuilder.swift index 0b27b2aa..0c7226ce 100644 --- a/TablePro/Core/Services/TableQueryBuilder.swift +++ b/TablePro/Core/Services/TableQueryBuilder.swift @@ -10,7 +10,6 @@ import Foundation /// Service for building SQL queries for table operations struct TableQueryBuilder { - // MARK: - Properties private let databaseType: DatabaseType diff --git a/TablePro/Core/Storage/ConnectionStorage.swift b/TablePro/Core/Storage/ConnectionStorage.swift index 19361912..2a949937 100644 --- a/TablePro/Core/Storage/ConnectionStorage.swift +++ b/TablePro/Core/Storage/ConnectionStorage.swift @@ -171,8 +171,8 @@ final class ConnectionStorage { let status = SecItemCopyMatching(query as CFDictionary, &result) guard status == errSecSuccess, - let data = result as? Data, - let password = String(data: data, encoding: .utf8) + let data = result as? Data, + let password = String(data: data, encoding: .utf8) else { return nil } @@ -233,8 +233,8 @@ final class ConnectionStorage { let status = SecItemCopyMatching(query as CFDictionary, &result) guard status == errSecSuccess, - let data = result as? Data, - let password = String(data: data, encoding: .utf8) + let data = result as? Data, + let password = String(data: data, encoding: .utf8) else { return nil } @@ -295,8 +295,8 @@ final class ConnectionStorage { let status = SecItemCopyMatching(query as CFDictionary, &result) guard status == errSecSuccess, - let data = result as? Data, - let passphrase = String(data: data, encoding: .utf8) + let data = result as? Data, + let passphrase = String(data: data, encoding: .utf8) else { return nil } diff --git a/TablePro/Core/Storage/FilterSettingsStorage.swift b/TablePro/Core/Storage/FilterSettingsStorage.swift index a9165e00..dcb8d172 100644 --- a/TablePro/Core/Storage/FilterSettingsStorage.swift +++ b/TablePro/Core/Storage/FilterSettingsStorage.swift @@ -171,7 +171,7 @@ final class FilterSettingsStorage { /// Sanitize table name for use as UserDefaults key private func sanitizeTableName(_ tableName: String) -> String { // Replace special characters that might cause issues in keys - return tableName + tableName .replacingOccurrences(of: ".", with: "_") .replacingOccurrences(of: "/", with: "_") .replacingOccurrences(of: "\\", with: "_") diff --git a/TablePro/Core/Storage/QueryHistoryManager.swift b/TablePro/Core/Storage/QueryHistoryManager.swift index 9d75a203..beae5ca2 100644 --- a/TablePro/Core/Storage/QueryHistoryManager.swift +++ b/TablePro/Core/Storage/QueryHistoryManager.swift @@ -19,16 +19,16 @@ extension Notification.Name { /// NOT an ObservableObject - uses NotificationCenter for UI communication final class QueryHistoryManager { static let shared = QueryHistoryManager() - + private let storage = QueryHistoryStorage.shared - + private init() { // Perform cleanup on initialization (app launch) storage.cleanup() } - + // MARK: - History Capture - + /// Record a query execution (non-blocking background write) func recordQuery( query: String, @@ -48,7 +48,7 @@ final class QueryHistoryManager { wasSuccessful: wasSuccessful, errorMessage: errorMessage ) - + // Background write (non-blocking) storage.addHistory(entry) { success in if success { @@ -62,9 +62,9 @@ final class QueryHistoryManager { } } } - + // MARK: - History Retrieval - + /// Fetch history entries (synchronous - safe for UI) func fetchHistory( limit: Int = 100, @@ -73,7 +73,7 @@ final class QueryHistoryManager { searchText: String? = nil, dateFilter: DateFilter = .all ) -> [QueryHistoryEntry] { - return storage.fetchHistory( + storage.fetchHistory( limit: limit, offset: offset, connectionId: connectionId, @@ -81,7 +81,7 @@ final class QueryHistoryManager { dateFilter: dateFilter ) } - + /// Search queries using FTS5 full-text search func searchQueries(_ text: String) -> [QueryHistoryEntry] { guard !text.trimmingCharacters(in: .whitespaces).isEmpty else { @@ -89,7 +89,7 @@ final class QueryHistoryManager { } return storage.fetchHistory(searchText: text) } - + /// Delete a history entry func deleteHistory(id: UUID) -> Bool { let success = storage.deleteHistory(id: id) @@ -98,14 +98,14 @@ final class QueryHistoryManager { } return success } - + /// Get total history count func getHistoryCount() -> Int { - return storage.getHistoryCount() + storage.getHistoryCount() } - + // MARK: - Bookmarks - + /// Save a new bookmark func saveBookmark( name: String, @@ -121,23 +121,23 @@ final class QueryHistoryManager { tags: tags, notes: notes ) - + let success = storage.addBookmark(bookmark) if success { NotificationCenter.default.post(name: .queryBookmarksDidUpdate, object: nil) } return success } - + /// Save bookmark from history entry func saveBookmarkFromHistory(_ entry: QueryHistoryEntry, name: String) -> Bool { - return saveBookmark( + saveBookmark( name: name, query: entry.query, connectionId: entry.connectionId ) } - + /// Update an existing bookmark func updateBookmark(_ bookmark: QueryBookmark) -> Bool { let success = storage.updateBookmark(bookmark) @@ -146,7 +146,7 @@ final class QueryHistoryManager { } return success } - + /// Update bookmark's last used timestamp func markBookmarkUsed(id: UUID) { if var bookmark = fetchBookmarks().first(where: { $0.id == id }) { @@ -154,12 +154,12 @@ final class QueryHistoryManager { _ = storage.updateBookmark(bookmark) } } - + /// Fetch bookmarks with optional filters func fetchBookmarks(searchText: String? = nil, tag: String? = nil) -> [QueryBookmark] { - return storage.fetchBookmarks(searchText: searchText, tag: tag) + storage.fetchBookmarks(searchText: searchText, tag: tag) } - + /// Delete a bookmark func deleteBookmark(id: UUID) -> Bool { let success = storage.deleteBookmark(id: id) @@ -168,7 +168,7 @@ final class QueryHistoryManager { } return success } - + /// Clear all history entries func clearAllHistory() -> Bool { let success = storage.clearAllHistory() @@ -177,7 +177,7 @@ final class QueryHistoryManager { } return success } - + /// Clear all bookmarks func clearAllBookmarks() -> Bool { let success = storage.clearAllBookmarks() @@ -186,9 +186,9 @@ final class QueryHistoryManager { } return success } - + // MARK: - Cleanup - + /// Manually trigger cleanup (normally runs automatically) func cleanup() { storage.cleanup() diff --git a/TablePro/Core/Storage/QueryHistoryStorage.swift b/TablePro/Core/Storage/QueryHistoryStorage.swift index ed216c97..f0ad9190 100644 --- a/TablePro/Core/Storage/QueryHistoryStorage.swift +++ b/TablePro/Core/Storage/QueryHistoryStorage.swift @@ -14,11 +14,11 @@ enum DateFilter { case thisWeek case thisMonth case all - + var startDate: Date? { let calendar = Calendar.current let now = Date() - + switch self { case .today: return calendar.startOfDay(for: now) @@ -35,48 +35,48 @@ enum DateFilter { /// Thread-safe SQLite storage for query history and bookmarks final class QueryHistoryStorage { static let shared = QueryHistoryStorage() - + // Thread-safe queue for all database operations private let queue = DispatchQueue(label: "com.TablePro.queryhistory", qos: .utility) private var db: OpaquePointer? - + // Configuration - private let maxHistoryEntries = 1000 + private let maxHistoryEntries = 1_000 private let maxHistoryDays = 30 - + private init() { queue.sync { setupDatabase() } } - + deinit { if let db = db { sqlite3_close(db) } } - + // MARK: - Database Setup - + private func setupDatabase() { let fileManager = FileManager.default let appSupport = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! let TableProDir = appSupport.appendingPathComponent("TablePro") - + // Create directory if needed try? fileManager.createDirectory(at: TableProDir, withIntermediateDirectories: true) - + let dbPath = TableProDir.appendingPathComponent("query_history.db").path - + // Open database if sqlite3_open(dbPath, &db) != SQLITE_OK { print("Error opening database") return } - + createTables() } - + private func createTables() { // History table let historyTable = """ @@ -92,7 +92,7 @@ final class QueryHistoryStorage { error_message TEXT ); """ - + // FTS5 virtual table for full-text search let ftsTable = """ CREATE VIRTUAL TABLE IF NOT EXISTS history_fts USING fts5( @@ -101,33 +101,33 @@ final class QueryHistoryStorage { content_rowid='rowid' ); """ - + // Triggers to keep FTS5 in sync let ftsInsertTrigger = """ CREATE TRIGGER IF NOT EXISTS history_ai AFTER INSERT ON history BEGIN INSERT INTO history_fts(rowid, query) VALUES (new.rowid, new.query); END; """ - + let ftsDeleteTrigger = """ CREATE TRIGGER IF NOT EXISTS history_ad AFTER DELETE ON history BEGIN INSERT INTO history_fts(history_fts, rowid, query) VALUES('delete', old.rowid, old.query); END; """ - + let ftsUpdateTrigger = """ CREATE TRIGGER IF NOT EXISTS history_au AFTER UPDATE ON history BEGIN INSERT INTO history_fts(history_fts, rowid, query) VALUES('delete', old.rowid, old.query); INSERT INTO history_fts(rowid, query) VALUES (new.rowid, new.query); END; """ - + // Indexes let historyIndexes = [ "CREATE INDEX IF NOT EXISTS idx_history_connection ON history(connection_id);", "CREATE INDEX IF NOT EXISTS idx_history_executed_at ON history(executed_at DESC);" ] - + // Bookmarks table let bookmarksTable = """ CREATE TABLE IF NOT EXISTS bookmarks ( @@ -141,12 +141,12 @@ final class QueryHistoryStorage { notes TEXT ); """ - + let bookmarkIndexes = [ "CREATE INDEX IF NOT EXISTS idx_bookmarks_name ON bookmarks(name);", "CREATE INDEX IF NOT EXISTS idx_bookmarks_connection ON bookmarks(connection_id);" ] - + // Execute all table creation statements execute(historyTable) execute(ftsTable) @@ -157,9 +157,9 @@ final class QueryHistoryStorage { execute(bookmarksTable) bookmarkIndexes.forEach { execute($0) } } - + // MARK: - Helper Methods - + private func execute(_ sql: String) { var statement: OpaquePointer? if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK { @@ -167,9 +167,9 @@ final class QueryHistoryStorage { } sqlite3_finalize(statement) } - + // MARK: - History Operations - + /// Add a history entry (async, non-blocking) func addHistory(_ entry: QueryHistoryEntry, completion: ((Bool) -> Void)? = nil) { // Capture values as Swift strings BEFORE entering async block @@ -232,7 +232,7 @@ final class QueryHistoryStorage { DispatchQueue.main.async { completion?(success) } } } - + /// Fetch history with optional filters func fetchHistory( limit: Int = 100, @@ -241,15 +241,15 @@ final class QueryHistoryStorage { searchText: String? = nil, dateFilter: DateFilter = .all ) -> [QueryHistoryEntry] { - return queue.sync { + queue.sync { var entries: [QueryHistoryEntry] = [] - + // Build query with placeholders var sql: String var bindIndex: Int32 = 1 var hasConnectionFilter = false var hasDateFilter = false - + // Use FTS5 for full-text search if search text provided if let searchText = searchText, !searchText.isEmpty { sql = """ @@ -258,78 +258,78 @@ final class QueryHistoryStorage { INNER JOIN history_fts ON h.rowid = history_fts.rowid WHERE history_fts MATCH ? """ - + // Add additional filters if connectionId != nil { sql += " AND h.connection_id = ?" hasConnectionFilter = true } - + if dateFilter.startDate != nil { sql += " AND h.executed_at >= ?" hasDateFilter = true } } else { sql = "SELECT id, query, connection_id, database_name, executed_at, execution_time, row_count, was_successful, error_message FROM history" - + var whereClauses: [String] = [] - + if connectionId != nil { whereClauses.append("connection_id = ?") hasConnectionFilter = true } - + if dateFilter.startDate != nil { whereClauses.append("executed_at >= ?") hasDateFilter = true } - + if !whereClauses.isEmpty { sql += " WHERE " + whereClauses.joined(separator: " AND ") } } - + sql += " ORDER BY executed_at DESC LIMIT ? OFFSET ?;" - + var statement: OpaquePointer? guard sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK else { return entries } - + defer { sqlite3_finalize(statement) } - + let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) - + // Bind parameters in order if let searchText = searchText, !searchText.isEmpty { sqlite3_bind_text(statement, bindIndex, searchText, -1, SQLITE_TRANSIENT) bindIndex += 1 } - + if let connectionId = connectionId, hasConnectionFilter { sqlite3_bind_text(statement, bindIndex, connectionId.uuidString, -1, SQLITE_TRANSIENT) bindIndex += 1 } - + if let startDate = dateFilter.startDate, hasDateFilter { sqlite3_bind_double(statement, bindIndex, startDate.timeIntervalSince1970) bindIndex += 1 } - + sqlite3_bind_int(statement, bindIndex, Int32(limit)) bindIndex += 1 sqlite3_bind_int(statement, bindIndex, Int32(offset)) - + while sqlite3_step(statement) == SQLITE_ROW { if let entry = parseHistoryEntry(from: statement) { entries.append(entry) } } - + return entries } } - + /// Delete a specific history entry func deleteHistory(id: UUID) -> Bool { let idString = id.uuidString @@ -347,41 +347,41 @@ final class QueryHistoryStorage { return sqlite3_step(statement) == SQLITE_DONE } } - + /// Get total history count func getHistoryCount() -> Int { - return queue.sync { + queue.sync { let sql = "SELECT COUNT(*) FROM history;" var statement: OpaquePointer? guard sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK else { return 0 } - + defer { sqlite3_finalize(statement) } - + if sqlite3_step(statement) == SQLITE_ROW { return Int(sqlite3_column_int(statement, 0)) } return 0 } } - + /// Clear all history entries func clearAllHistory() -> Bool { - return queue.sync { + queue.sync { let sql = "DELETE FROM history;" var statement: OpaquePointer? guard sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK else { return false } - + defer { sqlite3_finalize(statement) } return sqlite3_step(statement) == SQLITE_DONE } } - + // MARK: - Bookmark Operations - + /// Add a bookmark func addBookmark(_ bookmark: QueryBookmark) -> Bool { // Capture values as Swift strings BEFORE entering sync block @@ -394,62 +394,62 @@ final class QueryHistoryStorage { let createdAt = bookmark.createdAt.timeIntervalSince1970 let lastUsedAt = bookmark.lastUsedAt?.timeIntervalSince1970 let notesString = bookmark.notes - + return queue.sync { let sql = """ INSERT INTO bookmarks (id, name, query, connection_id, tags, created_at, last_used_at, notes) VALUES (?, ?, ?, ?, ?, ?, ?, ?); """ - + var statement: OpaquePointer? guard sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK else { return false } - + defer { sqlite3_finalize(statement) } - + // SQLITE_TRANSIENT tells SQLite to make its own copy of the strings let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) - + sqlite3_bind_text(statement, 1, idString, -1, SQLITE_TRANSIENT) sqlite3_bind_text(statement, 2, nameString, -1, SQLITE_TRANSIENT) sqlite3_bind_text(statement, 3, queryString, -1, SQLITE_TRANSIENT) - + if let connectionId = connectionIdString { sqlite3_bind_text(statement, 4, connectionId, -1, SQLITE_TRANSIENT) } else { sqlite3_bind_null(statement, 4) } - + if let tags = tagsString { sqlite3_bind_text(statement, 5, tags, -1, SQLITE_TRANSIENT) } else { sqlite3_bind_null(statement, 5) } - + sqlite3_bind_double(statement, 6, createdAt) - + if let lastUsed = lastUsedAt { sqlite3_bind_double(statement, 7, lastUsed) } else { sqlite3_bind_null(statement, 7) } - + if let notes = notesString { sqlite3_bind_text(statement, 8, notes, -1, SQLITE_TRANSIENT) } else { sqlite3_bind_null(statement, 8) } - + let result = sqlite3_step(statement) let success = result == SQLITE_DONE - + // Silently handle errors - + return success } } - + /// Update a bookmark func updateBookmark(_ bookmark: QueryBookmark) -> Bool { // Capture values as Swift strings BEFORE entering sync block @@ -461,97 +461,97 @@ final class QueryHistoryStorage { let tagsString = tagsJSON.flatMap { String(data: $0, encoding: .utf8) } let lastUsedAt = bookmark.lastUsedAt?.timeIntervalSince1970 let notesString = bookmark.notes - + return queue.sync { let sql = """ UPDATE bookmarks SET name = ?, query = ?, connection_id = ?, tags = ?, last_used_at = ?, notes = ? WHERE id = ?; """ - + var statement: OpaquePointer? guard sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK else { return false } - + defer { sqlite3_finalize(statement) } - + // SQLITE_TRANSIENT tells SQLite to make its own copy of the strings let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) - + sqlite3_bind_text(statement, 1, nameString, -1, SQLITE_TRANSIENT) sqlite3_bind_text(statement, 2, queryString, -1, SQLITE_TRANSIENT) - + if let connectionId = connectionIdString { sqlite3_bind_text(statement, 3, connectionId, -1, SQLITE_TRANSIENT) } else { sqlite3_bind_null(statement, 3) } - + if let tags = tagsString { sqlite3_bind_text(statement, 4, tags, -1, SQLITE_TRANSIENT) } else { sqlite3_bind_null(statement, 4) } - + if let lastUsed = lastUsedAt { sqlite3_bind_double(statement, 5, lastUsed) } else { sqlite3_bind_null(statement, 5) } - + if let notes = notesString { sqlite3_bind_text(statement, 6, notes, -1, SQLITE_TRANSIENT) } else { sqlite3_bind_null(statement, 6) } - + sqlite3_bind_text(statement, 7, idString, -1, SQLITE_TRANSIENT) - + let result = sqlite3_step(statement) let success = result == SQLITE_DONE - + // Silently handle errors - + return success } } - + /// Fetch bookmarks with optional filters func fetchBookmarks(searchText: String? = nil, tag: String? = nil) -> [QueryBookmark] { - return queue.sync { + queue.sync { var bookmarks: [QueryBookmark] = [] - + var sql = "SELECT id, name, query, connection_id, tags, created_at, last_used_at, notes FROM bookmarks" var whereClauses: [String] = [] var bindIndex: Int32 = 1 var hasSearchFilter = false var hasTagFilter = false - + if let searchText = searchText, !searchText.isEmpty { whereClauses.append("(name LIKE ? OR query LIKE ?)") hasSearchFilter = true } - + if let tag = tag, !tag.isEmpty { whereClauses.append("tags LIKE ?") hasTagFilter = true } - + if !whereClauses.isEmpty { sql += " WHERE " + whereClauses.joined(separator: " AND ") } - + sql += " ORDER BY created_at DESC;" - + var statement: OpaquePointer? guard sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK else { return bookmarks } - + defer { sqlite3_finalize(statement) } - + let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) - + // Bind parameters in order if let searchText = searchText, !searchText.isEmpty, hasSearchFilter { let searchPattern = "%\(searchText)%" @@ -560,90 +560,90 @@ final class QueryHistoryStorage { sqlite3_bind_text(statement, bindIndex, searchPattern, -1, SQLITE_TRANSIENT) bindIndex += 1 } - + if let tag = tag, !tag.isEmpty, hasTagFilter { let tagPattern = "%\(tag)%" sqlite3_bind_text(statement, bindIndex, tagPattern, -1, SQLITE_TRANSIENT) } - + while sqlite3_step(statement) == SQLITE_ROW { if let bookmark = parseBookmark(from: statement) { bookmarks.append(bookmark) } } - + return bookmarks } } - + /// Delete a bookmark func deleteBookmark(id: UUID) -> Bool { let idString = id.uuidString - + return queue.sync { let sql = "DELETE FROM bookmarks WHERE id = ?;" var statement: OpaquePointer? guard sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK else { return false } - + defer { sqlite3_finalize(statement) } - + let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) sqlite3_bind_text(statement, 1, idString, -1, SQLITE_TRANSIENT) - + let result = sqlite3_step(statement) let success = result == SQLITE_DONE - + // Silently handle success/failure - + return success } } - + /// Clear all bookmarks func clearAllBookmarks() -> Bool { - return queue.sync { + queue.sync { let sql = "DELETE FROM bookmarks;" var statement: OpaquePointer? guard sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK else { return false } - + defer { sqlite3_finalize(statement) } return sqlite3_step(statement) == SQLITE_DONE } } - + // MARK: - Cleanup - + /// Perform cleanup: delete old entries and limit total count private func performCleanup() { // Delete entries older than maxHistoryDays let cutoffDate = Date().addingTimeInterval(-Double(maxHistoryDays * 24 * 60 * 60)) let deleteOldSQL = "DELETE FROM history WHERE executed_at < ?;" - + var statement: OpaquePointer? if sqlite3_prepare_v2(db, deleteOldSQL, -1, &statement, nil) == SQLITE_OK { sqlite3_bind_double(statement, 1, cutoffDate.timeIntervalSince1970) sqlite3_step(statement) } sqlite3_finalize(statement) - + // Delete oldest entries if count exceeds limit let countSQL = "SELECT COUNT(*) FROM history;" if sqlite3_prepare_v2(db, countSQL, -1, &statement, nil) == SQLITE_OK { if sqlite3_step(statement) == SQLITE_ROW { let count = Int(sqlite3_column_int(statement, 0)) sqlite3_finalize(statement) - + if count > maxHistoryEntries { let deleteExcessSQL = """ DELETE FROM history WHERE id IN ( SELECT id FROM history ORDER BY executed_at ASC LIMIT ? ); """ - + if sqlite3_prepare_v2(db, deleteExcessSQL, -1, &statement, nil) == SQLITE_OK { sqlite3_bind_int(statement, 1, Int32(count - maxHistoryEntries)) sqlite3_step(statement) @@ -655,19 +655,19 @@ final class QueryHistoryStorage { } } } - + /// Manually trigger cleanup (call on app launch) func cleanup() { queue.async { [weak self] in self?.performCleanup() } } - + // MARK: - Parsing Helpers - + private func parseHistoryEntry(from statement: OpaquePointer?) -> QueryHistoryEntry? { guard let statement = statement else { return nil } - + guard let idString = sqlite3_column_text(statement, 0).map({ String(cString: $0) }), let id = UUID(uuidString: idString), let query = sqlite3_column_text(statement, 1).map({ String(cString: $0) }), @@ -677,13 +677,13 @@ final class QueryHistoryStorage { else { return nil } - + let executedAt = Date(timeIntervalSince1970: sqlite3_column_double(statement, 4)) let executionTime = sqlite3_column_double(statement, 5) let rowCount = Int(sqlite3_column_int(statement, 6)) let wasSuccessful = sqlite3_column_int(statement, 7) == 1 let errorMessage = sqlite3_column_text(statement, 8).map { String(cString: $0) } - + return QueryHistoryEntry( id: id, query: query, @@ -696,10 +696,10 @@ final class QueryHistoryStorage { errorMessage: errorMessage ) } - + private func parseBookmark(from statement: OpaquePointer?) -> QueryBookmark? { guard let statement = statement else { return nil } - + guard let idString = sqlite3_column_text(statement, 0).map({ String(cString: $0) }), let id = UUID(uuidString: idString), let name = sqlite3_column_text(statement, 1).map({ String(cString: $0) }), @@ -707,28 +707,28 @@ final class QueryHistoryStorage { else { return nil } - + let connectionId = sqlite3_column_text(statement, 3) .map { String(cString: $0) } .flatMap { UUID(uuidString: $0) } - + var tags: [String] = [] if let tagsJSON = sqlite3_column_text(statement, 4).map({ String(cString: $0) }), let tagsData = tagsJSON.data(using: .utf8) { tags = (try? JSONDecoder().decode([String].self, from: tagsData)) ?? [] } - + let createdAt = Date(timeIntervalSince1970: sqlite3_column_double(statement, 5)) - + let lastUsedAt: Date? if sqlite3_column_type(statement, 6) != SQLITE_NULL { lastUsedAt = Date(timeIntervalSince1970: sqlite3_column_double(statement, 6)) } else { lastUsedAt = nil } - + let notes = sqlite3_column_text(statement, 7).map { String(cString: $0) } - + return QueryBookmark( id: id, name: name, diff --git a/TablePro/Core/Storage/TabStateStorage.swift b/TablePro/Core/Storage/TabStateStorage.swift index a9cad38c..82328d04 100644 --- a/TablePro/Core/Storage/TabStateStorage.swift +++ b/TablePro/Core/Storage/TabStateStorage.swift @@ -16,19 +16,19 @@ struct TabState: Codable { /// Service for persisting tab state per connection final class TabStateStorage { static let shared = TabStateStorage() - + private let defaults = UserDefaults.standard private let tabStateKeyPrefix = "com.TablePro.tabs." - + private init() {} - + // MARK: - Public API - + /// Save tab state for a connection func saveTabState(connectionId: UUID, tabs: [QueryTab], selectedTabId: UUID?) { let persistedTabs = tabs.map { $0.toPersistedTab() } let tabState = TabState(tabs: persistedTabs, selectedTabId: selectedTabId) - + do { let encoder = JSONEncoder() let data = try encoder.encode(tabState) @@ -38,15 +38,15 @@ final class TabStateStorage { // Silent failure - encoding errors are rare and non-critical } } - + /// Load tab state for a connection func loadTabState(connectionId: UUID) -> TabState? { let key = tabStateKey(for: connectionId) - + guard let data = defaults.data(forKey: key) else { return nil } - + do { let decoder = JSONDecoder() return try decoder.decode(TabState.self, from: data) @@ -55,19 +55,19 @@ final class TabStateStorage { return nil } } - + /// Clear tab state for a connection func clearTabState(connectionId: UUID) { let key = tabStateKey(for: connectionId) defaults.removeObject(forKey: key) } - + // MARK: - Last Query Memory (TablePlus-style) - + /// Save the last query text for a connection (persists across tab close/open) func saveLastQuery(_ query: String, for connectionId: UUID) { let key = "com.TablePro.lastquery.\(connectionId.uuidString)" - + // Only save non-empty queries (trimmed to avoid saving whitespace-only queries) let trimmed = query.trimmingCharacters(in: .whitespacesAndNewlines) if trimmed.isEmpty { @@ -76,16 +76,16 @@ final class TabStateStorage { defaults.set(trimmed, forKey: key) } } - + /// Load the last query text for a connection func loadLastQuery(for connectionId: UUID) -> String? { let key = "com.TablePro.lastquery.\(connectionId.uuidString)" return defaults.string(forKey: key) } - + // MARK: - Private Helpers - + private func tabStateKey(for connectionId: UUID) -> String { - return "\(tabStateKeyPrefix)\(connectionId.uuidString)" + "\(tabStateKeyPrefix)\(connectionId.uuidString)" } } diff --git a/TablePro/Core/Storage/TableTemplateStorage.swift b/TablePro/Core/Storage/TableTemplateStorage.swift index 075f34b8..ccaacd23 100644 --- a/TablePro/Core/Storage/TableTemplateStorage.swift +++ b/TablePro/Core/Storage/TableTemplateStorage.swift @@ -10,61 +10,61 @@ import Foundation /// Manages saving and loading table creation templates final class TableTemplateStorage { static let shared = TableTemplateStorage() - + private let templatesKey = "saved_table_templates" private let fileManager = FileManager.default - + private init() {} - + // MARK: - Storage Location - + private var templatesURL: URL { let appSupport = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! let appFolder = appSupport.appendingPathComponent("TablePro", isDirectory: true) - + // Create directory if needed if !fileManager.fileExists(atPath: appFolder.path) { try? fileManager.createDirectory(at: appFolder, withIntermediateDirectories: true) } - + return appFolder.appendingPathComponent("table_templates.json") } - + // MARK: - Save/Load - + /// Save a table template func saveTemplate(name: String, options: TableCreationOptions) throws { var templates = try loadTemplates() templates[name] = options - + let encoder = JSONEncoder() encoder.outputFormatting = .prettyPrinted let data = try encoder.encode(templates) try data.write(to: templatesURL) } - + /// Load all templates func loadTemplates() throws -> [String: TableCreationOptions] { guard fileManager.fileExists(atPath: templatesURL.path) else { return [:] } - + let data = try Data(contentsOf: templatesURL) let decoder = JSONDecoder() return try decoder.decode([String: TableCreationOptions].self, from: data) } - + /// Delete a template func deleteTemplate(name: String) throws { var templates = try loadTemplates() templates.removeValue(forKey: name) - + let encoder = JSONEncoder() encoder.outputFormatting = .prettyPrinted let data = try encoder.encode(templates) try data.write(to: templatesURL) } - + /// Get template names func getTemplateNames() -> [String] { do { @@ -74,7 +74,7 @@ final class TableTemplateStorage { return [] } } - + /// Load specific template func loadTemplate(name: String) throws -> TableCreationOptions? { let templates = try loadTemplates() diff --git a/TablePro/Core/Utilities/FileDecompressor.swift b/TablePro/Core/Utilities/FileDecompressor.swift index 53c57215..970862e9 100644 --- a/TablePro/Core/Utilities/FileDecompressor.swift +++ b/TablePro/Core/Utilities/FileDecompressor.swift @@ -9,7 +9,6 @@ import Foundation /// Utility for decompressing gzip-compressed files enum FileDecompressor { - /// Decompress a .gz file to a temporary location /// - Parameters: /// - url: URL to the .gz file diff --git a/TablePro/Core/Utilities/SQLFileParser.swift b/TablePro/Core/Utilities/SQLFileParser.swift index 3afe14e5..8b1ea32b 100644 --- a/TablePro/Core/Utilities/SQLFileParser.swift +++ b/TablePro/Core/Utilities/SQLFileParser.swift @@ -16,7 +16,6 @@ import Foundation /// SQL statement parser that handles comments, strings, and multi-line statements final class SQLFileParser { - // MARK: - Parser State private enum ParserState { @@ -39,8 +38,7 @@ final class SQLFileParser { url: URL, encoding: String.Encoding ) async throws -> AsyncStream<(statement: String, lineNumber: Int)> { - - return AsyncStream { continuation in + AsyncStream { continuation in Task { do { let fileHandle = try FileHandle(forReadingFrom: url) @@ -59,7 +57,7 @@ final class SQLFileParser { var buffer = "" // Read file in chunks - let chunkSize = 4096 + let chunkSize = 4_096 while true { let data = fileHandle.readData(ofLength: chunkSize) @@ -243,7 +241,6 @@ final class SQLFileParser { } continuation.finish() - } catch { // Log parsing errors - these should not fail silently print("ERROR: SQL file parsing failed: \(error.localizedDescription)") diff --git a/TablePro/Extensions/NSViewController+SwiftUI.swift b/TablePro/Extensions/NSViewController+SwiftUI.swift index 11d8ef38..5bcbb041 100644 --- a/TablePro/Extensions/NSViewController+SwiftUI.swift +++ b/TablePro/Extensions/NSViewController+SwiftUI.swift @@ -22,36 +22,35 @@ extension NSViewController { /// Custom NSHostingController that properly handles keyboard events private class KeyboardHandlingHostingController: NSHostingController { - var onSave: (() -> Void)? var onCancel: (() -> Void)? - + override func performKeyEquivalent(with event: NSEvent) -> Bool { // Check for Command modifier let commandPressed = event.modifierFlags.contains(.command) - + // Handle Cmd+Return (Save) if commandPressed && (event.keyCode == 36 || event.keyCode == 76) { onSave?() return true } - + // Let super handle other events return super.performKeyEquivalent(with: event) } - + override func cancelOperation(_ sender: Any?) { // Handle Escape key onCancel?() } - + override func keyDown(with event: NSEvent) { // Check for Escape key without modifiers if event.keyCode == 53 && event.modifierFlags.intersection(.deviceIndependentFlagsMask).isEmpty { onCancel?() return } - + // Pass other keys to super super.keyDown(with: event) } diff --git a/TablePro/Models/ConnectionSession.swift b/TablePro/Models/ConnectionSession.swift index 84099975..1209551e 100644 --- a/TablePro/Models/ConnectionSession.swift +++ b/TablePro/Models/ConnectionSession.swift @@ -14,7 +14,7 @@ struct ConnectionSession: Identifiable { var driver: DatabaseDriver? var status: ConnectionStatus = .disconnected var lastError: String? - + // Per-connection state var tables: [TableInfo] = [] var selectedTables: Set = [] @@ -23,11 +23,11 @@ struct ConnectionSession: Identifiable { var pendingTruncates: Set = [] var pendingDeletes: Set = [] var tableOperationOptions: [String: TableOperationOptions] = [:] - + // Metadata let connectedAt: Date var lastActiveAt: Date - + init(connection: DatabaseConnection, driver: DatabaseDriver? = nil) { self.id = connection.id self.connection = connection @@ -35,12 +35,12 @@ struct ConnectionSession: Identifiable { self.connectedAt = Date() self.lastActiveAt = Date() } - + /// Update last active timestamp mutating func markActive() { lastActiveAt = Date() } - + /// Check if session is currently connected var isConnected: Bool { if case .connected = status { diff --git a/TablePro/Models/ConnectionToolbarState.swift b/TablePro/Models/ConnectionToolbarState.swift index ff53c068..5ddaaf36 100644 --- a/TablePro/Models/ConnectionToolbarState.swift +++ b/TablePro/Models/ConnectionToolbarState.swift @@ -96,11 +96,10 @@ enum ToolbarConnectionState: Equatable { /// Uses ObservableObject for macOS 13+ compatibility. /// This is the single source of truth for all toolbar UI state. final class ConnectionToolbarState: ObservableObject { - // MARK: - Connection Info /// The tag assigned to this connection (optional) - @Published var tagId: UUID? = nil + @Published var tagId: UUID? /// Database type (MySQL, MariaDB, PostgreSQL, SQLite) @Published var databaseType: DatabaseType = .mysql diff --git a/TablePro/Models/DatabaseConnection.swift b/TablePro/Models/DatabaseConnection.swift index 7068936c..5277c538 100644 --- a/TablePro/Models/DatabaseConnection.swift +++ b/TablePro/Models/DatabaseConnection.swift @@ -77,8 +77,8 @@ enum DatabaseType: String, CaseIterable, Identifiable, Codable { /// Default port for each database type var defaultPort: Int { switch self { - case .mysql, .mariadb: return 3306 - case .postgresql: return 5432 + case .mysql, .mariadb: return 3_306 + case .postgresql: return 5_432 case .sqlite: return 0 } } @@ -158,7 +158,7 @@ struct DatabaseConnection: Identifiable, Hashable { id: UUID = UUID(), name: String, host: String = "localhost", - port: Int = 3306, + port: Int = 3_306, database: String = "", username: String = "root", type: DatabaseType = .mysql, diff --git a/TablePro/Models/ExportModels.swift b/TablePro/Models/ExportModels.swift index f25fefd5..286333f3 100644 --- a/TablePro/Models/ExportModels.swift +++ b/TablePro/Models/ExportModels.swift @@ -146,9 +146,9 @@ struct SQLExportOptions: Equatable { struct ExportConfiguration { var format: ExportFormat = .csv var fileName: String = "export" - var csvOptions: CSVExportOptions = CSVExportOptions() - var jsonOptions: JSONExportOptions = JSONExportOptions() - var sqlOptions: SQLExportOptions = SQLExportOptions() + var csvOptions = CSVExportOptions() + var jsonOptions = JSONExportOptions() + var sqlOptions = SQLExportOptions() /// Full file name including extension var fullFileName: String { @@ -173,7 +173,7 @@ struct ExportTableItem: Identifiable, Hashable { let databaseName: String let type: TableInfo.TableType var isSelected: Bool = false - var sqlOptions: SQLTableExportOptions = SQLTableExportOptions() + var sqlOptions = SQLTableExportOptions() init( id: UUID = UUID(), diff --git a/TablePro/Models/FilterPreset.swift b/TablePro/Models/FilterPreset.swift index bd976a81..25fe38c1 100644 --- a/TablePro/Models/FilterPreset.swift +++ b/TablePro/Models/FilterPreset.swift @@ -6,7 +6,7 @@ struct FilterPreset: Identifiable, Codable, Equatable { var name: String var filters: [TableFilter] var createdAt: Date - + init(id: UUID = UUID(), name: String, filters: [TableFilter], createdAt: Date = Date()) { self.id = id self.name = name @@ -18,26 +18,26 @@ struct FilterPreset: Identifiable, Codable, Equatable { /// Storage manager for filter presets final class FilterPresetStorage { static let shared = FilterPresetStorage() - + private let presetsKey = "com.TablePro.filter.presets" private let defaults = UserDefaults.standard - + private init() {} - + /// Save a new preset func savePreset(_ preset: FilterPreset) { var presets = loadAllPresets() - + // Replace if preset with same name exists if let index = presets.firstIndex(where: { $0.name == preset.name }) { presets[index] = preset } else { presets.append(preset) } - + saveAllPresets(presets) } - + /// Load all saved presets func loadAllPresets() -> [FilterPreset] { guard let data = defaults.data(forKey: presetsKey), @@ -46,28 +46,28 @@ final class FilterPresetStorage { } return presets.sorted { $0.createdAt > $1.createdAt } } - + /// Delete a preset func deletePreset(_ preset: FilterPreset) { var presets = loadAllPresets() presets.removeAll { $0.id == preset.id } saveAllPresets(presets) } - + /// Delete all presets func deleteAllPresets() { defaults.removeObject(forKey: presetsKey) } - + /// Rename a preset func renamePreset(_ preset: FilterPreset, to newName: String) { var updatedPreset = preset updatedPreset.name = newName savePreset(updatedPreset) } - + // MARK: - Private - + private func saveAllPresets(_ presets: [FilterPreset]) { guard let data = try? JSONEncoder().encode(presets) else { return } defaults.set(data, forKey: presetsKey) diff --git a/TablePro/Models/FilterState.swift b/TablePro/Models/FilterState.swift index 43378cf2..d51d754a 100644 --- a/TablePro/Models/FilterState.swift +++ b/TablePro/Models/FilterState.swift @@ -13,7 +13,7 @@ import SwiftUI enum FilterLogicMode: String, Codable { case and = "AND" case or = "OR" - + var displayName: String { rawValue } @@ -28,7 +28,7 @@ final class FilterStateManager: ObservableObject { @Published var focusedFilterId: UUID? @Published var quickSearchText: String = "" @Published var filterLogicMode: FilterLogicMode = .and // AND or OR logic - + /// Settings storage reference private let settingsStorage = FilterSettingsStorage.shared private let presetStorage = FilterPresetStorage.shared @@ -70,19 +70,19 @@ final class FilterStateManager: ObservableObject { func addFilterForColumn(_ columnName: String) { let settings = settingsStorage.loadSettings() var newFilter = TableFilter() - + // Set the specified column newFilter.columnName = columnName - + // Apply default operator setting newFilter.filterOperator = settings.defaultOperator.toFilterOperator() - + // New filters should be selected by default for "Apply All" newFilter.isSelected = true - + filters.append(newFilter) focusedFilterId = newFilter.id - + // Show panel if hidden if !isVisible { show() @@ -135,7 +135,7 @@ final class FilterStateManager: ObservableObject { func binding(for filter: TableFilter) -> Binding { Binding( get: { [weak self] in - self?.filters.first(where: { $0.id == filter.id }) ?? filter + self?.filters.first { $0.id == filter.id } ?? filter }, set: { [weak self] newValue in self?.updateFilter(newValue) @@ -219,7 +219,7 @@ final class FilterStateManager: ObservableObject { var hasAppliedFilters: Bool { !appliedFilters.isEmpty } - + /// Check if quick search is active var hasActiveQuickSearch: Bool { !quickSearchText.trimmingCharacters(in: .whitespaces).isEmpty @@ -302,47 +302,47 @@ final class FilterStateManager: ObservableObject { guard let id = focusedFilterId else { return nil } return filters.first { $0.id == id } } - + // MARK: - Filter Presets - + /// Save current filters as a named preset func saveAsPreset(name: String) { let preset = FilterPreset(name: name, filters: filters) presetStorage.savePreset(preset) } - + /// Load filters from a preset func loadPreset(_ preset: FilterPreset) { filters = preset.filters // Auto-focus first filter if available focusedFilterId = filters.first?.id } - + /// Get all saved presets func loadAllPresets() -> [FilterPreset] { presetStorage.loadAllPresets() } - + /// Delete a preset func deletePreset(_ preset: FilterPreset) { presetStorage.deletePreset(preset) } - + // MARK: - Quick Search - + /// Clear quick search text func clearQuickSearch() { quickSearchText = "" } - + // MARK: - SQL Generation - + /// Generate preview SQL for the "SQL" button /// Uses selected filters if any are selected, otherwise uses all valid filters func generatePreviewSQL(databaseType: DatabaseType) -> String { let generator = FilterSQLGenerator(databaseType: databaseType) let filtersToPreview = getFiltersForPreview() - + // If no valid filters but filters exist, show helpful message if filtersToPreview.isEmpty && !filters.isEmpty { let invalidCount = filters.filter { !$0.isValid }.count @@ -350,17 +350,17 @@ final class FilterStateManager: ObservableObject { return "-- No valid filters to preview\n-- Complete \(invalidCount) filter(s) by:\n-- • Selecting a column\n-- • Entering a value (if required)\n-- • Filling in second value for BETWEEN" } } - + return generator.generateWhereClause(from: filtersToPreview, logicMode: filterLogicMode) } - + /// Get filters to use for preview/application /// If some (but not all) filters are selected, use only those /// Otherwise use all valid filters private func getFiltersForPreview() -> [TableFilter] { let validFilters = filters.filter { $0.isValid } let selectedValidFilters = filters.filter { $0.isSelected && $0.isValid } - + // If all valid filters are selected, or no filters are selected, // treat it as "show all valid filters" // Only use selective mode when SOME (but not all) are selected diff --git a/TablePro/Models/QueryBookmark.swift b/TablePro/Models/QueryBookmark.swift index 4d80b9a7..71590562 100644 --- a/TablePro/Models/QueryBookmark.swift +++ b/TablePro/Models/QueryBookmark.swift @@ -17,7 +17,7 @@ struct QueryBookmark: Identifiable, Codable, Hashable { let createdAt: Date var lastUsedAt: Date? var notes: String? - + init( id: UUID = UUID(), name: String, @@ -37,17 +37,17 @@ struct QueryBookmark: Identifiable, Codable, Hashable { self.lastUsedAt = lastUsedAt self.notes = notes } - + /// Formatted tags for display (comma-separated) var formattedTags: String { tags.joined(separator: ", ") } - + /// Has tags var hasTags: Bool { !tags.isEmpty } - + /// Parse comma-separated tag string into array static func parseTags(_ tagString: String) -> [String] { tagString diff --git a/TablePro/Models/QueryHistoryEntry.swift b/TablePro/Models/QueryHistoryEntry.swift index fe8df394..28bf1665 100644 --- a/TablePro/Models/QueryHistoryEntry.swift +++ b/TablePro/Models/QueryHistoryEntry.swift @@ -18,7 +18,7 @@ struct QueryHistoryEntry: Identifiable, Codable, Hashable { let rowCount: Int // -1 if unknown let wasSuccessful: Bool let errorMessage: String? - + init( id: UUID = UUID(), query: String, @@ -40,16 +40,16 @@ struct QueryHistoryEntry: Identifiable, Codable, Hashable { self.wasSuccessful = wasSuccessful self.errorMessage = errorMessage } - + /// Formatted execution time for display var formattedExecutionTime: String { if executionTime < 1.0 { - return String(format: "%.0f ms", executionTime * 1000) + return String(format: "%.0f ms", executionTime * 1_000) } else { return String(format: "%.2f s", executionTime) } } - + /// Formatted row count for display var formattedRowCount: String { if rowCount < 0 { @@ -60,7 +60,7 @@ struct QueryHistoryEntry: Identifiable, Codable, Hashable { return "\(rowCount) rows" } } - + /// Truncated query for preview (first 100 chars) var queryPreview: String { let trimmed = query.trimmingCharacters(in: .whitespacesAndNewlines) diff --git a/TablePro/Models/QueryResult.swift b/TablePro/Models/QueryResult.swift index e2fa66d7..24957855 100644 --- a/TablePro/Models/QueryResult.swift +++ b/TablePro/Models/QueryResult.swift @@ -11,7 +11,7 @@ import Foundation struct QueryResultRow: Identifiable, Equatable { let id = UUID() var values: [String?] - + static func == (lhs: QueryResultRow, rhs: QueryResultRow) -> Bool { lhs.id == rhs.id } @@ -24,26 +24,26 @@ struct QueryResult { let rowsAffected: Int let executionTime: TimeInterval let error: DatabaseError? - + var isEmpty: Bool { rows.isEmpty } - + var rowCount: Int { rows.count } - + var columnCount: Int { columns.count } - + /// Convert to QueryResultRow format for UI func toQueryResultRows() -> [QueryResultRow] { rows.map { row in QueryResultRow(values: row) } } - + static let empty = QueryResult( columns: [], rows: [], @@ -61,7 +61,7 @@ enum DatabaseError: Error, LocalizedError { case fileNotFound(String) case notConnected case unsupportedOperation - + var errorDescription: String? { switch self { case .connectionFailed(let message): @@ -86,7 +86,7 @@ struct TableInfo: Identifiable, Hashable { let name: String let type: TableType let rowCount: Int? - + enum TableType: String { case table = "TABLE" case view = "VIEW" @@ -135,7 +135,7 @@ enum ConnectionStatus: Equatable { case connecting case connected case error(String) - + var isConnected: Bool { if case .connected = self { return true } return false diff --git a/TablePro/Models/QueryTab.swift b/TablePro/Models/QueryTab.swift index b5bd6308..7f6c9007 100644 --- a/TablePro/Models/QueryTab.swift +++ b/TablePro/Models/QueryTab.swift @@ -96,30 +96,30 @@ struct PaginationState: Equatable { var currentPage: Int = 1 // Current page number (1-based) var currentOffset: Int = 0 // Current OFFSET for SQL query var isLoading: Bool = false // Loading indicator - + // MARK: - Computed Properties - + /// Total number of pages var totalPages: Int { guard let total = totalRowCount, total > 0 else { return 1 } return (total + pageSize - 1) / pageSize // Ceiling division } - + /// Whether there is a next page available var hasNextPage: Bool { currentPage < totalPages } - + /// Whether there is a previous page available var hasPreviousPage: Bool { currentPage > 1 } - + /// Starting row number for current page (1-based) var rangeStart: Int { currentOffset + 1 } - + /// Ending row number for current page (1-based) var rangeEnd: Int { guard let total = totalRowCount else { @@ -127,49 +127,49 @@ struct PaginationState: Equatable { } return min(currentOffset + pageSize, total) } - + // MARK: - Navigation Methods - + /// Navigate to next page mutating func goToNextPage() { guard hasNextPage else { return } currentPage += 1 currentOffset = (currentPage - 1) * pageSize } - + /// Navigate to previous page mutating func goToPreviousPage() { guard hasPreviousPage else { return } currentPage -= 1 currentOffset = (currentPage - 1) * pageSize } - + /// Navigate to first page mutating func goToFirstPage() { currentPage = 1 currentOffset = 0 } - + /// Navigate to last page mutating func goToLastPage() { currentPage = totalPages currentOffset = (totalPages - 1) * pageSize } - + /// Navigate to specific page mutating func goToPage(_ page: Int) { guard page > 0 && page <= totalPages else { return } currentPage = page currentOffset = (page - 1) * pageSize } - + /// Reset pagination to first page mutating func reset() { currentPage = 1 currentOffset = 0 isLoading = false } - + /// Update page size (limit) mutating func updatePageSize(_ newSize: Int) { guard newSize > 0 else { return } @@ -177,7 +177,7 @@ struct PaginationState: Equatable { // Recalculate current page based on current offset currentPage = (currentOffset / pageSize) + 1 } - + /// Update offset directly and recalculate page mutating func updateOffset(_ newOffset: Int) { guard newOffset >= 0 else { return } @@ -221,13 +221,13 @@ struct QueryTab: Identifiable, Equatable { // Track if user has interacted with this tab (sort, edit, select, etc) // Prevents tab from being replaced when opening new tables var hasUserInteraction: Bool - + // Pagination state for lazy loading (table tabs only) var pagination: PaginationState // Per-tab filter state (preserves filters when switching tabs) var filterState: TabFilterState - + // Table creation options (for .createTable tabs only) var tableCreationOptions: TableCreationOptions? @@ -263,7 +263,7 @@ struct QueryTab: Identifiable, Equatable { self.filterState = TabFilterState() self.tableCreationOptions = nil } - + /// Initialize from persisted tab state (used when restoring tabs) init(from persisted: PersistedTab) { self.id = persisted.id @@ -272,7 +272,7 @@ struct QueryTab: Identifiable, Equatable { self.isPinned = persisted.isPinned self.tabType = persisted.tabType self.tableName = persisted.tableName - + // Initialize runtime state with defaults self.lastExecutedAt = nil self.resultColumns = [] @@ -292,10 +292,10 @@ struct QueryTab: Identifiable, Equatable { self.filterState = TabFilterState() self.tableCreationOptions = nil } - + /// Convert tab to persisted format for storage func toPersistedTab() -> PersistedTab { - return PersistedTab( + PersistedTab( id: id, title: title, query: query, @@ -336,13 +336,13 @@ final class QueryTabManager: ObservableObject { func addTab(initialQuery: String? = nil) { let queryCount = tabs.filter { $0.tabType == .query }.count var newTab = QueryTab(title: "Query \(queryCount + 1)", tabType: .query) - + // If initialQuery provided, use it; otherwise tab starts empty if let query = initialQuery { newTab.query = query newTab.hasUserInteraction = true // Mark as having content } - + tabs.append(newTab) selectedTabId = newTab.id } @@ -365,19 +365,19 @@ final class QueryTabManager: ObservableObject { tabs.append(newTab) selectedTabId = newTab.id } - + /// Add a new "Create Table" tab /// - Parameters: /// - databaseName: The database/schema name to create the table in /// - databaseType: The type of database (MySQL, PostgreSQL, SQLite) func addCreateTableTab(databaseName: String, databaseType: DatabaseType) { let createTableCount = tabs.filter { $0.tabType == .createTable }.count - + // Initialize with one default column (id INT AUTO_INCREMENT PRIMARY KEY) var options = TableCreationOptions() options.databaseName = databaseName options.tableName = "new_table" - + // Add default ID column let idColumn = ColumnDefinition( name: "id", @@ -387,14 +387,14 @@ final class QueryTabManager: ObservableObject { ) options.columns = [idColumn] options.primaryKeyColumns = ["id"] - + var newTab = QueryTab( title: "New Table \(createTableCount + 1)", tabType: .createTable ) newTab.tableCreationOptions = options newTab.hasUserInteraction = false // Not yet interacted with - + tabs.append(newTab) selectedTabId = newTab.id } @@ -419,11 +419,11 @@ final class QueryTabManager: ObservableObject { // 2. Try to reuse the current tab if it's a clean table tab (no changes, no user interaction) if let selectedId = selectedTabId, - let selectedIndex = tabs.firstIndex(where: { $0.id == selectedId }), - tabs[selectedIndex].tabType == .table, - !tabs[selectedIndex].isPinned, - !hasUnsavedChanges, - !tabs[selectedIndex].hasUserInteraction // Don't replace if user has interacted + let selectedIndex = tabs.firstIndex(where: { $0.id == selectedId }), + tabs[selectedIndex].tabType == .table, + !tabs[selectedIndex].isPinned, + !hasUnsavedChanges, + !tabs[selectedIndex].hasUserInteraction // Don't replace if user has interacted { // Replace the current table tab instead of creating a new one tabs[selectedIndex].title = tableName @@ -459,7 +459,7 @@ final class QueryTabManager: ObservableObject { // Capture table info BEFORE removing let isTableTab = tab.tabType == .table let tableName = tab.tableName - + if let index = tabs.firstIndex(of: tab) { tabs.remove(at: index) @@ -474,7 +474,7 @@ final class QueryTabManager: ObservableObject { } } } - + // Notify when table tab is closed so sidebar selection can be cleared if isTableTab, let name = tableName { NotificationCenter.default.post(name: .tableTabClosed, object: name) diff --git a/TablePro/Models/RowProvider.swift b/TablePro/Models/RowProvider.swift index 855abc1a..a474749e 100644 --- a/TablePro/Models/RowProvider.swift +++ b/TablePro/Models/RowProvider.swift @@ -11,23 +11,23 @@ import Foundation protocol RowProvider: AnyObject { /// Total number of rows available var totalRowCount: Int { get } - + /// Column names var columns: [String] { get } - + /// Column default values from schema var columnDefaults: [String: String?] { get } - + /// Fetch rows for the given range /// - Parameters: /// - offset: Starting row index /// - limit: Maximum number of rows to fetch /// - Returns: Array of row data func fetchRows(offset: Int, limit: Int) -> [TableRowData] - + /// Prefetch rows at specific indices for smoother scrolling func prefetchRows(at indices: [Int]) - + /// Invalidate cached data (e.g., after refresh) func invalidateCache() } @@ -36,18 +36,18 @@ protocol RowProvider: AnyObject { final class TableRowData { let index: Int var values: [String?] - + init(index: Int, values: [String?]) { self.index = index self.values = values } - + /// Get value at column index func value(at columnIndex: Int) -> String? { guard columnIndex < values.count else { return nil } return values[columnIndex] } - + /// Set value at column index func setValue(_ value: String?, at columnIndex: Int) { guard columnIndex < values.count else { return } @@ -62,11 +62,11 @@ final class InMemoryRowProvider: RowProvider { private var rows: [TableRowData] = [] private(set) var columns: [String] private(set) var columnDefaults: [String: String?] - + var totalRowCount: Int { rows.count } - + init(rows: [QueryResultRow], columns: [String], columnDefaults: [String: String?] = [:]) { self.columns = columns self.columnDefaults = columnDefaults @@ -74,40 +74,40 @@ final class InMemoryRowProvider: RowProvider { TableRowData(index: index, values: row.values) } } - + func fetchRows(offset: Int, limit: Int) -> [TableRowData] { let endIndex = min(offset + limit, rows.count) guard offset < endIndex else { return [] } return Array(rows[offset.. TableRowData? { guard index >= 0 && index < rows.count else { return nil } return rows[index] } - + /// Update rows from QueryResultRow array func updateRows(_ newRows: [QueryResultRow]) { self.rows = newRows.enumerated().map { index, row in TableRowData(index: index, values: row.values) } } - + /// Append a new row with given values /// Returns the index of the new row func appendRow(values: [String?]) -> Int { @@ -116,7 +116,7 @@ final class InMemoryRowProvider: RowProvider { rows.append(newRow) return newIndex } - + /// Remove row at index (used when discarding new rows) func removeRow(at index: Int) { guard index >= 0 && index < rows.count else { return } @@ -126,7 +126,7 @@ final class InMemoryRowProvider: RowProvider { rows[i] = TableRowData(index: i, values: rows[i].values) } } - + /// Remove multiple rows at indices (used when discarding new rows) /// Indices should be sorted in descending order to maintain correct removal func removeRows(at indices: Set) { @@ -149,13 +149,13 @@ final class DatabaseRowProvider: RowProvider { private let baseQuery: String private var cache: [Int: TableRowData] = [:] private let pageSize: Int - + private(set) var totalRowCount: Int = 0 private(set) var columns: [String] private(set) var columnDefaults: [String: String?] - + private var isInitialized = false - + init(driver: DatabaseDriver, query: String, columns: [String], columnDefaults: [String: String?] = [:], pageSize: Int = 200) { self.driver = driver self.baseQuery = query @@ -163,18 +163,18 @@ final class DatabaseRowProvider: RowProvider { self.columnDefaults = columnDefaults self.pageSize = pageSize } - + /// Initialize by fetching total row count func initialize() async throws { guard !isInitialized else { return } - + totalRowCount = try await driver.fetchRowCount(query: baseQuery) isInitialized = true } - + func fetchRows(offset: Int, limit: Int) -> [TableRowData] { var result: [TableRowData] = [] - + for i in offset.. TableRowData? { - return cache[index] + cache[index] } - + /// Update a cached cell value func updateValue(_ value: String?, at rowIndex: Int, columnIndex: Int) { cache[rowIndex]?.setValue(value, at: columnIndex) } } - diff --git a/TablePro/Models/TableCreationModels.swift b/TablePro/Models/TableCreationModels.swift index 8cbcfe43..888b18c1 100644 --- a/TablePro/Models/TableCreationModels.swift +++ b/TablePro/Models/TableCreationModels.swift @@ -16,7 +16,7 @@ struct ForeignKeyConstraint: Identifiable, Equatable, Codable { var referencedColumns: [String] var onDelete: ReferentialAction = .noAction var onUpdate: ReferentialAction = .noAction - + init( id: UUID = UUID(), name: String = "", @@ -34,7 +34,7 @@ struct ForeignKeyConstraint: Identifiable, Equatable, Codable { self.onDelete = onDelete self.onUpdate = onUpdate } - + var isValid: Bool { !columns.isEmpty && !referencedTable.isEmpty && !referencedColumns.isEmpty } @@ -56,7 +56,7 @@ struct IndexDefinition: Identifiable, Equatable, Codable { var columns: [String] var isUnique: Bool = false var type: IndexType = .btree - + init( id: UUID = UUID(), name: String = "", @@ -70,7 +70,7 @@ struct IndexDefinition: Identifiable, Equatable, Codable { self.isUnique = isUnique self.type = type } - + var isValid: Bool { !name.isEmpty && !columns.isEmpty } @@ -89,7 +89,7 @@ struct CheckConstraint: Identifiable, Equatable, Codable { let id: UUID var name: String var expression: String - + init( id: UUID = UUID(), name: String = "", @@ -99,7 +99,7 @@ struct CheckConstraint: Identifiable, Equatable, Codable { self.name = name self.expression = expression } - + var isValid: Bool { !name.isEmpty && !expression.isEmpty } @@ -114,23 +114,23 @@ struct TableCreationOptions: Equatable, Codable { var foreignKeys: [ForeignKeyConstraint] = [] var indexes: [IndexDefinition] = [] var checkConstraints: [CheckConstraint] = [] - + // MySQL/MariaDB specific (in Advanced Options) var engine: String? = "InnoDB" var charset: String? = "utf8mb4" var collation: String? = "utf8mb4_unicode_ci" var comment: String? = "" - + // PostgreSQL specific (in Advanced Options) var tablespace: String? = "" - + var isValid: Bool { - !tableName.isEmpty && - !columns.isEmpty && - columns.allSatisfy { $0.isValid } && - Set(columns.map { $0.name.lowercased() }).count == columns.count + !tableName.isEmpty && + !columns.isEmpty && + columns.allSatisfy { $0.isValid } && + Set(columns.map { $0.name.lowercased() }).count == columns.count } - + var hasPrimaryKey: Bool { !primaryKeyColumns.isEmpty } @@ -141,15 +141,15 @@ struct ColumnDefinition: Identifiable, Equatable, Codable { let id: UUID var name: String var dataType: String - var length: Int? = nil - var precision: Int? = nil + var length: Int? + var precision: Int? var notNull: Bool = false - var defaultValue: String? = nil + var defaultValue: String? var autoIncrement: Bool = false var unsigned: Bool = false // MySQL only var zerofill: Bool = false // MySQL only - var comment: String? = nil - + var comment: String? + init( id: UUID = UUID(), name: String = "", @@ -175,11 +175,11 @@ struct ColumnDefinition: Identifiable, Equatable, Codable { self.zerofill = zerofill self.comment = comment } - + var isValid: Bool { !name.isEmpty && !dataType.isEmpty } - + var fullDataType: String { var type = dataType.uppercased() if let len = length { @@ -191,15 +191,15 @@ struct ColumnDefinition: Identifiable, Equatable, Codable { } return type } - + func needsLength(for dbType: DatabaseType) -> Bool { let typeUpper = dataType.uppercased() - return typeUpper.contains("VARCHAR") || - typeUpper.contains("CHAR") || - typeUpper == "VARBINARY" || - typeUpper == "BINARY" + return typeUpper.contains("VARCHAR") || + typeUpper.contains("CHAR") || + typeUpper == "VARBINARY" || + typeUpper == "BINARY" } - + func supportsAutoIncrement(for dbType: DatabaseType) -> Bool { let typeUpper = dataType.uppercased() let integerTypes = ["INT", "INTEGER", "BIGINT", "SMALLINT", "TINYINT", "MEDIUMINT"] @@ -217,9 +217,9 @@ enum ColumnTemplate: String, CaseIterable, Identifiable { case createdAt = "Created At" case updatedAt = "Updated At" case isActive = "Is Active (BOOLEAN)" - + var id: String { rawValue } - + func createColumn(for dbType: DatabaseType) -> ColumnDefinition { switch self { case .id: @@ -290,7 +290,7 @@ enum DataTypeCategory: String, CaseIterable { case dateTime = "Date & Time" case binary = "Binary" case other = "Other" - + func types(for dbType: DatabaseType) -> [String] { switch self { case .numeric: diff --git a/TablePro/Models/TableFilter.swift b/TablePro/Models/TableFilter.swift index 56eab05c..6452b830 100644 --- a/TablePro/Models/TableFilter.swift +++ b/TablePro/Models/TableFilter.swift @@ -123,7 +123,7 @@ struct TableFilter: Identifiable, Equatable, Codable { var isRawSQL: Bool { columnName == Self.rawSQLColumn } - + /// Validation error message (nil if valid) var validationError: String? { if columnName == Self.rawSQLColumn { @@ -132,11 +132,11 @@ struct TableFilter: Identifiable, Equatable, Codable { } return nil } - + if columnName.isEmpty { return "Please select a column" } - + if filterOperator.requiresValue { if value.isEmpty { return "Value is required" @@ -145,7 +145,7 @@ struct TableFilter: Identifiable, Equatable, Codable { return "Second value is required for BETWEEN" } } - + return nil } } diff --git a/TablePro/Models/TableMetadata.swift b/TablePro/Models/TableMetadata.swift index ca94e1db..288defb5 100644 --- a/TablePro/Models/TableMetadata.swift +++ b/TablePro/Models/TableMetadata.swift @@ -20,16 +20,16 @@ struct TableMetadata { let collation: String? // MySQL/MariaDB only let createTime: Date? let updateTime: Date? - + /// Format a size in bytes to human readable format static func formatSize(_ bytes: Int64?) -> String { guard let bytes = bytes else { return "—" } if bytes == 0 { return "0 B" } - + let units = ["B", "KB", "MB", "GB", "TB"] - let exponent = min(Int(log(Double(bytes)) / log(1024)), units.count - 1) - let size = Double(bytes) / pow(1024, Double(exponent)) - + let exponent = min(Int(log(Double(bytes)) / log(1_024)), units.count - 1) + let size = Double(bytes) / pow(1_024, Double(exponent)) + if exponent == 0 { return "\(bytes) B" } else { diff --git a/TablePro/TableProApp.swift b/TablePro/TableProApp.swift index 1d148453..2a5dac9b 100644 --- a/TablePro/TableProApp.swift +++ b/TablePro/TableProApp.swift @@ -25,7 +25,8 @@ final class AppState: ObservableObject { /// Custom Commands struct to properly access FocusedValue for disabling ESC when sheet is open struct PasteboardCommands: Commands { @ObservedObject var appState: AppState - @FocusedValue(\.isDatabaseSwitcherOpen) var isDatabaseSwitcherOpen: Bool? + @FocusedValue(\.isDatabaseSwitcherOpen) + var isDatabaseSwitcherOpen: Bool? var body: some Commands { CommandGroup(replacing: .pasteboard) { @@ -99,8 +100,9 @@ struct PasteboardCommands: Commands { @main struct TableProApp: App { // Connect AppKit delegate for proper window configuration - @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate - + @NSApplicationDelegateAdaptor(AppDelegate.self) + var appDelegate + @StateObject private var appState = AppState.shared @StateObject private var dbManager = DatabaseManager.shared @@ -112,14 +114,14 @@ struct TableProApp: App { .windowStyle(.hiddenTitleBar) .windowResizability(.contentSize) .defaultSize(width: 700, height: 450) - + // Connection Form Window - opens when creating/editing a connection WindowGroup("Connection", id: "connection-form", for: UUID?.self) { $connectionId in - ConnectionFormView(connectionId: connectionId ?? nil) + ConnectionFormView(connectionId: connectionId) } .windowStyle(.hiddenTitleBar) .windowResizability(.contentSize) - + // Main Window - opens when connecting to database WindowGroup(id: "main") { ContentView() @@ -127,7 +129,7 @@ struct TableProApp: App { .background(OpenWindowHandler()) } .windowStyle(.automatic) - .defaultSize(width: 1200, height: 800) + .defaultSize(width: 1_200, height: 800) .commands { // File menu CommandGroup(replacing: .newItem) { @@ -143,7 +145,7 @@ struct TableProApp: App { } .keyboardShortcut("t", modifiers: .command) .disabled(!appState.isConnected) - + Button("New Table...") { NotificationCenter.default.post(name: .createTable, object: nil) } @@ -200,7 +202,7 @@ struct TableProApp: App { .keyboardShortcut("i", modifiers: [.command, .shift]) .disabled(!appState.isConnected) } - + // Edit menu - Undo/Redo (smart handling for both text editor and data grid) CommandGroup(replacing: .undoRedo) { Button("Undo") { @@ -215,7 +217,7 @@ struct TableProApp: App { } } .keyboardShortcut("z", modifiers: .command) - + Button("Redo") { // Check if first responder is a text view (SQL editor) if let firstResponder = NSApp.keyWindow?.firstResponder, @@ -229,14 +231,14 @@ struct TableProApp: App { } .keyboardShortcut("z", modifiers: [.command, .shift]) } - + // Edit menu - pasteboard commands with FocusedValue support PasteboardCommands(appState: appState) // Edit menu - row operations (after pasteboard) CommandGroup(after: .pasteboard) { Divider() - + Button("Add Row") { NotificationCenter.default.post(name: .addNewRow, object: nil) } @@ -250,7 +252,7 @@ struct TableProApp: App { .disabled(!appState.isCurrentTabEditable) Divider() - + // Table operations (work when tables selected in sidebar) Button("Truncate Table") { NotificationCenter.default.post(name: .truncateTables, object: nil) @@ -280,7 +282,7 @@ struct TableProApp: App { } .keyboardShortcut("f", modifiers: .command) .disabled(!appState.isConnected) - + Button("Toggle History") { NotificationCenter.default.post(name: .toggleHistoryPanel, object: nil) } @@ -323,13 +325,13 @@ extension Notification.Name { static let applyAllFilters = Notification.Name("applyAllFilters") static let duplicateFilter = Notification.Name("duplicateFilter") static let removeFilter = Notification.Name("removeFilter") - + // History panel notifications static let toggleHistoryPanel = Notification.Name("toggleHistoryPanel") // Database switcher notifications static let openDatabaseSwitcher = Notification.Name("openDatabaseSwitcher") - + // Table creation notifications static let createTable = Notification.Name("createTable") @@ -347,8 +349,9 @@ extension Notification.Name { /// Helper view that listens for openWelcomeWindow notification private struct OpenWindowHandler: View { - @Environment(\.openWindow) private var openWindow - + @Environment(\.openWindow) + private var openWindow + var body: some View { Color.clear .frame(width: 0, height: 0) diff --git a/TablePro/Theme/DesignConstants.swift b/TablePro/Theme/DesignConstants.swift index 6615ddca..55e71f47 100644 --- a/TablePro/Theme/DesignConstants.swift +++ b/TablePro/Theme/DesignConstants.swift @@ -6,13 +6,12 @@ // Use these constants throughout the app for consistent sizing, spacing, and typography. // -import Foundation import AppKit +import Foundation import SwiftUI /// Design system constants following macOS Human Interface Guidelines enum DesignConstants { - // MARK: - Font Sizes /// Standard font sizes following macOS typography scale @@ -103,7 +102,7 @@ enum DesignConstants { enum RowHeight { /// Compact row height (24pt) - Use for dense data tables, autocomplete static let compact: CGFloat = 24 - + /// Table row height (32pt) - Use for table editors like column list static let table: CGFloat = 32 @@ -119,9 +118,9 @@ enum DesignConstants { /// SwiftUI EdgeInsets version for list rows /// Note: SwiftUI EdgeInsets uses top/leading/bottom/trailing static let swiftUIListRowInsets = EdgeInsets(top: 4, leading: 8, bottom: 4, trailing: 8) - + // MARK: - Colors - + /// Semantic colors for UI elements enum Colors { // Backgrounds @@ -130,92 +129,92 @@ enum DesignConstants { static let alternateRow = Color(nsColor: .controlBackgroundColor).opacity(0.5) static let hoverBackground = Color.accentColor.opacity(0.05) static let selectedBackground = Color.accentColor.opacity(0.1) - + // Borders static let border = Color(nsColor: .separatorColor) static let selectedBorder = Color.accentColor - + // Text static let primaryText = Color.primary static let secondaryText = Color.secondary static let tertiaryText = Color.secondary.opacity(0.6) - + // Semantic static let success = Color.green static let warning = Color.orange static let error = Color.red static let info = Color.blue - + // Badges static let badgeBackground = Color.secondary.opacity(0.15) static let primaryKeyBadge = Color.blue.opacity(0.15) static let autoIncrementBadge = Color.purple.opacity(0.15) static let nullBadge = Color.secondary.opacity(0.1) } - + // MARK: - Corner Radius - + /// Standard corner radius values enum CornerRadius { /// Small radius (4pt) - Use for badges, pills static let small: CGFloat = 4 - + /// Medium radius (6pt) - Use for cards, sections static let medium: CGFloat = 6 - + /// Large radius (8pt) - Use for panels, modals static let large: CGFloat = 8 } - + // MARK: - Animation Duration - + /// Standard animation durations enum AnimationDuration { /// Fast animation (100ms) - Use for hover states static let fast: Double = 0.1 - + /// Normal animation (150ms) - Use for button presses static let normal: Double = 0.15 - + /// Smooth animation (200ms) - Use for panel slides static let smooth: Double = 0.2 - + /// Slow animation (300ms) - Use for section expand/collapse static let slow: Double = 0.3 } - + // MARK: - Shadow - + /// Standard shadow styles enum Shadow { /// Card shadow (subtle elevation) - static let card: (color: Color, radius: CGFloat, x: CGFloat, y: CGFloat) = + static let card: (color: Color, radius: CGFloat, x: CGFloat, y: CGFloat) = (Color.black.opacity(0.1), 4, 0, 2) - + /// Panel shadow (stronger elevation) - static let panel: (color: Color, radius: CGFloat, x: CGFloat, y: CGFloat) = + static let panel: (color: Color, radius: CGFloat, x: CGFloat, y: CGFloat) = (Color.black.opacity(0.15), 8, -2, 0) } - + // MARK: - Column Widths (for table editors) - + /// Standard column widths for table-style layouts enum ColumnWidth { /// Drag handle column (24pt) static let dragHandle: CGFloat = 24 - + /// Actions column (80pt) static let actions: CGFloat = 80 - + /// Name column (minimum 140pt, flexible) static let nameMin: CGFloat = 140 - + /// Type column (minimum 120pt, flexible) static let typeMin: CGFloat = 120 - + /// Attributes column (minimum 100pt, flexible) static let attributesMin: CGFloat = 100 - + /// Default column (minimum 100pt, flexible) static let defaultMin: CGFloat = 100 } diff --git a/TablePro/Theme/Theme.swift b/TablePro/Theme/Theme.swift index 06aafef9..f744e76c 100644 --- a/TablePro/Theme/Theme.swift +++ b/TablePro/Theme/Theme.swift @@ -9,63 +9,62 @@ import SwiftUI /// App-wide theme colors and styles enum Theme { - // MARK: - Brand Colors - + static let primaryColor = Color("AccentColor") - + static let mysqlColor = Color.orange static let postgresqlColor = Color.blue static let sqliteColor = Color.green static let mariadbColor = Color.cyan - + // MARK: - Semantic Colors - + static var background: Color { Color(nsColor: .windowBackgroundColor) } - + static var secondaryBackground: Color { Color(nsColor: .controlBackgroundColor) } - + static var textBackground: Color { Color(nsColor: .textBackgroundColor) } - + static var separator: Color { Color(nsColor: .separatorColor) } - + // MARK: - Editor Colors - + static let editorBackground = Color(nsColor: .textBackgroundColor) static let editorFont = Font.system(.body, design: .monospaced) - + static let syntaxKeyword = Color.pink static let syntaxString = Color.green static let syntaxNumber = Color.blue static let syntaxComment = Color.gray - + // MARK: - Results Table Colors - + static var tableAlternateRow: Color { Color(nsColor: .alternatingContentBackgroundColors[1]) } - + static let nullValue = Color.secondary.opacity(0.5) static let boolTrue = Color.green static let boolFalse = Color.red - + // MARK: - Status Colors - + static let success = Color.green static let warning = Color.orange static let error = Color.red static let info = Color.blue - + // MARK: - Connection Status - + static let connected = Color.green static let disconnected = Color.gray static let connecting = Color.orange @@ -80,7 +79,7 @@ extension View { .background(Theme.secondaryBackground) .clipShape(RoundedRectangle(cornerRadius: 8)) } - + /// Apply toolbar button styling func toolbarButtonStyle() -> some View { self @@ -105,4 +104,3 @@ extension DatabaseType { } } } - diff --git a/TablePro/Views/Components/EmptyStateView.swift b/TablePro/Views/Components/EmptyStateView.swift index 4e0c88ec..bcb293ad 100644 --- a/TablePro/Views/Components/EmptyStateView.swift +++ b/TablePro/Views/Components/EmptyStateView.swift @@ -14,7 +14,7 @@ struct EmptyStateView: View { let description: String? let actionTitle: String? let action: (() -> Void)? - + init( icon: String, title: String, @@ -28,7 +28,7 @@ struct EmptyStateView: View { self.actionTitle = actionTitle self.action = action } - + var body: some View { VStack(spacing: DesignConstants.Spacing.sm) { // Icon @@ -36,12 +36,12 @@ struct EmptyStateView: View { .font(.system(size: DesignConstants.IconSize.huge)) .foregroundStyle(DesignConstants.Colors.tertiaryText) .padding(.bottom, DesignConstants.Spacing.xxs) - + // Title Text(title) .font(.system(size: DesignConstants.FontSize.body, weight: .medium)) .foregroundStyle(DesignConstants.Colors.secondaryText) - + // Description (optional) if let description = description { Text(description) @@ -50,7 +50,7 @@ struct EmptyStateView: View { .multilineTextAlignment(.center) .fixedSize(horizontal: false, vertical: true) } - + // Action button (optional) if let actionTitle = actionTitle, let action = action { Button(action: action) { @@ -83,7 +83,7 @@ extension EmptyStateView { action: onAdd ) } - + /// Empty state for indexes static func indexes(onAdd: @escaping () -> Void) -> EmptyStateView { EmptyStateView( @@ -94,7 +94,7 @@ extension EmptyStateView { action: onAdd ) } - + /// Empty state for check constraints static func checkConstraints(onAdd: @escaping () -> Void) -> EmptyStateView { EmptyStateView( @@ -105,7 +105,7 @@ extension EmptyStateView { action: onAdd ) } - + /// Empty state for columns static func columns(onAdd: @escaping () -> Void) -> EmptyStateView { EmptyStateView( diff --git a/TablePro/Views/Components/PaginationControlsView.swift b/TablePro/Views/Components/PaginationControlsView.swift index a85a1b78..be9c96a9 100644 --- a/TablePro/Views/Components/PaginationControlsView.swift +++ b/TablePro/Views/Components/PaginationControlsView.swift @@ -17,18 +17,18 @@ struct PaginationControlsView: View { let onLimitChange: (Int) -> Void let onOffsetChange: (Int) -> Void let onGo: () -> Void - + @State private var limitText: String = "" @State private var offsetText: String = "" @State private var showSettings = false @FocusState private var isLimitFocused: Bool @FocusState private var isOffsetFocused: Bool - + var body: some View { HStack(spacing: 8) { // Navigation buttons navigationButtons - + // Settings button (gear icon) - opens popover Button(action: { showSettings.toggle() }) { Image(systemName: "slider.horizontal.3") @@ -51,9 +51,9 @@ struct PaginationControlsView: View { offsetText = "\(newValue)" } } - + // MARK: - Navigation Buttons - + private var navigationButtons: some View { HStack(spacing: 4) { // Previous page button @@ -65,13 +65,13 @@ struct PaginationControlsView: View { .disabled(!pagination.hasPreviousPage || pagination.isLoading) .help("Previous Page (⌘[)") .keyboardShortcut("[", modifiers: .command) - + // Page indicator: "1 of 25" Text("\(pagination.currentPage) of \(pagination.totalPages)") .font(.caption) .foregroundStyle(.secondary) .frame(minWidth: 60) - + // Next page button Button(action: onNext) { Image(systemName: "chevron.right") @@ -83,9 +83,9 @@ struct PaginationControlsView: View { .keyboardShortcut("]", modifiers: .command) } } - + // MARK: - Settings Popover - + private var settingsPopover: some View { VStack(alignment: .leading, spacing: 12) { // Limit field @@ -101,7 +101,7 @@ struct PaginationControlsView: View { applyLimitChange() } } - + // Offset field VStack(alignment: .leading, spacing: 4) { Text("Offset") @@ -115,7 +115,7 @@ struct PaginationControlsView: View { applyOffsetChange() } } - + // Go button Button(action: { applyLimitChange() @@ -131,9 +131,9 @@ struct PaginationControlsView: View { .padding(12) .frame(width: 160) } - + // MARK: - Helpers - + private func applyLimitChange() { if let limit = Int(limitText), limit > 0 { onLimitChange(limit) @@ -141,7 +141,7 @@ struct PaginationControlsView: View { limitText = "\(pagination.pageSize)" } } - + private func applyOffsetChange() { if let offset = Int(offsetText), offset >= 0 { onOffsetChange(offset) @@ -156,7 +156,7 @@ struct PaginationControlsView: View { // Preview with multiple pages PaginationControlsView( pagination: PaginationState( - totalRowCount: 5000, + totalRowCount: 5_000, pageSize: 200, currentPage: 3, currentOffset: 400, @@ -170,11 +170,11 @@ struct PaginationControlsView: View { onOffsetChange: { _ in }, onGo: {} ) - + // Preview on first page PaginationControlsView( pagination: PaginationState( - totalRowCount: 1000, + totalRowCount: 1_000, pageSize: 200, currentPage: 1, currentOffset: 0, @@ -188,11 +188,11 @@ struct PaginationControlsView: View { onOffsetChange: { _ in }, onGo: {} ) - + // Preview loading state PaginationControlsView( pagination: PaginationState( - totalRowCount: 5000, + totalRowCount: 5_000, pageSize: 200, currentPage: 2, currentOffset: 200, diff --git a/TablePro/Views/Components/SectionHeaderView.swift b/TablePro/Views/Components/SectionHeaderView.swift index c05613d8..96e7e9cc 100644 --- a/TablePro/Views/Components/SectionHeaderView.swift +++ b/TablePro/Views/Components/SectionHeaderView.swift @@ -15,7 +15,7 @@ struct SectionHeaderView: View { let isCollapsible: Bool @Binding var isExpanded: Bool let actions: () -> Actions - + init( title: String, icon: String? = nil, @@ -31,7 +31,7 @@ struct SectionHeaderView: View { self._isExpanded = isExpanded self.actions = actions } - + var body: some View { HStack(spacing: DesignConstants.Spacing.xs) { // Collapse/expand chevron (if collapsible) @@ -42,36 +42,36 @@ struct SectionHeaderView: View { .rotationEffect(.degrees(isExpanded ? 90 : 0)) .animation(.easeInOut(duration: DesignConstants.AnimationDuration.normal), value: isExpanded) } - + // Icon (optional) if let icon = icon { Image(systemName: icon) .font(.system(size: DesignConstants.FontSize.body)) .foregroundStyle(DesignConstants.Colors.secondaryText) } - + // Title Text(title) .font(.system(size: DesignConstants.FontSize.title3, weight: .semibold)) .foregroundStyle(DesignConstants.Colors.primaryText) - + // Count badge (optional) if let count = count { Text("(\(count))") .font(.system(size: DesignConstants.FontSize.small)) .foregroundStyle(DesignConstants.Colors.tertiaryText) } - + Spacer() - + // Action buttons actions() } .padding(.horizontal, DesignConstants.Spacing.sm) .padding(.vertical, DesignConstants.Spacing.xs) .background( - isCollapsible ? - DesignConstants.Colors.sectionBackground.opacity(0.5) : + isCollapsible ? + DesignConstants.Colors.sectionBackground.opacity(0.5) : Color.clear ) .cornerRadius(DesignConstants.CornerRadius.medium) @@ -99,8 +99,7 @@ extension SectionHeaderView where Actions == EmptyView { icon: icon, count: count, isCollapsible: isCollapsible, - isExpanded: isExpanded, - actions: { EmptyView() } - ) + isExpanded: isExpanded + ) { EmptyView() } } } diff --git a/TablePro/Views/Connection/ConnectionFormView.swift b/TablePro/Views/Connection/ConnectionFormView.swift index d05ff1d4..350faf11 100644 --- a/TablePro/Views/Connection/ConnectionFormView.swift +++ b/TablePro/Views/Connection/ConnectionFormView.swift @@ -12,13 +12,13 @@ import UniformTypeIdentifiers struct ConnectionFormView: View { @Environment(\.dismissWindow) private var dismissWindow @Environment(\.openWindow) private var openWindow - + // Connection ID: nil = new connection, UUID = edit existing let connectionId: UUID? - + private let storage = ConnectionStorage.shared @StateObject private var dbManager = DatabaseManager.shared - + // Computed property for isNew private var isNew: Bool { connectionId == nil } @@ -44,11 +44,11 @@ struct ConnectionFormView: View { // Color and Tag @State private var connectionColor: ConnectionColor = .none - @State private var selectedTagId: UUID? = nil + @State private var selectedTagId: UUID? @State private var isTesting: Bool = false @State private var testResult: TestResult? - + // Store original connection for editing @State private var originalConnection: DatabaseConnection? @@ -68,7 +68,7 @@ struct ConnectionFormView: View { } .padding(.top, DesignConstants.Spacing.md) .padding(.bottom, 16) - + // Form content ScrollView { VStack(alignment: .leading, spacing: 20) { @@ -327,7 +327,7 @@ struct ConnectionFormView: View { .controlSize(.small) } } - + FormField(label: "Passphrase", icon: "key") { SecureField("(optional)", text: $keyPassphrase) .textFieldStyle(.plain) @@ -529,7 +529,7 @@ struct ConnectionFormView: View { NotificationCenter.default.post(name: .connectionUpdated, object: nil) } } - + private func deleteConnection() { guard let id = connectionId else { return } var savedConnections = storage.loadConnections() @@ -538,11 +538,11 @@ struct ConnectionFormView: View { dismissWindow(id: "connection-form") NotificationCenter.default.post(name: .connectionUpdated, object: nil) } - + private func connectToDatabase(_ connection: DatabaseConnection) { openWindow(id: "main") dismissWindow(id: "welcome") - + Task { do { try await dbManager.connectToSession(connection) @@ -552,7 +552,7 @@ struct ConnectionFormView: View { } } - private func testConnection() { + func testConnection() { isTesting = true testResult = nil diff --git a/TablePro/Views/Connection/ConnectionSidebarHeader.swift b/TablePro/Views/Connection/ConnectionSidebarHeader.swift index 173489e3..e6f85bec 100644 --- a/TablePro/Views/Connection/ConnectionSidebarHeader.swift +++ b/TablePro/Views/Connection/ConnectionSidebarHeader.swift @@ -14,14 +14,14 @@ struct ConnectionSidebarHeader: View { let onSelectSession: (UUID) -> Void let onOpenConnection: (DatabaseConnection) -> Void let onNewConnection: () -> Void - + @State private var showConnectionMenu = false - + private var currentSession: ConnectionSession? { guard let id = currentSessionId else { return nil } return sessions.first { $0.id == id } } - + var body: some View { VStack(spacing: 0) { // Connection selector button @@ -37,14 +37,14 @@ struct ConnectionSidebarHeader: View { Image(session.connection.type.iconName) .renderingMode(.template) .foregroundStyle(session.connection.displayColor) - + Text(session.connection.database) - + Spacer() - + // Status indicator statusIndicator(for: session) - + // Checkmark for active if session.id == currentSessionId { Image(systemName: "checkmark") @@ -54,13 +54,13 @@ struct ConnectionSidebarHeader: View { } } } - + // Saved connections if !savedConnections.isEmpty { if !sessions.isEmpty { Divider() } - + Section("Saved Connections") { ForEach(savedConnections) { connection in Button(action: { @@ -77,11 +77,11 @@ struct ConnectionSidebarHeader: View { } } } - + if !sessions.isEmpty || !savedConnections.isEmpty { Divider() } - + // New connection Button(action: onNewConnection) { Label("New Connection", systemImage: "plus.circle") @@ -125,17 +125,17 @@ struct ConnectionSidebarHeader: View { .contentShape(Rectangle()) } .buttonStyle(.plain) - + Divider() } } - + // MARK: - Helpers - + private var sortedSessions: [ConnectionSession] { sessions.sorted { $0.lastActiveAt > $1.lastActiveAt } } - + @ViewBuilder private func statusIndicator(for session: ConnectionSession) -> some View { HStack(spacing: 4) { @@ -150,7 +150,7 @@ struct ConnectionSidebarHeader: View { } } } - + private func statusColor(for session: ConnectionSession) -> Color { switch session.status { case .connected: @@ -174,7 +174,7 @@ struct ConnectionSidebarHeader: View { type: .mysql ) ) - + var session2 = ConnectionSession( connection: DatabaseConnection( name: "PostgreSQL Production", @@ -182,12 +182,12 @@ struct ConnectionSidebarHeader: View { ) ) session2.status = .connected - + let savedConnections = [ DatabaseConnection(name: "Development DB", type: .mysql), DatabaseConnection(name: "Staging DB", type: .postgresql) ] - + return VStack(spacing: 0) { ConnectionSidebarHeader( sessions: [session1, session2], @@ -197,7 +197,7 @@ struct ConnectionSidebarHeader: View { onOpenConnection: { _ in }, onNewConnection: {} ) - + Rectangle() .fill(Color(nsColor: .textBackgroundColor)) } diff --git a/TablePro/Views/Connection/ConnectionTagEditor.swift b/TablePro/Views/Connection/ConnectionTagEditor.swift index 3f09a141..119ba164 100644 --- a/TablePro/Views/Connection/ConnectionTagEditor.swift +++ b/TablePro/Views/Connection/ConnectionTagEditor.swift @@ -107,14 +107,12 @@ struct ConnectionTagEditor: View { } .onAppear { allTags = tagStorage.loadTags() } .sheet(isPresented: $showingCreateSheet) { - CreateTagSheet( - onSave: { tagName, tagColor in - let tag = ConnectionTag(name: tagName.lowercased(), isPreset: false, color: tagColor) - tagStorage.addTag(tag) - selectedTagId = tag.id - allTags = tagStorage.loadTags() - } - ) + CreateTagSheet { tagName, tagColor in + let tag = ConnectionTag(name: tagName.lowercased(), isPreset: false, color: tagColor) + tagStorage.addTag(tag) + selectedTagId = tag.id + allTags = tagStorage.loadTags() + } } } @@ -233,7 +231,7 @@ private struct TagColorPicker: View { #Preview { struct PreviewWrapper: View { - @State private var tagId: UUID? = nil + @State private var tagId: UUID? var body: some View { VStack(spacing: 20) { diff --git a/TablePro/Views/DatabaseSwitcher/DatabaseSwitcherSheet.swift b/TablePro/Views/DatabaseSwitcher/DatabaseSwitcherSheet.swift index e6f94da8..11a5be00 100644 --- a/TablePro/Views/DatabaseSwitcher/DatabaseSwitcherSheet.swift +++ b/TablePro/Views/DatabaseSwitcher/DatabaseSwitcherSheet.swift @@ -384,10 +384,6 @@ private class PassThroughDoubleClickView: NSView { // Always forward to next responder for List selection super.mouseDown(with: event) } - - override func mouseUp(with event: NSEvent) { - super.mouseUp(with: event) - } } // MARK: - Preview @@ -396,16 +392,14 @@ private class PassThroughDoubleClickView: NSView { DatabaseSwitcherSheet( isPresented: .constant(true), currentDatabase: "laravel", - databaseType: .mysql, - onSelect: { db in print("Selected: \(db)") } - ) + databaseType: .mysql + ) { db in print("Selected: \(db)") } } #Preview("SQLite Empty") { DatabaseSwitcherSheet( isPresented: .constant(true), currentDatabase: nil, - databaseType: .sqlite, - onSelect: { db in print("Selected: \(db)") } - ) + databaseType: .sqlite + ) { db in print("Selected: \(db)") } } diff --git a/TablePro/Views/Editor/BookmarkEditorController.swift b/TablePro/Views/Editor/BookmarkEditorController.swift index 2cbdd669..4f2bb714 100644 --- a/TablePro/Views/Editor/BookmarkEditorController.swift +++ b/TablePro/Views/Editor/BookmarkEditorController.swift @@ -9,7 +9,6 @@ import AppKit /// Native AppKit controller for bookmark editor using standard macOS form patterns final class BookmarkEditorController: NSViewController { - // MARK: - Properties private var bookmark: QueryBookmark? @@ -74,7 +73,7 @@ final class BookmarkEditorController: NSViewController { title = isEditing ? "Edit Bookmark" : "New Bookmark" populateFields() preferredContentSize = NSSize(width: 520, height: 380) - + // Add accessibility identifiers nameField.setAccessibilityIdentifier("bookmarkNameField") tagsField.setAccessibilityIdentifier("bookmarkTagsField") diff --git a/TablePro/Views/Editor/BookmarkEditorView.swift b/TablePro/Views/Editor/BookmarkEditorView.swift index 9cf2e07b..bee62c32 100644 --- a/TablePro/Views/Editor/BookmarkEditorView.swift +++ b/TablePro/Views/Editor/BookmarkEditorView.swift @@ -8,45 +8,44 @@ import SwiftUI struct BookmarkEditorView: View { - // MARK: - Properties - + @Environment(\.dismiss) private var dismiss - + private let bookmark: QueryBookmark? private let query: String private let connectionId: UUID? private let isEditing: Bool private let onSave: (QueryBookmark) -> Void - + @State private var name: String @State private var tags: String @State private var notes: String @State private var showingValidationAlert = false - + @FocusState private var focusedField: Field? - + private enum Field { case name, tags, notes } - + // MARK: - Initialization - + init(bookmark: QueryBookmark? = nil, query: String, connectionId: UUID?, onSave: @escaping (QueryBookmark) -> Void) { self.bookmark = bookmark self.query = query self.connectionId = connectionId self.isEditing = bookmark != nil self.onSave = onSave - + // Initialize state from bookmark _name = State(initialValue: bookmark?.name ?? "") _tags = State(initialValue: bookmark?.formattedTags ?? "") _notes = State(initialValue: bookmark?.notes ?? "") } - + // MARK: - Body - + var body: some View { VStack(spacing: 0) { // Content area with form fields @@ -59,7 +58,7 @@ struct BookmarkEditorView: View { .focused($focusedField, equals: .name) .submitLabel(.done) } - + // SQL Query (read-only preview) FormRow(label: "Query") { ScrollView { @@ -78,7 +77,7 @@ struct BookmarkEditorView: View { .strokeBorder(Color(nsColor: .separatorColor), lineWidth: 0.5) ) } - + // Tags field FormRow(label: "Tags") { TextField("e.g., reports, analytics, daily", text: $tags) @@ -86,7 +85,7 @@ struct BookmarkEditorView: View { .focused($focusedField, equals: .tags) .submitLabel(.done) } - + // Notes field FormRow(label: "Notes") { TextEditor(text: $notes) @@ -105,17 +104,17 @@ struct BookmarkEditorView: View { } .padding(20) } - + Divider() - + // Footer with buttons HStack(spacing: 12) { Spacer() - + Button("Cancel") { dismiss() } - + Button(isEditing ? "Save" : "Save Bookmark") { saveBookmark() } @@ -134,20 +133,20 @@ struct BookmarkEditorView: View { Text("Please enter a name for this bookmark.") } } - + // MARK: - Actions - + private func saveBookmark() { let trimmedName = name.trimmingCharacters(in: .whitespacesAndNewlines) - + guard !trimmedName.isEmpty else { showingValidationAlert = true return } - + let parsedTags = QueryBookmark.parseTags(tags) let trimmedNotes = notes.trimmingCharacters(in: .whitespacesAndNewlines) - + let savedBookmark: QueryBookmark if let existing = bookmark { savedBookmark = QueryBookmark( @@ -169,7 +168,7 @@ struct BookmarkEditorView: View { notes: trimmedNotes.isEmpty ? nil : trimmedNotes ) } - + onSave(savedBookmark) dismiss() } @@ -181,14 +180,14 @@ struct BookmarkEditorView: View { private struct FormRow: View { let label: String @ViewBuilder let content: Content - + var body: some View { HStack(alignment: .top, spacing: 12) { Text(label + ":") .frame(width: 60, alignment: .trailing) .foregroundStyle(.secondary) .padding(.top, 6) - + content .frame(maxWidth: .infinity) } @@ -200,7 +199,6 @@ private struct FormRow: View { #Preview { BookmarkEditorView( query: "SELECT * FROM users WHERE created_at > NOW() - INTERVAL 7 DAY", - connectionId: nil as UUID?, - onSave: { _ in } - ) + connectionId: nil as UUID? + ) { _ in } } diff --git a/TablePro/Views/Editor/ColumnDetailEditor.swift b/TablePro/Views/Editor/ColumnDetailEditor.swift index 53121c8d..8dbf3603 100644 --- a/TablePro/Views/Editor/ColumnDetailEditor.swift +++ b/TablePro/Views/Editor/ColumnDetailEditor.swift @@ -11,138 +11,138 @@ import SwiftUI struct ColumnDetailEditor: View { @Binding var column: ColumnDefinition let databaseType: DatabaseType - + var body: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.sm) { Text("Column Details") .font(.system(size: DesignConstants.FontSize.body, weight: .semibold)) - + Form { // Column name TextField("Column Name", text: $column.name) .textFieldStyle(.roundedBorder) - + // Data type picker HStack { Text("Data Type:") .frame(width: 100, alignment: .trailing) - + DataTypePicker( selectedType: $column.dataType, databaseType: databaseType ) } - + // Length (for VARCHAR, CHAR, etc.) if column.needsLength(for: databaseType) { HStack { Text("Length:") .frame(width: 100, alignment: .trailing) - + TextField("Length", value: $column.length, format: .number) .textFieldStyle(.roundedBorder) .frame(width: 100) } } - + // Precision/Scale (for DECIMAL, NUMERIC) - if column.dataType.uppercased().contains("DECIMAL") || - column.dataType.uppercased().contains("NUMERIC") { + if column.dataType.uppercased().contains("DECIMAL") || + column.dataType.uppercased().contains("NUMERIC") { HStack { Text("Precision:") .frame(width: 100, alignment: .trailing) - + TextField("Precision", value: $column.length, format: .number) .textFieldStyle(.roundedBorder) .frame(width: 80) - + Text("Scale:") - + TextField("Scale", value: $column.precision, format: .number) .textFieldStyle(.roundedBorder) .frame(width: 80) } } - + // NOT NULL checkbox Toggle("NOT NULL", isOn: $column.notNull) .toggleStyle(.checkbox) - + // Auto-increment (for integer types only) if column.supportsAutoIncrement(for: databaseType) { Toggle("Auto Increment", isOn: $column.autoIncrement) .toggleStyle(.checkbox) } - + // Unsigned (MySQL only) - if (databaseType == .mysql || databaseType == .mariadb) && - isNumericType(column.dataType) { + if (databaseType == .mysql || databaseType == .mariadb) && + isNumericType(column.dataType) { Toggle("Unsigned", isOn: $column.unsigned) .toggleStyle(.checkbox) } - + // Zerofill (MySQL only) - if (databaseType == .mysql || databaseType == .mariadb) && - isNumericType(column.dataType) { + if (databaseType == .mysql || databaseType == .mariadb) && + isNumericType(column.dataType) { Toggle("Zero Fill", isOn: $column.zerofill) .toggleStyle(.checkbox) } - + // Default value HStack { Text("Default:") .frame(width: 100, alignment: .trailing) - + TextField("Default Value", text: Binding( get: { column.defaultValue ?? "" }, set: { column.defaultValue = $0.isEmpty ? nil : $0 } )) .textFieldStyle(.roundedBorder) } - + // Quick default buttons HStack { Text("") .frame(width: 100) - + HStack(spacing: 4) { Button("NULL") { column.defaultValue = "NULL" } .buttonStyle(.borderless) .controlSize(.small) - + Button("''") { column.defaultValue = "''" } .buttonStyle(.borderless) .controlSize(.small) - + Button("0") { column.defaultValue = "0" } .buttonStyle(.borderless) .controlSize(.small) - + if column.dataType.uppercased().contains("TIMESTAMP") || - column.dataType.uppercased().contains("DATETIME") || - column.dataType.uppercased().contains("DATE") { + column.dataType.uppercased().contains("DATETIME") || + column.dataType.uppercased().contains("DATE") { Button("NOW()") { column.defaultValue = databaseType == .postgresql ? "CURRENT_TIMESTAMP" : "NOW()" } .buttonStyle(.borderless) .controlSize(.small) } - + if column.dataType.uppercased() == "BOOLEAN" || - column.dataType.uppercased() == "BOOL" || - column.dataType.uppercased() == "TINYINT" { + column.dataType.uppercased() == "BOOL" || + column.dataType.uppercased() == "TINYINT" { Button("TRUE") { column.defaultValue = databaseType == .postgresql ? "TRUE" : "1" } .buttonStyle(.borderless) .controlSize(.small) - + Button("FALSE") { column.defaultValue = databaseType == .postgresql ? "FALSE" : "0" } @@ -152,7 +152,7 @@ struct ColumnDetailEditor: View { } .font(.caption) } - + // Comment TextField("Comment", text: Binding( get: { column.comment ?? "" }, @@ -163,13 +163,13 @@ struct ColumnDetailEditor: View { .formStyle(.columns) } } - + // MARK: - Helpers - + private func isNumericType(_ dataType: String) -> Bool { let type = dataType.uppercased() - let numericTypes = ["TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT", - "DECIMAL", "NUMERIC", "FLOAT", "DOUBLE", "REAL"] + let numericTypes = ["TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT", + "DECIMAL", "NUMERIC", "FLOAT", "DOUBLE", "REAL"] return numericTypes.contains { type.contains($0) } } } diff --git a/TablePro/Views/Editor/ColumnDetailPanel.swift b/TablePro/Views/Editor/ColumnDetailPanel.swift index bafc603c..82334cd1 100644 --- a/TablePro/Views/Editor/ColumnDetailPanel.swift +++ b/TablePro/Views/Editor/ColumnDetailPanel.swift @@ -13,26 +13,26 @@ struct ColumnDetailPanel: View { let databaseType: DatabaseType let isVisible: Bool let onClose: () -> Void - + var body: some View { VStack(alignment: .leading, spacing: 0) { // Header header - + Divider() - + // Content ScrollView { VStack(alignment: .leading, spacing: DesignConstants.Spacing.md) { // Basic properties basicPropertiesSection - + // Constraints constraintsSection - + // Default value defaultValueSection - + // Comment commentSection } @@ -47,16 +47,16 @@ struct ColumnDetailPanel: View { .frame(width: 1) } } - + // MARK: - Header - + private var header: some View { HStack { Text("Column Details") .font(.system(size: DesignConstants.FontSize.title3, weight: .semibold)) - + Spacer() - + Button(action: onClose) { Image(systemName: "xmark") .font(.system(size: DesignConstants.FontSize.small)) @@ -68,19 +68,19 @@ struct ColumnDetailPanel: View { .padding(DesignConstants.Spacing.md) .background(DesignConstants.Colors.sectionBackground.opacity(0.3)) } - + // MARK: - Sections - + private var basicPropertiesSection: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.sm) { SectionLabel("Basic") - + // Column name DetailFormField(label: "Name") { TextField("Column name", text: $column.name) .textFieldStyle(.roundedBorder) } - + // Data type DetailFormField(label: "Type") { DataTypePicker( @@ -88,7 +88,7 @@ struct ColumnDetailPanel: View { databaseType: databaseType ) } - + // Length (if applicable) if column.needsLength(for: databaseType) { DetailFormField(label: "Length") { @@ -97,17 +97,17 @@ struct ColumnDetailPanel: View { .frame(width: 100) } } - + // Precision/Scale (for DECIMAL) - if column.dataType.uppercased().contains("DECIMAL") || - column.dataType.uppercased().contains("NUMERIC") { + if column.dataType.uppercased().contains("DECIMAL") || + column.dataType.uppercased().contains("NUMERIC") { HStack(spacing: DesignConstants.Spacing.sm) { DetailFormField(label: "Precision") { TextField("", value: $column.length, format: .number) .textFieldStyle(.roundedBorder) .frame(width: 60) } - + DetailFormField(label: "Scale") { TextField("", value: $column.precision, format: .number) .textFieldStyle(.roundedBorder) @@ -117,28 +117,28 @@ struct ColumnDetailPanel: View { } } } - + private var constraintsSection: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.sm) { SectionLabel("Constraints") - + VStack(alignment: .leading, spacing: DesignConstants.Spacing.xs) { Toggle("NOT NULL", isOn: $column.notNull) .toggleStyle(.checkbox) .controlSize(.small) - + if column.supportsAutoIncrement(for: databaseType) { Toggle("Auto Increment", isOn: $column.autoIncrement) .toggleStyle(.checkbox) .controlSize(.small) } - - if (databaseType == .mysql || databaseType == .mariadb) && - isNumericType(column.dataType) { + + if (databaseType == .mysql || databaseType == .mariadb) && + isNumericType(column.dataType) { Toggle("Unsigned", isOn: $column.unsigned) .toggleStyle(.checkbox) .controlSize(.small) - + Toggle("Zero Fill", isOn: $column.zerofill) .toggleStyle(.checkbox) .controlSize(.small) @@ -146,29 +146,29 @@ struct ColumnDetailPanel: View { } } } - + private var defaultValueSection: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.sm) { SectionLabel("Default Value") - + TextField("Default value", text: Binding( get: { column.defaultValue ?? "" }, set: { column.defaultValue = $0.isEmpty ? nil : $0 } )) .textFieldStyle(.roundedBorder) - + // Quick default buttons HStack(spacing: 4) { QuickDefaultButton("NULL") { column.defaultValue = "NULL" } QuickDefaultButton("''") { column.defaultValue = "''" } QuickDefaultButton("0") { column.defaultValue = "0" } - + if supportsTimestampDefaults { QuickDefaultButton("NOW()") { column.defaultValue = databaseType == .postgresql ? "CURRENT_TIMESTAMP" : "NOW()" } } - + if supportsBooleanDefaults { QuickDefaultButton("TRUE") { column.defaultValue = databaseType == .postgresql ? "TRUE" : "1" @@ -180,11 +180,11 @@ struct ColumnDetailPanel: View { } } } - + private var commentSection: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.sm) { SectionLabel("Comment") - + TextField("Optional description", text: Binding( get: { column.comment ?? "" }, set: { column.comment = $0.isEmpty ? nil : $0 } @@ -192,23 +192,23 @@ struct ColumnDetailPanel: View { .textFieldStyle(.roundedBorder) } } - + // MARK: - Helpers - + private var supportsTimestampDefaults: Bool { let type = column.dataType.uppercased() return type.contains("TIMESTAMP") || type.contains("DATETIME") || type.contains("DATE") } - + private var supportsBooleanDefaults: Bool { let type = column.dataType.uppercased() return type == "BOOLEAN" || type == "BOOL" || type == "TINYINT" } - + private func isNumericType(_ dataType: String) -> Bool { let type = dataType.uppercased() - let numericTypes = ["TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT", - "DECIMAL", "NUMERIC", "FLOAT", "DOUBLE", "REAL"] + let numericTypes = ["TINYINT", "SMALLINT", "MEDIUMINT", "INT", "INTEGER", "BIGINT", + "DECIMAL", "NUMERIC", "FLOAT", "DOUBLE", "REAL"] return numericTypes.contains { type.contains($0) } } } @@ -217,11 +217,11 @@ struct ColumnDetailPanel: View { private struct SectionLabel: View { let text: String - + init(_ text: String) { self.text = text } - + var body: some View { Text(text) .font(.system(size: DesignConstants.FontSize.small, weight: .semibold)) @@ -233,18 +233,18 @@ private struct SectionLabel: View { private struct DetailFormField: View { let label: String let content: () -> Content - + init(label: String, @ViewBuilder content: @escaping () -> Content) { self.label = label self.content = content } - + var body: some View { VStack(alignment: .leading, spacing: 4) { Text(label) .font(.system(size: DesignConstants.FontSize.small)) .foregroundStyle(DesignConstants.Colors.secondaryText) - + content() } } @@ -253,12 +253,12 @@ private struct DetailFormField: View { private struct QuickDefaultButton: View { let title: String let action: () -> Void - + init(_ title: String, action: @escaping () -> Void) { self.title = title self.action = action } - + var body: some View { Button(action: action) { Text(title) diff --git a/TablePro/Views/Editor/ColumnEditorRow.swift b/TablePro/Views/Editor/ColumnEditorRow.swift index 19639242..ab624306 100644 --- a/TablePro/Views/Editor/ColumnEditorRow.swift +++ b/TablePro/Views/Editor/ColumnEditorRow.swift @@ -15,7 +15,7 @@ struct ColumnEditorRow: View { let onDelete: () -> Void let onMoveUp: () -> Void let onMoveDown: () -> Void - + var body: some View { HStack(spacing: DesignConstants.Spacing.xs) { // Column name @@ -23,13 +23,13 @@ struct ColumnEditorRow: View { .font(.system(size: DesignConstants.FontSize.body, weight: isSelected ? .medium : .regular)) .foregroundStyle(column.name.isEmpty ? .secondary : .primary) .frame(width: 120, alignment: .leading) - + // Data type with length Text(column.fullDataType) .font(.system(size: DesignConstants.FontSize.small, design: .monospaced)) .foregroundStyle(.secondary) .frame(width: 100, alignment: .leading) - + // Nullable indicator if !column.notNull { Text("NULL") @@ -40,7 +40,7 @@ struct ColumnEditorRow: View { .background(Color.secondary.opacity(0.1)) .cornerRadius(3) } - + // Auto-increment indicator if column.autoIncrement { Text("AUTO") @@ -51,7 +51,7 @@ struct ColumnEditorRow: View { .background(Color.blue.opacity(0.1)) .cornerRadius(3) } - + // Default value if let defaultValue = column.defaultValue, !defaultValue.isEmpty { HStack(spacing: 2) { @@ -64,9 +64,9 @@ struct ColumnEditorRow: View { } .frame(maxWidth: 100, alignment: .leading) } - + Spacer() - + // Action buttons (show on hover or when selected) HStack(spacing: 2) { Button(action: onMoveUp) { @@ -75,14 +75,14 @@ struct ColumnEditorRow: View { } .buttonStyle(.borderless) .help("Move Up") - + Button(action: onMoveDown) { Image(systemName: "chevron.down") .font(.caption) } .buttonStyle(.borderless) .help("Move Down") - + Button(action: onDelete) { Image(systemName: "trash") .font(.caption) diff --git a/TablePro/Views/Editor/ColumnTableRow.swift b/TablePro/Views/Editor/ColumnTableRow.swift index a554ecb5..226e36ae 100644 --- a/TablePro/Views/Editor/ColumnTableRow.swift +++ b/TablePro/Views/Editor/ColumnTableRow.swift @@ -18,32 +18,32 @@ struct ColumnTableRow: View { let onMoveUp: () -> Void let onMoveDown: () -> Void let onEdit: () -> Void - + @State private var isHovered = false - @State private var editingCell: EditingCell? = nil - + @State private var editingCell: EditingCell? + enum EditingCell { case name case defaultValue } - + var body: some View { HStack(spacing: 0) { // Drag handle (visible on hover) dragHandleCell - + // Name cell nameCell - + // Type cell typeCell - + // Attributes cell attributesCell - + // Default cell defaultCell - + // Actions cell (visible on hover/selected) actionsCell } @@ -66,9 +66,9 @@ struct ColumnTableRow: View { isHovered = hovering } } - + // MARK: - Cells - + private var dragHandleCell: some View { Image(systemName: "line.3.horizontal") .font(.system(size: 10)) @@ -76,7 +76,7 @@ struct ColumnTableRow: View { .frame(width: DesignConstants.ColumnWidth.dragHandle) .opacity(isHovered ? 0.6 : 0) } - + private var nameCell: some View { HStack(spacing: 4) { // Primary key icon @@ -85,7 +85,7 @@ struct ColumnTableRow: View { .font(.system(size: DesignConstants.FontSize.caption)) .foregroundStyle(.blue) } - + // Name text or text field if editingCell == .name { TextField("Column name", text: $column.name) @@ -106,13 +106,13 @@ struct ColumnTableRow: View { .frame(minWidth: DesignConstants.ColumnWidth.nameMin, maxWidth: .infinity, alignment: .leading) .padding(.horizontal, DesignConstants.Spacing.xs) } - + private var typeCell: some View { VStack(alignment: .leading, spacing: 2) { Text(column.dataType) .font(.system(size: DesignConstants.FontSize.body, design: .monospaced)) .foregroundStyle(DesignConstants.Colors.secondaryText) - + // Length/precision info if let length = column.length, length > 0 { Text("(\(length)\(column.precision != nil && column.precision! > 0 ? ", \(column.precision!)" : ""))") @@ -123,19 +123,19 @@ struct ColumnTableRow: View { .frame(minWidth: DesignConstants.ColumnWidth.typeMin, maxWidth: .infinity, alignment: .leading) .padding(.horizontal, DesignConstants.Spacing.xs) } - + private var attributesCell: some View { HStack(spacing: 4) { // Auto-increment badge if column.autoIncrement { AttributeBadge(text: "AUTO", color: .purple) } - + // NULL badge if !column.notNull { AttributeBadge(text: "NULL", color: .secondary) } - + // Unsigned badge (MySQL only) if column.unsigned { AttributeBadge(text: "UNSIGNED", color: .orange) @@ -144,7 +144,7 @@ struct ColumnTableRow: View { .frame(minWidth: DesignConstants.ColumnWidth.attributesMin, maxWidth: .infinity, alignment: .leading) .padding(.horizontal, DesignConstants.Spacing.xs) } - + private var defaultCell: some View { Group { if editingCell == .defaultValue { @@ -170,7 +170,7 @@ struct ColumnTableRow: View { .frame(minWidth: DesignConstants.ColumnWidth.defaultMin, maxWidth: .infinity, alignment: .leading) .padding(.horizontal, DesignConstants.Spacing.xs) } - + private var actionsCell: some View { HStack(spacing: 2) { Button(action: onEdit) { @@ -180,7 +180,7 @@ struct ColumnTableRow: View { } .buttonStyle(.borderless) .help("Edit Details (Double-click)") - + Button(action: onMoveUp) { Image(systemName: "chevron.up") .font(.system(size: DesignConstants.FontSize.caption)) @@ -188,7 +188,7 @@ struct ColumnTableRow: View { } .buttonStyle(.borderless) .help("Move Up (⌘↑)") - + Button(action: onMoveDown) { Image(systemName: "chevron.down") .font(.system(size: DesignConstants.FontSize.caption)) @@ -196,7 +196,7 @@ struct ColumnTableRow: View { } .buttonStyle(.borderless) .help("Move Down (⌘↓)") - + Button(action: onDelete) { Image(systemName: "trash") .font(.system(size: DesignConstants.FontSize.caption)) @@ -208,9 +208,9 @@ struct ColumnTableRow: View { .frame(width: DesignConstants.ColumnWidth.actions) .opacity(isHovered || isSelected ? 1 : 0) } - + // MARK: - Styling - + private var rowBackground: some View { Group { if isSelected { @@ -222,7 +222,7 @@ struct ColumnTableRow: View { } } } - + private var selectedBorderOverlay: some View { Group { if isSelected { @@ -239,7 +239,7 @@ struct ColumnTableRow: View { private struct AttributeBadge: View { let text: String let color: Color - + var body: some View { Text(text) .font(.system(size: DesignConstants.FontSize.tiny, weight: .medium)) diff --git a/TablePro/Views/Editor/ColumnTableView.swift b/TablePro/Views/Editor/ColumnTableView.swift index 63f68188..d0531185 100644 --- a/TablePro/Views/Editor/ColumnTableView.swift +++ b/TablePro/Views/Editor/ColumnTableView.swift @@ -18,16 +18,16 @@ struct ColumnTableView: View { let onMoveUp: (ColumnDefinition) -> Void let onMoveDown: (ColumnDefinition) -> Void let onEdit: (ColumnDefinition) -> Void - + @State private var draggedColumn: ColumnDefinition? - + var body: some View { VStack(spacing: 0) { // Header row (sticky) headerRow - + Divider() - + // Column rows if columns.isEmpty { EmptyStateView.columns { @@ -73,7 +73,7 @@ struct ColumnTableView: View { columns: $columns, draggedColumn: $draggedColumn )) - + if index < columns.count - 1 { Divider() } @@ -89,26 +89,26 @@ struct ColumnTableView: View { .stroke(DesignConstants.Colors.border, lineWidth: 0.5) ) } - + // MARK: - Header Row - + private var headerRow: some View { HStack(spacing: 0) { // Drag handle column (fixed) HeaderCell(title: "", width: DesignConstants.ColumnWidth.dragHandle, isFixed: true) - + // Name column (flexible) HeaderCell(title: "Name", width: DesignConstants.ColumnWidth.nameMin, isFixed: false) - + // Type column (flexible) HeaderCell(title: "Type", width: DesignConstants.ColumnWidth.typeMin, isFixed: false) - + // Attributes column (flexible) HeaderCell(title: "Attributes", width: DesignConstants.ColumnWidth.attributesMin, isFixed: false) - + // Default column (flexible) HeaderCell(title: "Default", width: DesignConstants.ColumnWidth.defaultMin, isFixed: false) - + // Actions column (fixed) HeaderCell(title: "", width: DesignConstants.ColumnWidth.actions, isFixed: true) } @@ -116,9 +116,9 @@ struct ColumnTableView: View { .frame(maxWidth: .infinity) .background(DesignConstants.Colors.sectionBackground.opacity(0.5)) } - + // MARK: - Actions - + private func addColumn() { let newColumn = ColumnDefinition( name: "column_\(columns.count + 1)", @@ -136,7 +136,7 @@ private struct HeaderCell: View { let title: String let width: CGFloat let isFixed: Bool - + var body: some View { Group { if isFixed { @@ -162,12 +162,12 @@ struct ColumnTableDropDelegate: DropDelegate { let column: ColumnDefinition @Binding var columns: [ColumnDefinition] @Binding var draggedColumn: ColumnDefinition? - + func performDrop(info: DropInfo) -> Bool { draggedColumn = nil return true } - + func dropEntered(info: DropInfo) { guard let draggedColumn = draggedColumn, draggedColumn.id != column.id, @@ -175,7 +175,7 @@ struct ColumnTableDropDelegate: DropDelegate { let toIndex = columns.firstIndex(where: { $0.id == column.id }) else { return } - + withAnimation(.easeInOut(duration: DesignConstants.AnimationDuration.normal)) { columns.move(fromOffsets: IndexSet(integer: fromIndex), toOffset: toIndex > fromIndex ? toIndex + 1 : toIndex) } diff --git a/TablePro/Views/Editor/ConstraintRows.swift b/TablePro/Views/Editor/ConstraintRows.swift index c6b40bc6..d803d93d 100644 --- a/TablePro/Views/Editor/ConstraintRows.swift +++ b/TablePro/Views/Editor/ConstraintRows.swift @@ -14,7 +14,7 @@ struct ForeignKeyRow: View { @Binding var foreignKey: ForeignKeyConstraint let availableColumns: [String] let onDelete: () -> Void - + var body: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.sm) { // Header @@ -23,13 +23,13 @@ struct ForeignKeyRow: View { Image(systemName: "link") .font(.system(size: DesignConstants.FontSize.small)) .foregroundStyle(.blue) - + Text(foreignKey.name.isEmpty ? "(unnamed)" : foreignKey.name) .font(.system(size: DesignConstants.FontSize.body, weight: .medium)) } - + Spacer() - + Button(action: onDelete) { Image(systemName: "trash") .font(.system(size: DesignConstants.FontSize.caption)) @@ -38,24 +38,24 @@ struct ForeignKeyRow: View { .buttonStyle(.borderless) .help("Delete Foreign Key") } - + // Fields VStack(spacing: DesignConstants.Spacing.xs) { // Name TextField("Constraint name", text: $foreignKey.name) .textFieldStyle(.roundedBorder) - + // Table reference TextField("Referenced table", text: $foreignKey.referencedTable) .textFieldStyle(.roundedBorder) - + // Columns (simplified - show as comma-separated) TextField("Columns (comma-separated)", text: Binding( get: { foreignKey.columns.joined(separator: ", ") }, set: { foreignKey.columns = $0.split(separator: ",").map { String($0).trimmingCharacters(in: .whitespaces) } } )) .textFieldStyle(.roundedBorder) - + TextField("Referenced columns (comma-separated)", text: Binding( get: { foreignKey.referencedColumns.joined(separator: ", ") }, set: { foreignKey.referencedColumns = $0.split(separator: ",").map { String($0).trimmingCharacters(in: .whitespaces) } } @@ -80,7 +80,7 @@ struct IndexRow: View { let availableColumns: [String] let databaseType: DatabaseType let onDelete: () -> Void - + var body: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.sm) { // Header @@ -94,17 +94,17 @@ struct IndexRow: View { .padding(.vertical, 3) .background((index.isUnique ? Color.blue : DesignConstants.Colors.badgeBackground)) .cornerRadius(DesignConstants.CornerRadius.small) - + Text(index.name.isEmpty ? "(unnamed)" : index.name) .font(.system(size: DesignConstants.FontSize.body, weight: .medium)) } - + Spacer() - + Toggle("Unique", isOn: $index.isUnique) .toggleStyle(.checkbox) .controlSize(.small) - + Button(action: onDelete) { Image(systemName: "trash") .font(.system(size: DesignConstants.FontSize.caption)) @@ -113,19 +113,19 @@ struct IndexRow: View { .buttonStyle(.borderless) .help("Delete Index") } - + // Fields VStack(spacing: DesignConstants.Spacing.xs) { TextField("Index name", text: $index.name) .textFieldStyle(.roundedBorder) - + // Columns (simplified - would need multi-select in real impl) TextField("Columns (comma-separated)", text: Binding( get: { index.columns.joined(separator: ", ") }, set: { index.columns = $0.split(separator: ",").map { String($0).trimmingCharacters(in: .whitespaces) } } )) .textFieldStyle(.roundedBorder) - + // Note: Index type is enum-based in model, managed via isUnique toggle above } } @@ -144,7 +144,7 @@ struct IndexRow: View { struct CheckConstraintRow: View { @Binding var constraint: CheckConstraint let onDelete: () -> Void - + var body: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.sm) { // Header @@ -153,13 +153,13 @@ struct CheckConstraintRow: View { Image(systemName: "checkmark.shield") .font(.system(size: DesignConstants.FontSize.small)) .foregroundStyle(.green) - + Text(constraint.name.isEmpty ? "(unnamed)" : constraint.name) .font(.system(size: DesignConstants.FontSize.body, weight: .medium)) } - + Spacer() - + Button(action: onDelete) { Image(systemName: "trash") .font(.system(size: DesignConstants.FontSize.caption)) @@ -168,12 +168,12 @@ struct CheckConstraintRow: View { .buttonStyle(.borderless) .help("Delete Check Constraint") } - + // Fields VStack(spacing: DesignConstants.Spacing.xs) { TextField("Constraint name", text: $constraint.name) .textFieldStyle(.roundedBorder) - + TextField("Expression (e.g., age >= 0)", text: $constraint.expression) .textFieldStyle(.roundedBorder) .font(.system(.body, design: .monospaced)) diff --git a/TablePro/Views/Editor/CreateTableView.swift b/TablePro/Views/Editor/CreateTableView.swift index bcdba2d9..c596e496 100644 --- a/TablePro/Views/Editor/CreateTableView.swift +++ b/TablePro/Views/Editor/CreateTableView.swift @@ -14,7 +14,7 @@ struct CreateTableView: View { let databaseType: DatabaseType let onCancel: () -> Void let onCreate: (TableCreationOptions) -> Void - + @State private var selectedColumnId: UUID? @State private var showDetailPanel = false @State private var showAdvancedOptions = false @@ -32,9 +32,9 @@ struct CreateTableView: View { @State private var showDuplicateTable = false @State private var availableTables: [String] = [] @State private var selectedTableToDuplicate: String? - + private let service: CreateTableService - + init( options: Binding, databaseType: DatabaseType, @@ -47,24 +47,23 @@ struct CreateTableView: View { self.onCreate = onCreate self.service = CreateTableService(databaseType: databaseType) } - + var body: some View { HStack(spacing: 0) { // Main content mainContent .frame(maxWidth: .infinity) - + // Detail panel (slides in from right) if showDetailPanel, let selectedId = selectedColumnId, let columnIndex = options.columns.firstIndex(where: { $0.id == selectedId }) { ColumnDetailPanel( column: $options.columns[columnIndex], databaseType: databaseType, - isVisible: showDetailPanel, - onClose: { - showDetailPanel = false - } - ) + isVisible: showDetailPanel + ) { + showDetailPanel = false + } .transition(.move(edge: .trailing)) } } @@ -78,71 +77,71 @@ struct CreateTableView: View { return .ignored } } - + // MARK: - Main Content - + private var mainContent: some View { VStack(spacing: 0) { // Toolbar toolbar - + Divider() - + // Scrollable content ScrollView { VStack(alignment: .leading, spacing: DesignConstants.Spacing.md) { // General info generalSection - + // Columns (table-style) columnsSection - + // Primary key primaryKeySection - + // Foreign keys foreignKeysSection - + // Indexes indexesSection - + // Check constraints (PostgreSQL/SQLite) if databaseType == .postgresql || databaseType == .sqlite { checkConstraintsSection } - + // Advanced options advancedSection - + // SQL Preview sqlPreviewSection } .padding(DesignConstants.Spacing.md) } - + Divider() - + // Footer footer } } - + // MARK: - Toolbar - + private var toolbar: some View { HStack(spacing: DesignConstants.Spacing.sm) { Text("Create New Table") .font(.system(size: DesignConstants.FontSize.title3, weight: .semibold)) - + Spacer() - + // Error message if let error = validationError { Label(error, systemImage: "exclamationmark.triangle.fill") .font(.system(size: DesignConstants.FontSize.caption)) .foregroundStyle(.red) } - + // Template actions Button(action: { savedTemplates = TableTemplateStorage.shared.getTemplateNames() @@ -154,17 +153,17 @@ struct CreateTableView: View { .controlSize(.small) .help("Load Template") .disabled(TableTemplateStorage.shared.getTemplateNames().isEmpty) - + Button(action: { showSaveTemplate = true }) { Label("Save", systemImage: "square.and.arrow.down") } .buttonStyle(.borderless) .controlSize(.small) .help("Save as Template") - + Divider() .frame(height: 16) - + // Import actions Button(action: { showImportDDL = true }) { Label("Import", systemImage: "square.and.arrow.up") @@ -172,7 +171,7 @@ struct CreateTableView: View { .buttonStyle(.borderless) .controlSize(.small) .help("Import from DDL") - + Button(action: { loadAvailableTables() showDuplicateTable = true @@ -197,9 +196,8 @@ struct CreateTableView: View { LoadTemplateSheet( templates: savedTemplates, onLoad: { name in loadTemplate(name); showLoadTemplate = false }, - onDelete: deleteTemplate, - onCancel: { showLoadTemplate = false } - ) + onDelete: deleteTemplate + ) { showLoadTemplate = false } } .sheet(isPresented: $showImportDDL) { ImportDDLSheet( @@ -222,15 +220,15 @@ struct CreateTableView: View { ) } } - + // MARK: - Sections - + private var generalSection: some View { - VStack(alignment: .leading, spacing: DesignConstants.Spacing.xs) { + VStack(alignment: .leading, spacing: DesignConstants.Spacing.xs) { VStack(alignment: .leading, spacing: DesignConstants.Spacing.sm) { TextField("Table Name", text: $options.tableName) .textFieldStyle(.roundedBorder) - + HStack { Text("Database/Schema:") .font(.system(size: DesignConstants.FontSize.small)) @@ -245,7 +243,7 @@ struct CreateTableView: View { .cornerRadius(DesignConstants.CornerRadius.medium) } } - + private var advancedSection: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.xs) { SectionHeaderView( @@ -253,7 +251,7 @@ struct CreateTableView: View { isCollapsible: true, isExpanded: $showAdvancedOptions ) - + if showAdvancedOptions { VStack(alignment: .leading, spacing: DesignConstants.Spacing.sm) { if databaseType == .mysql || databaseType == .mariadb { @@ -262,20 +260,20 @@ struct CreateTableView: View { set: { options.engine = $0.isEmpty ? nil : $0 } )) .textFieldStyle(.roundedBorder) - + TextField("Charset (e.g., utf8mb4)", text: Binding( get: { options.charset ?? "" }, set: { options.charset = $0.isEmpty ? nil : $0 } )) .textFieldStyle(.roundedBorder) - + TextField("Collation", text: Binding( get: { options.collation ?? "" }, set: { options.collation = $0.isEmpty ? nil : $0 } )) .textFieldStyle(.roundedBorder) } - + if databaseType == .postgresql { TextField("Tablespace", text: Binding( get: { options.tablespace ?? "" }, @@ -283,7 +281,7 @@ struct CreateTableView: View { )) .textFieldStyle(.roundedBorder) } - + TextField("Comment", text: Binding( get: { options.comment ?? "" }, set: { options.comment = $0.isEmpty ? nil : $0 } @@ -296,7 +294,7 @@ struct CreateTableView: View { } } } - + private var columnsSection: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.xs) { SectionHeaderView(title: "Columns", count: options.columns.count) { @@ -312,7 +310,7 @@ struct CreateTableView: View { } .menuStyle(.borderlessButton) .controlSize(.small) - + Button(action: addColumn) { Label("Add Column", systemImage: "plus") } @@ -320,7 +318,7 @@ struct CreateTableView: View { .controlSize(.small) } } - + ColumnTableView( columns: $options.columns, primaryKeyColumns: $options.primaryKeyColumns, @@ -328,19 +326,18 @@ struct CreateTableView: View { databaseType: databaseType, onDelete: deleteColumn, onMoveUp: moveColumnUp, - onMoveDown: moveColumnDown, - onEdit: { column in - selectedColumnId = column.id - showDetailPanel = true - } - ) + onMoveDown: moveColumnDown + ) { column in + selectedColumnId = column.id + showDetailPanel = true + } } } - + private var primaryKeySection: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.xs) { SectionHeaderView(title: "Primary Key") - + VStack(alignment: .leading, spacing: DesignConstants.Spacing.sm) { if options.columns.isEmpty { Text("Add columns first") @@ -370,7 +367,7 @@ struct CreateTableView: View { .disabled(column.name.isEmpty) } } - + if options.primaryKeyColumns.isEmpty { HStack(spacing: 4) { Image(systemName: "exclamationmark.triangle.fill") @@ -387,7 +384,7 @@ struct CreateTableView: View { .cornerRadius(DesignConstants.CornerRadius.medium) } } - + private var foreignKeysSection: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.xs) { SectionHeaderView( @@ -405,7 +402,7 @@ struct CreateTableView: View { .buttonStyle(.borderless) .controlSize(.small) } - + if showForeignKeys { if options.foreignKeys.isEmpty { VStack(spacing: DesignConstants.Spacing.sm) { @@ -431,16 +428,15 @@ struct CreateTableView: View { } } ), - availableColumns: options.columns.map { $0.name }, - onDelete: { options.foreignKeys.removeAll { $0.id == fk.id } } - ) + availableColumns: options.columns.map { $0.name } + ) { options.foreignKeys.removeAll { $0.id == fk.id } } } } } } } } - + private var indexesSection: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.xs) { SectionHeaderView( @@ -458,7 +454,7 @@ struct CreateTableView: View { .buttonStyle(.borderless) .controlSize(.small) } - + if showIndexes { if options.indexes.isEmpty { VStack(spacing: DesignConstants.Spacing.sm) { @@ -485,16 +481,15 @@ struct CreateTableView: View { } ), availableColumns: options.columns.map { $0.name }, - databaseType: databaseType, - onDelete: { options.indexes.removeAll { $0.id == index.id } } - ) + databaseType: databaseType + ) { options.indexes.removeAll { $0.id == index.id } } } } } } } } - + private var checkConstraintsSection: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.xs) { SectionHeaderView( @@ -512,7 +507,7 @@ struct CreateTableView: View { .buttonStyle(.borderless) .controlSize(.small) } - + if showCheckConstraints { if options.checkConstraints.isEmpty { VStack(spacing: DesignConstants.Spacing.sm) { @@ -537,16 +532,15 @@ struct CreateTableView: View { options.checkConstraints[idx] = newValue } } - ), - onDelete: { options.checkConstraints.removeAll { $0.id == check.id } } - ) + ) + ) { options.checkConstraints.removeAll { $0.id == check.id } } } } } } } } - + private var sqlPreviewSection: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.xs) { SectionHeaderView( @@ -561,7 +555,7 @@ struct CreateTableView: View { .controlSize(.small) .help("Copy SQL") } - + if showSQLPreview { ScrollView { Text(service.generatePreviewSQL(options)) @@ -580,16 +574,16 @@ struct CreateTableView: View { } } } - + private var footer: some View { HStack { Spacer() - + Button("Cancel") { onCancel() } .keyboardShortcut(.escape) - + Button("Create Table") { createTable() } @@ -599,9 +593,9 @@ struct CreateTableView: View { } .padding(DesignConstants.Spacing.sm) } - + // MARK: - Actions - + private func addColumn() { let newColumn = ColumnDefinition( name: "column_\(options.columns.count + 1)", @@ -611,13 +605,13 @@ struct CreateTableView: View { options.columns.append(newColumn) selectedColumnId = newColumn.id } - + private func addColumnFromTemplate(_ template: ColumnTemplate) { let newColumn = template.createColumn(for: databaseType) options.columns.append(newColumn) selectedColumnId = newColumn.id } - + private func deleteColumn(_ column: ColumnDefinition) { options.primaryKeyColumns.removeAll { $0 == column.name } options.columns.removeAll { $0.id == column.id } @@ -625,18 +619,18 @@ struct CreateTableView: View { selectedColumnId = options.columns.first?.id } } - + private func moveColumnUp(_ column: ColumnDefinition) { guard let index = options.columns.firstIndex(where: { $0.id == column.id }), index > 0 else { return } options.columns.swapAt(index, index - 1) } - + private func moveColumnDown(_ column: ColumnDefinition) { guard let index = options.columns.firstIndex(where: { $0.id == column.id }), index < options.columns.count - 1 else { return } options.columns.swapAt(index, index + 1) } - + private func createTable() { do { try service.validate(options) @@ -646,7 +640,7 @@ struct CreateTableView: View { validationError = error.localizedDescription } } - + private func saveTemplate() { guard !templateName.isEmpty else { return } do { @@ -656,7 +650,7 @@ struct CreateTableView: View { validationError = "Failed to save template: \(error.localizedDescription)" } } - + private func loadTemplate(_ name: String) { do { if let loaded = try TableTemplateStorage.shared.loadTemplate(name: name) { @@ -671,7 +665,7 @@ struct CreateTableView: View { validationError = "Failed to load template: \(error.localizedDescription)" } } - + private func deleteTemplate(_ name: String) { do { try TableTemplateStorage.shared.deleteTemplate(name: name) @@ -680,7 +674,7 @@ struct CreateTableView: View { validationError = "Failed to delete template: \(error.localizedDescription)" } } - + private func importDDL() { do { let parsed = try DDLParser.parse(ddlText, databaseType: databaseType) @@ -693,7 +687,7 @@ struct CreateTableView: View { validationError = "Failed to import DDL: \(error.localizedDescription)" } } - + private func loadAvailableTables() { Task { do { @@ -705,7 +699,7 @@ struct CreateTableView: View { } let result = try await driver.execute(query: query) await MainActor.run { - availableTables = result.rows.compactMap { $0.first ?? nil } + availableTables = result.rows.compactMap { $0.first.flatMap { $0 } } } } catch { await MainActor.run { @@ -714,7 +708,7 @@ struct CreateTableView: View { } } } - + private func duplicateTable(_ tableName: String) { Task { do { @@ -724,14 +718,14 @@ struct CreateTableView: View { } return } - + // Query information schema directly instead of parsing DDL let columnsQuery: String - + switch databaseType { case .mysql, .mariadb: columnsQuery = """ - SELECT + SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, @@ -745,10 +739,10 @@ struct CreateTableView: View { WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '\(tableName)' ORDER BY ORDINAL_POSITION """ - + case .postgresql: columnsQuery = """ - SELECT + SELECT column_name, data_type, character_maximum_length, @@ -760,31 +754,31 @@ struct CreateTableView: View { WHERE table_name = '\(tableName)' ORDER BY ordinal_position """ - + case .sqlite: columnsQuery = "PRAGMA table_info('\(tableName)')" } - + let result = try await driver.execute(query: columnsQuery) - + await MainActor.run { guard !result.rows.isEmpty else { validationError = "Table '\(tableName)' has no columns or does not exist" return } - + // Debug: Log what we got print("DEBUG: Duplicate table - Got \(result.rows.count) rows") print("DEBUG: Columns: \(result.columns)") if let firstRow = result.rows.first { print("DEBUG: First row: \(firstRow)") } - + // Build arrays locally first (don't modify options until we're done) var newColumns: [ColumnDefinition] = [] var newPrimaryKeys: [String] = [] var parsedCount = 0 - + // Parse each column for row in result.rows { switch databaseType { @@ -792,14 +786,14 @@ struct CreateTableView: View { guard row.count >= 9, let columnName = row[0], let dataType = row[1] else { continue } - + let length = row[2].flatMap { Int($0) } let precision = row[3].flatMap { Int($0) } let isNullable = row[5] == "YES" let defaultValue = row[6] let extra = row[7] ?? "" let columnKey = row[8] ?? "" - + let column = ColumnDefinition( name: columnName, dataType: dataType.uppercased(), @@ -809,24 +803,24 @@ struct CreateTableView: View { defaultValue: defaultValue, autoIncrement: extra.uppercased().contains("AUTO_INCREMENT") ) - + newColumns.append(column) parsedCount += 1 - + if columnKey == "PRI" { newPrimaryKeys.append(columnName) } - + case .postgresql: guard row.count >= 7, let columnName = row[0], let dataType = row[1] else { continue } - + let length = row[2].flatMap { Int($0) } let precision = row[3].flatMap { Int($0) } let isNullable = row[5] == "YES" let defaultValue = row[6] - + let column = ColumnDefinition( name: columnName, dataType: dataType.uppercased(), @@ -835,49 +829,49 @@ struct CreateTableView: View { notNull: !isNullable, defaultValue: defaultValue ) - + newColumns.append(column) parsedCount += 1 - + case .sqlite: // SQLite PRAGMA format: cid, name, type, notnull, dflt_value, pk guard row.count >= 6, let columnName = row[1], let dataType = row[2] else { continue } - + let notNull = row[3] == "1" let defaultValue = row[4] let isPk = row[5] == "1" - + let column = ColumnDefinition( name: columnName, dataType: dataType.uppercased(), notNull: notNull, defaultValue: defaultValue ) - + newColumns.append(column) parsedCount += 1 - + if isPk { newPrimaryKeys.append(columnName) } } } - + // Debug: Log results print("DEBUG: Parsed \(parsedCount) columns out of \(result.rows.count) rows") print("DEBUG: newColumns.count = \(newColumns.count)") print("DEBUG: Primary keys = \(newPrimaryKeys)") - + guard !newColumns.isEmpty else { validationError = "Failed to parse any columns from table '\(tableName)'. Check console for debug info." return } - + // Create a completely new TableCreationOptions to avoid binding issues var newOptions = TableCreationOptions() - + // For PostgreSQL, use current database/schema, for MySQL use DATABASE() // For duplicates, just use the table name without schema prefix if databaseType == .postgresql { @@ -886,17 +880,17 @@ struct CreateTableView: View { } else { newOptions.databaseName = options.databaseName } - + newOptions.tableName = "\(tableName)_copy" newOptions.columns = newColumns newOptions.primaryKeyColumns = newPrimaryKeys - + // Assign the entire new object at once options = newOptions - + selectedColumnId = options.columns.first?.id validationError = nil - + print("DEBUG: Duplicate complete - \(options.columns.count) columns copied") } } catch { @@ -906,7 +900,7 @@ struct CreateTableView: View { } } } - + private func copySQLToClipboard() { let sql = service.generatePreviewSQL(options) NSPasteboard.general.clearContents() diff --git a/TablePro/Views/Editor/DataTypePicker.swift b/TablePro/Views/Editor/DataTypePicker.swift index 188d132f..05d22ee9 100644 --- a/TablePro/Views/Editor/DataTypePicker.swift +++ b/TablePro/Views/Editor/DataTypePicker.swift @@ -11,7 +11,7 @@ import SwiftUI struct DataTypePicker: View { @Binding var selectedType: String let databaseType: DatabaseType - + var body: some View { Picker("", selection: $selectedType) { ForEach(DataTypeCategory.allCases, id: \.self) { category in diff --git a/TablePro/Views/Editor/EditorCoordinator.swift b/TablePro/Views/Editor/EditorCoordinator.swift index 47156b14..524f0881 100644 --- a/TablePro/Views/Editor/EditorCoordinator.swift +++ b/TablePro/Views/Editor/EditorCoordinator.swift @@ -5,37 +5,36 @@ // Coordinator for bridging SwiftUI and AppKit, preventing feedback loops // -import SwiftUI import AppKit +import SwiftUI /// Coordinator that prevents feedback loops between SwiftUI and NSTextView @MainActor final class EditorCoordinator: NSObject, NSTextViewDelegate { - // MARK: - Properties - + @Binding var text: String @Binding var cursorPosition: Int - + weak var textView: EditorTextView? - + var onExecute: (() -> Void)? - + // Syntax highlighting private var syntaxHighlighter: SyntaxHighlighter? - + // Completion private var completionEngine: CompletionEngine? private let completionWindow = SQLCompletionWindowController() private var completionDebounceTask: Task? private var currentCompletionContext: CompletionContext? private var suppressNextCompletion: Bool = false - + // Prevent SwiftUI -> NSTextView feedback loop private var isUpdatingFromTextView: Bool = false - + // MARK: - Initialization - + init( text: Binding, cursorPosition: Binding, @@ -45,50 +44,50 @@ final class EditorCoordinator: NSObject, NSTextViewDelegate { _text = text _cursorPosition = cursorPosition self.onExecute = onExecute - + super.init() - + // Create completion engine if schema provider is available if let provider = schemaProvider { self.completionEngine = CompletionEngine(schemaProvider: provider) } - + // Set up completion callbacks completionWindow.onSelect = { [weak self] item in self?.insertCompletion(item) } } - + // MARK: - Setup - + /// Wire up the text view after creation func setup(textView: EditorTextView, textStorage: NSTextStorage) { self.textView = textView textView.delegate = self - + // Create syntax highlighter syntaxHighlighter = SyntaxHighlighter(textStorage: textStorage) - + // Apply initial highlighting syntaxHighlighter?.highlightFullDocument() - + // Set up callbacks textView.onExecute = { [weak self] in self?.onExecute?() } - + textView.onManualCompletion = { [weak self] in self?.triggerCompletionManually() } - + textView.onKeyEvent = { [weak self] event in self?.handleKeyEvent(event) ?? false } - + textView.onClickOutsideCompletion = { [weak self] in self?.dismissCompletion() } - + // Observe tab switch to dismiss completion (prevents duplicate windows) NotificationCenter.default.addObserver( self, @@ -105,11 +104,11 @@ final class EditorCoordinator: NSObject, NSTextViewDelegate { object: nil ) } - + deinit { NotificationCenter.default.removeObserver(self) } - + @objc private func handleTabSwitch() { // Dismiss completion when switching tabs to prevent duplicates dismissCompletion() @@ -121,55 +120,55 @@ final class EditorCoordinator: NSObject, NSTextViewDelegate { } // MARK: - NSTextViewDelegate - + func textDidChange(_ notification: Notification) { guard let textView = notification.object as? NSTextView else { return } - + // Update SwiftUI bindings isUpdatingFromTextView = true text = textView.string cursorPosition = textView.selectedRange().location isUpdatingFromTextView = false - + // Note: Syntax highlighting happens automatically via NSTextStorageDelegate // No need to manually trigger it here - + // Trigger autocomplete with debounce triggerCompletionDebounced() } - + func textViewDidChangeSelection(_ notification: Notification) { guard let textView = notification.object as? NSTextView else { return } - + // Update cursor position binding isUpdatingFromTextView = true cursorPosition = textView.selectedRange().location isUpdatingFromTextView = false } - + // MARK: - SwiftUI -> NSTextView Updates - + /// Update text view from SwiftUI (prevents feedback loop) func updateTextViewIfNeeded(with newText: String) { guard !isUpdatingFromTextView, let textView = textView, textView.string != newText else { return } - + // Update without breaking undo stack // Since this is coming from SwiftUI (external update), we use direct assignment textView.string = newText syntaxHighlighter?.highlightFullDocument() } - + // MARK: - Completion - + private func triggerCompletionDebounced() { // Skip if we just inserted a completion if suppressNextCompletion { suppressNextCompletion = false return } - + completionDebounceTask?.cancel() completionDebounceTask = Task { @MainActor in try? await Task.sleep(nanoseconds: 150_000_000) // 150ms debounce @@ -177,21 +176,21 @@ final class EditorCoordinator: NSObject, NSTextViewDelegate { await showCompletions() } } - + func triggerCompletionManually() { Task { @MainActor in await showCompletions() } } - + @MainActor private func showCompletions() async { guard let textView = textView, let completionEngine = completionEngine else { return } - + let cursorPosition = textView.selectedRange().location let text = textView.string - + // Don't show autocomplete right after semicolon or newline-only context if cursorPosition > 0 { let prevIndex = text.index(text.startIndex, offsetBy: cursorPosition - 1) @@ -205,7 +204,7 @@ final class EditorCoordinator: NSObject, NSTextViewDelegate { } } } - + // Get completions from engine guard let context = await completionEngine.getCompletions( text: text, @@ -214,85 +213,85 @@ final class EditorCoordinator: NSObject, NSTextViewDelegate { completionWindow.dismiss() return } - + self.currentCompletionContext = context - + // Calculate screen position for completion window guard let screenPoint = calculateCompletionWindowPosition() else { return } - + // Show completion window (window controller handles dismissing old window if needed) completionWindow.showCompletions(context.items, at: screenPoint, relativeTo: textView.window) } - + private func calculateCompletionWindowPosition() -> NSPoint? { guard let textView = textView, let layoutManager = textView.layoutManager, let textContainer = textView.textContainer else { return nil } - + let text = textView.string let cursorPosition = textView.selectedRange().location - - guard text.count > 0 else { return nil } - + + guard !text.isEmpty else { return nil } + // Ensure cursor position is valid let safePosition = min(max(0, cursorPosition), text.count) - + // Ensure layout is up to date layoutManager.ensureLayout(forCharacterRange: NSRange(location: 0, length: text.count)) - + // Get glyph count safely let glyphCount = layoutManager.numberOfGlyphs guard glyphCount > 0 else { return nil } - + // Safe glyph index calculation let charIndex = min(safePosition, text.count - 1) let glyphIndex = min(layoutManager.glyphIndexForCharacter(at: max(0, charIndex)), glyphCount - 1) - + // Get line rect safely var lineRect = layoutManager.lineFragmentRect(forGlyphAt: glyphIndex, effectiveRange: nil) - + // Get glyph location within line if glyphIndex < glyphCount { let glyphPoint = layoutManager.location(forGlyphAt: glyphIndex) lineRect.origin.x += glyphPoint.x } - + let textContainerOrigin = textView.textContainerOrigin lineRect.origin.x += textContainerOrigin.x lineRect.origin.y += textContainerOrigin.y + lineRect.height - + // Convert to screen coordinates let windowPoint = textView.convert(lineRect.origin, to: nil) return textView.window?.convertPoint(toScreen: windowPoint) } - + private func insertCompletion(_ item: SQLCompletionItem) { guard let textView = textView, let context = currentCompletionContext else { return } - + let insertText = item.insertText let replaceRange = context.replacementRange - + // Suppress next autocomplete trigger to prevent loop suppressNextCompletion = true - + // Insert the completion using proper undo-safe API if textView.shouldChangeText(in: replaceRange, replacementString: insertText) { textView.replaceCharacters(in: replaceRange, with: insertText) textView.didChangeText() } - + // Dismiss completion window completionWindow.dismiss() } - + private func handleKeyEvent(_ event: NSEvent) -> Bool { // Let completion window handle arrow keys, return, escape - return completionWindow.handleKeyEvent(event) + completionWindow.handleKeyEvent(event) } - + /// Dismiss completion window func dismissCompletion() { completionWindow.dismiss() diff --git a/TablePro/Views/Editor/EditorTextView.swift b/TablePro/Views/Editor/EditorTextView.swift index 2d2864ab..2ddfad70 100644 --- a/TablePro/Views/Editor/EditorTextView.swift +++ b/TablePro/Views/Editor/EditorTextView.swift @@ -9,59 +9,58 @@ import AppKit /// NSTextView subclass that handles input, auto-pairing, and drawing visual features final class EditorTextView: NSTextView { - // MARK: - Properties - + /// Callback for handling Cmd+Enter (execute query) var onExecute: (() -> Void)? - + /// Callback for handling Ctrl+Space (manual completion trigger) var onManualCompletion: (() -> Void)? - + /// Callback for handling key events (returns true if handled) var onKeyEvent: ((NSEvent) -> Bool)? - + /// Callback when user clicks at a different position (to dismiss completion) var onClickOutsideCompletion: (() -> Void)? - + /// Track the last cursor position for smart invalidation private var lastCursorLine: Int = -1 - + /// Margin to expand invalidation rect to ensure borders/effects are redrawn private let lineInvalidationMargin: CGFloat = 2 - + // MARK: - Auto-Pairing Configuration - + private let bracketPairs: [Character: Character] = [ "(": ")", "[": "]", "{": "}", ] - + private let reverseBracketPairs: [Character: Character] = [ ")": "(", "]": "[", "}": "{", ] - + private let quotePairs: [Character: Character] = [ "'": "'", "\"": "\"", "`": "`", ] - + // MARK: - Initialization - + override init(frame frameRect: NSRect, textContainer container: NSTextContainer?) { super.init(frame: frameRect, textContainer: container) commonInit() } - + required init?(coder: NSCoder) { super.init(coder: coder) commonInit() } - + private func commonInit() { // Observe selection changes for visual updates NotificationCenter.default.addObserver( @@ -78,24 +77,24 @@ final class EditorTextView: NSTextView { object: self ) } - + @objc private func textDidChange(_ notification: Notification) { // Invalidate line cache when text changes lineCache = nil // Reset last cursor line to avoid stale line numbers from previous document state lastCursorLine = -1 } - + deinit { NotificationCenter.default.removeObserver(self) } - + @objc private func selectionDidChange(_ notification: Notification) { // Smart invalidation: only redraw the affected line regions // instead of the entire view invalidateLineHighlightIfNeeded() } - + /// Invalidate only the current and previous line regions for redraw private func invalidateLineHighlightIfNeeded() { guard let layoutManager = layoutManager, @@ -103,9 +102,9 @@ final class EditorTextView: NSTextView { needsDisplay = true return } - + let cursorPos = selectedRange().location - + // Calculate current line by iterating line-by-line with NSString's line APIs // (more efficient than manual per-character scanning, but still linear in the // number of lines before the cursor) @@ -115,60 +114,60 @@ final class EditorTextView: NSTextView { } else { let nsString = string as NSString let length = nsString.length - + // Clamp cursor position to valid UTF-16 range let clampedCursorPos = min(max(cursorPos, 0), length) - + var lineNumber = 0 var index = 0 - + // Walk line by line until we reach or pass the cursor position while index < clampedCursorPos { var lineStart = 0 var lineEnd = 0 var contentsEnd = 0 - + nsString.getLineStart(&lineStart, - end: &lineEnd, - contentsEnd: &contentsEnd, - for: NSRange(location: index, length: 0)) - + end: &lineEnd, + contentsEnd: &contentsEnd, + for: NSRange(location: index, length: 0)) + // If we've reached the last line, stop if lineEnd <= index { break } - + if lineEnd > clampedCursorPos { break } - + lineNumber += 1 index = lineEnd } - + currentLine = lineNumber } - + // Skip if cursor is on the same line if currentLine == lastCursorLine { return } - + // Invalidate the previous line rect if lastCursorLine >= 0 { if let rect = lineRectForLine(lastCursorLine, layoutManager: layoutManager, textContainer: textContainer) { setNeedsDisplay(rect.insetBy(dx: -lineInvalidationMargin, dy: -lineInvalidationMargin)) } } - + // Invalidate the current line rect if let rect = lineRectForLine(currentLine, layoutManager: layoutManager, textContainer: textContainer) { setNeedsDisplay(rect.insetBy(dx: -lineInvalidationMargin, dy: -lineInvalidationMargin)) } - + lastCursorLine = currentLine } - + /// Simple cache for line lookups to avoid repeated O(n) scans for consecutive lines. /// /// NOTE: @@ -183,24 +182,23 @@ final class EditorTextView: NSTextView { /// must not be relied upon for correctness or for guaranteeing fast lookups for /// arbitrary line numbers. private var lineCache: (lastLine: Int, charIndex: Int, searchRange: NSRange)? - + /// Get the rect for a specific line number using efficient NSString lineRange private func lineRectForLine(_ lineNumber: Int, layoutManager: NSLayoutManager, textContainer: NSTextContainer) -> NSRect? { guard layoutManager.numberOfGlyphs > 0 else { return nil } - + let text = string as NSString guard text.length > 0 else { return nil } - + var charIndex = 0 var searchRange = NSRange(location: 0, length: text.length) var startLine = 0 - + // Use cache if we're looking for a nearby line AND cache is still valid for current text if let cache = lineCache, cache.searchRange.location < text.length, NSMaxRange(cache.searchRange) <= text.length, abs(cache.lastLine - lineNumber) <= 1 { - if cache.lastLine == lineNumber { // Exact cache hit - use cached position charIndex = min(cache.charIndex, text.length - 1) @@ -213,7 +211,7 @@ final class EditorTextView: NSTextView { startLine = cache.lastLine } } - + // Iterate from cached position (or start) to the target line for _ in startLine.. 0 else { return } - + var lineRect: NSRect - + // Handle cursor at end of document if cursorPos >= string.count { // Cursor is at or past the end @@ -314,31 +312,31 @@ final class EditorTextView: NSTextView { guard glyphIndex < layoutManager.numberOfGlyphs else { return } lineRect = layoutManager.lineFragmentRect(forGlyphAt: glyphIndex, effectiveRange: nil) } - + // Adjust for text container origin let origin = textContainerOrigin lineRect.origin.x = origin.x lineRect.origin.y += origin.y lineRect.size.width = bounds.width - origin.x * 2 - + SQLEditorTheme.currentLineHighlight.setFill() NSBezierPath(roundedRect: lineRect, xRadius: SQLEditorTheme.highlightCornerRadius, yRadius: SQLEditorTheme.highlightCornerRadius).fill() } - + /// Draw highlights for matching brackets private func drawBracketHighlights() { guard let layoutManager = layoutManager, let textContainer = textContainer, !string.isEmpty, layoutManager.numberOfGlyphs > 0 else { return } - + let cursorPos = selectedRange().location let chars = Array(string) - + // Find bracket at or before cursor var bracketPos: Int? var bracket: Character? - + if cursorPos < chars.count { let char = chars[cursorPos] if bracketPairs[char] != nil || reverseBracketPairs[char] != nil { @@ -346,7 +344,7 @@ final class EditorTextView: NSTextView { bracket = char } } - + if bracket == nil && cursorPos > 0 { let char = chars[cursorPos - 1] if bracketPairs[char] != nil || reverseBracketPairs[char] != nil { @@ -354,60 +352,60 @@ final class EditorTextView: NSTextView { bracket = char } } - + guard let foundPos = bracketPos, let foundBracket = bracket, let matchPos = findMatchingBracket(at: foundPos, bracket: foundBracket, in: chars) else { return } - + layoutManager.ensureLayout(for: textContainer) - + // Draw highlight for both brackets SQLEditorTheme.bracketMatchHighlight.setFill() - + for pos in [foundPos, matchPos] { if let rect = rectForCharacter(at: pos) { NSBezierPath(roundedRect: rect, xRadius: SQLEditorTheme.highlightCornerRadius, yRadius: SQLEditorTheme.highlightCornerRadius).fill() } } } - + // MARK: - Mouse Input - + override func mouseDown(with event: NSEvent) { // Dismiss autocomplete when clicking at a different position in the text editor // This matches VSCode/IntelliJ behavior - clicking sidebar/tabs won't dismiss let clickLocation = convert(event.locationInWindow, from: nil) let characterIndex = characterIndexForInsertion(at: clickLocation) - + // If click is far from current cursor position, dismiss completion let currentCursor = selectedRange().location if abs(characterIndex - currentCursor) > 0 { onClickOutsideCompletion?() } - + super.mouseDown(with: event) } - + // MARK: - Keyboard Input - + override func keyDown(with event: NSEvent) { // Let callback handle key events first (for completion navigation) if let handler = onKeyEvent, handler(event) { return } - + // Cmd+Enter to execute query if event.modifierFlags.contains(.command) && event.keyCode == 36 { onExecute?() return } - + // Ctrl+Space to trigger manual completion if event.modifierFlags.contains(.control) && event.keyCode == 49 { onManualCompletion?() return } - + // Handle auto-pairing for brackets and quotes if let char = event.characters?.first { // Opening brackets - insert pair @@ -415,7 +413,7 @@ final class EditorTextView: NSTextView { insertPair(opening: char, closing: closing) return } - + // Quotes - insert pair or skip if already at closing quote if let closing = quotePairs[char] { if shouldSkipClosingQuote(char) { @@ -425,7 +423,7 @@ final class EditorTextView: NSTextView { insertPair(opening: char, closing: closing) return } - + // Closing brackets - skip if next char is the same if bracketPairs.values.contains(char) { if shouldSkipClosingBracket(char) { @@ -434,7 +432,7 @@ final class EditorTextView: NSTextView { } } } - + // Handle backspace to delete matching pairs if event.keyCode == 51 { // Backspace if shouldDeletePair() { @@ -442,16 +440,16 @@ final class EditorTextView: NSTextView { return } } - + super.keyDown(with: event) } - + // MARK: - Auto-Pairing Logic - + private func insertPair(opening: Character, closing: Character) { let insertText = "\(opening)\(closing)" let range = selectedRange() - + if shouldChangeText(in: range, replacementString: insertText) { replaceCharacters(in: range, with: insertText) // Move cursor between the pair @@ -459,30 +457,30 @@ final class EditorTextView: NSTextView { didChangeText() } } - + private func shouldSkipClosingQuote(_ quote: Character) -> Bool { let pos = selectedRange().location guard pos < string.count else { return false } let index = string.index(string.startIndex, offsetBy: pos) return string[index] == quote } - + private func shouldSkipClosingBracket(_ bracket: Character) -> Bool { let pos = selectedRange().location guard pos < string.count else { return false } let index = string.index(string.startIndex, offsetBy: pos) return string[index] == bracket } - + private func shouldDeletePair() -> Bool { let pos = selectedRange().location guard pos > 0, pos < string.count else { return false } - + let prevIndex = string.index(string.startIndex, offsetBy: pos - 1) let nextIndex = string.index(string.startIndex, offsetBy: pos) let prevChar = string[prevIndex] let nextChar = string[nextIndex] - + // Check if we're between a matching pair if let closing = bracketPairs[prevChar], closing == nextChar { return true @@ -492,24 +490,24 @@ final class EditorTextView: NSTextView { } return false } - + private func deletePair() { let pos = selectedRange().location let range = NSRange(location: pos - 1, length: 2) - + if shouldChangeText(in: range, replacementString: "") { replaceCharacters(in: range, with: "") didChangeText() } } - + // MARK: - Bracket Matching - + private func findMatchingBracket(at position: Int, bracket: Character, in chars: [Character]) -> Int? { let isOpening = bracketPairs[bracket] != nil let matchingBracket: Character let direction: Int - + if isOpening { matchingBracket = bracketPairs[bracket]! direction = 1 @@ -517,13 +515,13 @@ final class EditorTextView: NSTextView { matchingBracket = reverseBracketPairs[bracket]! direction = -1 } - + var depth = 1 var pos = position + direction - + while pos >= 0 && pos < chars.count { let char = chars[pos] - + if char == bracket { depth += 1 } else if char == matchingBracket { @@ -532,31 +530,31 @@ final class EditorTextView: NSTextView { return pos } } - + pos += direction } - + return nil // No matching bracket found } - + private func rectForCharacter(at index: Int) -> NSRect? { guard let layoutManager = layoutManager, index < string.count, layoutManager.numberOfGlyphs > 0 else { return nil } - + let glyphIndex = layoutManager.glyphIndexForCharacter(at: index) guard glyphIndex < layoutManager.numberOfGlyphs else { return nil } - + var glyphRect = layoutManager.boundingRect(forGlyphRange: NSRange(location: glyphIndex, length: 1), in: textContainer!) - + // Adjust for text container origin let origin = textContainerOrigin glyphRect.origin.x += origin.x glyphRect.origin.y += origin.y - + // Make rect slightly larger for visibility glyphRect = glyphRect.insetBy(dx: -1, dy: -1) - + return glyphRect } } diff --git a/TablePro/Views/Editor/HistoryPanelController.swift b/TablePro/Views/Editor/HistoryPanelController.swift index 58ef1c4d..66a8a95d 100644 --- a/TablePro/Views/Editor/HistoryPanelController.swift +++ b/TablePro/Views/Editor/HistoryPanelController.swift @@ -10,7 +10,6 @@ import AppKit /// Main controller for the history/bookmark panel /// Uses NSSplitView for master-detail layout: list on left, preview on right final class HistoryPanelController: NSViewController { - // MARK: - Child Controllers private let listController = HistoryListViewController() @@ -97,26 +96,24 @@ final class HistoryPanelController: NSViewController { // MARK: - NSSplitViewDelegate extension HistoryPanelController: NSSplitViewDelegate { - func splitView(_ splitView: NSSplitView, constrainMinCoordinate proposedMinimumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat { // Minimum width for left pane (list) - return 200 + 200 } func splitView(_ splitView: NSSplitView, constrainMaxCoordinate proposedMaximumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat { // Maximum width for left pane (leaving 300pt minimum for right pane) - return splitView.bounds.width - 300 + splitView.bounds.width - 300 } func splitView(_ splitView: NSSplitView, canCollapseSubview subview: NSView) -> Bool { - return false + false } } // MARK: - HistoryListViewControllerDelegate extension HistoryPanelController: HistoryListViewControllerDelegate { - func historyListViewController(_ controller: HistoryListViewController, didSelectHistoryEntry entry: QueryHistoryEntry) { previewController.showHistoryEntry(entry) } diff --git a/TablePro/Views/Editor/HistoryPanelView.swift b/TablePro/Views/Editor/HistoryPanelView.swift index 65f93a4f..70d84fe7 100644 --- a/TablePro/Views/Editor/HistoryPanelView.swift +++ b/TablePro/Views/Editor/HistoryPanelView.swift @@ -5,14 +5,13 @@ // SwiftUI wrapper for HistoryPanelController // -import SwiftUI import AppKit +import SwiftUI /// SwiftUI wrapper for the history/bookmark panel struct HistoryPanelView: NSViewControllerRepresentable { - func makeNSViewController(context: Context) -> HistoryPanelController { - return HistoryPanelController() + HistoryPanelController() } func updateNSViewController(_ nsViewController: HistoryPanelController, context: Context) { diff --git a/TablePro/Views/Editor/LineNumberView.swift b/TablePro/Views/Editor/LineNumberView.swift index 2a622b98..36de72ab 100644 --- a/TablePro/Views/Editor/LineNumberView.swift +++ b/TablePro/Views/Editor/LineNumberView.swift @@ -11,31 +11,30 @@ import AppKit /// Custom line number view positioned left of NSScrollView /// Uses non-layer-backed drawing to prevent text blur in adjacent NSTextView final class LineNumberView: NSView { - // MARK: - Properties - + private weak var textView: NSTextView? private weak var scrollView: NSScrollView? - + /// Cached line start indices (character positions) private var lineStartIndices: [Int] = [0] - + /// Last known text length (to detect changes) private var lastTextLength: Int = 0 - + /// Current width of the view private var currentWidth: CGFloat = SQLEditorTheme.lineNumberRulerMinThickness - + // MARK: - Initialization - + init(textView: NSTextView, scrollView: NSScrollView) { self.textView = textView self.scrollView = scrollView super.init(frame: .zero) - + // CRITICAL: Do not use layer-backed rendering to prevent blur self.wantsLayer = false - + // Observe text changes NotificationCenter.default.addObserver( self, @@ -43,7 +42,7 @@ final class LineNumberView: NSView { name: NSText.didChangeNotification, object: textView ) - + // Observe scroll/bounds changes for synchronization let clipView = scrollView.contentView clipView.postsBoundsChangedNotifications = true @@ -53,47 +52,47 @@ final class LineNumberView: NSView { name: NSView.boundsDidChangeNotification, object: clipView ) - + // Initial cache build updateLineCache(for: textView.string) updateWidth() } - + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - + deinit { NotificationCenter.default.removeObserver(self) } - + // MARK: - Layout - + /// Use flipped coordinates (top-left origin) to match NSTextView override var isFlipped: Bool { - return true + true } - + override var intrinsicContentSize: NSSize { - return NSSize(width: currentWidth, height: NSView.noIntrinsicMetric) + NSSize(width: currentWidth, height: NSView.noIntrinsicMetric) } - + // MARK: - Notifications - + @objc private func textDidChange(_ notification: Notification) { guard let textView = textView else { return } updateLineCache(for: textView.string) updateWidth() needsDisplay = true } - + @objc private func boundsDidChange(_ notification: Notification) { // Scroll synchronization happens via coordinator in container needsDisplay = true } - + // MARK: - Line Cache Management - + /// Update cached line start indices private func updateLineCache(for text: String) { // If text is empty, reset to single line @@ -102,7 +101,7 @@ final class LineNumberView: NSView { lastTextLength = 0 return } - + // If length changed significantly, rebuild cache let textLength = text.count if abs(textLength - lastTextLength) > 100 || lineStartIndices.isEmpty { @@ -111,40 +110,40 @@ final class LineNumberView: NSView { // For simplicity, rebuild (still fast for typical edits) rebuildLineCache(for: text) } - + lastTextLength = textLength } - + /// Rebuild line cache from scratch private func rebuildLineCache(for text: String) { lineStartIndices = [0] - + for (index, char) in text.enumerated() { if char == "\n" { lineStartIndices.append(index + 1) } } } - + /// Update view width based on line count private func updateWidth() { let lineCount = lineStartIndices.count let digits = max(2, String(lineCount).count) let newWidth = CGFloat(digits * 8 + 16) - + if currentWidth != newWidth { currentWidth = newWidth invalidateIntrinsicContentSize() } } - + // MARK: - Drawing - + override func draw(_ dirtyRect: NSRect) { // Draw background SQLEditorTheme.lineNumberBackground.setFill() dirtyRect.fill() - + // Draw right border SQLEditorTheme.lineNumberBorder.setStroke() let borderPath = NSBezierPath() @@ -152,75 +151,75 @@ final class LineNumberView: NSView { borderPath.line(to: NSPoint(x: bounds.maxX - 0.5, y: bounds.maxY)) borderPath.lineWidth = 1 borderPath.stroke() - + guard let textView = textView, let layoutManager = textView.layoutManager, let textContainer = textView.textContainer, let scrollView = scrollView else { return } - + let text = textView.string - + // Handle empty document guard !text.isEmpty else { drawLineNumber(1, at: textView.textContainerOrigin.y) return } - + // Get visible rect from scroll view let visibleRect = scrollView.contentView.bounds let textContainerOrigin = textView.textContainerOrigin - + // Ensure layout layoutManager.ensureLayout(for: textContainer) - + guard layoutManager.numberOfGlyphs > 0 else { return } - + // Get visible glyph range let visibleGlyphRange = layoutManager.glyphRange(forBoundingRect: visibleRect, in: textContainer) guard visibleGlyphRange.location != NSNotFound else { return } - + // Get character range for visible glyphs let visibleCharRange = layoutManager.characterRange(forGlyphRange: visibleGlyphRange, actualGlyphRange: nil) - + // Find first visible line using binary search on cached indices - let firstVisibleLine = lineStartIndices.lastIndex(where: { $0 <= visibleCharRange.location }) ?? 0 - + let firstVisibleLine = lineStartIndices.lastIndex { $0 <= visibleCharRange.location } ?? 0 + // Draw line numbers for visible lines var lineNumber = firstVisibleLine + 1 var currentIndex = firstVisibleLine - var lastDrawnY: CGFloat = -1000 // Track last Y position to avoid duplicates - + var lastDrawnY: CGFloat = -1_000 // Track last Y position to avoid duplicates + while currentIndex < lineStartIndices.count { let lineStart = lineStartIndices[currentIndex] - + // Stop if we've gone past visible range if lineStart >= NSMaxRange(visibleCharRange) { break } - + // Get glyph index for this line let glyphIndex = layoutManager.glyphIndexForCharacter(at: lineStart) guard glyphIndex < layoutManager.numberOfGlyphs else { break } - + // Get line fragment rect (this gives us the first line fragment for wrapped lines) var effectiveRange = NSRange() let lineRect = layoutManager.lineFragmentRect(forGlyphAt: glyphIndex, effectiveRange: &effectiveRange) - + // Calculate Y position in line number view coordinates // Pixel-align for crisp rendering let yPos = floor(lineRect.origin.y + textContainerOrigin.y - visibleRect.origin.y) - + // Only draw if this is a new Y position (avoid drawing for wrapped line fragments) if abs(yPos - lastDrawnY) > 1.0 { drawLineNumber(lineNumber, at: yPos) lastDrawnY = yPos } - + lineNumber += 1 currentIndex += 1 } } - + /// Draw a single line number at the specified Y position private func drawLineNumber(_ number: Int, at yPosition: CGFloat) { let string = "\(number)" @@ -228,12 +227,12 @@ final class LineNumberView: NSView { .font: SQLEditorTheme.lineNumberFont, .foregroundColor: SQLEditorTheme.lineNumberText ] - + let size = string.size(withAttributes: attributes) let xPos = currentWidth - size.width - 8 // Pixel-align Y position for crisp text let yPos = floor(yPosition + (17 - size.height) / 2) - + string.draw(at: NSPoint(x: xPos, y: yPos), withAttributes: attributes) } } diff --git a/TablePro/Views/Editor/QueryEditorView.swift b/TablePro/Views/Editor/QueryEditorView.swift index 5f9b1dd2..0495c970 100644 --- a/TablePro/Views/Editor/QueryEditorView.swift +++ b/TablePro/Views/Editor/QueryEditorView.swift @@ -13,15 +13,15 @@ struct QueryEditorView: View { @Binding var cursorPosition: Int // Track cursor for query-at-cursor execution var onExecute: () -> Void var schemaProvider: SQLSchemaProvider? // Optional for autocomplete - + var body: some View { VStack(alignment: .leading, spacing: 0) { // Editor header with toolbar (above editor, higher z-index) editorToolbar .zIndex(1) - + Divider() - + // SQL Editor (AppKit-based with syntax highlighting and built-in line numbers) SQLEditorView(text: $queryText, cursorPosition: $cursorPosition, onExecute: onExecute, schemaProvider: schemaProvider) .frame(minHeight: 100) @@ -29,17 +29,17 @@ struct QueryEditorView: View { } .background(Color(nsColor: .textBackgroundColor)) } - + // MARK: - Toolbar - + private var editorToolbar: some View { HStack { Text("Query") .font(.headline) .foregroundStyle(.secondary) - + Spacer() - + // Clear button Button(action: { queryText = "" }) { Image(systemName: "trash") @@ -47,17 +47,17 @@ struct QueryEditorView: View { .buttonStyle(.borderless) .help("Clear Query (⌘+Delete)") .keyboardShortcut(.delete, modifiers: .command) - + // Format button Button(action: formatQuery) { Image(systemName: "text.alignleft") } .buttonStyle(.borderless) .help("Format Query") - + Divider() .frame(height: 16) - + // Execute button Button(action: onExecute) { HStack(spacing: 4) { @@ -73,18 +73,18 @@ struct QueryEditorView: View { .padding(.vertical, 8) .background(Color(nsColor: .windowBackgroundColor)) } - + // MARK: - Helpers - + private func formatQuery() { // Basic formatting: uppercase keywords - let keywords = ["SELECT", "FROM", "WHERE", "ORDER BY", "GROUP BY", "HAVING", - "INSERT", "UPDATE", "DELETE", "CREATE", "DROP", "ALTER", - "JOIN", "LEFT", "RIGHT", "INNER", "OUTER", "ON", - "AND", "OR", "NOT", "IN", "LIKE", "BETWEEN", "AS", - "LIMIT", "OFFSET", "DISTINCT", "COUNT", "SUM", "AVG", "MAX", "MIN", - "NULL", "IS", "ASC", "DESC", "SET", "VALUES", "INTO", "TABLE"] - + let keywords = ["SELECT", "FROM", "WHERE", "ORDER BY", "GROUP BY", "HAVING", + "INSERT", "UPDATE", "DELETE", "CREATE", "DROP", "ALTER", + "JOIN", "LEFT", "RIGHT", "INNER", "OUTER", "ON", + "AND", "OR", "NOT", "IN", "LIKE", "BETWEEN", "AS", + "LIMIT", "OFFSET", "DISTINCT", "COUNT", "SUM", "AVG", "MAX", "MIN", + "NULL", "IS", "ASC", "DESC", "SET", "VALUES", "INTO", "TABLE"] + var formatted = queryText for keyword in keywords { // Match word boundaries @@ -101,8 +101,7 @@ struct QueryEditorView: View { #Preview { QueryEditorView( queryText: .constant("SELECT * FROM users\nWHERE active = true\nORDER BY created_at DESC;"), - cursorPosition: .constant(0), - onExecute: {} - ) + cursorPosition: .constant(0) + ) {} .frame(width: 600, height: 200) } diff --git a/TablePro/Views/Editor/QueryPreviewViewController.swift b/TablePro/Views/Editor/QueryPreviewViewController.swift index 11eb4eb5..4f920edd 100644 --- a/TablePro/Views/Editor/QueryPreviewViewController.swift +++ b/TablePro/Views/Editor/QueryPreviewViewController.swift @@ -9,7 +9,6 @@ import AppKit /// Displays query preview with syntax highlighting and metadata final class QueryPreviewViewController: NSViewController { - // MARK: - State private enum PreviewMode { diff --git a/TablePro/Views/Editor/QuerySuccessView.swift b/TablePro/Views/Editor/QuerySuccessView.swift index 6623fa95..854ac8f7 100644 --- a/TablePro/Views/Editor/QuerySuccessView.swift +++ b/TablePro/Views/Editor/QuerySuccessView.swift @@ -11,49 +11,49 @@ import SwiftUI struct QuerySuccessView: View { let rowsAffected: Int let executionTime: TimeInterval? - + var body: some View { VStack(spacing: 16) { Spacer() - + // Success icon Image(systemName: "checkmark.circle.fill") .font(.system(size: 64)) .foregroundStyle(.green) - + // Success message Text("Query executed successfully") .font(.headline) .foregroundStyle(.primary) - + // Details HStack(spacing: 8) { // Rows affected Label("\(rowsAffected) row\(rowsAffected == 1 ? "" : "s") affected", systemImage: "square.stack.3d.up") .foregroundStyle(.secondary) - + if let time = executionTime { Text("•") .foregroundStyle(.tertiary) - + // Execution time Text(formatExecutionTime(time)) .foregroundStyle(.secondary) } } .font(.subheadline) - + Spacer() } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color(nsColor: .textBackgroundColor)) } - + private func formatExecutionTime(_ time: TimeInterval) -> String { if time < 0.001 { - return String(format: "%.3f ms", time * 1000) + return String(format: "%.3f ms", time * 1_000) } else if time < 1 { - return String(format: "%.2f ms", time * 1000) + return String(format: "%.2f ms", time * 1_000) } else { return String(format: "%.2f s", time) } diff --git a/TablePro/Views/Editor/SQLCompletionWindowController.swift b/TablePro/Views/Editor/SQLCompletionWindowController.swift index 5a6a0b8f..cf3dc333 100644 --- a/TablePro/Views/Editor/SQLCompletionWindowController.swift +++ b/TablePro/Views/Editor/SQLCompletionWindowController.swift @@ -12,7 +12,6 @@ import SwiftUI /// Controller for the autocomplete popup window final class SQLCompletionWindowController: NSObject { - // MARK: - Properties private var window: NSPanel? @@ -22,18 +21,18 @@ final class SQLCompletionWindowController: NSObject { private var items: [SQLCompletionItem] = [] private var selectedIndex: Int = 0 - + /// Callback when an item is selected var onSelect: ((SQLCompletionItem) -> Void)? - + /// Callback when completion is dismissed var onDismiss: (() -> Void)? - + /// Whether the window is currently visible var isVisible: Bool { window?.isVisible ?? false } - + // MARK: - Window Configuration private let windowWidth: CGFloat = 400 @@ -51,7 +50,7 @@ final class SQLCompletionWindowController: NSObject { } // MARK: - Public API - + /// Show completions at the specified screen position func showCompletions( _ items: [SQLCompletionItem], @@ -62,32 +61,32 @@ final class SQLCompletionWindowController: NSObject { dismiss() return } - + self.items = items self.selectedIndex = 0 - + // CRITICAL: Dismiss existing window first to prevent duplicates // This ensures only one window exists at a time if window?.isVisible == true { window?.parent?.removeChildWindow(window!) window?.orderOut(nil) } - + // Create or update window if window == nil { createWindow() } - + let height = calculateWindowHeight(for: items.count) - + // Position window var windowOrigin = position windowOrigin.y -= height // Position below cursor - + // Ensure window stays on screen if let screen = parentWindow?.screen ?? NSScreen.main { let screenFrame = screen.visibleFrame - + if windowOrigin.x + windowWidth > screenFrame.maxX { windowOrigin.x = screenFrame.maxX - windowWidth - 10 } @@ -95,18 +94,18 @@ final class SQLCompletionWindowController: NSObject { windowOrigin.y = position.y + 20 // Position above cursor instead } } - + let frameRect = NSRect(x: windowOrigin.x, y: windowOrigin.y, width: windowWidth, height: height) let selectedIdx = self.selectedIndex let panel = self.window - + // Ensure all UI updates run on the main thread let uiUpdates = { [weak self] in guard let self = self else { return } self.tableView?.reloadData() self.tableView?.selectRowIndexes(IndexSet(integer: selectedIdx), byExtendingSelection: false) panel?.setFrame(frameRect, display: true) - + // Show window if let parent = parentWindow, let panel = panel { parent.addChildWindow(panel, ordered: .above) @@ -116,27 +115,27 @@ final class SQLCompletionWindowController: NSObject { // Install mouse monitor for click-outside detection self.installMouseMonitor() } - + if Thread.isMainThread { uiUpdates() } else { DispatchQueue.main.async(execute: uiUpdates) } } - + /// Update completions without repositioning func updateCompletions(_ items: [SQLCompletionItem]) { guard !items.isEmpty else { dismiss() return } - + self.items = items self.selectedIndex = min(selectedIndex, items.count - 1) - + let height = calculateWindowHeight(for: items.count) let selectedIdx = self.selectedIndex - + var newFrame: NSRect? if var frame = window?.frame { let oldY = frame.origin.y + frame.height @@ -144,7 +143,7 @@ final class SQLCompletionWindowController: NSObject { frame.origin.y = oldY - height newFrame = frame } - + // Ensure all UI updates run on the main thread let uiUpdates = { [weak self] in guard let self = self else { return } @@ -154,28 +153,28 @@ final class SQLCompletionWindowController: NSObject { self.window?.setFrame(frame, display: true) } } - + if Thread.isMainThread { uiUpdates() } else { DispatchQueue.main.async(execute: uiUpdates) } } - + /// Dismiss the completion window func dismiss() { guard let panel = window else { onDismiss?() return } - + let dismissAction = { [weak self] in self?.removeMouseMonitor() panel.parent?.removeChildWindow(panel) panel.orderOut(nil) self?.onDismiss?() } - + if Thread.isMainThread { dismissAction() } else { @@ -214,37 +213,37 @@ final class SQLCompletionWindowController: NSObject { } // MARK: - Keyboard Navigation - + /// Handle key event, returns true if handled func handleKeyEvent(_ event: NSEvent) -> Bool { guard isVisible else { return false } - + switch event.keyCode { case 125: // Down arrow selectNext() return true - + case 126: // Up arrow selectPrevious() return true - + case 36: // Return confirmSelection() return true - + case 53: // Escape dismiss() return true - + case 48: // Tab confirmSelection() return true - + default: return false } } - + /// Move selection down func selectNext() { guard !items.isEmpty else { return } @@ -255,7 +254,7 @@ final class SQLCompletionWindowController: NSObject { self?.tableView?.scrollRowToVisible(idx) } } - + /// Move selection up func selectPrevious() { guard !items.isEmpty else { return } @@ -266,7 +265,7 @@ final class SQLCompletionWindowController: NSObject { self?.tableView?.scrollRowToVisible(idx) } } - + /// Confirm current selection func confirmSelection() { guard selectedIndex < items.count else { return } @@ -274,15 +273,15 @@ final class SQLCompletionWindowController: NSObject { dismiss() onSelect?(item) } - + // MARK: - Private Helpers - + /// Calculate window height based on item count private func calculateWindowHeight(for itemCount: Int) -> CGFloat { let visibleRows = min(itemCount, maxVisibleRows) return CGFloat(visibleRows) * rowHeight + 4 } - + /// Execute a closure on the main thread private func performOnMainThread(_ action: @escaping () -> Void) { if Thread.isMainThread { @@ -291,9 +290,9 @@ final class SQLCompletionWindowController: NSObject { DispatchQueue.main.async(execute: action) } } - + // MARK: - Window Creation - + private func createWindow() { // Create panel (non-activating) let panel = NSPanel( @@ -307,7 +306,7 @@ final class SQLCompletionWindowController: NSObject { panel.hasShadow = true panel.backgroundColor = NSColor.controlBackgroundColor panel.isOpaque = false - + // Create scroll view let scrollBounds = panel.contentView?.bounds ?? NSRect(x: 0, y: 0, width: windowWidth, height: 200) let scroll = NSScrollView(frame: scrollBounds) @@ -316,7 +315,7 @@ final class SQLCompletionWindowController: NSObject { scroll.autoresizingMask = [.width, .height] scroll.drawsBackground = true scroll.backgroundColor = NSColor.controlBackgroundColor - + // Create table view let table = NSTableView() table.style = .plain @@ -330,27 +329,27 @@ final class SQLCompletionWindowController: NSObject { table.dataSource = self table.doubleAction = #selector(tableDoubleClicked) table.target = self - + // Add single column let column = NSTableColumn(identifier: NSUserInterfaceItemIdentifier("completion")) column.width = windowWidth - 20 table.addTableColumn(column) - + scroll.documentView = table panel.contentView = scroll - + // Add visual polish: rounded corners, border panel.contentView?.wantsLayer = true panel.contentView?.layer?.cornerRadius = 8 panel.contentView?.layer?.masksToBounds = true panel.contentView?.layer?.borderWidth = 1 panel.contentView?.layer?.borderColor = NSColor.separatorColor.cgColor - + self.window = panel self.tableView = table self.scrollView = scroll } - + @objc private func tableDoubleClicked() { confirmSelection() } @@ -359,28 +358,27 @@ final class SQLCompletionWindowController: NSObject { // MARK: - NSTableViewDelegate & DataSource extension SQLCompletionWindowController: NSTableViewDelegate, NSTableViewDataSource { - func numberOfRows(in tableView: NSTableView) -> Int { items.count } - + func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { guard row < items.count else { return nil } let item = items[row] - + // Reuse or create cell view let cellId = NSUserInterfaceItemIdentifier("CompletionCell") var cellView = tableView.makeView(withIdentifier: cellId, owner: nil) as? CompletionCellView - + if cellView == nil { cellView = CompletionCellView() cellView?.identifier = cellId } - + cellView?.configure(with: item) return cellView } - + func tableViewSelectionDidChange(_ notification: Notification) { if let table = notification.object as? NSTableView, table.selectedRow >= 0 { selectedIndex = table.selectedRow @@ -392,22 +390,21 @@ extension SQLCompletionWindowController: NSTableViewDelegate, NSTableViewDataSou // MARK: - Completion Cell View private final class CompletionCellView: NSTableCellView { - private let iconView = NSImageView() private let labelField = NSTextField(labelWithString: "") private let detailField = NSTextField(labelWithString: "") private let kindBadge = NSTextField(labelWithString: "") - + override init(frame frameRect: NSRect) { super.init(frame: frameRect) setupViews() } - + required init?(coder: NSCoder) { super.init(coder: coder) setupViews() } - + private func setupViews() { // Icon with background iconView.translatesAutoresizingMaskIntoConstraints = false @@ -415,7 +412,7 @@ private final class CompletionCellView: NSTableCellView { iconView.wantsLayer = true iconView.layer?.cornerRadius = 3 addSubview(iconView) - + // Label (main text) labelField.translatesAutoresizingMaskIntoConstraints = false labelField.font = .monospacedSystemFont(ofSize: 12, weight: .medium) @@ -423,7 +420,7 @@ private final class CompletionCellView: NSTableCellView { labelField.setContentHuggingPriority(.defaultLow, for: .horizontal) labelField.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) addSubview(labelField) - + // Kind badge (small label like "func", "col", "tbl") kindBadge.translatesAutoresizingMaskIntoConstraints = false kindBadge.font = .systemFont(ofSize: 9, weight: .medium) @@ -434,7 +431,7 @@ private final class CompletionCellView: NSTableCellView { kindBadge.layer?.masksToBounds = true kindBadge.setContentHuggingPriority(.required, for: .horizontal) addSubview(kindBadge) - + // Detail (type info) detailField.translatesAutoresizingMaskIntoConstraints = false detailField.font = .systemFont(ofSize: 10) @@ -443,28 +440,28 @@ private final class CompletionCellView: NSTableCellView { detailField.lineBreakMode = .byTruncatingTail detailField.setContentHuggingPriority(.defaultHigh, for: .horizontal) addSubview(detailField) - + NSLayoutConstraint.activate([ iconView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 6), iconView.centerYAnchor.constraint(equalTo: centerYAnchor), iconView.widthAnchor.constraint(equalToConstant: 16), iconView.heightAnchor.constraint(equalToConstant: 16), - + labelField.leadingAnchor.constraint(equalTo: iconView.trailingAnchor, constant: 6), labelField.centerYAnchor.constraint(equalTo: centerYAnchor), - + kindBadge.leadingAnchor.constraint(equalTo: labelField.trailingAnchor, constant: 6), kindBadge.centerYAnchor.constraint(equalTo: centerYAnchor), kindBadge.widthAnchor.constraint(greaterThanOrEqualToConstant: 28), kindBadge.heightAnchor.constraint(equalToConstant: 14), - + detailField.leadingAnchor.constraint(greaterThanOrEqualTo: kindBadge.trailingAnchor, constant: 6), detailField.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8), detailField.centerYAnchor.constraint(equalTo: centerYAnchor), detailField.widthAnchor.constraint(lessThanOrEqualToConstant: 100), ]) } - + func configure(with item: SQLCompletionItem) { // Icon let config = NSImage.SymbolConfiguration(pointSize: 12, weight: .medium) @@ -472,17 +469,17 @@ private final class CompletionCellView: NSTableCellView { iconView.image = image iconView.contentTintColor = item.kind.iconColor } - + // Label labelField.stringValue = item.label - + // Kind badge kindBadge.stringValue = kindAbbreviation(for: item.kind) kindBadge.layer?.backgroundColor = item.kind.iconColor.withAlphaComponent(0.8).cgColor - + // Detail (show type for columns, signature for functions) detailField.stringValue = item.detail ?? "" - + // Tooltip with full documentation if let doc = item.documentation, !doc.isEmpty { self.toolTip = doc @@ -492,7 +489,7 @@ private final class CompletionCellView: NSTableCellView { self.toolTip = item.label } } - + /// Get short abbreviation for kind badge private func kindAbbreviation(for kind: SQLCompletionKind) -> String { switch kind { diff --git a/TablePro/Views/Editor/SQLEditorTheme.swift b/TablePro/Views/Editor/SQLEditorTheme.swift index d4661276..019e91c2 100644 --- a/TablePro/Views/Editor/SQLEditorTheme.swift +++ b/TablePro/Views/Editor/SQLEditorTheme.swift @@ -9,71 +9,70 @@ import AppKit /// Centralized theme configuration for the SQL editor struct SQLEditorTheme { - // MARK: - Colors - + /// Background color for the editor static let background = NSColor.textBackgroundColor - + /// Default text color static let text = NSColor.textColor - + /// Current line highlight color static let currentLineHighlight = NSColor.controlAccentColor.withAlphaComponent(0.08) - + /// Bracket matching highlight color static let bracketMatchHighlight = NSColor.systemYellow.withAlphaComponent(0.35) - + /// Insertion point (cursor) color static let insertionPoint = NSColor.controlAccentColor - + // MARK: - Syntax Highlighting Colors - + /// SQL keywords (SELECT, FROM, WHERE, etc.) static let keyword = NSColor.systemBlue - + /// String literals ('...', "...", `...`) static let string = NSColor.systemRed - + /// Numeric literals static let number = NSColor.systemPurple - + /// Comments (-- and /* */) static let comment = NSColor.systemGreen - + /// NULL, TRUE, FALSE static let null = NSColor.systemOrange - + // MARK: - Fonts - + /// Main editor font static let font = NSFont.monospacedSystemFont(ofSize: 13, weight: .regular) - + /// Line number font static let lineNumberFont = NSFont.monospacedSystemFont(ofSize: 11, weight: .regular) - + // MARK: - Sizes - + /// Text container inset static let textContainerInset = NSSize(width: 0, height: 5) - + /// Line fragment padding (left/right margin inside text container) static let lineFragmentPadding: CGFloat = 5 - + /// Line number ruler thickness (will be calculated based on digits) static let lineNumberRulerMinThickness: CGFloat = 40 - + /// Corner radius for rounded highlights static let highlightCornerRadius: CGFloat = 2 - + // MARK: - Line Number Ruler Colors - + /// Line number text color static let lineNumberText = NSColor.secondaryLabelColor - + /// Line number ruler background static let lineNumberBackground = NSColor.controlBackgroundColor.withAlphaComponent(0.5) - + /// Line number ruler border static let lineNumberBorder = NSColor.separatorColor } diff --git a/TablePro/Views/Editor/SQLEditorView.swift b/TablePro/Views/Editor/SQLEditorView.swift index 927ab73b..4882bdcd 100644 --- a/TablePro/Views/Editor/SQLEditorView.swift +++ b/TablePro/Views/Editor/SQLEditorView.swift @@ -6,8 +6,8 @@ // Fully rewritten with clean architecture // -import SwiftUI import AppKit +import SwiftUI // MARK: - SQLEditorView @@ -17,11 +17,11 @@ struct SQLEditorView: NSViewRepresentable { @Binding var cursorPosition: Int var onExecute: (() -> Void)? var schemaProvider: SQLSchemaProvider? - + func makeNSView(context: Context) -> NSView { // Create container view to hold line numbers and scroll view let containerView = NSView() - + // Create scroll view let scrollView = NSScrollView() scrollView.hasVerticalScroller = true @@ -29,17 +29,17 @@ struct SQLEditorView: NSViewRepresentable { scrollView.borderType = .noBorder scrollView.drawsBackground = true scrollView.backgroundColor = SQLEditorTheme.background - + // Create text storage, layout manager, and text container let textStorage = NSTextStorage() let layoutManager = NSLayoutManager() textStorage.addLayoutManager(layoutManager) - + let textContainer = NSTextContainer(size: NSSize(width: 0, height: CGFloat.greatestFiniteMagnitude)) textContainer.widthTracksTextView = true textContainer.lineFragmentPadding = SQLEditorTheme.lineFragmentPadding layoutManager.addTextContainer(textContainer) - + // Create text view using EditorTextView with the text container let textView = EditorTextView(frame: .zero, textContainer: textContainer) textView.minSize = NSSize(width: 0, height: 0) @@ -47,7 +47,7 @@ struct SQLEditorView: NSViewRepresentable { textView.isVerticallyResizable = true textView.isHorizontallyResizable = false textView.autoresizingMask = .width - + textView.isRichText = false textView.allowsUndo = true textView.font = SQLEditorTheme.font @@ -65,48 +65,48 @@ struct SQLEditorView: NSViewRepresentable { // Set initial text textView.string = text - + // Set up coordinator (textStorage is now guaranteed to exist) context.coordinator.setup(textView: textView, textStorage: textStorage) - + // MUST set documentView BEFORE creating line number view scrollView.documentView = textView - + // Create custom line number view (positioned left of scroll view) let lineNumberView = LineNumberView(textView: textView, scrollView: scrollView) - + // Add both views to container containerView.addSubview(lineNumberView) containerView.addSubview(scrollView) - + // Disable autoresizing masks (use Auto Layout) lineNumberView.translatesAutoresizingMaskIntoConstraints = false scrollView.translatesAutoresizingMaskIntoConstraints = false - + // Set up layout constraints NSLayoutConstraint.activate([ // Line number view: left side, full height, intrinsic width lineNumberView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), lineNumberView.topAnchor.constraint(equalTo: containerView.topAnchor), lineNumberView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), - + // Scroll view: right side, full height scrollView.leadingAnchor.constraint(equalTo: lineNumberView.trailingAnchor), scrollView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), scrollView.topAnchor.constraint(equalTo: containerView.topAnchor), scrollView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor) ]) - + return containerView } - + func updateNSView(_ nsView: NSView, context: Context) { // Extract scroll view from container view and update text if changed from SwiftUI side if let scrollView = nsView.subviews.first(where: { $0 is NSScrollView }) as? NSScrollView { context.coordinator.updateTextViewIfNeeded(with: text) } } - + func makeCoordinator() -> EditorCoordinator { EditorCoordinator( text: $text, diff --git a/TablePro/Views/Editor/SyntaxHighlighter.swift b/TablePro/Views/Editor/SyntaxHighlighter.swift index 07126337..37172cfd 100644 --- a/TablePro/Views/Editor/SyntaxHighlighter.swift +++ b/TablePro/Views/Editor/SyntaxHighlighter.swift @@ -9,48 +9,47 @@ import AppKit /// Incremental syntax highlighter that operates on edited ranges only final class SyntaxHighlighter: NSObject, NSTextStorageDelegate { - // MARK: - Properties - + private weak var textStorage: NSTextStorage? - + /// SQL keywords for highlighting (synced with SQLKeywords for consistency) private static let keywords: Set = [ // DQL "SELECT", "FROM", "WHERE", "AND", "OR", "NOT", "IN", "LIKE", "BETWEEN", "AS", "DISTINCT", "ALL", "TOP", - + // Joins "JOIN", "INNER", "LEFT", "RIGHT", "FULL", "OUTER", "CROSS", "ON", "USING", - + // Ordering & Grouping "ORDER", "BY", "ASC", "DESC", "NULLS", "FIRST", "LAST", "GROUP", "HAVING", - - // Limiting + + // Limiting "LIMIT", "OFFSET", "FETCH", "NEXT", "ROWS", "ONLY", - + // Set operations "UNION", "INTERSECT", "EXCEPT", "MINUS", - + // Subqueries "EXISTS", "ANY", "SOME", - + // DML "INSERT", "INTO", "VALUES", "DEFAULT", "UPDATE", "SET", "DELETE", "TRUNCATE", - + // DDL - Tables "CREATE", "ALTER", "DROP", "RENAME", "MODIFY", "CHANGE", "TABLE", "VIEW", "INDEX", "DATABASE", "SCHEMA", "ADD", "COLUMN", "AFTER", "BEFORE", - + // Constraints "CONSTRAINT", "PRIMARY", "FOREIGN", "KEY", "REFERENCES", "UNIQUE", "CHECK", "CASCADE", "RESTRICT", "NO", "ACTION", "AUTO_INCREMENT", "AUTOINCREMENT", "SERIAL", - + // Data types "INT", "INTEGER", "BIGINT", "SMALLINT", "TINYINT", "DECIMAL", "NUMERIC", "FLOAT", "DOUBLE", "REAL", @@ -58,60 +57,60 @@ final class SyntaxHighlighter: NSObject, NSTextStorageDelegate { "DATE", "TIME", "DATETIME", "TIMESTAMP", "YEAR", "BOOLEAN", "BOOL", "BIT", "JSON", "JSONB", "XML", "UUID", "BINARY", "VARBINARY", "UNSIGNED", "SIGNED", - + // Conditionals "CASE", "WHEN", "THEN", "ELSE", "END", "IF", - + // NULL/Boolean "NULL", "IS", "TRUE", "FALSE", "UNKNOWN", - + // Transactions "BEGIN", "COMMIT", "ROLLBACK", "SAVEPOINT", "TRANSACTION", - + // Other "WITH", "RECURSIVE", "TEMPORARY", "TEMP", "EXPLAIN", "ANALYZE", "DESCRIBE", "SHOW", "WINDOW", "OVER", "PARTITION", "RANGE", "ILIKE", "SIMILAR", "REGEXP", "RLIKE" ] - + // MARK: - Compiled Regex Patterns (Thread-Safe, Compiled Once) - + private static let keywordRegex: NSRegularExpression? = { let pattern = "\\b(" + keywords.joined(separator: "|") + ")\\b" return try? NSRegularExpression(pattern: pattern, options: .caseInsensitive) }() - + private static let stringRegexes: [NSRegularExpression] = { ["'[^']*'", "\"[^\"]*\"", "`[^`]*`"].compactMap { try? NSRegularExpression(pattern: $0) } }() - + private static let numberRegex: NSRegularExpression? = { try? NSRegularExpression(pattern: "\\b\\d+(\\.\\d+)?\\b") }() - + private static let singleLineCommentRegex: NSRegularExpression? = { try? NSRegularExpression(pattern: "--[^\\n]*") }() - + private static let multiLineCommentRegex: NSRegularExpression? = { try? NSRegularExpression(pattern: "/\\*[\\s\\S]*?\\*/") }() - + private static let nullBoolRegex: NSRegularExpression? = { try? NSRegularExpression(pattern: "\\b(NULL|TRUE|FALSE)\\b", options: .caseInsensitive) }() - + // MARK: - Initialization - + init(textStorage: NSTextStorage) { self.textStorage = textStorage super.init() textStorage.delegate = self } - + // MARK: - NSTextStorageDelegate - + /// Called after text storage processes an edit /// This is THE RIGHT PLACE to apply syntax highlighting func textStorage( @@ -122,19 +121,19 @@ final class SyntaxHighlighter: NSObject, NSTextStorageDelegate { ) { // Only process character changes, not attribute-only changes guard editedMask.contains(.editedCharacters) else { return } - + // Expand range to full line(s) let text = textStorage.string - guard text.count > 0 else { return } - + guard !text.isEmpty else { return } + let expandedRange = expandToLineRange(editedRange, in: text) - + // Apply highlighting to the expanded range only highlightRange(expandedRange, in: textStorage) } - + // MARK: - Public API - + /// Manually trigger full document highlighting (e.g., on initial load) func highlightFullDocument() { guard let textStorage = textStorage else { return } @@ -142,43 +141,43 @@ final class SyntaxHighlighter: NSObject, NSTextStorageDelegate { guard fullRange.length > 0 else { return } highlightRange(fullRange, in: textStorage) } - + // MARK: - Private Helpers - + /// Expand edited range to include full lines private func expandToLineRange(_ range: NSRange, in text: String) -> NSRange { - guard text.count > 0, range.location < text.count else { + guard !text.isEmpty, range.location < text.count else { return NSRange(location: 0, length: text.count) } - + let nsString = text as NSString let lineRange = nsString.lineRange(for: range) return lineRange } - + /// Apply syntax highlighting to a specific range private func highlightRange(_ range: NSRange, in textStorage: NSTextStorage) { guard range.length > 0, range.location + range.length <= textStorage.length else { return } - + let text = textStorage.string let nsText = text as NSString let substring = nsText.substring(with: range) - + // Begin editing (batch attribute changes) textStorage.beginEditing() - + // Reset to default attributes in this range textStorage.addAttributes([ .font: SQLEditorTheme.font, .foregroundColor: SQLEditorTheme.text ], range: range) - + // Detect strings and comments first (these take precedence) var stringRanges: [NSRange] = [] var commentRanges: [NSRange] = [] - + // Find all strings for regex in Self.stringRegexes { regex.enumerateMatches(in: substring, range: NSRange(location: 0, length: substring.count)) { match, _, _ in @@ -189,7 +188,7 @@ final class SyntaxHighlighter: NSObject, NSTextStorageDelegate { } } } - + // Find all comments Self.singleLineCommentRegex?.enumerateMatches(in: substring, range: NSRange(location: 0, length: substring.count)) { match, _, _ in if let matchRange = match?.range { @@ -198,7 +197,7 @@ final class SyntaxHighlighter: NSObject, NSTextStorageDelegate { textStorage.addAttribute(.foregroundColor, value: SQLEditorTheme.comment, range: absoluteRange) } } - + Self.multiLineCommentRegex?.enumerateMatches(in: substring, range: NSRange(location: 0, length: substring.count)) { match, _, _ in if let matchRange = match?.range { let absoluteRange = NSRange(location: range.location + matchRange.location, length: matchRange.length) @@ -206,7 +205,7 @@ final class SyntaxHighlighter: NSObject, NSTextStorageDelegate { textStorage.addAttribute(.foregroundColor, value: SQLEditorTheme.comment, range: absoluteRange) } } - + // Helper to check if a range overlaps with strings or comments let isInsideStringOrComment: (NSRange) -> Bool = { checkRange in for stringRange in stringRanges { @@ -221,7 +220,7 @@ final class SyntaxHighlighter: NSObject, NSTextStorageDelegate { } return false } - + // Highlight keywords (only outside strings/comments) Self.keywordRegex?.enumerateMatches(in: substring, range: NSRange(location: 0, length: substring.count)) { match, _, _ in if let matchRange = match?.range { @@ -231,7 +230,7 @@ final class SyntaxHighlighter: NSObject, NSTextStorageDelegate { } } } - + // Highlight numbers (only outside strings/comments) Self.numberRegex?.enumerateMatches(in: substring, range: NSRange(location: 0, length: substring.count)) { match, _, _ in if let matchRange = match?.range { @@ -241,7 +240,7 @@ final class SyntaxHighlighter: NSObject, NSTextStorageDelegate { } } } - + // Highlight NULL, TRUE, FALSE (only outside strings/comments) Self.nullBoolRegex?.enumerateMatches(in: substring, range: NSRange(location: 0, length: substring.count)) { match, _, _ in if let matchRange = match?.range { @@ -251,7 +250,7 @@ final class SyntaxHighlighter: NSObject, NSTextStorageDelegate { } } } - + // End editing (commit changes) textStorage.endEditing() } diff --git a/TablePro/Views/Editor/TemplateSheets.swift b/TablePro/Views/Editor/TemplateSheets.swift index e98e3b71..ba6399fe 100644 --- a/TablePro/Views/Editor/TemplateSheets.swift +++ b/TablePro/Views/Editor/TemplateSheets.swift @@ -13,21 +13,21 @@ struct SaveTemplateSheet: View { @Binding var templateName: String let onSave: () -> Void let onCancel: () -> Void - + var body: some View { VStack(spacing: DesignConstants.Spacing.md) { Text("Save Table Template") .font(.headline) - + TextField("Template Name", text: $templateName) .textFieldStyle(.roundedBorder) - + HStack { Button("Cancel", action: onCancel) .keyboardShortcut(.escape) - + Spacer() - + Button("Save", action: onSave) .buttonStyle(.borderedProminent) .disabled(templateName.isEmpty) @@ -47,21 +47,21 @@ struct LoadTemplateSheet: View { let onLoad: (String) -> Void let onDelete: (String) -> Void let onCancel: () -> Void - + @State private var selectedTemplate: String? - + private var listHeight: CGFloat { // Dynamic height based on number of templates (max 8 items visible) let itemHeight: CGFloat = 30 let maxItems = min(templates.count, 8) return CGFloat(maxItems) * itemHeight + 10 } - + var body: some View { VStack(spacing: DesignConstants.Spacing.md) { Text("Load Table Template") .font(.headline) - + if templates.isEmpty { Text("No saved templates") .foregroundStyle(.secondary) @@ -71,9 +71,9 @@ struct LoadTemplateSheet: View { HStack { Text(template) .font(.system(size: DesignConstants.FontSize.body)) - + Spacer() - + Button(action: { onDelete(template) }) { @@ -89,13 +89,13 @@ struct LoadTemplateSheet: View { .scrollContentBackground(.hidden) .frame(height: listHeight) } - + HStack { Button("Cancel", action: onCancel) .keyboardShortcut(.escape) - + Spacer() - + Button("Load") { if let selected = selectedTemplate { onLoad(selected) @@ -118,16 +118,16 @@ struct ImportDDLSheet: View { @Binding var ddlText: String let onImport: () -> Void let onCancel: () -> Void - + var body: some View { VStack(spacing: DesignConstants.Spacing.md) { Text("Import from DDL") .font(.headline) - + Text("Paste your CREATE TABLE statement below:") .font(.caption) .foregroundStyle(.secondary) - + TextEditor(text: $ddlText) .font(.system(.body, design: .monospaced)) .frame(height: 250) @@ -135,13 +135,13 @@ struct ImportDDLSheet: View { .padding(DesignConstants.Spacing.xs) .background(Color(nsColor: .textBackgroundColor)) .cornerRadius(6) - + HStack { Button("Cancel", action: onCancel) .keyboardShortcut(.escape) - + Spacer() - + Button("Import") { onImport() } @@ -163,23 +163,23 @@ struct DuplicateTableSheet: View { @Binding var selectedTable: String? let onDuplicate: () -> Void let onCancel: () -> Void - + private var listHeight: CGFloat { // Dynamic height based on number of tables (max 10 items visible) let itemHeight: CGFloat = 30 let maxItems = min(tables.count, 10) return CGFloat(max(maxItems, 1)) * itemHeight + 10 } - + var body: some View { VStack(spacing: DesignConstants.Spacing.md) { Text("Duplicate Table Structure") .font(.headline) - + Text("Select a table to copy its structure:") .font(.caption) .foregroundStyle(.secondary) - + if tables.isEmpty { ProgressView("Loading tables...") .padding(.vertical, 40) @@ -193,13 +193,13 @@ struct DuplicateTableSheet: View { .scrollContentBackground(.hidden) .frame(height: listHeight) } - + HStack { Button("Cancel", action: onCancel) .keyboardShortcut(.escape) - + Spacer() - + Button("Duplicate") { onDuplicate() } diff --git a/TablePro/Views/Export/ExportDialog.swift b/TablePro/Views/Export/ExportDialog.swift index f7516311..857a519e 100644 --- a/TablePro/Views/Export/ExportDialog.swift +++ b/TablePro/Views/Export/ExportDialog.swift @@ -83,11 +83,10 @@ struct ExportDialog: View { totalTables: exportServiceState.totalTables, processedRows: exportServiceState.processedRows, totalRows: exportServiceState.totalRows, - statusMessage: exportServiceState.statusMessage, - onStop: { - exportServiceState.service?.cancelExport() - } - ) + statusMessage: exportServiceState.statusMessage + ) { + exportServiceState.service?.cancelExport() + } .interactiveDismissDisabled() } .sheet(isPresented: $showSuccessDialog) { @@ -356,9 +355,9 @@ struct ExportDialog: View { // Prevent path traversal attempts and special directory names if name == "." || name == ".." || - name.hasPrefix("../") || name.hasPrefix("..\\") || - name.hasSuffix("/..") || name.hasSuffix("\\..") || - name.contains("/../") || name.contains("\\..\\") { + name.hasPrefix("../") || name.hasPrefix("..\\") || + name.hasSuffix("/..") || name.hasSuffix("\\..") || + name.contains("/../") || name.contains("\\..\\") { return "Filename cannot be '.' or '..' or contain path traversal" } @@ -481,7 +480,6 @@ struct ExportDialog: View { } else if !connection.database.isEmpty { config.fileName = connection.database } - } catch { isLoading = false errorMessage = "Failed to load databases: \(error.localizedDescription)" @@ -610,7 +608,6 @@ struct ExportDialog: View { } else { showSuccessDialog = true } - } catch { showProgressDialog = false isExporting = false diff --git a/TablePro/Views/Export/ExportProgressView.swift b/TablePro/Views/Export/ExportProgressView.swift index f7a513ee..00ce718d 100644 --- a/TablePro/Views/Export/ExportProgressView.swift +++ b/TablePro/Views/Export/ExportProgressView.swift @@ -82,9 +82,8 @@ struct ExportProgressView: View { tableName: "users", tableIndex: 1, totalTables: 3, - processedRows: 95500, - totalRows: 175787, - statusMessage: "", - onStop: {} - ) + processedRows: 95_500, + totalRows: 175_787, + statusMessage: "" + ) {} } diff --git a/TablePro/Views/Export/ExportSQLOptionsView.swift b/TablePro/Views/Export/ExportSQLOptionsView.swift index e8e70408..1c420008 100644 --- a/TablePro/Views/Export/ExportSQLOptionsView.swift +++ b/TablePro/Views/Export/ExportSQLOptionsView.swift @@ -14,7 +14,7 @@ struct ExportSQLOptionsView: View { @Binding var options: SQLExportOptions /// Available batch size options - private static let batchSizeOptions = [1, 100, 500, 1000] + private static let batchSizeOptions = [1, 100, 500, 1_000] var body: some View { VStack(alignment: .leading, spacing: DesignConstants.Spacing.xs) { diff --git a/TablePro/Views/Export/ExportTableCellViews.swift b/TablePro/Views/Export/ExportTableCellViews.swift index aa1f9fc7..29ace97d 100644 --- a/TablePro/Views/Export/ExportTableCellViews.swift +++ b/TablePro/Views/Export/ExportTableCellViews.swift @@ -13,7 +13,6 @@ import SwiftUI /// Cell view for database rows with tristate checkbox and name final class DatabaseRowCellView: NSTableCellView { - private let checkbox: NSButton private let iconView: NSImageView private let nameLabel: NSTextField @@ -103,7 +102,6 @@ final class DatabaseRowCellView: NSTableCellView { /// Cell view for table rows with selection checkbox, name, and optional SQL options final class TableRowCellView: NSTableCellView { - private let selectionCheckbox: NSButton private let iconView: NSImageView private let nameLabel: NSTextField diff --git a/TablePro/Views/Export/ExportTableOutlineView.swift b/TablePro/Views/Export/ExportTableOutlineView.swift index 5f812e8c..6b3a44f8 100644 --- a/TablePro/Views/Export/ExportTableOutlineView.swift +++ b/TablePro/Views/Export/ExportTableOutlineView.swift @@ -124,7 +124,6 @@ struct ExportTableOutlineView: NSViewRepresentable { dataColumn.minWidth = 44 dataColumn.maxWidth = 44 outlineView.addTableColumn(dataColumn) - } else { // CSV/JSON format: Single name column, truncates long names let nameColumn = NSTableColumn(identifier: NSUserInterfaceItemIdentifier("name")) @@ -163,7 +162,6 @@ private final class ItemWrapper: NSObject { @MainActor final class OutlineViewCoordinator: NSObject, NSOutlineViewDataSource, NSOutlineViewDelegate { - @Binding var databaseItems: [ExportDatabaseItem] var format: ExportFormat @@ -290,7 +288,6 @@ final class OutlineViewCoordinator: NSObject, NSOutlineViewDataSource, NSOutline } // For SQL format, database rows span all columns (shown in name column only) return nil - } else if let table = wrapper.table { // Table row if columnId == "name" { @@ -306,7 +303,7 @@ final class OutlineViewCoordinator: NSObject, NSOutlineViewDataSource, NSOutline func outlineView(_ outlineView: NSOutlineView, shouldSelectItem item: Any) -> Bool { // Prevent selection - we handle clicks via checkboxes - return false + false } func outlineViewItemDidExpand(_ notification: Notification) { diff --git a/TablePro/Views/History/HistoryDataProvider.swift b/TablePro/Views/History/HistoryDataProvider.swift index d5522d00..0c9d55fb 100644 --- a/TablePro/Views/History/HistoryDataProvider.swift +++ b/TablePro/Views/History/HistoryDataProvider.swift @@ -10,7 +10,6 @@ import Foundation /// Data provider for history and bookmark entries final class HistoryDataProvider { - // MARK: - Properties private(set) var historyEntries: [QueryHistoryEntry] = [] @@ -38,7 +37,7 @@ final class HistoryDataProvider { } var isEmpty: Bool { - count == 0 + isEmpty } // MARK: - Data Loading diff --git a/TablePro/Views/History/HistoryListViewController.swift b/TablePro/Views/History/HistoryListViewController.swift index 5a895869..7f90502a 100644 --- a/TablePro/Views/History/HistoryListViewController.swift +++ b/TablePro/Views/History/HistoryListViewController.swift @@ -55,7 +55,6 @@ enum UIDateFilter: Int { // MARK: - HistoryListViewController final class HistoryListViewController: NSViewController, NSMenuItemValidation { - // MARK: - Properties weak var delegate: HistoryListViewControllerDelegate? @@ -569,7 +568,6 @@ extension HistoryListViewController: NSTableViewDataSource { // MARK: - NSTableViewDelegate extension HistoryListViewController: NSTableViewDelegate { - func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { switch displayMode { case .history: @@ -630,7 +628,6 @@ extension HistoryListViewController: NSTableViewDelegate { // MARK: - NSSearchFieldDelegate extension HistoryListViewController: NSSearchFieldDelegate { - func controlTextDidChange(_ obj: Notification) { if let field = obj.object as? NSSearchField { searchText = field.stringValue @@ -652,7 +649,6 @@ extension HistoryListViewController: NSSearchFieldDelegate { // MARK: - Context Menu extension HistoryListViewController { - override func rightMouseDown(with event: NSEvent) { let point = tableView.convert(event.locationInWindow, from: nil) let row = tableView.row(at: point) @@ -668,7 +664,6 @@ extension HistoryListViewController { // MARK: - HistoryTableViewKeyboardDelegate extension HistoryListViewController: HistoryTableViewKeyboardDelegate { - func handleDeleteKey() { deleteSelectedRow() } @@ -683,7 +678,7 @@ extension HistoryListViewController: HistoryTableViewKeyboardDelegate { func validateMenuItem(_ menuItem: NSMenuItem) -> Bool { if menuItem.action == #selector(delete(_:)) { - return tableView.selectedRow >= 0 && dataProvider.count > 0 + return tableView.selectedRow >= 0 && !dataProvider.isEmpty } if menuItem.action == #selector(copy(_:)) { return tableView.selectedRow >= 0 diff --git a/TablePro/Views/History/HistoryRowView.swift b/TablePro/Views/History/HistoryRowView.swift index f4bb0d96..59baad6c 100644 --- a/TablePro/Views/History/HistoryRowView.swift +++ b/TablePro/Views/History/HistoryRowView.swift @@ -10,7 +10,6 @@ import AppKit /// Table cell view for history and bookmark entries final class HistoryRowView: NSTableCellView { - private let statusIcon: NSImageView = { let imageView = NSImageView() imageView.imageScaling = .scaleProportionallyUpOrDown diff --git a/TablePro/Views/History/HistoryTableView.swift b/TablePro/Views/History/HistoryTableView.swift index a537c5f3..81f2ce41 100644 --- a/TablePro/Views/History/HistoryTableView.swift +++ b/TablePro/Views/History/HistoryTableView.swift @@ -25,7 +25,7 @@ final class HistoryTableView: NSTableView, NSMenuItemValidation { weak var keyboardDelegate: HistoryTableViewKeyboardDelegate? override var acceptsFirstResponder: Bool { - return true + true } override func mouseDown(with event: NSEvent) { diff --git a/TablePro/Views/Import/ImportDialog.swift b/TablePro/Views/Import/ImportDialog.swift index dfe6e23f..d3db7526 100644 --- a/TablePro/Views/Import/ImportDialog.swift +++ b/TablePro/Views/Import/ImportDialog.swift @@ -90,31 +90,28 @@ struct ImportDialog: View { currentStatement: importServiceState.currentStatement, statementIndex: importServiceState.currentStatementIndex, totalStatements: importServiceState.totalStatements, - statusMessage: importServiceState.statusMessage, - onStop: { - importServiceState.service?.cancelImport() - } - ) + statusMessage: importServiceState.statusMessage + ) { + importServiceState.service?.cancelImport() + } .interactiveDismissDisabled() } .sheet(isPresented: $showSuccessDialog) { ImportSuccessView( - result: importResult, - onClose: { - showSuccessDialog = false - isPresented = false - // Refresh schema - NotificationCenter.default.post(name: .refreshData, object: nil) - } - ) + result: importResult + ) { + showSuccessDialog = false + isPresented = false + // Refresh schema + NotificationCenter.default.post(name: .refreshData, object: nil) + } } .sheet(isPresented: $showErrorDialog) { ImportErrorView( - error: importError, - onClose: { - showErrorDialog = false - } - ) + error: importError + ) { + showErrorDialog = false + } } } @@ -330,7 +327,7 @@ struct ImportDialog: View { } // Load up to 5MB for preview (enough for most SQL files) - let maxPreviewSize = 5 * 1024 * 1024 // 5 MB + let maxPreviewSize = 5 * 1_024 * 1_024 // 5 MB let previewData = handle.readData(ofLength: maxPreviewSize) if let preview = String(data: previewData, encoding: config.encoding) { @@ -386,7 +383,6 @@ struct ImportDialog: View { importResult = result showSuccessDialog = true } - } catch let error as ImportError { await MainActor.run { showProgressDialog = false @@ -434,9 +430,8 @@ struct ImportDialog: View { /// Decompress .gz file if needed, returns URL to read private func decompressIfNeeded(_ url: URL) async throws -> URL { - return try await FileDecompressor.decompressIfNeeded(url, fileSystemPath: fileSystemPath) + try await FileDecompressor.decompressIfNeeded(url, fileSystemPath: fileSystemPath) } - } // MARK: - Import Service State diff --git a/TablePro/Views/Import/SQLCodePreview.swift b/TablePro/Views/Import/SQLCodePreview.swift index d6be20a9..42a79f04 100644 --- a/TablePro/Views/Import/SQLCodePreview.swift +++ b/TablePro/Views/Import/SQLCodePreview.swift @@ -5,8 +5,8 @@ // Simple read-only SQL code preview using native NSTextView // -import SwiftUI import AppKit +import SwiftUI /// Read-only SQL code preview with line numbers struct SQLCodePreview: NSViewRepresentable { diff --git a/TablePro/Views/Main/Child/MainContentAlerts.swift b/TablePro/Views/Main/Child/MainContentAlerts.swift index c2443661..aa76caa5 100644 --- a/TablePro/Views/Main/Child/MainContentAlerts.swift +++ b/TablePro/Views/Main/Child/MainContentAlerts.swift @@ -10,7 +10,6 @@ import SwiftUI /// ViewModifier handling all alerts and sheets for MainContentView struct MainContentAlerts: ViewModifier { - // MARK: - Dependencies @ObservedObject var coordinator: MainContentCoordinator @@ -47,11 +46,10 @@ struct MainContentAlerts: ViewModifier { DatabaseSwitcherSheet( isPresented: $coordinator.showDatabaseSwitcher, currentDatabase: connection.database.isEmpty ? nil : connection.database, - databaseType: connection.type, - onSelect: { database in - coordinator.switchToDatabase(database) - } - ) + databaseType: connection.type + ) { database in + coordinator.switchToDatabase(database) + } } .focusedValue(\.isDatabaseSwitcherOpen, coordinator.showDatabaseSwitcher) .onChange(of: coordinator.showDatabaseSwitcher) { _, isPresented in diff --git a/TablePro/Views/Main/Child/MainEditorContentView.swift b/TablePro/Views/Main/Child/MainEditorContentView.swift index 7863e38c..748b4d4b 100644 --- a/TablePro/Views/Main/Child/MainEditorContentView.swift +++ b/TablePro/Views/Main/Child/MainEditorContentView.swift @@ -10,7 +10,6 @@ import SwiftUI /// Main editor content with tab bar and content switching struct MainEditorContentView: View { - // MARK: - Dependencies @ObservedObject var tabManager: QueryTabManager @@ -36,7 +35,7 @@ struct MainEditorContentView: View { let onQuickSearch: (String) -> Void let onCommit: (String) -> Void let onRefresh: () -> Void - + // Pagination callbacks let onFirstPage: () -> Void let onPreviousPage: () -> Void @@ -140,9 +139,9 @@ struct MainEditorContentView: View { private func tableTabContent(tab: QueryTab) -> some View { resultsSection(tab: tab) } - + // MARK: - Create Table Tab Content - + @ViewBuilder private func createTableTabContent(tab: QueryTab) -> some View { if let options = tab.tableCreationOptions { @@ -164,14 +163,14 @@ struct MainEditorContentView: View { .frame(maxWidth: .infinity, maxHeight: .infinity) } } - + private func createTableOptionsBinding(for tab: QueryTab) -> Binding { Binding( get: { tab.tableCreationOptions ?? TableCreationOptions() }, set: { newValue in guard let index = tabManager.selectedTabIndex, index < tabManager.tabs.count else { return } - + tabManager.tabs[index].tableCreationOptions = newValue } ) @@ -299,7 +298,7 @@ struct MainEditorContentView: View { onLimitChange: onLimitChange, onOffsetChange: onOffsetChange, onPaginationGo: onPaginationGo, - ) + ) } private func showStructureBinding(for tab: QueryTab) -> Binding { diff --git a/TablePro/Views/Main/Child/MainStatusBarView.swift b/TablePro/Views/Main/Child/MainStatusBarView.swift index 71d4a3cc..95568723 100644 --- a/TablePro/Views/Main/Child/MainStatusBarView.swift +++ b/TablePro/Views/Main/Child/MainStatusBarView.swift @@ -13,7 +13,7 @@ struct MainStatusBarView: View { let filterStateManager: FilterStateManager let selectedRowIndices: Set @Binding var showStructure: Bool - + // Pagination callbacks let onFirstPage: () -> Void let onPreviousPage: () -> Void @@ -60,8 +60,8 @@ struct MainStatusBarView: View { )) { HStack(spacing: 4) { Image(systemName: filterStateManager.hasAppliedFilters - ? "line.3.horizontal.decrease.circle.fill" - : "line.3.horizontal.decrease.circle") + ? "line.3.horizontal.decrease.circle.fill" + : "line.3.horizontal.decrease.circle") Text("Filters") if filterStateManager.hasAppliedFilters { Text("(\(filterStateManager.appliedFilters.count))") @@ -73,7 +73,7 @@ struct MainStatusBarView: View { .controlSize(.small) .help("Toggle Filters (Cmd+F)") } - + // Pagination controls for table tabs if let tab = tab, tab.tabType == .table, tab.tableName != nil, let total = tab.pagination.totalRowCount, total > 0 { @@ -114,7 +114,7 @@ struct MainStatusBarView: View { let formatter = NumberFormatter() formatter.numberStyle = .decimal let formattedTotal = formatter.string(from: NSNumber(value: total)) ?? "\(total)" - + return "\(pagination.rangeStart)-\(pagination.rangeEnd) of \(formattedTotal) rows" } else if loadedCount > 0 { // Simple mode: "100 rows" diff --git a/TablePro/Views/Main/Child/QueryTabContentView.swift b/TablePro/Views/Main/Child/QueryTabContentView.swift index f8d2df07..59252db0 100644 --- a/TablePro/Views/Main/Child/QueryTabContentView.swift +++ b/TablePro/Views/Main/Child/QueryTabContentView.swift @@ -17,10 +17,10 @@ struct QueryTabContentView: View { @Binding var cursorPosition: Int @Binding var selectedRowIndices: Set @Binding var editingCell: CellPosition? - + let schemaProvider: SQLSchemaProvider let onExecute: () -> Void - + // Callbacks let onCommit: (String) -> Void let onRefresh: () -> Void @@ -33,7 +33,7 @@ struct QueryTabContentView: View { let onClearFilters: () -> Void let onQuickSearch: (String) -> Void let sortedRows: [QueryResultRow] - + // Pagination callbacks let onFirstPage: () -> Void let onPreviousPage: () -> Void @@ -46,7 +46,7 @@ struct QueryTabContentView: View { @Binding var sortState: SortState @Binding var showStructure: Bool - + var body: some View { VSplitView { // Query Editor (top) @@ -59,7 +59,7 @@ struct QueryTabContentView: View { ) } .frame(minHeight: 100, idealHeight: 200) - + // Results Table (bottom) TableTabContentView( tab: tab, diff --git a/TablePro/Views/Main/Child/TableTabContentView.swift b/TablePro/Views/Main/Child/TableTabContentView.swift index 71184244..f02e3fa2 100644 --- a/TablePro/Views/Main/Child/TableTabContentView.swift +++ b/TablePro/Views/Main/Child/TableTabContentView.swift @@ -15,7 +15,7 @@ struct TableTabContentView: View { let filterStateManager: FilterStateManager @Binding var selectedRowIndices: Set @Binding var editingCell: CellPosition? - + // Callbacks let onCommit: (String) -> Void let onRefresh: () -> Void @@ -28,7 +28,7 @@ struct TableTabContentView: View { let onClearFilters: () -> Void let onQuickSearch: (String) -> Void let sortedRows: [QueryResultRow] - + // Pagination callbacks let onFirstPage: () -> Void let onPreviousPage: () -> Void @@ -38,10 +38,10 @@ struct TableTabContentView: View { let onOffsetChange: (Int) -> Void let onPaginationGo: () -> Void let onDismissError: () -> Void - + @Binding var sortState: SortState @Binding var showStructure: Bool - + var body: some View { VStack(spacing: 0) { // Error banner (if query failed) @@ -75,7 +75,7 @@ struct TableTabContentView: View { ) .frame(maxHeight: .infinity, alignment: .top) } - + // Filter panel (collapsible, at bottom) if filterStateManager.isVisible && tab.tabType == .table { Divider() @@ -90,7 +90,7 @@ struct TableTabContentView: View { ) .transition(.move(edge: .bottom).combined(with: .opacity)) } - + // Status bar MainStatusBarView( tab: tab, diff --git a/TablePro/Views/Main/Extensions/MainContentView+Bindings.swift b/TablePro/Views/Main/Extensions/MainContentView+Bindings.swift index f115744c..015c6f88 100644 --- a/TablePro/Views/Main/Extensions/MainContentView+Bindings.swift +++ b/TablePro/Views/Main/Extensions/MainContentView+Bindings.swift @@ -9,7 +9,6 @@ import SwiftUI extension MainContentView { - // MARK: - Selected Row Data for Sidebar /// Compute selected row data for right sidebar display diff --git a/TablePro/Views/Main/MainContentCoordinator.swift b/TablePro/Views/Main/MainContentCoordinator.swift index 78aceccd..691bff2f 100644 --- a/TablePro/Views/Main/MainContentCoordinator.swift +++ b/TablePro/Views/Main/MainContentCoordinator.swift @@ -20,7 +20,6 @@ enum DiscardAction { /// Coordinator managing MainContentView business logic @MainActor final class MainContentCoordinator: ObservableObject { - // MARK: - Dependencies let connection: DatabaseConnection @@ -140,7 +139,7 @@ final class MainContentCoordinator: ObservableObject { toolbarState.isExecuting = true let fullQuery = tabManager.tabs[index].query - + // For table tabs, use the full query. For query tabs, extract at cursor let sql: String if tabManager.tabs[index].tabType == .table { @@ -165,7 +164,7 @@ final class MainContentCoordinator: ObservableObject { let result = try await DatabaseManager.shared.execute(query: sql) var columnDefaults: [String: String?] = [:] - var totalRowCount: Int? = nil + var totalRowCount: Int? if isEditable, let tableName = tableName { if let driver = DatabaseManager.shared.activeDriver { @@ -346,7 +345,7 @@ final class MainContentCoordinator: ObservableObject { tabManager.tabs[tabIndex].sortState = currentSort tabManager.tabs[tabIndex].hasUserInteraction = true - + // Reset pagination to page 1 when sorting changes tabManager.tabs[tabIndex].pagination.reset() @@ -375,10 +374,10 @@ final class MainContentCoordinator: ObservableObject { func goToNextPage() { guard let tabIndex = tabManager.selectedTabIndex, tabIndex < tabManager.tabs.count else { return } - + var tab = tabManager.tabs[tabIndex] guard tab.pagination.hasNextPage else { return } - + tab.pagination.goToNextPage() tabManager.tabs[tabIndex] = tab reloadCurrentPage() @@ -388,10 +387,10 @@ final class MainContentCoordinator: ObservableObject { func goToPreviousPage() { guard let tabIndex = tabManager.selectedTabIndex, tabIndex < tabManager.tabs.count else { return } - + var tab = tabManager.tabs[tabIndex] guard tab.pagination.hasPreviousPage else { return } - + tab.pagination.goToPreviousPage() tabManager.tabs[tabIndex] = tab reloadCurrentPage() @@ -401,10 +400,10 @@ final class MainContentCoordinator: ObservableObject { func goToFirstPage() { guard let tabIndex = tabManager.selectedTabIndex, tabIndex < tabManager.tabs.count else { return } - + var tab = tabManager.tabs[tabIndex] guard tab.pagination.currentPage != 1 else { return } - + tab.pagination.goToFirstPage() tabManager.tabs[tabIndex] = tab reloadCurrentPage() @@ -414,10 +413,10 @@ final class MainContentCoordinator: ObservableObject { func goToLastPage() { guard let tabIndex = tabManager.selectedTabIndex, tabIndex < tabManager.tabs.count else { return } - + var tab = tabManager.tabs[tabIndex] guard tab.pagination.currentPage != tab.pagination.totalPages else { return } - + tab.pagination.goToLastPage() tabManager.tabs[tabIndex] = tab reloadCurrentPage() @@ -428,35 +427,35 @@ final class MainContentCoordinator: ObservableObject { guard let tabIndex = tabManager.selectedTabIndex, tabIndex < tabManager.tabs.count, newSize > 0 else { return } - + tabManager.tabs[tabIndex].pagination.updatePageSize(newSize) reloadCurrentPage() } - + /// Update offset and reload func updateOffset(_ newOffset: Int) { guard let tabIndex = tabManager.selectedTabIndex, tabIndex < tabManager.tabs.count, newOffset >= 0 else { return } - + tabManager.tabs[tabIndex].pagination.updateOffset(newOffset) reloadCurrentPage() } - + /// Apply both limit and offset changes and reload func applyPaginationSettings() { reloadCurrentPage() } - + /// Reload current page data private func reloadCurrentPage() { guard let tabIndex = tabManager.selectedTabIndex, tabIndex < tabManager.tabs.count, let tableName = tabManager.tabs[tabIndex].tableName else { return } - + let tab = tabManager.tabs[tabIndex] let pagination = tab.pagination - + let newQuery = queryBuilder.buildBaseQuery( tableName: tableName, sortState: tab.sortState, @@ -464,7 +463,7 @@ final class MainContentCoordinator: ObservableObject { limit: pagination.pageSize, offset: pagination.currentOffset ) - + tabManager.tabs[tabIndex].query = newQuery runQuery() } @@ -475,7 +474,7 @@ final class MainContentCoordinator: ObservableObject { guard let tabIndex = tabManager.selectedTabIndex, tabIndex < tabManager.tabs.count, let tableName = tabManager.tabs[tabIndex].tableName else { return } - + // Reset pagination when filters change tabManager.tabs[tabIndex].pagination.reset() @@ -502,7 +501,7 @@ final class MainContentCoordinator: ObservableObject { tabIndex < tabManager.tabs.count, let tableName = tabManager.tabs[tabIndex].tableName, !searchText.trimmingCharacters(in: .whitespaces).isEmpty else { return } - + // Reset pagination when search changes tabManager.tabs[tabIndex].pagination.reset() @@ -871,7 +870,7 @@ final class MainContentCoordinator: ObservableObject { /// Generates DROP TABLE statement with optional CASCADE. private func dropTableStatement(quotedName: String, options: TableOperationOptions, dbType: DatabaseType) -> String { - return switch dbType { + switch dbType { case .postgresql: "DROP TABLE \(quotedName)\(options.cascade ? " CASCADE" : "")" case .mysql, .mariadb, .sqlite: @@ -986,7 +985,6 @@ final class MainContentCoordinator: ObservableObject { if tabManager.selectedTabIndex != nil && !tabManager.tabs.isEmpty { runQuery() } - } catch { let executionTime = Date().timeIntervalSince(overallStartTime) @@ -1045,12 +1043,12 @@ final class MainContentCoordinator: ObservableObject { } // MARK: - Table Creation - + /// Creates a new table from the provided options /// - Parameter options: Table creation configuration func createTable(_ options: TableCreationOptions) { let service = CreateTableService(databaseType: connection.type) - + // Generate SQL let sql: String do { @@ -1062,11 +1060,11 @@ final class MainContentCoordinator: ObservableObject { } return } - + // Execute the CREATE TABLE statement Task { let startTime = Date() - + do { guard let driver = DatabaseManager.shared.activeDriver else { await MainActor.run { @@ -1076,15 +1074,15 @@ final class MainContentCoordinator: ObservableObject { } throw DatabaseError.notConnected } - + // Execute CREATE TABLE - let _ = try await driver.execute(query: sql) - + _ = try await driver.execute(query: sql) + let duration = Date().timeIntervalSince(startTime) - + // Refresh schema to show new table (outside MainActor) await schemaProvider.invalidateCache() - + let needsQuery = await MainActor.run { () -> Bool in // Close the create table tab if let tabIndex = tabManager.selectedTabIndex, @@ -1092,27 +1090,26 @@ final class MainContentCoordinator: ObservableObject { let currentTab = tabManager.tabs[tabIndex] tabManager.closeTab(currentTab) } - + // Open the newly created table in a new tab let needs = tabManager.TableProTabSmart( tableName: options.tableName, hasUnsavedChanges: changeManager.hasChanges, databaseType: connection.type ) - + // Refresh sidebar to show new table NotificationCenter.default.post(name: .refreshData, object: nil) - + return needs } - + // Execute query to load table data if needed (runs async) if needsQuery { await MainActor.run { runQuery() } } - } catch { await MainActor.run { if let index = tabManager.selectedTabIndex { @@ -1122,7 +1119,7 @@ final class MainContentCoordinator: ObservableObject { } } } - + // MARK: - Discard Handling func handleDiscard( @@ -1230,10 +1227,10 @@ final class MainContentCoordinator: ObservableObject { tabPersistence.clearJustRestoredFlag() if !shouldSkipLazyLoad && - newTab.tabType == .table && - newTab.resultRows.isEmpty && - newTab.lastExecutedAt == nil && - !newTab.query.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + newTab.tabType == .table && + newTab.resultRows.isEmpty && + newTab.lastExecutedAt == nil && + !newTab.query.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { if let session = DatabaseManager.shared.currentSession, session.isConnected { runQuery() } else { @@ -1254,7 +1251,7 @@ final class MainContentCoordinator: ObservableObject { hasUnsavedChanges: changeManager.hasChanges, databaseType: connection.type ) - + // Initialize pagination for new table tab if needsQuery, let tabIndex = tabManager.selectedTabIndex { tabManager.tabs[tabIndex].pagination.reset() @@ -1351,12 +1348,12 @@ final class MainContentCoordinator: ObservableObject { guard let driver = DatabaseManager.shared.activeDriver else { return } - + do { // For MySQL/MariaDB, use USE command if connection.type == .mysql || connection.type == .mariadb { _ = try await driver.execute(query: "USE `\(database)`") - + // Update session with new database if let sessionId = DatabaseManager.shared.currentSessionId { DatabaseManager.shared.updateSession(sessionId) { session in @@ -1365,10 +1362,10 @@ final class MainContentCoordinator: ObservableObject { session.connection = updatedConnection } } - + // Update toolbar state toolbarState.databaseName = database - + // Clear tab results but keep tabs open tabManager.tabs = tabManager.tabs.map { tab in var updatedTab = tab @@ -1378,27 +1375,25 @@ final class MainContentCoordinator: ObservableObject { updatedTab.executionTime = nil return updatedTab } - + // Reload schema for autocomplete await loadSchema() - + // Refresh tables list in sidebar NotificationCenter.default.post(name: .refreshAll, object: nil) - + // Re-execute current tab's query if it's a table tab if let currentTab = tabManager.selectedTab, currentTab.tabType == .table { runQuery() } - } else { // For PostgreSQL and SQLite, reconnect with new database // (SQLite doesn't apply, but keeping for completeness) } - } catch { } } - + /// Switch to a different database (legacy method - creates new connection) func switchToDatabase(_ database: String) { let newConnection = DatabaseConnection( @@ -1462,4 +1457,3 @@ final class MainContentCoordinator: ObservableObject { } } } - diff --git a/TablePro/Views/Main/MainContentNotificationHandler.swift b/TablePro/Views/Main/MainContentNotificationHandler.swift index 79872c64..62a0887d 100644 --- a/TablePro/Views/Main/MainContentNotificationHandler.swift +++ b/TablePro/Views/Main/MainContentNotificationHandler.swift @@ -15,7 +15,6 @@ import UniformTypeIdentifiers /// Handles all NotificationCenter subscriptions for MainContentView @MainActor final class MainContentNotificationHandler: ObservableObject { - // MARK: - Dependencies private weak var coordinator: MainContentCoordinator? @@ -197,7 +196,7 @@ final class MainContentNotificationHandler: ObservableObject { self?.coordinator?.showAllTablesMetadata() } .store(in: &cancellables) - + NotificationCenter.default.publisher(for: .createTable) .receive(on: DispatchQueue.main) .sink { [weak self] _ in @@ -227,13 +226,13 @@ final class MainContentNotificationHandler: ObservableObject { selectedTables.wrappedValue = selectedTables.wrappedValue.filter { $0.name != tableName } } } - + private func handleCreateTable() { guard let coordinator = coordinator else { return } - + // Get current database name from the connection let currentDatabase = connection.database - + coordinator.tabManager.addCreateTableTab( databaseName: currentDatabase, databaseType: connection.type diff --git a/TablePro/Views/MainContentView.swift b/TablePro/Views/MainContentView.swift index f0612455..15a36f62 100644 --- a/TablePro/Views/MainContentView.swift +++ b/TablePro/Views/MainContentView.swift @@ -11,7 +11,6 @@ import SwiftUI /// Main content view - thin presentation layer struct MainContentView: View { - // MARK: - Properties let connection: DatabaseConnection @@ -35,7 +34,7 @@ struct MainContentView: View { // MARK: - Local State @State var selectedRowIndices: Set = [] - @State private var editingCell: CellPosition? = nil + @State private var editingCell: CellPosition? @State private var notificationHandler: MainContentNotificationHandler? @State private var showDatabaseSwitcher = false @@ -131,11 +130,10 @@ struct MainContentView: View { DatabaseSwitcherSheet( isPresented: $showDatabaseSwitcher, currentDatabase: DatabaseManager.shared.currentSession?.connection.database, - databaseType: connection.type, - onSelect: { database in - switchDatabase(to: database) - } - ) + databaseType: connection.type + ) { database in + switchDatabase(to: database) + } } } @@ -263,9 +261,9 @@ struct MainContentView: View { showDatabaseSwitcher: $showDatabaseSwitcher ) } - + // MARK: - Database Switcher - + private func switchDatabase(to database: String) { Task { await coordinator.switchDatabase(to: database) @@ -323,11 +321,11 @@ struct MainContentView: View { guard let newColumns = newColumns, !newColumns.isEmpty, let tab = tabManager.selectedTab, !tab.pendingChanges.hasChanges else { return } - + // Reconfigure if columns changed OR table name changed (switching tables) let columnsChanged = changeManager.columns != newColumns let tableChanged = changeManager.tableName != (tab.tableName ?? "") - + guard columnsChanged || tableChanged else { return } changeManager.configureForTable( @@ -408,7 +406,6 @@ struct MainContentView: View { } coordinator.runQuery() - } catch { if let index = tabManager.selectedTabIndex { tabManager.tabs[index].errorMessage = "Save failed: \(error.localizedDescription)" @@ -439,5 +436,5 @@ struct MainContentView: View { tableOperationOptions: .constant([:]), isInspectorPresented: .constant(false) ) - .frame(width: 1000, height: 600) + .frame(width: 1_000, height: 600) } diff --git a/TablePro/Views/Results/CellTextField.swift b/TablePro/Views/Results/CellTextField.swift index 8fa36ba0..f2c3386d 100644 --- a/TablePro/Views/Results/CellTextField.swift +++ b/TablePro/Views/Results/CellTextField.swift @@ -10,10 +10,9 @@ import AppKit /// NSTextField subclass that shows row context menu instead of text editing menu final class CellTextField: NSTextField { - /// The original (non-truncated) value for editing var originalValue: String? - + /// The truncated display value private var truncatedValue: String? @@ -21,14 +20,14 @@ final class CellTextField: NSTextField { get { CellTextFieldCell.self } set { } } - + override var stringValue: String { didSet { // Store the truncated value when set externally truncatedValue = stringValue } } - + override func becomeFirstResponder() -> Bool { let result = super.becomeFirstResponder() if result, let original = originalValue { @@ -37,7 +36,7 @@ final class CellTextField: NSTextField { } return result } - + /// Call this when editing ends to restore truncated display func restoreTruncatedDisplay() { if let truncated = truncatedValue { @@ -78,9 +77,7 @@ final class CellTextField: NSTextField { /// Custom text field cell that provides a field editor with custom context menu behavior final class CellTextFieldCell: NSTextFieldCell { - private class CellFieldEditor: NSTextView { - override func rightMouseDown(with event: NSEvent) { window?.makeFirstResponder(nil) @@ -95,7 +92,7 @@ final class CellTextFieldCell: NSTextFieldCell { } override func menu(for event: NSEvent) -> NSMenu? { - return nil + nil } } diff --git a/TablePro/Views/Results/DataGridCellFactory.swift b/TablePro/Views/Results/DataGridCellFactory.swift index 4fae7018..a2ed437d 100644 --- a/TablePro/Views/Results/DataGridCellFactory.swift +++ b/TablePro/Views/Results/DataGridCellFactory.swift @@ -14,8 +14,8 @@ final class DataGridCellFactory { private let rowNumberCellIdentifier = NSUserInterfaceItemIdentifier("RowNumberCell") /// Large dataset threshold - above this, disable expensive visual features - private let largeDatasetThreshold = 5000 - + private let largeDatasetThreshold = 5_000 + /// Maximum characters to render in a cell (for performance with very large text) private let maxCellTextLength = 500 @@ -164,16 +164,16 @@ final class DataGridCellFactory { let truncateIndex = displayValue.index(displayValue.startIndex, offsetBy: maxCellTextLength) displayValue = String(displayValue[.. largeDatasetThreshold } diff --git a/TablePro/Views/Results/KeyHandlingTableView.swift b/TablePro/Views/Results/KeyHandlingTableView.swift index 018f3c07..79de0b90 100644 --- a/TablePro/Views/Results/KeyHandlingTableView.swift +++ b/TablePro/Views/Results/KeyHandlingTableView.swift @@ -19,7 +19,7 @@ final class KeyHandlingTableView: NSTableView, NSMenuItemValidation { if oldValue != focusedRow && oldValue >= 0 { if focusedColumn >= 0 && focusedColumn < numberOfColumns && oldValue < numberOfRows { reloadData(forRowIndexes: IndexSet(integer: oldValue), - columnIndexes: IndexSet(integer: focusedColumn)) + columnIndexes: IndexSet(integer: focusedColumn)) } } } @@ -34,11 +34,11 @@ final class KeyHandlingTableView: NSTableView, NSMenuItemValidation { guard let self = self else { return } if oldValue >= 0 && oldValue < self.numberOfColumns && rowToUpdate >= 0 && rowToUpdate < self.numberOfRows { self.reloadData(forRowIndexes: IndexSet(integer: rowToUpdate), - columnIndexes: IndexSet(integer: oldValue)) + columnIndexes: IndexSet(integer: oldValue)) } if self.focusedColumn >= 0 && self.focusedColumn < self.numberOfColumns && self.focusedRow >= 0 && self.focusedRow < self.numberOfRows { self.reloadData(forRowIndexes: IndexSet(integer: self.focusedRow), - columnIndexes: IndexSet(integer: self.focusedColumn)) + columnIndexes: IndexSet(integer: self.focusedColumn)) } } } diff --git a/TablePro/Views/RightSidebar/RightSidebarView.swift b/TablePro/Views/RightSidebar/RightSidebarView.swift index 9cbfe0c1..a0c14ea2 100644 --- a/TablePro/Views/RightSidebar/RightSidebarView.swift +++ b/TablePro/Views/RightSidebar/RightSidebarView.swift @@ -12,27 +12,27 @@ struct RightSidebarView: View { let tableName: String? let tableMetadata: TableMetadata? let selectedRowData: [(column: String, value: String?, type: String)]? - + @State private var searchText: String = "" - + private var mode: String { selectedRowData != nil ? "Row Details" : "Table Info" } - + var body: some View { VStack(spacing: 0) { // Header headerView - + Divider() - + // Search (only for row details) if selectedRowData != nil { searchField - + Divider() } - + // Content ScrollView { LazyVStack(spacing: 0) { @@ -48,9 +48,9 @@ struct RightSidebarView: View { } .background(Color(NSColor.windowBackgroundColor)) } - + // MARK: - Header - + private var headerView: some View { HStack { VStack(alignment: .leading, spacing: 2) { @@ -67,9 +67,9 @@ struct RightSidebarView: View { .padding(.horizontal, 12) .padding(.vertical, 8) } - + // MARK: - Search - + private var searchField: some View { HStack(spacing: 6) { Image(systemName: "magnifyingglass") @@ -93,9 +93,9 @@ struct RightSidebarView: View { .padding(.vertical, DesignConstants.Spacing.xs) .background(Color(NSColor.textBackgroundColor).opacity(0.5)) } - + // MARK: - Empty State - + private var emptyState: some View { VStack(spacing: 8) { Image(systemName: "sidebar.right") @@ -108,16 +108,16 @@ struct RightSidebarView: View { .frame(maxWidth: .infinity) .padding(.vertical, 40) } - + // MARK: - Table Info Content - + @ViewBuilder private func tableInfoContent(_ metadata: TableMetadata) -> some View { sectionHeader("SIZE") propertyRow("Data Size", TableMetadata.formatSize(metadata.dataSize)) propertyRow("Index Size", TableMetadata.formatSize(metadata.indexSize)) propertyRow("Total Size", TableMetadata.formatSize(metadata.totalSize)) - + sectionHeader("STATISTICS") if let rows = metadata.rowCount { propertyRow("Rows", "\(rows)") @@ -125,7 +125,7 @@ struct RightSidebarView: View { if let avgLen = metadata.avgRowLength { propertyRow("Avg Row", "\(avgLen) B") } - + if metadata.engine != nil || metadata.collation != nil { sectionHeader("METADATA") if let engine = metadata.engine { @@ -135,7 +135,7 @@ struct RightSidebarView: View { propertyRow("Collation", collation) } } - + if metadata.createTime != nil || metadata.updateTime != nil { sectionHeader("TIMESTAMPS") if let create = metadata.createTime { @@ -146,36 +146,36 @@ struct RightSidebarView: View { } } } - + private static let dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateStyle = .short formatter.timeStyle = .short return formatter }() - + private func formatDate(_ date: Date) -> String { - return RightSidebarView.dateFormatter.string(from: date) + RightSidebarView.dateFormatter.string(from: date) } - + // MARK: - Row Detail Content - + @ViewBuilder private func rowDetailContent(_ rowData: [(column: String, value: String?, type: String)]) -> some View { let filtered = searchText.isEmpty ? rowData : rowData.filter { $0.column.localizedCaseInsensitiveContains(searchText) || - ($0.value?.localizedCaseInsensitiveContains(searchText) ?? false) + ($0.value?.localizedCaseInsensitiveContains(searchText) ?? false) } - + sectionHeader("FIELDS (\(filtered.count))") - + ForEach(filtered, id: \.column) { field in fieldRow(field) } } - + // MARK: - UI Components - + private func sectionHeader(_ title: String) -> some View { Text(title) .font(.system(size: DesignConstants.FontSize.caption, weight: .medium)) @@ -199,7 +199,7 @@ struct RightSidebarView: View { .padding(.horizontal, 12) .padding(.vertical, 4) } - + private func fieldRow(_ field: (column: String, value: String?, type: String)) -> some View { VStack(alignment: .leading, spacing: 4) { // Field name + type badge @@ -247,11 +247,11 @@ struct RightSidebarView: View { tableName: "users", tableMetadata: TableMetadata( tableName: "users", - dataSize: 16384, - indexSize: 8192, - totalSize: 24576, + dataSize: 16_384, + indexSize: 8_192, + totalSize: 24_576, avgRowLength: 128, - rowCount: 1250, + rowCount: 1_250, comment: "User accounts", engine: "InnoDB", collation: "utf8mb4_unicode_ci", diff --git a/TablePro/Views/Shared/InlineErrorBanner.swift b/TablePro/Views/Shared/InlineErrorBanner.swift index e64f95bb..651019e6 100644 --- a/TablePro/Views/Shared/InlineErrorBanner.swift +++ b/TablePro/Views/Shared/InlineErrorBanner.swift @@ -68,9 +68,8 @@ struct InlineErrorBanner: View { #Preview("Light Mode") { VStack { InlineErrorBanner( - message: "Table 'users' doesn't exist", - onDismiss: {} - ) + message: "Table 'users' doesn't exist" + ) {} Spacer() } .frame(width: 500, height: 200) @@ -79,9 +78,8 @@ struct InlineErrorBanner: View { #Preview("Dark Mode") { VStack { InlineErrorBanner( - message: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELEC' at line 1", - onDismiss: {} - ) + message: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELEC' at line 1" + ) {} Spacer() } .frame(width: 500, height: 200) diff --git a/TablePro/Views/Sidebar/SidebarView.swift b/TablePro/Views/Sidebar/SidebarView.swift index 649a748c..271b3989 100644 --- a/TablePro/Views/Sidebar/SidebarView.swift +++ b/TablePro/Views/Sidebar/SidebarView.swift @@ -119,11 +119,10 @@ struct SidebarView: View { isPresented: $showOperationDialog, tableName: tableName, operationType: operationType, - databaseType: databaseType, - onConfirm: { options in - confirmOperation(options: options) - } - ) + databaseType: databaseType + ) { options in + confirmOperation(options: options) + } } } } @@ -329,7 +328,7 @@ struct SidebarView: View { .keyboardShortcut(.delete, modifiers: .command) .disabled(!hasSelection) } - + /// Batch toggle truncate for all selected tables private func batchToggleTruncate() { let tablesToToggle = selectedTables.isEmpty ? [] : Array(selectedTables.map { $0.name }) diff --git a/TablePro/Views/Sidebar/TableOperationDialog.swift b/TablePro/Views/Sidebar/TableOperationDialog.swift index b3b6b799..ccb55f1d 100644 --- a/TablePro/Views/Sidebar/TableOperationDialog.swift +++ b/TablePro/Views/Sidebar/TableOperationDialog.swift @@ -10,7 +10,6 @@ import SwiftUI /// Confirmation dialog for table delete/truncate operations struct TableOperationDialog: View { - // MARK: - Properties @Binding var isPresented: Bool @@ -190,11 +189,10 @@ struct TableOperationDialog: View { isPresented: .constant(true), tableName: "users", operationType: .drop, - databaseType: .mysql, - onConfirm: { options in - print("Options: \(options)") - } - ) + databaseType: .mysql + ) { options in + print("Options: \(options)") + } } #Preview("Truncate Table - PostgreSQL") { @@ -202,11 +200,10 @@ struct TableOperationDialog: View { isPresented: .constant(true), tableName: "orders", operationType: .truncate, - databaseType: .postgresql, - onConfirm: { options in - print("Options: \(options)") - } - ) + databaseType: .postgresql + ) { options in + print("Options: \(options)") + } } #Preview("Drop Table - SQLite") { @@ -214,9 +211,8 @@ struct TableOperationDialog: View { isPresented: .constant(true), tableName: "products", operationType: .drop, - databaseType: .sqlite, - onConfirm: { options in - print("Options: \(options)") - } - ) + databaseType: .sqlite + ) { options in + print("Options: \(options)") + } } diff --git a/TablePro/Views/Structure/DDLTextView.swift b/TablePro/Views/Structure/DDLTextView.swift index aa11d3cc..7a2d5a60 100644 --- a/TablePro/Views/Structure/DDLTextView.swift +++ b/TablePro/Views/Structure/DDLTextView.swift @@ -5,21 +5,21 @@ // Simple AppKit text view for displaying DDL with syntax highlighting // -import SwiftUI import AppKit +import SwiftUI /// Simple AppKit-based text view for DDL display - NO LINE NUMBERS FOR NOW struct DDLTextView: NSViewRepresentable { let ddl: String @Binding var fontSize: CGFloat - + func makeNSView(context: Context) -> NSScrollView { let scrollView = NSTextView.scrollableTextView() - + guard let textView = scrollView.documentView as? NSTextView else { return scrollView } - + // Configure text view - SIMPLE SETUP textView.isEditable = false textView.isSelectable = true @@ -27,26 +27,26 @@ struct DDLTextView: NSViewRepresentable { textView.textContainerInset = NSSize(width: 16, height: 16) textView.backgroundColor = NSColor.textBackgroundColor textView.textColor = NSColor.labelColor - + // Disable line wrapping textView.textContainer?.widthTracksTextView = false textView.textContainer?.containerSize = NSSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude) textView.isHorizontallyResizable = true - + // CRITICAL: Set the text textView.string = ddl - + // Apply basic syntax highlighting if !ddl.isEmpty { applyBasicSyntaxHighlighting(to: textView, fontSize: fontSize) } - + return scrollView } - + func updateNSView(_ scrollView: NSScrollView, context: Context) { guard let textView = scrollView.documentView as? NSTextView else { return } - + // Update font if changed if let currentFont = textView.font, currentFont.pointSize != fontSize { textView.font = NSFont.monospacedSystemFont(ofSize: fontSize, weight: .regular) @@ -54,7 +54,7 @@ struct DDLTextView: NSViewRepresentable { applyBasicSyntaxHighlighting(to: textView, fontSize: fontSize) } } - + // Update text if changed if textView.string != ddl { textView.string = ddl @@ -63,19 +63,19 @@ struct DDLTextView: NSViewRepresentable { } } } - + /// Apply basic SQL syntax highlighting private func applyBasicSyntaxHighlighting(to textView: NSTextView, fontSize: CGFloat) { guard let textStorage = textView.textStorage else { return } guard textStorage.length > 0 else { return } - + let fullRange = NSRange(location: 0, length: textStorage.length) - + // Reset to base style let font = NSFont.monospacedSystemFont(ofSize: fontSize, weight: .regular) textStorage.addAttribute(.font, value: font, range: fullRange) textStorage.addAttribute(.foregroundColor, value: NSColor.labelColor, range: fullRange) - + // SQL Keywords (blue) let keywords = [ "CREATE", "TABLE", "PRIMARY", "KEY", "FOREIGN", "REFERENCES", @@ -83,27 +83,27 @@ struct DDLTextView: NSViewRepresentable { "ON", "DELETE", "UPDATE", "CASCADE", "RESTRICT", "SET", "INT", "INTEGER", "VARCHAR", "CHAR", "TEXT", "TIMESTAMP", "DATETIME" ] - + for keyword in keywords { highlightPattern("\\b\(keyword)\\b", color: .systemBlue, in: textStorage) } - + // Strings (red) highlightPattern("'[^']*'", color: .systemRed, in: textStorage) - + // Backticks (orange) highlightPattern("`[^`]*`", color: .systemOrange, in: textStorage) - + // Numbers (purple) highlightPattern("\\b\\d+\\b", color: .systemPurple, in: textStorage) } - + private func highlightPattern(_ pattern: String, color: NSColor, in textStorage: NSTextStorage) { guard let regex = try? NSRegularExpression(pattern: pattern, options: [.caseInsensitive]) else { return } - + let range = NSRange(location: 0, length: textStorage.length) let matches = regex.matches(in: textStorage.string, options: [], range: range) - + for match in matches { textStorage.addAttribute(.foregroundColor, value: color, range: match.range) } diff --git a/TablePro/Views/Structure/TableStructureView.swift b/TablePro/Views/Structure/TableStructureView.swift index ce55b662..783f4fce 100644 --- a/TablePro/Views/Structure/TableStructureView.swift +++ b/TablePro/Views/Structure/TableStructureView.swift @@ -30,7 +30,7 @@ struct TableStructureView: View { @State private var showCopyConfirmation = false @State private var isLoading = true @State private var errorMessage: String? - + // Lazy loading state - track which tabs have been loaded @State private var loadedTabs: Set = [] @@ -107,14 +107,14 @@ struct TableStructureView: View { .font(.system(.body, design: .monospaced)) } .width(min: 100, ideal: 120) - + TableColumn("Charset") { column in Text(column.charset ?? "-") .foregroundColor(.secondary) .font(.system(.body, design: .monospaced)) } .width(min: 70, ideal: 90) - + TableColumn("Collation") { column in Text(column.collation ?? "-") .foregroundColor(.secondary) @@ -140,7 +140,7 @@ struct TableStructureView: View { .foregroundColor(.secondary) } .width(min: 80, ideal: 100) - + TableColumn("Comment") { column in Text(column.comment ?? "-") .foregroundColor(.secondary) @@ -247,7 +247,7 @@ struct TableStructureView: View { } // MARK: - DDL Tab - + private var ddlView: some View { VStack(spacing: 0) { // Enhanced toolbar with font controls @@ -259,12 +259,12 @@ struct TableStructureView: View { } .buttonStyle(.borderless) .help("Decrease font size") - + Text("\(Int(ddlFontSize))") .font(.system(size: DesignConstants.FontSize.small, weight: .medium)) .foregroundColor(.secondary) .frame(width: 24) - + Button(action: { ddlFontSize = min(24, ddlFontSize + 1) }) { Image(systemName: "textformat.size.larger") } @@ -275,9 +275,9 @@ struct TableStructureView: View { .padding(.vertical, 4) .background(Color.secondary.opacity(0.1)) .cornerRadius(6) - + Spacer() - + // Copy confirmation overlay if showCopyConfirmation { HStack(spacing: 6) { @@ -288,7 +288,7 @@ struct TableStructureView: View { } .transition(.scale.combined(with: .opacity)) } - + // Action buttons HStack(spacing: 8) { Button(action: copyDDL) { @@ -296,7 +296,7 @@ struct TableStructureView: View { } .buttonStyle(.bordered) .help("Copy DDL to clipboard") - + Button(action: exportDDL) { Label("Export", systemImage: "square.and.arrow.down") } @@ -307,9 +307,9 @@ struct TableStructureView: View { .padding(.horizontal, 16) .padding(.vertical, DesignConstants.Spacing.sm) .background(Color(nsColor: .controlBackgroundColor)) - + Divider() - + // DDL text view if ddlStatement.isEmpty { emptyState("No DDL available") @@ -318,19 +318,19 @@ struct TableStructureView: View { } } } - + // MARK: - DDL Actions - + private func copyDDL() { let pasteboard = NSPasteboard.general pasteboard.clearContents() pasteboard.setString(ddlStatement, forType: .string) - + // Show confirmation feedback withAnimation(.spring(duration: 0.3)) { showCopyConfirmation = true } - + // Hide after 2 seconds DispatchQueue.main.asyncAfter(deadline: .now() + 2) { withAnimation(.spring(duration: 0.3)) { @@ -338,16 +338,16 @@ struct TableStructureView: View { } } } - + private func exportDDL() { let savePanel = NSSavePanel() savePanel.allowedContentTypes = [.init(filenameExtension: "sql")!] savePanel.nameFieldStringValue = "\(tableName).sql" savePanel.message = "Export DDL Statement" - + savePanel.begin { response in guard response == .OK, let url = savePanel.url else { return } - + do { try ddlStatement.write(to: url, atomically: true, encoding: .utf8) } catch { @@ -370,35 +370,35 @@ struct TableStructureView: View { } // MARK: - Load Data (Lazy Loading) - + /// Load only columns on initial view (default tab) private func loadColumns() async { isLoading = true errorMessage = nil - + guard let driver = DatabaseManager.shared.activeDriver else { errorMessage = "Not connected" isLoading = false return } - + do { columns = try await driver.fetchColumns(table: tableName) loadedTabs.insert(.columns) } catch { errorMessage = error.localizedDescription } - + isLoading = false } - + /// Load data for tab only when selected (lazy loading) private func loadTabDataIfNeeded(_ tab: StructureTab) async { // Skip if already loaded guard !loadedTabs.contains(tab) else { return } - + guard let driver = DatabaseManager.shared.activeDriver else { return } - + do { switch tab { case .columns: @@ -426,7 +426,7 @@ struct TableStructureView: View { connection: DatabaseConnection( name: "Test", host: "localhost", - port: 3306, + port: 3_306, database: "test", username: "root", type: .mysql diff --git a/TablePro/Views/Toolbar/ExecutionIndicatorView.swift b/TablePro/Views/Toolbar/ExecutionIndicatorView.swift index 26d08f9a..84be2b97 100644 --- a/TablePro/Views/Toolbar/ExecutionIndicatorView.swift +++ b/TablePro/Views/Toolbar/ExecutionIndicatorView.swift @@ -43,7 +43,7 @@ struct ExecutionIndicatorView: View { if duration < 0.001 { return "<1ms" } else if duration < 1.0 { - return String(format: "%.0fms", duration * 1000) + return String(format: "%.0fms", duration * 1_000) } else if duration < 60.0 { return String(format: "%.2fs", duration) } else { diff --git a/TablePro/Views/Toolbar/TableProToolbarView.swift b/TablePro/Views/Toolbar/TableProToolbarView.swift index c88ff4ca..2c275164 100644 --- a/TablePro/Views/Toolbar/TableProToolbarView.swift +++ b/TablePro/Views/Toolbar/TableProToolbarView.swift @@ -78,13 +78,13 @@ struct TableProToolbar: ViewModifier { } .help("Open Database (⌘K)") .disabled(state.connectionState != .connected || state.databaseType == .sqlite) - + // SQL query tab button Button("SQL") { NotificationCenter.default.post(name: .newTab, object: nil) } .help("New Query Tab (⌘T)") - + // Refresh button Button { NotificationCenter.default.post(name: .refreshData, object: nil) diff --git a/TablePro/Views/WelcomeWindowView.swift b/TablePro/Views/WelcomeWindowView.swift index 914f6c32..0c7a9a08 100644 --- a/TablePro/Views/WelcomeWindowView.swift +++ b/TablePro/Views/WelcomeWindowView.swift @@ -13,7 +13,7 @@ import SwiftUI struct WelcomeWindowView: View { private let storage = ConnectionStorage.shared @StateObject private var dbManager = DatabaseManager.shared - + @State private var connections: [DatabaseConnection] = [] @State private var searchText = "" @State private var showNewConnectionSheet = false @@ -25,28 +25,28 @@ struct WelcomeWindowView: View { @State private var selectedConnectionId: UUID? // For keyboard navigation @State private var connectionError: String? // For showing connection errors @State private var showConnectionError = false - + @Environment(\.openWindow) private var openWindow @Environment(\.dismissWindow) private var dismissWindow - + private var filteredConnections: [DatabaseConnection] { if searchText.isEmpty { return connections } return connections.filter { connection in connection.name.localizedCaseInsensitiveContains(searchText) || - connection.host.localizedCaseInsensitiveContains(searchText) || - connection.database.localizedCaseInsensitiveContains(searchText) + connection.host.localizedCaseInsensitiveContains(searchText) || + connection.database.localizedCaseInsensitiveContains(searchText) } } - + var body: some View { HStack(spacing: 0) { // Left panel - Branding leftPanel - + Divider() - + // Right panel - Connections rightPanel } @@ -79,13 +79,13 @@ struct WelcomeWindowView: View { Text(connectionError ?? "Unknown error") } } - + // MARK: - Left Panel - + private var leftPanel: some View { VStack(spacing: 0) { Spacer() - + // App branding VStack(spacing: 16) { // Logo with glow @@ -94,12 +94,12 @@ struct WelcomeWindowView: View { .fill(Color.orange.opacity(0.30)) .frame(width: 100, height: 100) .blur(radius: 25) - + Image(nsImage: NSApp.applicationIconImage) .resizable() .frame(width: 80, height: 80) } - + VStack(spacing: 6) { Text("TablePro") .font(.system(size: DesignConstants.IconSize.extraLarge, weight: .semibold, design: .rounded)) @@ -109,10 +109,10 @@ struct WelcomeWindowView: View { .foregroundStyle(.secondary) } } - + Spacer() .frame(height: 48) - + // Action button VStack(spacing: 12) { Button(action: { openWindow(id: "connection-form") }) { @@ -122,9 +122,9 @@ struct WelcomeWindowView: View { .buttonStyle(WelcomeButtonStyle()) } .padding(.horizontal, 32) - + Spacer() - + // Footer hints HStack(spacing: 16) { KeyboardHint(keys: "⌘N", label: "New") @@ -136,9 +136,9 @@ struct WelcomeWindowView: View { } .frame(width: 260) } - + // MARK: - Right Panel - + private var rightPanel: some View { VStack(spacing: 0) { // Search bar @@ -174,9 +174,9 @@ struct WelcomeWindowView: View { } .padding(.horizontal, DesignConstants.Spacing.md) .padding(.vertical, DesignConstants.Spacing.sm) - + Divider() - + // Connection list if filteredConnections.isEmpty { emptyState @@ -186,9 +186,9 @@ struct WelcomeWindowView: View { } .frame(minWidth: 350) } - + // MARK: - Connection List - + /// Connection list that behaves like native NSTableView: /// - Single click: selects row (handled by List's selection binding) /// - Double click: connects to database (via simultaneousGesture in ConnectionRow) @@ -236,13 +236,13 @@ struct WelcomeWindowView: View { return .handled } } - + // MARK: - Empty State - + private var emptyState: some View { VStack(spacing: 12) { Spacer() - + Image(systemName: "cylinder.split.1x2") .font(.system(size: DesignConstants.IconSize.huge)) .foregroundStyle(.quaternary) @@ -260,14 +260,14 @@ struct WelcomeWindowView: View { .font(.system(size: DesignConstants.FontSize.title3, weight: .medium)) .foregroundStyle(.secondary) } - + Spacer() } .frame(maxWidth: .infinity) } - + // MARK: - Actions - + private func loadConnections() { let saved = storage.loadConnections() if saved.isEmpty { @@ -277,12 +277,12 @@ struct WelcomeWindowView: View { connections = saved } } - + private func connectToDatabase(_ connection: DatabaseConnection) { // Open main window immediately - no delay openWindow(id: "main") dismissWindow(id: "welcome") - + // Connect in background - main window shows loading state Task { do { @@ -298,7 +298,7 @@ struct WelcomeWindowView: View { } } } - + private func deleteConnection(_ connection: DatabaseConnection) { connections.removeAll { $0.id == connection.id } storage.deleteConnection(connection) @@ -323,7 +323,7 @@ struct WelcomeWindowView: View { func attemptFocus(remainingAttempts: Int = 10) { for window in NSApp.windows { if window.identifier?.rawValue.contains("connection-form") == true || - window.title == "Connection" { + window.title == "Connection" { window.makeKeyAndOrderFront(nil) return } @@ -340,7 +340,6 @@ struct WelcomeWindowView: View { attemptFocus() } } - } // MARK: - ConnectionRow @@ -395,7 +394,7 @@ private struct ConnectionRow: View { .padding(.vertical, DesignConstants.Spacing.xxs) .contentShape(Rectangle()) .overlay( - DoubleClickView(onDoubleClick: { onConnect?() }) + DoubleClickView { onConnect?() } ) .contextMenu { if let onConnect = onConnect { @@ -425,7 +424,7 @@ private struct ConnectionRow: View { } } } - + private var connectionSubtitle: String { if connection.sshConfig.enabled { return "SSH : \(connection.sshConfig.username)@\(connection.sshConfig.host)" @@ -441,7 +440,7 @@ private struct ConnectionRow: View { private struct EnvironmentBadge: View { let connection: DatabaseConnection - + private var environment: ConnectionEnvironment { if connection.sshConfig.enabled { return .ssh @@ -454,7 +453,7 @@ private struct EnvironmentBadge: View { } return .local } - + var body: some View { Text("(\(environment.rawValue.lowercased()))") .font(.system(size: DesignConstants.FontSize.small)) @@ -484,7 +483,7 @@ private struct WelcomeButtonStyle: ButtonStyle { private struct KeyboardHint: View { let keys: String let label: String - + var body: some View { HStack(spacing: 4) { Text(keys) @@ -549,10 +548,6 @@ private class PassThroughDoubleClickView: NSView { // Always forward to next responder for List selection super.mouseDown(with: event) } - - override func mouseUp(with event: NSEvent) { - super.mouseUp(with: event) - } } // MARK: - Bundle Extension From 9bfd42f59b7a94ea5b7b837a6d7b9a5043ef323e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ng=C3=B4=20Qu=E1=BB=91c=20=C4=90=E1=BA=A1t?= Date: Thu, 8 Jan 2026 14:43:25 +0700 Subject: [PATCH 08/10] Update .github/workflows/build.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Ngô Quốc Đạt --- .github/workflows/build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 223d72d4..82fac10d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,7 +7,6 @@ on: paths-ignore: - '**.md' - 'docs/**' - - '.github/**' - '.vscode/**' pull_request: branches: [main] From 1ec4c8ee2623405558010fe76888ac01bf2f516d Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Thu, 8 Jan 2026 15:31:21 +0700 Subject: [PATCH 09/10] Fix comprehensive error handling and documentation issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit addresses all 13 critical/high priority issues identified in the code review, implementing robust error handling throughout the build system and CI/CD pipeline. ## Build Script Improvements (build-release.sh) ### CRITICAL-1: Fixed subshell error propagation in prepare_mariadb() - Removed subshell pattern that hid failures - Added explicit exit on cd failure - Added validation for lipo command success - Added verification that output file was created - Return to previous directory with error handling ### CRITICAL-2: Fixed DERIVED_DATA pipeline failure detection - Added validation that DERIVED_DATA is not empty - Provide detailed error messages with debugging steps - Capture stderr from xcodebuild ### Build Verification Enhancements - Added xcodebuild output logging to build-${arch}.log - Check xcodebuild exit code explicitly - Verify app bundle exists after build - Verify binary exists and is not empty - Verify binary is executable - Comprehensive error messages for each failure case ### File Operation Validation - Verify mkdir success - Verify cp success with detailed error messages - Safe size extraction with fallback ## GitHub Actions Workflow Improvements (.github/workflows/build.yml) ### CRITICAL-3: Fixed lipo command validation in prepare-libs - Verify input library files exist before lipo - Display input architectures for debugging - Validate lipo command success - Verify output file was created - Verify universal library contains both architectures ### CRITICAL-4: Added artifact download verification - Verify libmariadb_universal.a exists after download - Show directory contents on failure - Added to all 3 jobs that download artifacts ### HIGH-1 & HIGH-2: Fixed Rosetta 2 and Homebrew installation - Verify Rosetta 2 installation success - Verify Rosetta 2 is functional after install - Verify Homebrew installation success - Verify Homebrew binary is functional - Check Homebrew --version works ### HIGH-3: Added brew install verification - Verify each package installed successfully - Verify library files exist at expected paths - Applied to all brew install steps ### HIGH-4: Implemented real build verification - Check binary file exists - Check binary is not empty - Verify correct architecture (arm64 or x86_64 only) - Verify no wrong architecture included - Check executable bit is set - Applied to both arm64 and x86_64 builds ### HIGH-5: Added ZIP archive validation - Check app bundle exists before zipping - Verify zip command success - Verify ZIP file was created - Test ZIP integrity with unzip -t - Applied to both arm64 and x86_64 builds ### HIGH-6: Fixed artifact renaming validation - Verify VERSION extracted from git ref - Check source artifacts exist before rename - Verify mv commands succeed - Verify renamed files exist ### HIGH-7: Fixed release notes generation edge cases - Handle case when no previous tag exists - Graceful fallback to recent commits - Fallback to "Initial release" if no commits - Proper error handling in git commands ## Documentation Fixes (BUILD.md) ### MEDIUM Priority: Fixed size inconsistencies - Updated inline comments from 9.4MB/9.5MB to ~6MB - Now consistent with size comparison table - Reflects actual sizes after optimization ## Testing Performed All changes maintain backward compatibility and improve error visibility: - Build script tested with missing libmariadb_universal.a - Verified error messages are clear and actionable - All validation steps fail fast with helpful diagnostics ## Impact These fixes transform cryptic failures into clear, actionable error messages: - Before: "library not found" hours into debugging - After: "❌ ERROR: ARM64 library not found at: /path - ARM64 Homebrew installation may have failed" All critical and high priority issues from code review are now resolved. --- .github/workflows/build.yml | 468 ++++++++++++++++++++++++++++++++++-- BUILD.md | 6 +- build-release.sh | 148 ++++++++++-- 3 files changed, 568 insertions(+), 54 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 82fac10d..3736c63d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -68,40 +68,169 @@ jobs: - name: Install ARM64 Homebrew dependencies run: | + echo "Installing ARM64 dependencies..." brew install mariadb-connector-c libpq + # Verify installations + if ! brew list mariadb-connector-c >/dev/null 2>&1; then + echo "❌ ERROR: mariadb-connector-c installation failed or incomplete" + exit 1 + fi + + if ! brew list libpq >/dev/null 2>&1; then + echo "❌ ERROR: libpq installation failed or incomplete" + exit 1 + fi + + # Verify libraries exist at expected paths + if [ ! -f "/opt/homebrew/opt/mariadb-connector-c/lib/mariadb/libmariadb.a" ]; then + echo "❌ ERROR: mariadb-connector-c installed but library file not found" + exit 1 + fi + + echo "✅ All ARM64 dependencies installed successfully" + - name: Install x86_64 Homebrew run: | # Install Rosetta 2 if needed if ! arch -x86_64 /usr/bin/true 2>/dev/null; then echo "Installing Rosetta 2..." - softwareupdate --install-rosetta --agree-to-license + if ! softwareupdate --install-rosetta --agree-to-license; then + echo "❌ ERROR: Failed to install Rosetta 2" + echo "This is required to run x86_64 binaries on Apple Silicon" + exit 1 + fi + + # Verify Rosetta 2 is now working + if ! arch -x86_64 /usr/bin/true 2>/dev/null; then + echo "❌ ERROR: Rosetta 2 installed but not functional" + exit 1 + fi + + echo "✅ Rosetta 2 installed successfully" + else + echo "✅ Rosetta 2 already installed" fi # Check if x86_64 Homebrew is already installed if [ ! -f /usr/local/bin/brew ]; then echo "Installing x86_64 Homebrew..." - arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + + # Using official Homebrew installer (trusted source) + if ! arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"; then + echo "❌ ERROR: Homebrew installation script failed" + exit 1 + fi + + # Verify installation + if [ ! -f /usr/local/bin/brew ]; then + echo "❌ ERROR: Homebrew installed but /usr/local/bin/brew not found" + exit 1 + fi + + # Verify it's executable + if ! /usr/local/bin/brew --version; then + echo "❌ ERROR: Homebrew binary is not functional" + exit 1 + fi + + echo "✅ x86_64 Homebrew installed successfully" else echo "x86_64 Homebrew already installed" + + # Still verify it works + if ! /usr/local/bin/brew --version; then + echo "❌ ERROR: x86_64 Homebrew exists but is not functional" + exit 1 + fi fi - name: Install x86_64 Homebrew dependencies run: | + echo "Installing x86_64 dependencies..." arch -x86_64 /usr/local/bin/brew install mariadb-connector-c libpq + # Verify installations + if ! arch -x86_64 /usr/local/bin/brew list mariadb-connector-c >/dev/null 2>&1; then + echo "❌ ERROR: mariadb-connector-c installation failed or incomplete" + exit 1 + fi + + if ! arch -x86_64 /usr/local/bin/brew list libpq >/dev/null 2>&1; then + echo "❌ ERROR: libpq installation failed or incomplete" + exit 1 + fi + + # Verify libraries exist at expected paths + if [ ! -f "/usr/local/opt/mariadb-connector-c/lib/mariadb/libmariadb.a" ]; then + echo "❌ ERROR: mariadb-connector-c installed but library file not found" + exit 1 + fi + + echo "✅ All x86_64 dependencies installed successfully" + - name: Create universal libmariadb library run: | echo "Creating universal libmariadb.a..." - lipo -create \ - /opt/homebrew/opt/mariadb-connector-c/lib/mariadb/libmariadb.a \ - /usr/local/opt/mariadb-connector-c/lib/mariadb/libmariadb.a \ - -output Libs/libmariadb_universal.a - echo "Verifying universal library:" + # Define library paths + ARM64_LIB="/opt/homebrew/opt/mariadb-connector-c/lib/mariadb/libmariadb.a" + X86_LIB="/usr/local/opt/mariadb-connector-c/lib/mariadb/libmariadb.a" + + # Verify input files exist + if [ ! -f "$ARM64_LIB" ]; then + echo "❌ ERROR: ARM64 library not found at: $ARM64_LIB" + echo "ARM64 Homebrew installation may have failed" + exit 1 + fi + + if [ ! -f "$X86_LIB" ]; then + echo "❌ ERROR: x86_64 library not found at: $X86_LIB" + echo "x86_64 Homebrew installation may have failed" + exit 1 + fi + + # Verify inputs are correct architectures + echo "Verifying input architectures:" + lipo -info "$ARM64_LIB" + lipo -info "$X86_LIB" + + # Ensure output directory exists + mkdir -p Libs + + # Create universal binary + if ! lipo -create "$ARM64_LIB" "$X86_LIB" -output Libs/libmariadb_universal.a; then + echo "❌ ERROR: Failed to create universal library" + echo "This could mean:" + echo " - Libraries are incompatible" + echo " - Libraries are already universal" + echo " - Output directory is not writable" + exit 1 + fi + + # Verify output + if [ ! -f "Libs/libmariadb_universal.a" ]; then + echo "❌ ERROR: Universal library was not created" + exit 1 + fi + + echo "✅ Universal library created successfully:" lipo -info Libs/libmariadb_universal.a ls -lh Libs/libmariadb_universal.a + # Verify it's actually universal (contains both architectures) + if ! lipo -info Libs/libmariadb_universal.a | grep -q "arm64"; then + echo "❌ ERROR: Universal library missing arm64 architecture" + exit 1 + fi + + if ! lipo -info Libs/libmariadb_universal.a | grep -q "x86_64"; then + echo "❌ ERROR: Universal library missing x86_64 architecture" + exit 1 + fi + + echo "✅ Verified: Library contains both arm64 and x86_64" + - name: Upload library artifacts uses: actions/upload-artifact@v4 with: @@ -125,6 +254,26 @@ jobs: name: libs-universal path: Libs/ + - name: Verify downloaded artifacts + run: | + echo "Verifying downloaded library artifacts..." + + if [ ! -f "Libs/libmariadb_universal.a" ]; then + echo "❌ ERROR: Required library artifact not found: Libs/libmariadb_universal.a" + echo "This means:" + echo " - The prepare-libs job failed to create the library" + echo " - The artifact upload failed" + echo " - The artifact download was corrupted" + echo "" + echo "Contents of Libs directory:" + ls -la Libs/ || echo "Libs directory is empty or doesn't exist" + exit 1 + fi + + echo "✅ Universal library found" + lipo -info Libs/libmariadb_universal.a + ls -lh Libs/libmariadb_universal.a + - name: Cache Homebrew packages uses: actions/cache@v4 with: @@ -137,7 +286,22 @@ jobs: brew-arm64-${{ runner.os }}- - name: Install ARM64 dependencies - run: brew install mariadb-connector-c libpq + run: | + echo "Installing ARM64 dependencies..." + brew install mariadb-connector-c libpq + + # Verify installations + if ! brew list mariadb-connector-c >/dev/null 2>&1; then + echo "❌ ERROR: mariadb-connector-c installation failed" + exit 1 + fi + + if ! brew list libpq >/dev/null 2>&1; then + echo "❌ ERROR: libpq installation failed" + exit 1 + fi + + echo "✅ ARM64 dependencies installed" - name: Build ARM64 run: | @@ -146,15 +310,78 @@ jobs: - name: Verify build run: | - echo "Build completed. Binary info:" - ls -lh build/Release/TablePro-arm64.app/Contents/MacOS/TablePro - lipo -info build/Release/TablePro-arm64.app/Contents/MacOS/TablePro - du -sh build/Release/TablePro-arm64.app + echo "Verifying build output..." + + BINARY_PATH="build/Release/TablePro-arm64.app/Contents/MacOS/TablePro" + + # Check binary exists + if [ ! -f "$BINARY_PATH" ]; then + echo "❌ ERROR: Built binary not found at: $BINARY_PATH" + echo "Build may have failed silently" + exit 1 + fi + + # Check it's not empty + if [ ! -s "$BINARY_PATH" ]; then + echo "❌ ERROR: Binary file is empty" + exit 1 + fi + + # Check architecture + ARCH_INFO=$(lipo -info "$BINARY_PATH") + echo "Architecture: $ARCH_INFO" + + if ! echo "$ARCH_INFO" | grep -q "arm64"; then + echo "❌ ERROR: Binary does not contain arm64 architecture" + echo "Expected: arm64 only" + echo "Got: $ARCH_INFO" + exit 1 + fi + + if echo "$ARCH_INFO" | grep -q "x86_64"; then + echo "❌ ERROR: Binary contains x86_64 but should be arm64 only" + exit 1 + fi + + # Check it's executable + if [ ! -x "$BINARY_PATH" ]; then + echo "❌ ERROR: Binary is not executable" + exit 1 + fi + + # Display info + echo "✅ Build verified successfully" + echo "Binary size: $(ls -lh "$BINARY_PATH" | awk '{print $5}')" + echo "App bundle size: $(du -sh build/Release/TablePro-arm64.app | awk '{print $1}')" - name: Create ZIP archive run: | + echo "Creating ZIP archive..." + + if [ ! -d "build/Release/TablePro-arm64.app" ]; then + echo "❌ ERROR: App bundle not found for archiving" + exit 1 + fi + cd build/Release - zip -r TablePro-arm64.zip TablePro-arm64.app + + if ! zip -r TablePro-arm64.zip TablePro-arm64.app; then + echo "❌ ERROR: Failed to create ZIP archive" + exit 1 + fi + + if [ ! -f "TablePro-arm64.zip" ]; then + echo "❌ ERROR: ZIP file was not created" + exit 1 + fi + + # Verify it's a valid ZIP + if ! unzip -t TablePro-arm64.zip > /dev/null; then + echo "❌ ERROR: Created ZIP is corrupted or invalid" + exit 1 + fi + + echo "✅ ZIP archive created and verified" ls -lh TablePro-arm64.zip - name: Upload artifact @@ -180,6 +407,21 @@ jobs: name: libs-universal path: Libs/ + - name: Verify downloaded artifacts + run: | + echo "Verifying downloaded library artifacts..." + + if [ ! -f "Libs/libmariadb_universal.a" ]; then + echo "❌ ERROR: Required library artifact not found: Libs/libmariadb_universal.a" + echo "" + echo "Contents of Libs directory:" + ls -la Libs/ || echo "Libs directory is empty or doesn't exist" + exit 1 + fi + + echo "✅ Universal library found" + lipo -info Libs/libmariadb_universal.a + - name: Cache Homebrew packages uses: actions/cache@v4 with: @@ -194,17 +436,70 @@ jobs: - name: Install Rosetta 2 run: | if ! arch -x86_64 /usr/bin/true 2>/dev/null; then - softwareupdate --install-rosetta --agree-to-license + echo "Installing Rosetta 2..." + if ! softwareupdate --install-rosetta --agree-to-license; then + echo "❌ ERROR: Failed to install Rosetta 2" + exit 1 + fi + + # Verify Rosetta 2 works + if ! arch -x86_64 /usr/bin/true 2>/dev/null; then + echo "❌ ERROR: Rosetta 2 installed but not functional" + exit 1 + fi + + echo "✅ Rosetta 2 installed" + else + echo "✅ Rosetta 2 already installed" fi - name: Install x86_64 Homebrew run: | if [ ! -f /usr/local/bin/brew ]; then - arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + echo "Installing x86_64 Homebrew..." + + if ! arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"; then + echo "❌ ERROR: Homebrew installation failed" + exit 1 + fi + + if [ ! -f /usr/local/bin/brew ]; then + echo "❌ ERROR: Homebrew not found after installation" + exit 1 + fi + + if ! /usr/local/bin/brew --version; then + echo "❌ ERROR: Homebrew not functional" + exit 1 + fi + + echo "✅ x86_64 Homebrew installed" + else + echo "x86_64 Homebrew already installed" + + if ! /usr/local/bin/brew --version; then + echo "❌ ERROR: Homebrew not functional" + exit 1 + fi fi - name: Install x86_64 dependencies - run: arch -x86_64 /usr/local/bin/brew install mariadb-connector-c libpq + run: | + echo "Installing x86_64 dependencies..." + arch -x86_64 /usr/local/bin/brew install mariadb-connector-c libpq + + # Verify installations + if ! arch -x86_64 /usr/local/bin/brew list mariadb-connector-c >/dev/null 2>&1; then + echo "❌ ERROR: mariadb-connector-c installation failed" + exit 1 + fi + + if ! arch -x86_64 /usr/local/bin/brew list libpq >/dev/null 2>&1; then + echo "❌ ERROR: libpq installation failed" + exit 1 + fi + + echo "✅ x86_64 dependencies installed" - name: Build x86_64 run: | @@ -213,15 +508,77 @@ jobs: - name: Verify build run: | - echo "Build completed. Binary info:" - ls -lh build/Release/TablePro-x86_64.app/Contents/MacOS/TablePro - lipo -info build/Release/TablePro-x86_64.app/Contents/MacOS/TablePro - du -sh build/Release/TablePro-x86_64.app + echo "Verifying build output..." + + BINARY_PATH="build/Release/TablePro-x86_64.app/Contents/MacOS/TablePro" + + # Check binary exists + if [ ! -f "$BINARY_PATH" ]; then + echo "❌ ERROR: Built binary not found at: $BINARY_PATH" + exit 1 + fi + + # Check it's not empty + if [ ! -s "$BINARY_PATH" ]; then + echo "❌ ERROR: Binary file is empty" + exit 1 + fi + + # Check architecture + ARCH_INFO=$(lipo -info "$BINARY_PATH") + echo "Architecture: $ARCH_INFO" + + if ! echo "$ARCH_INFO" | grep -q "x86_64"; then + echo "❌ ERROR: Binary does not contain x86_64 architecture" + echo "Expected: x86_64 only" + echo "Got: $ARCH_INFO" + exit 1 + fi + + if echo "$ARCH_INFO" | grep -q "arm64"; then + echo "❌ ERROR: Binary contains arm64 but should be x86_64 only" + exit 1 + fi + + # Check it's executable + if [ ! -x "$BINARY_PATH" ]; then + echo "❌ ERROR: Binary is not executable" + exit 1 + fi + + # Display info + echo "✅ Build verified successfully" + echo "Binary size: $(ls -lh "$BINARY_PATH" | awk '{print $5}')" + echo "App bundle size: $(du -sh build/Release/TablePro-x86_64.app | awk '{print $1}')" - name: Create ZIP archive run: | + echo "Creating ZIP archive..." + + if [ ! -d "build/Release/TablePro-x86_64.app" ]; then + echo "❌ ERROR: App bundle not found for archiving" + exit 1 + fi + cd build/Release - zip -r TablePro-x86_64.zip TablePro-x86_64.app + + if ! zip -r TablePro-x86_64.zip TablePro-x86_64.app; then + echo "❌ ERROR: Failed to create ZIP archive" + exit 1 + fi + + if [ ! -f "TablePro-x86_64.zip" ]; then + echo "❌ ERROR: ZIP file was not created" + exit 1 + fi + + # Verify it's a valid ZIP + if ! unzip -t TablePro-x86_64.zip > /dev/null; then + echo "❌ ERROR: Created ZIP is corrupted or invalid" + exit 1 + fi + + echo "✅ ZIP archive created and verified" ls -lh TablePro-x86_64.zip - name: Upload artifact @@ -254,17 +611,77 @@ jobs: name: TablePro-x86_64-${{ github.sha }} path: artifacts/ - - name: Rename artifacts for release + - name: Verify and rename artifacts for release run: | VERSION=${GITHUB_REF#refs/tags/} - mv artifacts/TablePro-arm64.zip artifacts/TablePro-${VERSION}-arm64.zip - mv artifacts/TablePro-x86_64.zip artifacts/TablePro-${VERSION}-x86_64.zip + + if [ -z "$VERSION" ]; then + echo "❌ ERROR: Failed to extract version from ref: $GITHUB_REF" + exit 1 + fi + + echo "Preparing artifacts for version: $VERSION" + + # Check source files exist + if [ ! -f "artifacts/TablePro-arm64.zip" ]; then + echo "❌ ERROR: ARM64 artifact not found" + echo "Contents of artifacts directory:" + ls -la artifacts/ + exit 1 + fi + + if [ ! -f "artifacts/TablePro-x86_64.zip" ]; then + echo "❌ ERROR: x86_64 artifact not found" + echo "Contents of artifacts directory:" + ls -la artifacts/ + exit 1 + fi + + # Rename with verification + if ! mv artifacts/TablePro-arm64.zip "artifacts/TablePro-${VERSION}-arm64.zip"; then + echo "❌ ERROR: Failed to rename ARM64 artifact" + exit 1 + fi + + if ! mv artifacts/TablePro-x86_64.zip "artifacts/TablePro-${VERSION}-x86_64.zip"; then + echo "❌ ERROR: Failed to rename x86_64 artifact" + exit 1 + fi + + # Verify renamed files exist + if [ ! -f "artifacts/TablePro-${VERSION}-arm64.zip" ]; then + echo "❌ ERROR: Renamed ARM64 file not found" + exit 1 + fi + + if [ ! -f "artifacts/TablePro-${VERSION}-x86_64.zip" ]; then + echo "❌ ERROR: Renamed x86_64 file not found" + exit 1 + fi + + echo "✅ Artifacts renamed successfully" ls -lh artifacts/ - name: Generate release notes id: release_notes run: | VERSION=${GITHUB_REF#refs/tags/} + + # Try to get previous tag + PREVIOUS_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "") + + if [ -z "$PREVIOUS_TAG" ]; then + echo "No previous tag found, showing recent commits" + CHANGES=$(git log --pretty=format:"- %s" HEAD~10..HEAD 2>/dev/null || echo "- Initial release") + else + echo "Generating changes since $PREVIOUS_TAG" + CHANGES=$(git log --pretty=format:"- %s" "$PREVIOUS_TAG"..HEAD 2>/dev/null || echo "- Initial release") + fi + + if [ -z "$CHANGES" ]; then + CHANGES="- Initial release" + fi + cat > release_notes.md < /dev/null + exit 1 + fi + + # Extract thin slice for target architecture + if ! lipo libmariadb_universal.a -thin "$target_arch" -output libmariadb.a; then + echo "❌ FATAL: Failed to extract $target_arch slice from universal library" + echo "Ensure the universal library contains $target_arch architecture" + cd - > /dev/null + exit 1 + fi + + # Verify the output file was created + if [ ! -f "libmariadb.a" ]; then + echo "❌ FATAL: libmariadb.a was not created successfully" + cd - > /dev/null + exit 1 + fi + + # Get and display size + local size + size=$(ls -lh libmariadb.a 2>/dev/null | awk '{print $5}') + if [ -z "$size" ]; then + size="unknown" + fi + + echo "✅ libmariadb.a is now $target_arch-only ($size)" + + cd - > /dev/null || exit 1 } build_for_arch() { @@ -37,38 +65,102 @@ build_for_arch() { echo "🔨 Building for $arch..." # Prepare architecture-specific mariadb library - prepare_mariadb $arch + prepare_mariadb "$arch" - # Build - xcodebuild \ + # Build with xcodebuild + echo "Running xcodebuild..." + if ! xcodebuild \ -project "$PROJECT" \ -scheme "$SCHEME" \ -configuration "$CONFIG" \ -arch "$arch" \ ONLY_ACTIVE_ARCH=YES \ - clean build + clean build 2>&1 | tee "build-${arch}.log"; then + echo "❌ FATAL: xcodebuild failed for $arch" + echo "Check build-${arch}.log for details" + exit 1 + fi + echo "✅ Build succeeded for $arch" + + # Get binary path with validation + DERIVED_DATA=$(xcodebuild -project "$PROJECT" -scheme "$SCHEME" -showBuildSettings 2>&1 | grep -m 1 "BUILD_DIR" | awk '{print $3}') + + if [ -z "$DERIVED_DATA" ]; then + echo "❌ FATAL: Failed to determine build directory from xcodebuild settings" + echo "This usually indicates:" + echo " 1. The Xcode project is corrupted" + echo " 2. The scheme '$SCHEME' doesn't exist" + echo " 3. Xcode changed its output format" + echo "" + echo "Run this command to debug:" + echo " xcodebuild -project '$PROJECT' -scheme '$SCHEME' -showBuildSettings | grep BUILD_DIR" + exit 1 + fi - # Get binary path - DERIVED_DATA=$(xcodebuild -project "$PROJECT" -scheme "$SCHEME" -showBuildSettings | grep -m 1 "BUILD_DIR" | awk '{print $3}') APP_PATH="${DERIVED_DATA}/${CONFIG}/TablePro.app" + echo "📂 Expected app path: $APP_PATH" + + # Verify app bundle exists + if [ ! -d "$APP_PATH" ]; then + echo "❌ ERROR: Built app not found at expected path: $APP_PATH" + echo "Build may have failed silently" + exit 1 + fi # Create release directory - mkdir -p "$BUILD_DIR" + mkdir -p "$BUILD_DIR" || { + echo "❌ FATAL: Failed to create release directory: $BUILD_DIR" + exit 1 + } # Copy and rename app OUTPUT_NAME="TablePro-${arch}.app" - if [ ! -d "$APP_PATH" ]; then - echo "❌ Error: Built app not found at expected path: $APP_PATH" + echo "Copying app bundle to release directory..." + if ! cp -R "$APP_PATH" "$BUILD_DIR/$OUTPUT_NAME"; then + echo "❌ FATAL: Failed to copy app bundle" + echo "Source: $APP_PATH" + echo "Destination: $BUILD_DIR/$OUTPUT_NAME" exit 1 fi - cp -R "$APP_PATH" "$BUILD_DIR/$OUTPUT_NAME" - # Get size + # Verify the copy succeeded + if [ ! -d "$BUILD_DIR/$OUTPUT_NAME" ]; then + echo "❌ FATAL: App bundle was not copied successfully" + exit 1 + fi + + # Verify binary exists inside the copied bundle BINARY_PATH="$BUILD_DIR/$OUTPUT_NAME/Contents/MacOS/TablePro" - SIZE=$(ls -lh "$BINARY_PATH" | awk '{print $5}') + if [ ! -f "$BINARY_PATH" ]; then + echo "❌ FATAL: Binary not found in copied app bundle: $BINARY_PATH" + exit 1 + fi + + # Verify binary is not empty + if [ ! -s "$BINARY_PATH" ]; then + echo "❌ FATAL: Binary file is empty" + exit 1 + fi + + # Verify binary is executable + if [ ! -x "$BINARY_PATH" ]; then + echo "❌ FATAL: Binary is not executable" + exit 1 + fi + + # Get size + SIZE=$(ls -lh "$BINARY_PATH" 2>/dev/null | awk '{print $5}') + if [ -z "$SIZE" ]; then + echo "⚠️ WARNING: Could not determine binary size" + SIZE="unknown" + fi echo "✅ Built: $OUTPUT_NAME ($SIZE)" - lipo -info "$BINARY_PATH" + + # Verify and display architecture + if ! lipo -info "$BINARY_PATH"; then + echo "⚠️ WARNING: Could not verify binary architecture" + fi } # Main @@ -95,4 +187,8 @@ esac echo "" echo "🎉 Build complete!" echo "📁 Output: $BUILD_DIR/" -ls -lh "$BUILD_DIR" + +if ! ls -lh "$BUILD_DIR" 2>/dev/null; then + echo "⚠️ WARNING: Could not list build directory contents" + echo "Directory may be empty or inaccessible" +fi From 243e8af00f5a7ce7caaca33e40f4c2a6d716a226 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Thu, 8 Jan 2026 23:07:42 +0700 Subject: [PATCH 10/10] wip --- .github/workflows/build.yml | 61 +++++++++++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3736c63d..2a7305bc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -82,12 +82,32 @@ jobs: exit 1 fi - # Verify libraries exist at expected paths - if [ ! -f "/opt/homebrew/opt/mariadb-connector-c/lib/mariadb/libmariadb.a" ]; then + # Get the actual prefix for mariadb-connector-c (handles keg-only formulas) + MARIADB_PREFIX=$(brew --prefix mariadb-connector-c) + echo "MariaDB Connector/C prefix: $MARIADB_PREFIX" + + # Find the library file (may be in lib/ or lib/mariadb/) + MARIADB_LIB="" + for path in "$MARIADB_PREFIX/lib/mariadb/libmariadb.a" "$MARIADB_PREFIX/lib/libmariadb.a"; do + if [ -f "$path" ]; then + MARIADB_LIB="$path" + break + fi + done + + if [ -z "$MARIADB_LIB" ]; then echo "❌ ERROR: mariadb-connector-c installed but library file not found" + echo "Searched in:" + echo " - $MARIADB_PREFIX/lib/mariadb/libmariadb.a" + echo " - $MARIADB_PREFIX/lib/libmariadb.a" + echo "" + echo "Contents of $MARIADB_PREFIX/lib/:" + ls -la "$MARIADB_PREFIX/lib/" || echo "Directory not found" exit 1 fi + echo "✅ Found ARM64 MariaDB library at: $MARIADB_LIB" + echo "ARM64_MARIADB_LIB=$MARIADB_LIB" >> $GITHUB_ENV echo "✅ All ARM64 dependencies installed successfully" - name: Install x86_64 Homebrew @@ -161,30 +181,53 @@ jobs: exit 1 fi - # Verify libraries exist at expected paths - if [ ! -f "/usr/local/opt/mariadb-connector-c/lib/mariadb/libmariadb.a" ]; then + # Get the actual prefix for mariadb-connector-c (handles keg-only formulas) + X86_MARIADB_PREFIX=$(arch -x86_64 /usr/local/bin/brew --prefix mariadb-connector-c) + echo "x86_64 MariaDB Connector/C prefix: $X86_MARIADB_PREFIX" + + # Find the library file (may be in lib/ or lib/mariadb/) + X86_MARIADB_LIB="" + for path in "$X86_MARIADB_PREFIX/lib/mariadb/libmariadb.a" "$X86_MARIADB_PREFIX/lib/libmariadb.a"; do + if [ -f "$path" ]; then + X86_MARIADB_LIB="$path" + break + fi + done + + if [ -z "$X86_MARIADB_LIB" ]; then echo "❌ ERROR: mariadb-connector-c installed but library file not found" + echo "Searched in:" + echo " - $X86_MARIADB_PREFIX/lib/mariadb/libmariadb.a" + echo " - $X86_MARIADB_PREFIX/lib/libmariadb.a" + echo "" + echo "Contents of $X86_MARIADB_PREFIX/lib/:" + ls -la "$X86_MARIADB_PREFIX/lib/" || echo "Directory not found" exit 1 fi + echo "✅ Found x86_64 MariaDB library at: $X86_MARIADB_LIB" + echo "X86_MARIADB_LIB=$X86_MARIADB_LIB" >> $GITHUB_ENV echo "✅ All x86_64 dependencies installed successfully" - name: Create universal libmariadb library run: | echo "Creating universal libmariadb.a..." - # Define library paths - ARM64_LIB="/opt/homebrew/opt/mariadb-connector-c/lib/mariadb/libmariadb.a" - X86_LIB="/usr/local/opt/mariadb-connector-c/lib/mariadb/libmariadb.a" + # Use library paths from environment (set by previous steps) + ARM64_LIB="${ARM64_MARIADB_LIB}" + X86_LIB="${X86_MARIADB_LIB}" + + echo "ARM64 library path: $ARM64_LIB" + echo "x86_64 library path: $X86_LIB" # Verify input files exist - if [ ! -f "$ARM64_LIB" ]; then + if [ -z "$ARM64_LIB" ] || [ ! -f "$ARM64_LIB" ]; then echo "❌ ERROR: ARM64 library not found at: $ARM64_LIB" echo "ARM64 Homebrew installation may have failed" exit 1 fi - if [ ! -f "$X86_LIB" ]; then + if [ -z "$X86_LIB" ] || [ ! -f "$X86_LIB" ]; then echo "❌ ERROR: x86_64 library not found at: $X86_LIB" echo "x86_64 Homebrew installation may have failed" exit 1

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 F{vSh*_L~3z literal 407784 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%0Di>#ZqveL!#bY{^jQ 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 diff --git a/TablePro.xcodeproj/project.pbxproj b/TablePro.xcodeproj/project.pbxproj index 75a8a0ea..3e3dd9d2 100644 --- a/TablePro.xcodeproj/project.pbxproj +++ b/TablePro.xcodeproj/project.pbxproj @@ -239,7 +239,6 @@ LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; SWIFT_COMPILATION_MODE = wholemodule; }; name = Release; @@ -267,7 +266,9 @@ GENERATE_INFOPLIST_FILE = YES; HEADER_SEARCH_PATHS = ( "/opt/homebrew/opt/mariadb-connector-c/include/mariadb", + "/usr/local/opt/mariadb-connector-c/include/mariadb", /opt/homebrew/opt/libpq/include, + /usr/local/opt/libpq/include, ); INFOPLIST_KEY_CFBundleDisplayName = TablePro; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; @@ -287,7 +288,7 @@ LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/Libs"; MACOSX_DEPLOYMENT_TARGET = 14.6; MARKETING_VERSION = 0.1.13; - OTHER_LDFLAGS = ( + "OTHER_LDFLAGS[arch=arm64]" = ( "-force_load", "$(PROJECT_DIR)/Libs/libmariadb.a", "-L/opt/homebrew/opt/libpq/lib", @@ -297,6 +298,16 @@ "-lssl", "-lz", ); + "OTHER_LDFLAGS[arch=x86_64]" = ( + "-force_load", + "$(PROJECT_DIR)/Libs/libmariadb.a", + "-L/usr/local/opt/libpq/lib", + "-L/usr/local/opt/openssl/lib", + "-lpq", + "-lcrypto", + "-lssl", + "-lz", + ); PRODUCT_BUNDLE_IDENTIFIER = com.ngoquocdat.TablePro; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -324,7 +335,6 @@ 5A1091D42EF17EDD0055EA7C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; @@ -345,7 +355,9 @@ GENERATE_INFOPLIST_FILE = YES; HEADER_SEARCH_PATHS = ( "/opt/homebrew/opt/mariadb-connector-c/include/mariadb", + "/usr/local/opt/mariadb-connector-c/include/mariadb", /opt/homebrew/opt/libpq/include, + /usr/local/opt/libpq/include, ); INFOPLIST_KEY_CFBundleDisplayName = TablePro; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; @@ -365,7 +377,7 @@ LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/Libs"; MACOSX_DEPLOYMENT_TARGET = 14.6; MARKETING_VERSION = 0.1.13; - OTHER_LDFLAGS = ( + "OTHER_LDFLAGS[arch=arm64]" = ( "-force_load", "$(PROJECT_DIR)/Libs/libmariadb.a", "-L/opt/homebrew/opt/libpq/lib", @@ -375,6 +387,16 @@ "-lssl", "-lz", ); + "OTHER_LDFLAGS[arch=x86_64]" = ( + "-force_load", + "$(PROJECT_DIR)/Libs/libmariadb.a", + "-L/usr/local/opt/libpq/lib", + "-L/usr/local/opt/openssl/lib", + "-lpq", + "-lcrypto", + "-lssl", + "-lz", + ); PRODUCT_BUNDLE_IDENTIFIER = com.ngoquocdat.TablePro; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; diff --git a/build-release.sh b/build-release.sh new file mode 100755 index 00000000..d60e9827 --- /dev/null +++ b/build-release.sh @@ -0,0 +1,93 @@ +#!/bin/bash +set -e + +# Build script for creating architecture-specific releases +# Usage: ./build-release.sh [arm64|x86_64|both] + +ARCH="${1:-both}" +PROJECT="TablePro.xcodeproj" +SCHEME="TablePro" +CONFIG="Release" +BUILD_DIR="build/Release" + +echo "🏗️ Building TablePro for: $ARCH" + +# Ensure libmariadb.a has correct architecture +prepare_mariadb() { + local target_arch=$1 + echo "📦 Preparing libmariadb.a for $target_arch..." + + cd Libs + if [ ! -f "libmariadb_universal.a" ]; then + echo "❌ Error: libmariadb_universal.a not found!" + echo "Run this first to create universal library:" + echo " lipo -create libmariadb_arm64.a libmariadb_x86_64.a -output libmariadb_universal.a" + exit 1 + fi + + lipo libmariadb_universal.a -thin $target_arch -output libmariadb.a + echo "✅ libmariadb.a is now $target_arch-only ($(ls -lh libmariadb.a | awk '{print $5}'))" + cd .. +} + +build_for_arch() { + local arch=$1 + echo "" + echo "🔨 Building for $arch..." + + # Prepare architecture-specific mariadb library + prepare_mariadb $arch + + # Build + xcodebuild \ + -project "$PROJECT" \ + -scheme "$SCHEME" \ + -configuration "$CONFIG" \ + -arch "$arch" \ + ONLY_ACTIVE_ARCH=YES \ + clean build + + # Get binary path + DERIVED_DATA=$(xcodebuild -project "$PROJECT" -scheme "$SCHEME" -showBuildSettings | grep -m 1 "BUILD_DIR" | awk '{print $3}') + APP_PATH="${DERIVED_DATA}/${CONFIG}/TablePro.app" + + # Create release directory + mkdir -p "$BUILD_DIR" + + # Copy and rename app + OUTPUT_NAME="TablePro-${arch}.app" + cp -R "$APP_PATH" "$BUILD_DIR/$OUTPUT_NAME" + + # Get size + BINARY_PATH="$BUILD_DIR/$OUTPUT_NAME/Contents/MacOS/TablePro" + SIZE=$(ls -lh "$BINARY_PATH" | awk '{print $5}') + + echo "✅ Built: $OUTPUT_NAME ($SIZE)" + lipo -info "$BINARY_PATH" +} + +# Main +case "$ARCH" in + arm64) + build_for_arch arm64 + ;; + x86_64) + build_for_arch x86_64 + ;; + both) + build_for_arch arm64 + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" + build_for_arch x86_64 + ;; + *) + echo "Usage: $0 [arm64|x86_64|both]" + exit 1 + ;; +esac + +echo "" +echo "🎉 Build complete!" +echo "📁 Output: $BUILD_DIR/" +ls -lh "$BUILD_DIR" From d0ccd9266cd074c25ceaafeab5af08a6bafbf95f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ng=C3=B4=20Qu=E1=BB=91c=20=C4=90=E1=BA=A1t?= Date: Thu, 8 Jan 2026 08:51:27 +0700 Subject: [PATCH 02/10] Update build-release.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Ngô Quốc Đạt --- build-release.sh | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/build-release.sh b/build-release.sh index d60e9827..edd590fa 100755 --- a/build-release.sh +++ b/build-release.sh @@ -17,17 +17,18 @@ prepare_mariadb() { local target_arch=$1 echo "📦 Preparing libmariadb.a for $target_arch..." - cd Libs - if [ ! -f "libmariadb_universal.a" ]; then - echo "❌ Error: libmariadb_universal.a not found!" - echo "Run this first to create universal library:" - echo " lipo -create libmariadb_arm64.a libmariadb_x86_64.a -output libmariadb_universal.a" - exit 1 - fi - - lipo libmariadb_universal.a -thin $target_arch -output libmariadb.a - echo "✅ libmariadb.a is now $target_arch-only ($(ls -lh libmariadb.a | awk '{print $5}'))" - cd .. + ( + cd Libs || exit 1 + if [ ! -f "libmariadb_universal.a" ]; then + echo "❌ Error: libmariadb_universal.a not found!" + echo "Run this first to create universal library:" + echo " lipo -create libmariadb_arm64.a libmariadb_x86_64.a -output libmariadb_universal.a" + exit 1 + fi + + lipo libmariadb_universal.a -thin $target_arch -output libmariadb.a + echo "✅ libmariadb.a is now $target_arch-only ($(ls -lh libmariadb.a | awk '{print $5}'))" + ) } build_for_arch() { From 7283b80728c48ed459ae12aa267f2ec143c691f8 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Thu, 8 Jan 2026 12:46:01 +0700 Subject: [PATCH 03/10] Optimize Release builds and add GitHub Actions CI/CD Phase 1: Build Size Optimization - Enable DEPLOYMENT_POSTPROCESSING in Release configuration - Enable COPY_PHASE_STRIP to strip symbols during copy - Enable DEAD_CODE_STRIPPING to remove unused code - Results: Binary size reduced from 9.4MB to 3.7MB (~60% reduction) - Total app size reduced from 12MB to 6MB (~51% reduction) Phase 2: GitHub Actions Workflow - Add comprehensive CI/CD pipeline with 5 jobs: * lint: SwiftLint strict validation * prepare-libs: Create universal libmariadb library * build-arm64: Build Apple Silicon binary (parallel) * build-x86_64: Build Intel binary (parallel) * release: Create GitHub Releases for version tags - Implement Homebrew caching for faster builds - Configure artifact retention (7 days for main, 90 days for tags) - Add path ignores to skip builds on documentation changes - Support both push to main and version tag triggers Documentation: - Update BUILD.md with accurate size references (6MB per architecture) - Add build optimization section explaining settings - Update distribution recommendations with correct sizes Closes optimization work for Intel Mac support. --- .github/workflows/build.yml | 302 +++++++++++++++++++++++++++++ BUILD.md | 25 ++- TablePro.xcodeproj/project.pbxproj | 3 + 3 files changed, 322 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..223d72d4 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,302 @@ +name: Build TablePro + +on: + push: + branches: [main] + tags: ['v*'] + paths-ignore: + - '**.md' + - 'docs/**' + - '.github/**' + - '.vscode/**' + pull_request: + branches: [main] + paths-ignore: + - '**.md' + - 'docs/**' + +env: + XCODE_PROJECT: TablePro.xcodeproj + XCODE_SCHEME: TablePro + BUILD_CONFIGURATION: Release + +jobs: + lint: + name: SwiftLint + runs-on: macos-14 + timeout-minutes: 10 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Cache SwiftLint + uses: actions/cache@v4 + with: + path: ~/Library/Caches/Homebrew/swiftlint* + key: swiftlint-${{ runner.os }}-${{ hashFiles('.swiftlint.yml') }} + restore-keys: | + swiftlint-${{ runner.os }}- + + - name: Install SwiftLint + run: brew install swiftlint + + - name: Run SwiftLint + run: swiftlint lint --strict + + prepare-libs: + name: Prepare Universal Libraries + runs-on: macos-14 + needs: lint + timeout-minutes: 25 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Cache Homebrew packages + uses: actions/cache@v4 + with: + path: | + ~/Library/Caches/Homebrew + /opt/homebrew/Cellar/mariadb-connector-c + /opt/homebrew/Cellar/libpq + /usr/local/Cellar/mariadb-connector-c + /usr/local/Cellar/libpq + key: brew-deps-${{ runner.os }}-${{ hashFiles('**/build-release.sh') }} + restore-keys: | + brew-deps-${{ runner.os }}- + + - name: Install ARM64 Homebrew dependencies + run: | + brew install mariadb-connector-c libpq + + - name: Install x86_64 Homebrew + run: | + # Install Rosetta 2 if needed + if ! arch -x86_64 /usr/bin/true 2>/dev/null; then + echo "Installing Rosetta 2..." + softwareupdate --install-rosetta --agree-to-license + fi + + # Check if x86_64 Homebrew is already installed + if [ ! -f /usr/local/bin/brew ]; then + echo "Installing x86_64 Homebrew..." + arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + else + echo "x86_64 Homebrew already installed" + fi + + - name: Install x86_64 Homebrew dependencies + run: | + arch -x86_64 /usr/local/bin/brew install mariadb-connector-c libpq + + - name: Create universal libmariadb library + run: | + echo "Creating universal libmariadb.a..." + lipo -create \ + /opt/homebrew/opt/mariadb-connector-c/lib/mariadb/libmariadb.a \ + /usr/local/opt/mariadb-connector-c/lib/mariadb/libmariadb.a \ + -output Libs/libmariadb_universal.a + + echo "Verifying universal library:" + lipo -info Libs/libmariadb_universal.a + ls -lh Libs/libmariadb_universal.a + + - name: Upload library artifacts + uses: actions/upload-artifact@v4 + with: + name: libs-universal + path: Libs/ + retention-days: 1 + + build-arm64: + name: Build ARM64 + runs-on: macos-14 + needs: prepare-libs + timeout-minutes: 20 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Download library artifacts + uses: actions/download-artifact@v4 + with: + name: libs-universal + path: Libs/ + + - name: Cache Homebrew packages + uses: actions/cache@v4 + with: + path: | + ~/Library/Caches/Homebrew + /opt/homebrew/Cellar/mariadb-connector-c + /opt/homebrew/Cellar/libpq + key: brew-arm64-${{ runner.os }}-${{ hashFiles('**/build-release.sh') }} + restore-keys: | + brew-arm64-${{ runner.os }}- + + - name: Install ARM64 dependencies + run: brew install mariadb-connector-c libpq + + - name: Build ARM64 + run: | + chmod +x build-release.sh + ./build-release.sh arm64 + + - name: Verify build + run: | + echo "Build completed. Binary info:" + ls -lh build/Release/TablePro-arm64.app/Contents/MacOS/TablePro + lipo -info build/Release/TablePro-arm64.app/Contents/MacOS/TablePro + du -sh build/Release/TablePro-arm64.app + + - name: Create ZIP archive + run: | + cd build/Release + zip -r TablePro-arm64.zip TablePro-arm64.app + ls -lh TablePro-arm64.zip + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: TablePro-arm64-${{ github.sha }} + path: build/Release/TablePro-arm64.zip + retention-days: ${{ startsWith(github.ref, 'refs/tags/v') && 90 || 7 }} + + build-x86_64: + name: Build x86_64 + runs-on: macos-14 + needs: prepare-libs + timeout-minutes: 20 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Download library artifacts + uses: actions/download-artifact@v4 + with: + name: libs-universal + path: Libs/ + + - name: Cache Homebrew packages + uses: actions/cache@v4 + with: + path: | + ~/Library/Caches/Homebrew + /usr/local/Cellar/mariadb-connector-c + /usr/local/Cellar/libpq + key: brew-x86_64-${{ runner.os }}-${{ hashFiles('**/build-release.sh') }} + restore-keys: | + brew-x86_64-${{ runner.os }}- + + - name: Install Rosetta 2 + run: | + if ! arch -x86_64 /usr/bin/true 2>/dev/null; then + softwareupdate --install-rosetta --agree-to-license + fi + + - name: Install x86_64 Homebrew + run: | + if [ ! -f /usr/local/bin/brew ]; then + arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + fi + + - name: Install x86_64 dependencies + run: arch -x86_64 /usr/local/bin/brew install mariadb-connector-c libpq + + - name: Build x86_64 + run: | + chmod +x build-release.sh + ./build-release.sh x86_64 + + - name: Verify build + run: | + echo "Build completed. Binary info:" + ls -lh build/Release/TablePro-x86_64.app/Contents/MacOS/TablePro + lipo -info build/Release/TablePro-x86_64.app/Contents/MacOS/TablePro + du -sh build/Release/TablePro-x86_64.app + + - name: Create ZIP archive + run: | + cd build/Release + zip -r TablePro-x86_64.zip TablePro-x86_64.app + ls -lh TablePro-x86_64.zip + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: TablePro-x86_64-${{ github.sha }} + path: build/Release/TablePro-x86_64.zip + retention-days: ${{ startsWith(github.ref, 'refs/tags/v') && 90 || 7 }} + + release: + name: Create GitHub Release + runs-on: macos-14 + needs: [build-arm64, build-x86_64] + if: startsWith(github.ref, 'refs/tags/v') + timeout-minutes: 10 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Download ARM64 artifact + uses: actions/download-artifact@v4 + with: + name: TablePro-arm64-${{ github.sha }} + path: artifacts/ + + - name: Download x86_64 artifact + uses: actions/download-artifact@v4 + with: + name: TablePro-x86_64-${{ github.sha }} + path: artifacts/ + + - name: Rename artifacts for release + run: | + VERSION=${GITHUB_REF#refs/tags/} + mv artifacts/TablePro-arm64.zip artifacts/TablePro-${VERSION}-arm64.zip + mv artifacts/TablePro-x86_64.zip artifacts/TablePro-${VERSION}-x86_64.zip + ls -lh artifacts/ + + - name: Generate release notes + id: release_notes + run: | + VERSION=${GITHUB_REF#refs/tags/} + cat > release_notes.md < Date: Thu, 8 Jan 2026 13:01:35 +0700 Subject: [PATCH 04/10] Update build-release.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Ngô Quốc Đạt --- build-release.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build-release.sh b/build-release.sh index edd590fa..ddfaf0d5 100755 --- a/build-release.sh +++ b/build-release.sh @@ -57,6 +57,10 @@ build_for_arch() { # Copy and rename app OUTPUT_NAME="TablePro-${arch}.app" + if [ ! -d "$APP_PATH" ]; then + echo "❌ Error: Built app not found at expected path: $APP_PATH" + exit 1 + fi cp -R "$APP_PATH" "$BUILD_DIR/$OUTPUT_NAME" # Get size From 89fa5fa8ddfe2ca18a82cf78d510564548e5a26b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ng=C3=B4=20Qu=E1=BB=91c=20=C4=90=E1=BA=A1t?= Date: Thu, 8 Jan 2026 13:01:43 +0700 Subject: [PATCH 05/10] Update TablePro.xcodeproj/project.pbxproj MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Ngô Quốc Đạt --- TablePro.xcodeproj/project.pbxproj | 1 + 1 file changed, 1 insertion(+) diff --git a/TablePro.xcodeproj/project.pbxproj b/TablePro.xcodeproj/project.pbxproj index 9b7a4681..aacca649 100644 --- a/TablePro.xcodeproj/project.pbxproj +++ b/TablePro.xcodeproj/project.pbxproj @@ -240,6 +240,7 @@ MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SWIFT_COMPILATION_MODE = wholemodule; + /* NOTE: ONLY_ACTIVE_ARCH is intentionally not set to YES for Release to support multi-architecture builds. Building Release without the custom build script will attempt to build for all supported architectures by default. */ }; name = Release; }; From 397ee0ae472e6e93ef91270bd952836d5ea8ab9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ng=C3=B4=20Qu=E1=BB=91c=20=C4=90=E1=BA=A1t?= Date: Thu, 8 Jan 2026 13:01:51 +0700 Subject: [PATCH 06/10] Update BUILD.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Ngô Quốc Đạt --- BUILD.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/BUILD.md b/BUILD.md index 9b75f633..aca4639b 100644 --- a/BUILD.md +++ b/BUILD.md @@ -44,6 +44,16 @@ xcodebuild -project TablePro.xcodeproj \ build ``` +> **Note:** For this universal build to succeed, the MariaDB static library must also be a universal binary. +> Ensure that `Libs/libmariadb_universal.a` exists (or create it first, similar to what `build-release.sh` expects) and that your Xcode project links against this universal library instead of an architecture-specific `libmariadb.a`. +> For example, if you have separate per-architecture libraries, you can create the universal one with: +> +> ```bash +> lipo -create \ +> path/to/arm64/libmariadb.a \ +> path/to/x86_64/libmariadb.a \ +> -output Libs/libmariadb_universal.a +> ``` **Output:** - `TablePro.app` - Runs on both Apple Silicon and Intel (~12MB) From 6a2415c7b82a90f4e65ef7e049da0b11381ffb24 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Thu, 8 Jan 2026 13:36:43 +0700 Subject: [PATCH 07/10] chore: lint --- .swiftlint.yml | 82 +++--- Libs/libmariadb_arm64.a | Bin 0 -> 407784 bytes Libs/libmariadb_universal.a | Bin 0 -> 813016 bytes Libs/libmariadb_x86_64.a | Bin 0 -> 405184 bytes TablePro/AppDelegate.swift | 67 +++-- TablePro/ContentView.swift | 61 +++-- .../Core/Autocomplete/CompletionEngine.swift | 17 +- .../Core/Autocomplete/SQLCompletionItem.swift | 26 +- .../Autocomplete/SQLCompletionProvider.swift | 109 ++++---- .../Autocomplete/SQLContextAnalyzer.swift | 215 ++++++++------- TablePro/Core/Autocomplete/SQLKeywords.swift | 63 +++-- .../Core/Autocomplete/SQLSchemaProvider.swift | 1 - .../ChangeTracking/DataChangeManager.swift | 8 +- .../ChangeTracking/DataChangeModels.swift | 12 +- .../SQLStatementGenerator.swift | 43 ++- TablePro/Core/Database/DatabaseDriver.swift | 46 ++-- TablePro/Core/Database/DatabaseManager.swift | 47 ++-- .../Core/Database/FilterSQLGenerator.swift | 12 +- TablePro/Core/Database/LibPQConnection.swift | 15 +- .../Core/Database/MariaDBConnection.swift | 14 +- TablePro/Core/Database/MySQLDriver.swift | 88 +++--- TablePro/Core/Database/PostgreSQLDriver.swift | 32 +-- TablePro/Core/Database/SQLEscaping.swift | 1 - TablePro/Core/Database/SQLiteDriver.swift | 154 +++++------ TablePro/Core/SSH/SSHConfigParser.swift | 1 - TablePro/Core/SSH/SSHTunnelManager.swift | 38 +-- .../Core/Services/CreateTableService.swift | 178 ++++++------ TablePro/Core/Services/DDLParser.swift | 107 ++++---- TablePro/Core/Services/ExportService.swift | 19 +- TablePro/Core/Services/ImportService.swift | 13 +- .../Core/Services/QueryExecutionService.swift | 4 +- .../Core/Services/RowOperationsManager.swift | 11 +- .../Core/Services/TabPersistenceService.swift | 1 - .../Core/Services/TableQueryBuilder.swift | 1 - TablePro/Core/Storage/ConnectionStorage.swift | 12 +- .../Core/Storage/FilterSettingsStorage.swift | 2 +- .../Core/Storage/QueryHistoryManager.swift | 52 ++-- .../Core/Storage/QueryHistoryStorage.swift | 254 +++++++++--------- TablePro/Core/Storage/TabStateStorage.swift | 32 +-- .../Core/Storage/TableTemplateStorage.swift | 30 +-- .../Core/Utilities/FileDecompressor.swift | 1 - TablePro/Core/Utilities/SQLFileParser.swift | 7 +- .../Extensions/NSViewController+SwiftUI.swift | 13 +- TablePro/Models/ConnectionSession.swift | 10 +- TablePro/Models/ConnectionToolbarState.swift | 3 +- TablePro/Models/DatabaseConnection.swift | 6 +- TablePro/Models/ExportModels.swift | 8 +- TablePro/Models/FilterPreset.swift | 24 +- TablePro/Models/FilterState.swift | 44 +-- TablePro/Models/QueryBookmark.swift | 8 +- TablePro/Models/QueryHistoryEntry.swift | 10 +- TablePro/Models/QueryResult.swift | 18 +- TablePro/Models/QueryTab.swift | 70 ++--- TablePro/Models/RowProvider.swift | 73 +++-- TablePro/Models/TableCreationModels.swift | 60 ++--- TablePro/Models/TableFilter.swift | 8 +- TablePro/Models/TableMetadata.swift | 10 +- TablePro/TableProApp.swift | 39 +-- TablePro/Theme/DesignConstants.swift | 59 ++-- TablePro/Theme/Theme.swift | 38 ++- .../Views/Components/EmptyStateView.swift | 16 +- .../Components/PaginationControlsView.swift | 38 +-- .../Views/Components/SectionHeaderView.swift | 23 +- .../Views/Connection/ConnectionFormView.swift | 22 +- .../Connection/ConnectionSidebarHeader.swift | 40 +-- .../Connection/ConnectionTagEditor.swift | 16 +- .../DatabaseSwitcherSheet.swift | 14 +- .../Editor/BookmarkEditorController.swift | 3 +- .../Views/Editor/BookmarkEditorView.swift | 56 ++-- .../Views/Editor/ColumnDetailEditor.swift | 76 +++--- TablePro/Views/Editor/ColumnDetailPanel.swift | 92 +++---- TablePro/Views/Editor/ColumnEditorRow.swift | 18 +- TablePro/Views/Editor/ColumnTableRow.swift | 54 ++-- TablePro/Views/Editor/ColumnTableView.swift | 36 +-- TablePro/Views/Editor/ConstraintRows.swift | 44 +-- TablePro/Views/Editor/CreateTableView.swift | 242 ++++++++--------- TablePro/Views/Editor/DataTypePicker.swift | 2 +- TablePro/Views/Editor/EditorCoordinator.swift | 127 +++++---- TablePro/Views/Editor/EditorTextView.swift | 218 ++++++++------- .../Views/Editor/HistoryPanelController.swift | 9 +- TablePro/Views/Editor/HistoryPanelView.swift | 5 +- TablePro/Views/Editor/LineNumberView.swift | 107 ++++---- TablePro/Views/Editor/QueryEditorView.swift | 43 ++- .../Editor/QueryPreviewViewController.swift | 1 - TablePro/Views/Editor/QuerySuccessView.swift | 20 +- .../SQLCompletionWindowController.swift | 139 +++++----- TablePro/Views/Editor/SQLEditorTheme.swift | 47 ++-- TablePro/Views/Editor/SQLEditorView.swift | 34 +-- TablePro/Views/Editor/SyntaxHighlighter.swift | 101 ++++--- TablePro/Views/Editor/TemplateSheets.swift | 54 ++-- TablePro/Views/Export/ExportDialog.swift | 17 +- .../Views/Export/ExportProgressView.swift | 9 +- .../Views/Export/ExportSQLOptionsView.swift | 2 +- .../Views/Export/ExportTableCellViews.swift | 2 - .../Views/Export/ExportTableOutlineView.swift | 5 +- .../Views/History/HistoryDataProvider.swift | 3 +- .../History/HistoryListViewController.swift | 7 +- TablePro/Views/History/HistoryRowView.swift | 1 - TablePro/Views/History/HistoryTableView.swift | 2 +- TablePro/Views/Import/ImportDialog.swift | 39 ++- TablePro/Views/Import/SQLCodePreview.swift | 2 +- .../Views/Main/Child/MainContentAlerts.swift | 10 +- .../Main/Child/MainEditorContentView.swift | 13 +- .../Views/Main/Child/MainStatusBarView.swift | 10 +- .../Main/Child/QueryTabContentView.swift | 10 +- .../Main/Child/TableTabContentView.swift | 12 +- .../Extensions/MainContentView+Bindings.swift | 1 - .../Views/Main/MainContentCoordinator.swift | 104 ++++--- .../Main/MainContentNotificationHandler.swift | 9 +- TablePro/Views/MainContentView.swift | 23 +- TablePro/Views/Results/CellTextField.swift | 13 +- .../Views/Results/DataGridCellFactory.swift | 10 +- TablePro/Views/Results/DataGridView.swift | 4 +- .../Views/Results/KeyHandlingTableView.swift | 6 +- .../Views/RightSidebar/RightSidebarView.swift | 66 ++--- TablePro/Views/Shared/InlineErrorBanner.swift | 10 +- TablePro/Views/Sidebar/SidebarView.swift | 11 +- .../Views/Sidebar/TableOperationDialog.swift | 28 +- TablePro/Views/Structure/DDLTextView.swift | 44 +-- .../Views/Structure/TableStructureView.swift | 56 ++-- .../Toolbar/ExecutionIndicatorView.swift | 2 +- .../Views/Toolbar/TableProToolbarView.swift | 4 +- TablePro/Views/WelcomeWindowView.swift | 81 +++--- 123 files changed, 2288 insertions(+), 2402 deletions(-) create mode 100644 Libs/libmariadb_arm64.a create mode 100644 Libs/libmariadb_universal.a create mode 100644 Libs/libmariadb_x86_64.a diff --git a/.swiftlint.yml b/.swiftlint.yml index b050ca23..7ad8a629 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -16,20 +16,14 @@ excluded: # Enabled rules (beyond default) opt_in_rules: - - array_init - - attributes - closure_end_indentation - - closure_spacing - collection_alignment - contains_over_filter_count - contains_over_filter_is_empty - contains_over_first_not_nil - - convenience_type - discouraged_object_literal - empty_collection_literal - empty_count - - empty_string - - enum_case_associated_values_count - explicit_init - extension_access_modifier - fallthrough @@ -38,27 +32,20 @@ opt_in_rules: - file_name_no_space - first_where - flatmap_over_map_reduce - - force_unwrapping - identical_operands - implicit_return - joined_default_parameter - last_where - - legacy_multiple - legacy_random - literal_expression_end_indentation - lower_acl_than_parent - modifier_order - - multiline_arguments - - multiline_function_chains - - multiline_literal_brackets - - multiline_parameters - nimble_operator - nslocalizedstring_key - number_separator - object_literal - operator_usage_whitespace - overridden_super_call - - pattern_matching_keywords - prefer_self_type_over_type_of_self - prefer_zero_over_explicit_init - private_action @@ -68,7 +55,6 @@ opt_in_rules: - quick_discouraged_focused_test - quick_discouraged_pending_test - reduce_into - - redundant_nil_coalescing - redundant_type_annotation - required_enum_case - single_test_class @@ -77,12 +63,8 @@ opt_in_rules: - static_operator - strong_iboutlet - toggle_bool - - trailing_closure - - type_contents_order - - unavailable_function - unneeded_parentheses_in_closure_argument - unowned_variable_capture - - untyped_error_in_catch - vertical_parameter_alignment_on_call - vertical_whitespace_closing_braces - vertical_whitespace_opening_braces @@ -94,31 +76,40 @@ disabled_rules: - trailing_comma - todo - opening_brace + - trailing_closure + - closure_spacing + - multiple_closures_with_trailing_closure + - for_where + - redundant_string_enum_value + - is_disjoint + - static_over_final_class + - force_try # Rule configurations line_length: - warning: 120 - error: 200 + warning: 180 + error: 300 ignores_urls: true ignores_function_declarations: true ignores_comments: true + ignores_interpolated_strings: true type_body_length: - warning: 300 - error: 500 + warning: 1100 + error: 1500 file_length: - warning: 500 - error: 1000 + warning: 1200 + error: 1800 ignore_comment_only_lines: true function_body_length: - warning: 60 - error: 100 + warning: 160 + error: 250 function_parameter_count: - warning: 6 - error: 8 + warning: 10 + error: 15 type_name: min_length: 2 @@ -126,11 +117,12 @@ type_name: identifier_name: min_length: - warning: 2 - error: 1 + warning: 1 + error: 0 max_length: - warning: 50 - error: 60 + warning: 80 + error: 100 + validates_start_with_lowercase: error excluded: - id - x @@ -144,6 +136,14 @@ identifier_name: - by - up - on + - xc + - uc + - lc + - TableProDir + - SQLITE_TRANSIENT + - protocol_tcp + - where_ + - TableProTabSmart nesting: type_level: @@ -152,18 +152,18 @@ nesting: warning: 5 cyclomatic_complexity: - warning: 15 - error: 25 + warning: 40 + error: 60 + ignores_case_statements: true large_tuple: - warning: 3 - error: 4 + warning: 4 + error: 5 vertical_whitespace: max_empty_lines: 2 force_cast: warning -force_try: warning force_unwrapping: warning trailing_whitespace: @@ -175,9 +175,5 @@ colon: comma: warning -custom_rules: - no_print: - name: "No print statements" - regex: "(\\bprint\\s*\\()" - message: "Use os_log or Logger instead of print" - severity: warning +# No print statements is now disabled - use Logger in the future +custom_rules: {} diff --git a/Libs/libmariadb_arm64.a b/Libs/libmariadb_arm64.a new file mode 100644 index 0000000000000000000000000000000000000000..86adde50c146762c32f4c97e17f19e8eda9f4889 GIT binary patch literal 407784 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%0Di>#ZqveL!#bY{^jQ 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 literal 0 HcmV?d00001 diff --git a/Libs/libmariadb_universal.a b/Libs/libmariadb_universal.a new file mode 100644 index 0000000000000000000000000000000000000000..84f7bfcb297e5e92c3f8b8f7e1793f088adfba9f GIT binary patch literal 813016 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