discontinuedPackage connect_database has been discontinued.

executeCursor method

  1. @override
Future<Result<Stream<Map<String, dynamic>>>> executeCursor(
  1. String query, {
  2. List? params,
})
override

Executa uma query SQL retornando um Stream para leitura linha-a-linha (Cursor). Ideal para grandes volumes de dados.

Implementation

@override
Future<Result<Stream<Map<String, dynamic>>>> executeCursor(String query,
    {List<dynamic>? params}) async {
  try {
    // If params is empty, don't pass it (bypasses parameter binding)
    final cursor = params != null && params.isEmpty
        ? await driver.executeCursor(query)
        : await driver.executeCursor(query, params: params);

    Stream<Map<String, dynamic>> stream() async* {
      try {
        while (true) {
          try {
            final row = await cursor.next();
            if (row is CursorDone) {
              break;
            }

            yield Map<String, dynamic>.from(row as Map);
          } catch (e) {
            final errorMessage = e.toString().toLowerCase();
            if (errorMessage.contains('cursor') &&
                (errorMessage.contains('not found') ||
                    errorMessage.contains('closed'))) {
              break;
            }
            rethrow;
          }
        }
      } finally {
        try {
          await cursor.close();
        } catch (e) {
          final errorMessage = e.toString().toLowerCase();
          if (!errorMessage.contains('cursor') ||
              (!errorMessage.contains('not found') &&
                  !errorMessage.contains('closed'))) {
            rethrow;
          }
        }
      }
    }

    return Success(stream());
  } catch (err, stackTrace) {
    return Failure(QueryError(
      'Falha ao executar cursor (stream)',
      query: query,
      originalError: err,
      stackTrace: stackTrace,
    ));
  }
}