Point-in-time recovery, a SQL server with its own gauges, and operator parity across both servers
Summary: Point-in-time recovery, a SQL server with its own gauges, and operator parity across both servers (v0.5.4b235).
This is the largest SecantusDB release to date — a month of parallel work,
125 changelog entries. The headline capability is point-in-time
recovery: every write already flowed through the oplog, and
secantusAdmin.restoreToTimestamp now replays it to reconstruct the
database exactly as it stood at any moment inside the retention window —
with hot backup archives, base snapshots, and archives portable between the
Python and Rust servers. The other headline is housekeeping with teeth: the
daemons got distinguishable names (secantusd-py, secantusd-rs,
secantusd-py-pg — the old secantusdb console script is gone), and
Python 3.10 is now genuinely supported and genuinely tested in CI.
The PostgreSQL-wire SQL server graduated from experiment to measured
surface. It now has two external conformance gauges of its own — psycopg
3's unmodified test suite and the SQLite-originated sqllogictest corpus —
and the long tail they surfaced landed alongside them: server-side cursors
over the wire, COPY inside transaction blocks, CREATE SCHEMA,
LANGUAGE plpgsql function bodies, the full binary codec surface with real
Postgres type OIDs, per-statement RBAC reusing the Mongo role model, and
SQL's three-valued NULL semantics carried all the way down the
filter-pushdown path.
On the MongoDB side, both servers picked up a wide operator-fidelity batch
— the $setWindowFields operator set completed ($derivative /
$integral with time units, $locf, $linearFill, $expMovingAvg, range
windows), the N-ary accumulators, trigonometric and set expressions, a
much larger date toolbox, and dozens of exact-error-code alignments — and
the Rust server reached pymongo-suite parity with the Python server (99.5%
each). Measurement grew to match: sixteen driver-conformance gauges now run
weekly (C, C++, C#, Kotlin, pymongo async, psycopg, and the Rust-server
gates joined this cycle), feeding a regenerated cross-driver summary and a
new three-way feature-comparison page. One genuine bug that machinery
caught — an awaitData wake race that could delay change-stream delivery by
a full maxTimeMS — is fixed, alongside security hardening (two admin-UI
CVEs, SCRAM-credential leak paths closed, constant-time token comparison).