Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
af2cfeb
docs(linux): add the driver layer to the architecture guide
datlechin Oct 13, 2026
fe32cfd
docs(linux): rewrite the driver guide for contract v2
datlechin Oct 13, 2026
24c2d9e
docs(linux): document driver errors, timeouts and TLS remedies
datlechin Oct 13, 2026
90c670c
docs(linux): add per-engine driver pages
datlechin Oct 13, 2026
5ca1adb
docs(linux): record driver contract v2 in ADR 0016
datlechin Oct 13, 2026
0eb7864
fix(linux-clickhouse): refuse a result line that never ends
datlechin Oct 13, 2026
3798bd4
fix(linux-clickhouse): give up on an editor KILL after the grace
datlechin Oct 13, 2026
3d1f37a
fix(linux-clickhouse): send no further query once a call is stopped
datlechin Oct 13, 2026
5715010
fix(linux-clickhouse): look a mutation up in the table the save wrote
datlechin Oct 13, 2026
855e0c2
fix(linux-clickhouse): report an expired editor session as lost
datlechin Oct 13, 2026
c6f4a47
fix(linux-clickhouse): pin the DateTime output format
datlechin Oct 13, 2026
6e0e097
refactor(linux): give each window its own pending-edit trackers
datlechin Oct 13, 2026
6dda859
ci(linux): fail fast checks on thread_local! in app services
datlechin Oct 13, 2026
3c3aae4
fix(linux-editor): keep statements sqlformat would respace unformatted
datlechin Oct 13, 2026
47d59f4
fix(linux-postgres): tell a statement timeout apart by time, not text
datlechin Oct 13, 2026
200717c
refactor(linux-editor): map Run at Cursor through one statement helper
datlechin Oct 13, 2026
db0a29f
fix(linux-postgres): run every table definition query inside its read
datlechin Oct 13, 2026
e819a86
fix(linux-postgres): keep user SQL in stream_read from writing
datlechin Oct 13, 2026
681075a
fix(linux-mysql): refuse a TLS name sqlx cannot verify over TCP
datlechin Oct 13, 2026
8972e22
fix(linux-mysql): stop the editor's batch when its reader goes away
datlechin Oct 13, 2026
e6f985d
fix(linux-mysql): prepare every save step so a ';' cannot add one
datlechin Oct 13, 2026
ffbd309
fix(linux-editor): build a result page only when its line is shown
datlechin Oct 13, 2026
9e03061
fix(linux-core): export reals and array items at column precision
datlechin Oct 13, 2026
12ffe8f
fix(linux-core): neutralise formulas in CSV values of unplaced types
datlechin Oct 13, 2026
7b6b989
fix(linux-core): write integers and scaled decimals to Excel exactly
datlechin Oct 13, 2026
712bc27
fix(linux-core): escape pipes in Markdown export column names
datlechin Oct 13, 2026
9a1aca6
fix(linux-core): refuse a MySQL # comment in a raw filter or type
datlechin Oct 13, 2026
99aaf67
test(linux-tests): bound every conformance case and each running count
datlechin Oct 13, 2026
4482bdd
test(linux-tests): fail a row guard on a present row
datlechin Oct 13, 2026
8b8ccbe
docs(linux): say which suite flags no capability can check
datlechin Oct 13, 2026
1372e83
fix(linux-tests): run a fake's close behaviour once per object
datlechin Oct 13, 2026
7fc64e7
fix(linux-editor): enforce the 8 MB SQL file limit while reading
datlechin Oct 13, 2026
47e9d58
docs(linux): correct editor cancel, row-limit and stop claims
datlechin Oct 13, 2026
8dee1a9
docs(linux): warn that tokio-postgres logs editor SQL at debug
datlechin Oct 13, 2026
fd4fd89
docs(linux): state the session fakes exception and drop em dashes
datlechin Oct 13, 2026
f1044ac
fix(linux-mssql): read money exactly in the editor and query results
datlechin Oct 13, 2026
eb07487
fix(linux-mssql): bind char and varchar keys as varchar so saves seek
datlechin Oct 13, 2026
55ef948
test(linux-mssql): pin a stop after any answer as mid-token
datlechin Oct 13, 2026
6d38e44
fix(linux-sqlite): let Stop end a statement waiting for a lock
datlechin Oct 13, 2026
6fdcbc6
fix(linux-sqlite): keep the connection when SQLite rolled back a save
datlechin Oct 13, 2026
39f7d5a
fix(linux-sqlite): run statements before an unclosed comment alone
datlechin Oct 13, 2026
cae14ed
fix(linux-sqlite): write a NUL in a text literal through char(0)
datlechin Oct 13, 2026
e2b49fc
fix(linux-storage): keep an import from taking over saved secrets
datlechin Oct 13, 2026
3708ed1
fix(linux-ssh): leave every new SSH host key to the app's dialog
datlechin Oct 13, 2026
baef3b1
fix(linux): stop a cancelled connect from saving or prompting
datlechin Oct 13, 2026
bd547b6
fix(linux-session): end a Retry's password prompt with its session
datlechin Oct 13, 2026
96ee24a
fix(linux): close the session when its window closes
datlechin Oct 13, 2026
eedae9e
fix(linux-editor): keep a MySQL function against its paren in Format
datlechin Oct 13, 2026
1ccec23
test(linux-editor): cover Run at Cursor while a run is in flight
datlechin Oct 13, 2026
7cf534d
refactor(linux-editor): drop comments that restate the results code
datlechin Oct 13, 2026
037dba1
fix(linux-ssh): leave a config's StrictHostKeyChecking yes in force
datlechin Oct 13, 2026
350183d
fix(linux): take back a new entry saved as its connect is cancelled
datlechin Oct 13, 2026
31ab99f
fix(linux-storage): name an imported copy apart from the saved entry
datlechin Oct 13, 2026
df811ca
docs(linux): drop prompt comments that only restate the code
datlechin Oct 13, 2026
b7ec8dc
docs(linux): drop changelog lines for fixes to unreleased flows
datlechin Oct 13, 2026
b5fd89b
merge linux-1b/core-tests
datlechin Oct 13, 2026
8c665e3
merge linux-1b/pg-mysql
datlechin Oct 13, 2026
1fc7842
merge linux-1b/mssql-sqlite
datlechin Oct 13, 2026
1819072
merge linux-1b/clickhouse
datlechin Oct 13, 2026
d53fb03
merge linux-1b/docs
datlechin Oct 13, 2026
b033ca2
merge linux-1b/trackers
datlechin Oct 13, 2026
64ca6ea
merge linux-1b/export
datlechin Oct 13, 2026
7cd6b0c
merge linux-1b/editor
datlechin Oct 13, 2026
211c696
merge linux-1b/app-flows
datlechin Oct 13, 2026
be04899
build(linux): list the new app files in POTFILES.in
datlechin Oct 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .github/workflows/build-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,14 @@ jobs:
run: meson setup _build -Dprofile=development
- name: Format check
run: cargo fmt --all -- --check
- name: No thread-local state in app services
# Trackers belong to a workspace; a thread_local! registry shares
# one window's unsaved edits with every other window.
run: |
if grep -rn 'thread_local!' crates/app/src/services; then
echo "::error::crates/app/src/services must not hold thread_local! state"
exit 1
fi
- name: Clippy
run: meson devenv -C _build cargo clippy --locked --workspace --all-targets -- -D warnings
- name: Clippy without default features
Expand Down
184 changes: 129 additions & 55 deletions linux/ARCHITECTURE.md

