Highlights
- Opt-in
:telemetryinstrumentation across the whole API: spans with nanosecond timings for every operation, cancellation lifecycle events, and a bridge re-emitting hook fan-outs as[:xqlite, :hook, :*]. Compile-time flag — disabled (the default) means zero telemetry code in the bytecode. New "Wiring xqlite telemetry" guide on hexdocs. - Multi-subscriber hooks: update / WAL / commit / rollback / log hooks now fan out to any number of subscribers via
register_*_hook/unregister_*_hookhandles. New progress-tick hook with per-subscriber decimation. - Connection observability:
wal_checkpoint/3(structured results),connection_stats/1,autocommit/1,txn_state/2, plusXqlite.busy_timeout/2and the busy handler with retry policy and PID forwarding.
Breaking
- Hook API renamed:
set_X_hook/remove_X_hook→register_X_hook/unregister_X_hook(handle)(multi-subscriber). - Cancellable NIFs take a list of cancel tokens (OR-semantics);
Xqlite.*_cancellablewrappers accept a single token or a list. XqliteNIFis now the raw NIF boundary only — ergonomic wrappers (open_in_memory/0,serialize/1,backup/2, …) moved toXqlite.
Fixed
- WAL hook ↔
wal_autocheckpointslot conflict. SQLite implements autocheckpointing as a wal_hook, so the two silently disabled each other. xqlite's master callback now owns the slot and emulates the autocheckpoint (passive checkpoint at the configured threshold, default 1000 pages);set_pragmarepairs the slot and syncs the threshold. Caveat: raw-SQLPRAGMA wal_autocheckpointstill steals the slot — useset_pragma.
Full details in CHANGELOG.md.