executeAsync method

Future<Uint8List?> executeAsync(
  1. int connectionId,
  2. String sql, {
  3. Duration pollInterval = const Duration(milliseconds: 10),
  4. Duration? timeout,
  5. int? maxBufferBytes,
})

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