executeAsync method
Executes sql in non-blocking mode using native async request lifecycle.
Flow: start -> poll -> get_result -> free.
Returns the binary result when execution completes successfully, or null
on failure/cancellation/timeout.
Implementation
Future<Uint8List?> executeAsync(
int connectionId,
String sql, {
Duration pollInterval = const Duration(milliseconds: 10),
Duration? timeout,
int? maxBufferBytes,
}) async {
final requestId = await executeAsyncStart(connectionId, sql);
if (requestId <= 0) {
return null;
}
final effectiveTimeout =
timeout ?? _requestTimeout ?? _defaultRequestTimeout;
final deadline = DateTime.now().add(effectiveTimeout);
try {
while (true) {
final status = await asyncPoll(requestId);
switch (status) {
case 1: // ready
return asyncGetResult(
requestId,
maxBufferBytes: maxBufferBytes,
);
case 0: // pending
if (effectiveTimeout > Duration.zero &&
DateTime.now().isAfter(deadline)) {
await asyncCancel(requestId);
return null;
}
await Future<void>.delayed(pollInterval);
case -1: // error
case -2: // cancelled
return null;
default:
return null;
}
}
} finally {
await asyncFree(requestId);
}
}