queryStream method
- String fmtString, {
- dynamic substitutionValues,
- PlaceholderIdentifier placeholderIdentifier = PlaceholderIdentifier.atSign,
- int fetchSize = 1000,
- int? timeoutInSeconds,
Executa fmtString (um SELECT, VALUES ou TABLE) com um cursor
no servidor e entrega as linhas aos poucos, em lotes de fetchSize
(DECLARE ... CURSOR e FETCH).
O próximo lote só é buscado quando o consumidor do stream pede mais
dados (respeita pause), então no máximo uns dois lotes ficam na memória,
mesmo para milhões de linhas. Cancelar a inscrição fecha o cursor. Os
parâmetros e placeholders funcionam como em query; timeoutInSeconds
vale para cada lote.
Na conexão, o cursor roda numa transação própria, que ocupa a conexão até o stream terminar ou ser cancelado (as outras consultas esperam). Dentro de PostgreSQLConnection.transaction, o stream deve ser consumido antes de o bloco terminar; senão ele recebe um StateError e o cursor é fechado antes do COMMIT. Um erro numa consulta do cursor desfaz a transação, como qualquer outra consulta.
Implementation
Stream<PostgreSQLResultRow> queryStream(
String fmtString, {
dynamic substitutionValues,
PlaceholderIdentifier placeholderIdentifier = PlaceholderIdentifier.atSign,
int fetchSize = 1000,
int? timeoutInSeconds,
}) {
if (fetchSize < 1) {
throw ArgumentError.value(fetchSize, 'fetchSize', 'Must be positive');
}
return _CursorStream(this, fmtString, substitutionValues,
placeholderIdentifier, fetchSize, timeoutInSeconds)
._controller
.stream;
}