queryStream method

Stream<PostgreSQLResultRow> queryStream(
  1. String fmtString, {
  2. dynamic substitutionValues,
  3. PlaceholderIdentifier placeholderIdentifier = PlaceholderIdentifier.atSign,
  4. int fetchSize = 1000,
  5. int? timeoutInSeconds,
})
inherited

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;
}