github TableProApp/TablePro v0.6.0

latest releases: v0.30.1, plugin-mssql-v1.0.8, v0.30.0...
one month ago

Added

  • Inline AI suggestions (ghost text) in the SQL editor — auto-triggers on typing pause, Tab to accept, Escape to dismiss
  • Schema-aware inline suggestions — AI now uses actual table/column names from the connected database (cached with 30s TTL, respects includeSchema and maxSchemaTables settings)
  • AI feature highlight row on onboarding features page
  • Added VoiceOver accessibility labels to custom controls: data grid (table view, column headers, cells), filter panel (logic toggle, presets, action buttons, filter row controls), toolbar buttons (connection switcher, database switcher, refresh, export, import, filter toggle, history toggle, inspector toggle), editor tab bar (tab items, close buttons, add tab button), and sidebar (table/view rows, search clear button)

Changed

  • Migrated notification observers in MainContentCommandActions from Combine publishers (.publisher(for:).sink) to async sequences (for await over NotificationCenter.default.notifications(named:)) — removes AnyCancellable storage in favor of Task handles with proper cancellation on deinit
  • Migrated tab state persistence from UserDefaults to file-based storage in Application Support — prevents large JSON payloads from bloating the plist loaded at app launch, with automatic one-time migration of existing data
  • Refactored menu and toolbar commands from NotificationCenter to @FocusedObject pattern — menu commands and toolbar buttons now call MainContentCommandActions methods directly instead of posting global notifications, with context-aware routing for structure view operations
  • Redesigned connection form with tab-based layout (General / SSH Tunnel / SSL/TLS / Advanced), replacing the single-scroll layout
  • Revamped connection form UI to use native macOS grouped form style (Form/.formStyle(.grouped)) with LabeledContent for automatic label-value alignment and Section headers — replacing the previous hand-rolled VStack layout with custom FormField component
  • Removed unused FormField component and helper methods (iconForType, colorForType)
  • SQLite connections now only show General and Advanced tabs (SSH/SSL hidden)
  • Added async/await wrapper methods to QueryHistoryStorage — existing completion-handler API preserved for compatibility, new async overloads use withCheckedContinuation for modern Swift concurrency callers

Fixed

  • Fixed TOCTOU race condition in SQLiteDriver — replaced nonisolated(unsafe) + DispatchQueue pattern with a dedicated actor (SQLiteConnectionActor) that serializes all sqlite3 handle access, preventing concurrent task races on the connection state
  • Consolidated multiple .sheet(isPresented:) modifiers in MainContentView into a single .sheet(item:) with an ActiveSheet enum — fixes SwiftUI anti-pattern where only the last .sheet modifier reliably activates
  • Replaced blocking Process.waitUntilExit() calls in SSHTunnelManager with async withCheckedContinuation-based waiting, and replaced the fixed 1.5s sleep with active port probing — SSH tunnel setup no longer blocks the actor thread, keeping the UI responsive during connection
  • Eliminated potential deadlocks in MariaDBConnection and LibPQConnection — replaced all queue.sync calls (in disconnect, deinit, isConnected, serverVersion) with lock-protected cached state and queue.async cleanup, preventing deadlocks when callbacks re-enter the connection queue
  • SQL editor now respects the macOS accessibility text size preference (System Settings > Accessibility > Display > Text Size) — the user's chosen font size is scaled by the system's preferred text size factor, with live updates when the setting changes
  • Fixed retain cycle in UpdaterBridge.assign(to:on:self) retains self strongly; replaced with .sink using [weak self]
  • Fixed leaked NotificationCenter observer in SQLEditorCoordinator — observer token is now stored and removed in destroy()
  • Eliminated tab switching delay — replaced view teardown/recreation with ZStack+ForEach to keep NSViews alive, moved tab persistence I/O to background threads, skipped unnecessary change-tracking deep copies, and coalesced redundant inspector/sidebar updates during tab switch
  • Reduced tab-switch CPU spikes from 40-60% to ~10-20% by eliminating redundant reloadData() calls: configureForTable no longer triggers a reload during tab switch (single controlled bump instead of 2-3), onChange(of: resultColumns) is suppressed while the switch is in progress, and DataGridView.updateNSView skips all heavy work when the data identity hasn't changed
  • Table open now shows data instantly — split executeQueryInternal into two phases: rows display immediately after SELECT completes, metadata (columns, FKs, enums, row count) loads in the background without blocking the grid
  • Eliminated 20-80ms overhead when clicking an already-open table in the sidebar — openTableTab short-circuits immediately, and TableProTabSmart no longer fires @Published when the selected tab hasn't changed
  • Keychain SecItemAdd return values are now checked and logged — previously, failed writes (e.g. errSecDuplicateItem, errSecInteractionNotAllowed) were silently discarded, risking password loss
  • Added kSecAttrService to all Keychain queries across ConnectionStorage, LicenseStorage, and AIKeyStorage — items now have a proper service identifier, preventing potential collisions with other apps
  • Ensured proper cleanup for @State reference type tokens — tracked untracked Task instances in ImportDialog (file selection), AIProviderEditorSheet (model fetching, connection test), and added onDisappear cancellation to prevent leaked work after view dismissal
  • Replaced .onAppear with .task for I/O operations in ConnectionTagEditor — uses SwiftUI-idiomatic lifecycle-tied loading instead of onAppear which can re-fire on navigation

Don't miss a new TablePro release

NewReleases is sending notifications on new releases.