Large diffs are not rendered by default.

26 changes: 25 additions & 1 deletion linux/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added

- Password prompt on connect when the keyring holds no password, with a choice to remember it.
- SSH tunnels through the system OpenSSH client, using your SSH agent, host aliases and jump hosts.
- SSH tunnels through the system OpenSSH client, with your agent, host aliases and jump hosts, confirming new host keys.
- Security group in the connect dialog: encryption mode, CA certificate, client certificate and TLS server name.
- SQLite file chooser in the connect dialog, with New Database to create a file.
- Results list in the SQL editor with one entry per statement, its rows affected or error, and the open transaction.

### Fixed

- Format, a query opened from history and a loaded SQL file could not be undone with Ctrl+Z.
- PostgreSQL statement timeouts showed as a plain server error when the server's messages were not in English.
- SQL Server money and smallmoney in the SQL editor and query results showed as approximate floats.
- Saving a SQL Server row with a char or varchar key locked the whole table until the save ended.
- Stop could not end a SQLite statement waiting for another connection's lock.
- A SQLite save that failed in a way SQLite rolls back itself closed the connection and its temporary tables.
- A SQLite script ending in an unclosed comment showed later results under the first statement's columns.
- SQLite text containing a NUL character exported as SQL that SQLite cannot read.
- ClickHouse query or export with a FORMAT clause filled memory instead of failing.
- ClickHouse editor tab silently lost its temporary tables and settings when the server expired its session.
- ClickHouse DateTime values showed as UTC text when the server profile or session set ISO output.
- ClickHouse save with an unknown outcome could read as applied because of another table's mutation.
- A new row removed with Delete stayed in the grid while the save left it out.
- A save that failed on a new row did not flash that row.
- The window title showed no unsaved-changes bullet for pending structure changes.
- `real` values showed extra digits in the grid, copies and exports, such as 0.10000000149011612 for 0.1.
- Excel export rounded integers past 2^53 and wrote decimals as text when their column padded the scale.
- Exported arrays wrote each row of a multi-dimensional array as a quoted string.
- Markdown export broke its table when a column name held a pipe.

### Security

- CSV export did not neutralise formulas in values of a type TablePro does not recognise.
- Format could put a space inside `+=`, `b'01'` or `@@version`, or between a MySQL function such as `GROUP_CONCAT` and its parenthesis, and change what the statement does.
- Opening a pipe or a device as a SQL file never finished, or read past the 8 MB limit.
14 changes: 14 additions & 0 deletions linux/crates/app/src/services/cell_overlay.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
use tablepro_core::Value;

use super::change_tracker::CellState;

/// One cell as the grid draws it, copied out of the tracker so a bind
/// holds no borrow while it updates widgets.
#[derive(Debug, Clone, PartialEq)]
pub struct CellOverlay {
/// The pending edit when there is one, else the fetched value.
pub value: Value,
pub state: CellState,
/// The row produced the statement a save just failed on.
pub error_flash: bool,
}
Loading
Loading