Skip to content

Release 2.2.1: new providers, faster connects, SQL write fix - #93

Merged
broisnischal merged 15 commits into
masterfrom
fix/persistence-and-editor-polish
Sep 29, 2026
Merged

broisnischal merged 15 commits into
masterfrom
fix/persistence-and-editor-polish

Conversation

@broisnischal

@broisnischal broisnischal commented Sep 29, 2026 •

Copy link
Copy Markdown
Collaborator

Four new providers, faster connecting, and a fix for SQL runs that lost their writes.

Fixes

  • A SQL run ending in a SELECT committed nothing; earlier writes were rolled back. It commits now.
  • Picking a saved provider database could match a similarly named one. Matching uses the provider's own id.
  • Passwords with a raw %, #, ? or @ import from a connection URL whole.
  • PlanetScale lists and connects again; one ungranted org no longer empties any provider's list.
  • Editor stop cancels on the server, deleted connections stay deleted, Windows keeps provider sign-in.

New

  • TiDB Cloud (device code shown in the app), Turso, Nile and Upstash. Railway is written but disabled until its OAuth app exists.
  • Sign out with a confirm, provider logos and an engine chip in the connection list, dialog shortcuts, Alt+wheel precise scrolling.

Faster

  • Reconnecting a saved provider database makes no API calls; the picker opens on its last list.
  • No restarted handshakes to far hosts, no double connect, one reused Redis connection, parallel API calls for Supabase, Turso and Prisma.
  • Vite no longer watches the 139 GB Rust build output.

163 Rust and 684 frontend tests pass. The new provider sign-ins are not yet tested against the live services.

Stop in the SQL editor only dropped the Rust future on Postgres, so the statement kept running until the 60s timeout and held its connection. The editor path now arms pg_cancel_backend and a per-row cancel check, and a stopped run always reports "Query cancelled".

The editor shows that as its own quiet "Query stopped" view with Run again instead of the red error pane, the Stop button matches Run's footprint, and the error header drops the uppercase label.
Every client row now has a labelled Copy config, plus a Claude Code row that copies the claude mcp add command. Rows use soft filled buttons instead of the outline field style, the server URL, state and Start/Stop share one row, and read-only is a real switch.
Inter for the UI, Source Serif 4 for dialog titles, JetBrains Mono kept for data and SQL. Installs still on the old all-mono default move once, and the migrated value is written back immediately so a later save can't restore mono.
A windowed browse passes a sparse array as long as the whole table, and sampling it by index hit holes and threw on row.map. The chart now uses the rows that exist and labels partial data as "N of M loaded".
upsertConnection inserted whatever it was handed, and the shell re-saves the open connection on every connect, reconnect and database switch, so deleting the connection in use brought it back. Deleted ids are now recorded and never re-added unless explicitly revived (the Sample Database button), and deleting the active connection disconnects it.

Saved connections are also mirrored to connections.json in the app data folder (fsynced, 0600 on unix) and loaded before the app reads them, so a localStorage write lost at exit (WebView2) can't undo a delete.

Both delete buttons now ask first, since a delete also clears the connection's history, saved queries, charts and chats.
All secrets were one JSON blob in a single keychain credential, and Windows caps a credential at 1280 characters. After an OAuth sign-in the write failed, the tokens went to the fallback file, and the next launch read the older credential first and looked signed out. The vault is now split across credentials under the limit and verified by read-back; a failing keychain makes the file the store and removes the keychain copy, and the file wins on load, which also recovers installs already in that state.

Every vault change goes through one locked read-modify-write, token refresh is single-flight (Prisma, Supabase and Cloudflare rotate refresh tokens), a provider API 401 refreshes once and retries, only invalid_grant ends a session, and an expired session offers Sign in again.
A run whose last statement returned rows was rolled back, so writes before it
(UPDATE ...; SELECT ...), data-modifying CTEs and SELECT on functions that
write were shown and then thrown away. They commit now. The binary-output
retry only re-runs single-statement input, since re-running just the last
statement of a multi-statement run reported success over a lost write.

The read-only row counts end with COMMIT too: Nile's proxy rejects that
ROLLBACK, which left the connection marked in-transaction, so sqlx closed it
and every count paid a fresh handshake.
- Keep a connect attempt once the TCP probe has proven the host reachable,
  instead of restarting it at 800ms. Far hosts (a Sydney pooler) paid TCP,
  TLS and auth twice.
- Reuse one Redis connection per database instead of opening one per
  command, PING it after 30s idle, and bound connects at 10s.
- Parse connection URLs whose password has a raw %, #, ?, / or @, and encode
  the database name in the URL handed to sqlx.
The watcher crawled src-tauri/target and website/, holding ~3 GB and reacting to every cargo rebuild. It watches the frontend only now.
- TiDB Cloud (device code sign-in, code shown in the app), Turso and Nile
  through their CLIs' browser sign-in, Upstash with an email and API key.
  Railway is written but disabled until its OAuth app exists.
- Open the provider picker on the last list and refresh it underneath;
  fetch every org's databases at once; skip an org the token can't read
  instead of failing the list.
- Reconnect a saved provider database from the saved entry, matched by the
  provider's own id. The old name match could pick the wrong database.
- PlanetScale asks for the scopes listing orgs and creating passwords need,
  and is enabled again.
- Sign out with a confirm, a branded sign-in page, a callback that ignores
  stray requests, failed picks reported as toasts, and provider logos with an
  engine chip in the connection list.
Geist is the default font again; installs still on an earlier default move once. The boot page paints the theme's real background, recorded on the previous run, instead of a fixed near-black that switched when the stylesheet loaded.
On multi-million-row tables a wheel notch travelled dozens of rows. Alt+wheel steps four rows per notch, snapped to row edges, without adding a wheel listener to the plain scroll path.
Columns are an editable table in the structure editor's style. An empty sidebar tab shows one empty state instead of two.
It listed four providers and ran to 444 lines. It now covers every engine and provider, the install paths and the build in under 100.
@broisnischal broisnischal added the release:patch Bump patch version (0.0.x) label Sep 29, 2026
@broisnischal
broisnischal merged commit 0e2ab87 into master Sep 29, 2026
1 check passed
@github-actions github-actions Bot locked and limited conversation to collaborators Sep 29, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

release:patch Bump patch version (0.0.x)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant