stream method

  1. @override
Stream<Map<String, dynamic>> stream(
  1. String sql, [
  2. Map<String, dynamic>? params
])
override

Executes a raw SQL query and returns a stream of rows.

This is suitable for large result sets to avoid loading everything into memory.

Implementation

@override
Stream<Map<String, dynamic>> stream(
  String sql, [
  Map<String, dynamic>? params,
]) async* {
  try {
    String processedSql = sql;
    List<dynamic> positionalParams = [];

    if (params != null && params.isNotEmpty) {
      final translation = _translateSql(sql, params);
      processedSql = translation.sql;
      positionalParams = translation.params;
    } else {
      processedSql = _stripReturning(sql);
    }

    if (_log.isLoggable(Level.FINE)) {
      _log.fine('Streaming SQL: $processedSql');
      if (positionalParams.isNotEmpty) {
        _log.fine('Parameters: $positionalParams');
      }
    }

    if (positionalParams.isNotEmpty) {
      final stmt = _db.prepare(processedSql);
      try {
        final result = stmt.select(positionalParams);
        for (final row in result) {
          yield Map<String, dynamic>.from(row);
        }
      } finally {
        stmt.dispose();
      }
    } else {
      final result = _db.select(processedSql);
      for (final row in result) {
        yield Map<String, dynamic>.from(row);
      }
    }
  } catch (e) {
    throw QueryException('SQLite Error: $e', sql: sql);
  }
}