mirror of
https://github.com/element-hq/synapse.git
synced 2026-08-15 11:20:38 +00:00
Add a batched fetch alongside `fetch_one`/`fetch_all`: it blocks for the first row, then scoops up any further rows that are already buffered without blocking again, returning them as one batch. This lets Python iterate large result sets without the per-row overhead of `fetch_one`, while still not blocking on the whole result set like `fetch_all`. Exhaustion is reported by an empty batch, and deliberately deferred: a batch that runs into the end of the stream still returns the rows it has and leaves the empty-batch report (and the move to `Closed`) to the next call. The fused stream makes that re-poll safe. Unit tests use the in-memory fakes from the previous change, plus a new `SteppedStream` that can report "not ready yet" mid-stream, so the partial -batch boundary, the deferred empty report, the capacity-is-a-hint behaviour, interleaving with `fetch_one`, and the mid-batch error path are all covered without a live database. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>