Skip to content

SqlKit v1.0.0

Latest

Choose a tag to compare

@github-actions github-actions released this 18 Oct 09:29
· 8 commits to master since this release

✨ Added

  • DuckDB failure diagnosis and file-format reporting — DuckDB connection failures are translated into an explanation with the fix attached: file lock held by another process or connection, instance-configuration conflict, and storage-format incompatibility each get their own message, and the two lock cases offer retry as read-only inline in the connection form (the connecting modal shows the same explanation on connect). probe_database_file additionally reports the DuckDB storage-format version (header bytes 12..20, mapped to the oldest release that can open the file) and whether a sibling .wal write-ahead log is present, both shown under the file path.

  • Create DuckDB / SQLite databases from the connection form — the file-based path field is editable again and gains New… / Open… actions backed by the native save dialog (extension appended automatically), an inline explanation of what will happen on connect (the engine creates a missing file, the file exists, is empty, is read-only, is a folder, is a different engine's file, or the parent folder is missing with a one-click "Create folder"), and a per-engine recent-files list with reveal/remove actions. DuckDB also gets the SQLite-style File / In-Memory tabs; in-memory connections are stored as named instances (memory:<label>) because unnamed DuckDB in-memory databases are private to a single connection and would otherwise give every pooled connection its own empty database. A new read-only access mode (access_mode=READ_ONLY) is meant to let DuckDB share a file with other processes (~ is expanded for file-based paths, and opening the same DuckDB file a second time with a conflicting access mode is blocked with "switch to that connection" / "open read-only" choices — read-only needs a bridge build with the HikariCP flag alignment below, and the form explains that until it ships). New Tauri commands: probe_database_file (existence, size, writability, header sniffing) and create_database_directory. scripts/verify-duckdb-jdbc-urls.sh records the DuckDB JDBC semantics these decisions rely on.

  • Entitlements & version-lock subscription model (geekfun#56) — client-side implementation of the Ultimate entitlement contract: the two server-computed fields ultimateExpiresAt + versionLockHorizon are consumed via a new Rust entitlement module (persisted cache, offline tolerance, failure degradation, 5-minute refresh throttle, app.releaseDate <= versionLockHorizon unlock check). Rust command gates return ENTITLEMENT_REQUIRED for AI (agent loop/step, compaction, LLM validation), the whole Transfer module (import/export/migration/structure execution), SSH tunnel establishment, and the MCP bridge (config/policy save + auto-start). The frontend adds an entitlement store, Geekfun login entry, paid-feature gates with upgrade guidance on Data Studio, Transfer, AI assistant sidebar, ER diagram actions, AI/MCP settings, SSH tunnel option in the connection form, plus an Account & Plan settings tab showing the version-lock state with Geekfun login and logout (logout clears the local entitlement cache so entitlements never outlive the account session).

  • Requesty provider preset in AI settings (OpenAI compatible, base URL https://router.requesty.ai/v1)

  • Opper provider preset in AI settings (OpenAI compatible, base URL https://api.opper.ai/v3/compat)

  • API Route provider preset in AI settings (OpenAI compatible, base URL https://global.api-route.com/v1)

  • SSH tunnels for any connection — connect through a bastion, with multi-hop chains, reusable SSH profiles, an optional proxy hop, password or key auth (ED25519/RSA, optional passphrase), and trust-on-first-use host-key pinning plus an unpin command for when a server key changes.

  • Cross-database browsing without reconnecting — table, column, index, foreign-key, view, routine and trigger panels can inspect any database on the server; PostgreSQL and SQL Server route through a short-lived connection instead of asking you to reconnect.

  • Instant result-grid sorting — sorting runs in the frontend over the rows already returned, so clicking a header no longer re-runs the query; primitive columns sort consistently even when one column mixes numbers, dates, booleans and text.

  • Settings report what is happening — JRE/driver installs, provider sync, update checks and other settings actions show pending, success and failure inline with progress and retry, replacing silent no-ops.

🔧 Changed

  • JDBC connections are much faster (DuckDB "Test connection" above all) — measured per connect before: an Adoptium JRE update check (1.4-2.5 s, on every connect), two Maven Central metadata round trips (0.6-0.8 s each), a fresh bridge JVM (DuckDB maps a ~107 MB native library, ~1.4 s) and a new driver class loader per connection. Now: the JRE check is memoised for 6 hours, a cached driver JAR skips the Maven resolution on the Rust side (the Java side follows in the next bridge build), bridge downloads use a shared HTTP client with a bounded connect timeout instead of reqwest::get (which had none), the bridge process is shared across connections (shared_launcher), and a connection releases only its own pool through the disconnect RPC instead of killing the process. Verified with src-tauri/tests/duckdb_bridge_integration.rs: a warm connect went from ~4.3 s to 5.5 ms with a bridge build that also caches the driver class loader; with the currently released bridge the same test measures ~1.4 s per warm connect.

  • Result grids use the available width — data columns stretch to fill spare space and the Actions column stays pinned to the right edge.

🐛 Fixed

  • Editing an AI provider now selects its exact provider preset before falling back to API compatibility.

  • DuckDB read-only mode is rejected by the released JDBC bridge — DuckDB refuses Connection.setReadOnly(), and HikariCP calls it whenever its own read-only flag disagrees with the opened connection (it defaults to false), so a read-only URL failed with Can't change read-only status on connection level. The bridge now derives HikariCP's flag from the URL (ConnectionManager.isReadOnlyUrl); until a bridge build with that change ships, the connection form explains the limitation and offers retry as read-write. Verified against a patched bridge in src-tauri/tests/duckdb_bridge_integration.rs.

  • Untranslated keys could render in the UI — the new-connection menu displayed pages.connections.newMenu.* because those strings were added under the wrong node of the locale files; src/__tests__/i18nKeys.test.ts now scans every literal t('…') in src/ and fails when a key does not resolve in enUS or zhCN, so this class of regression is caught by npm test instead of by a screenshot. The same scan surfaced two latent gaps, both fixed: common.cancel (used by the device-replace dialog, now the existing common.buttons.cancel) and the missing zhCN value for components.serverForm.placeholders.encryptionKey.

  • DuckDB database files whose path contains ; were mis-parsed — the DuckDB JDBC driver splits its URL on ;, so jdbc:duckdb:/path/semi;colon.duckdb failed with Invalid URL entry (verified against duckdb_jdbc 1.5.6); such paths are now rejected with an explanation in the connection form and in the backend instead of surfacing a confusing driver error, and read-only mode is never silently dropped for them.

  • DuckDB connections fail with "The following options were not recognized: ssl" (issue #158) — embedded/file-based engines (DuckDB, SQLite, SQLCipher, Access) have no SSL settings in the UI, so their stored ssl mode is just the Prefer default; the JDBC bridge now receives no ssl mode for such types instead of injecting ssl=true, which DuckDB's driver rejects as an unknown option; the bridge's property mapper also stops blindly setting ssl=true for drivers without explicit SSL support (H2 and Firebird previously fell into that fallback).

  • Deep-link sign-in on cold start — a sqlkit://auth link that launches the app no longer drops the token: the payload is parked in a pending-auth slot during startup and the frontend pulls it via consume_pending_auth once mounted; running-instance links double-write the same slot, closing the startup window too.

  • Complex queries across all four databases — PostgreSQL multi-statement batches keep their result sets and exotic types (arrays, JSON, ranges, geometry); MySQL and SQL Server keep sessions across requests and preserve later or empty result sets, row counts and errors; Oracle keeps PL/SQL definitions and slash delimiters and returns complete DDL. MySQL functional-index crashes and numeric/binary conversion, SQL Server duplicate columns and missing precision, and Oracle JSON, timestamp and object-type conversion are fixed.

  • Statements that start with a comment or end in RETURNING — these were classified as non-row statements, so the UI showed "N row(s) affected" and an empty grid; they now return rows.

  • Numeric column headers line up with their values — headers take the same alignment as their cells, the sort indicator stays after the column name, and sort-priority numbers appear only for multi-column sorts.

  • The DDL panel's close button no longer overlaps Copy — the header reserves the space the dialog close button occupies.

  • AI providers update instead of duplicating — adding an existing provider updates it in place, and a failed model sync reports the error instead of silently leaving the default model list.

  • DuckDB native-load warnings — the bridge JVM starts with native access enabled, so JDK 24+ no longer prints restricted-method warnings into connection error messages.

  • Themed default avatar — accounts without a picture get a deterministic gradient initial derived from the account name instead of the flat ink block.

👥 Contributors

  • Anand Hegde (1 commit)
  • Felix Wunderlich (1 commit)
  • Thibault Jaigu (1 commit)
  • blankll (51 commits)
  • dennyho0917 (1 commit)
  • seven (11 commits)

📋 Full commit history

Changes from v0.8.8 to v1.0.0

  • 084b61f release: v1.0.0 (blankll, 7 minutes ago)
  • 8aa85e2 docs(sql-test): add graduated sample query ladder (blankll, 18 minutes ago)
  • ce42d63 fix(grid): align numeric headers with their values (blankll, 18 minutes ago)
  • 4d0890a feat(settings): add status feedback and harden provider/JRE settings (blankll, 18 minutes ago)
  • 2d7ecb2 docs: record standalone Rust regression test count (blankll, 2 hours ago)
  • 13e6cd7 fix: resolve multi-database SQL stress regressions (blankll, 2 hours ago)
  • fbc91d9 fix: audit fix (blankll, 2 days ago)
  • de34e88 docs(readme): drop the WeChat group and Discord links (#186) (seven, 2 days ago)
  • 81348e4 feat(entitlement): session-phase source of truth + paid-gate fixes (#184) (#185) (seven, 2 days ago)
  • 41f2e46 docs: test insturctions (blankll, 2 days ago)
  • e41085b feat: bridge metadata panels (#181) + cross-database metadata + connection form tabs & SSH journey (#182) (seven, 3 days ago)
  • ab9c5ce fix(connections): gate SSH tunnel behind Ultimate and move SSL/TLS into Advanced Configuration (blankll, 5 days ago)
  • b5b57ce fix(jdbc-bridge): grant native access to bridge JVM for DuckDB native loads (issue #176) (blankll, 8 days ago)
  • 51298bc style(auth): import order and blank-line cleanup (blankll, 6 days ago)
  • 42aa775 feat(auth): themed default avatar for accounts without a picture (blankll, 6 days ago)
  • a926ed2 docs(ssh): move the tunnel test stack to event-search (#177) (seven, 6 days ago)
  • 669ca39 fix(query-result): let data columns stretch when the grid has spare width (blankll, 9 days ago)
  • 6ad46e2 fix(query-result): pin Actions column at the right edge even without overflow (blankll, 9 days ago)
  • 5973097 fix(query-result): pin Actions column right and keep export buttons visible (blankll, 9 days ago)
  • 39e758c fix(database): route commented and RETURNING statements to the row path (blankll, 9 days ago)
  • c29474c style(ssh): eslint autofix for docker-compose-ssh-tunnel.yml (blankll, 9 days ago)
  • a0a0d72 docs(ssh): tunnel testing guide for the pg/mysql/mssql/oracle stack (blankll, 9 days ago)
  • 70b30a7 test(ssh): docker compose stack for SSH tunnel testing (pg/mysql/mssql/oracle) (blankll, 9 days ago)
  • 1488539 test(ssh): isolate known_hosts tests via store-path injection (blankll, 9 days ago)
  • eee5a97 fix(ssh): TOFU recovery command, sshTunnel passthrough, audit-fix lockfile (blankll, 9 days ago)
  • 1bed588 fix(ssh): review fixes — profile round-trip, TOFU recovery, warning cleanup (blankll, 9 days ago)
  • b77a6e4 fix(deps): gate system-configuration to macOS (macOS-only crate) (blankll, 10 days ago)
  • be2dda5 style: eslint autofix (import order, template indent) (blankll, 10 days ago)
  • d0b283c feat(ssh): full tunnel parity with dockit — chains, profiles, proxies, TOFU (blankll, 10 days ago)
  • 86bded8 chore(lint): allow const-arrow top-level declarations per AGENTS.md (blankll, 10 days ago)
  • e23ca32 fix(grid): consistent sorting for columns with mixed primitive types (blankll, 10 days ago)
  • d572341 feat(settings): add API Route provider preset (dennyho0917, 10 days ago)
  • 6b6fb95 feat(grid): client-side sorting for primitive result columns (blankll, 10 days ago)
  • da18dc9 fix(connections): saved SSH connections are Ultimate-only to operate (blankll, 10 days ago)
  • c78b01f feat(settings): add Opper provider preset (Felix Wunderlich, 11 days ago)
  • 28aac83 chore(deps): bump data-studio-agent to v0.1.9 (blankll, 10 days ago)
  • 0d93509 fix(upgrade): style the MCP poster's Ultimate lock badge (blankll, 11 days ago)
  • 82df9a8 fix(sidebar): Queries is a Community page — drop the stray Pro dot (blankll, 11 days ago)
  • 6235cb1 fix(entitlement): no dead Checking… — every terminal state lands somewhere (blankll, 11 days ago)
  • fd7b953 feat(plan): show a Checking… state instead of Unknown before the first answer (blankll, 12 days ago)
  • 323a17d test(ultimate): cover entitlement store, activation fatal path, seed semantics (blankll, 12 days ago)
  • 01a7333 refactor: review fixes — await seed ordering, comment discipline, arrow style (blankll, 12 days ago)
  • f47d683 fix(device): restore 5030 replace-picker flow and make retry tests timer-safe (blankll, 12 days ago)
  • 45ef0d5 lint fix (blankll, 12 days ago)
  • 0ec6026 feat(ultimate): session renewal hardening, AI gate coverage & login handoff (blankll, 12 days ago)
  • 4d1364e fix(entitlement): unwrap the API response data envelope (blankll, 13 days ago)
  • 4537c00 debug(entitlement): log the raw subscriptions API response in debug builds (blankll, 13 days ago)
  • df8ed1b refactor(upgrade): unify logged-out CTAs to Log in + Register (blankll, 13 days ago)
  • c622bc7 refactor(sidebar): replace the S logo with the user identity entry (blankll, 13 days ago)
  • 7d42377 feat(account): user menu with login entry and entitlement state in the sidebar (blankll, 13 days ago)

📦 Downloads

See the assets below to download this version and install for your platform:

  • macOS: Apple Silicon & Intel
  • Windows: x64 installer
  • Linux: AppImage / deb