executeCursor method
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,
));
}
}