private async ValueTask Cancel(bool disposing, bool async) { if (State == ClickHouseDataReaderState.Closed || State == ClickHouseDataReaderState.Broken || State == ClickHouseDataReaderState.ClosePending) { return; } try { await _session.SendCancel(async); State = ClickHouseDataReaderState.ClosePending; } catch (Exception ex) { State = ClickHouseDataReaderState.Broken; await _session.SetFailed(ex, false, async); if (!disposing) { throw; } } }
private async ValueTask Close(bool disposing, bool async) { if (_session.IsDisposed || _session.IsFailed) { return; } if (!(State == ClickHouseDataReaderState.Closed || State == ClickHouseDataReaderState.Broken)) { await _session.SendCancel(async); while (true) { try { var message = _nextResultMessage ?? await _session.ReadMessage(async, CancellationToken.None); _nextResultMessage = null; switch (message.MessageCode) { case ServerMessageCode.Data: case ServerMessageCode.Totals: case ServerMessageCode.Extremes: var dataMessage = (ServerDataMessage)message; await _session.SkipTable(dataMessage, async, CancellationToken.None); continue; case ServerMessageCode.Error: State = ClickHouseDataReaderState.Closed; if (disposing) { break; } throw ((ServerErrorMessage)message).Exception; case ServerMessageCode.Progress: var progressMessage = (ServerProgressMessage)message; _recordsAffected = progressMessage.Rows; continue; case ServerMessageCode.EndOfStream: State = ClickHouseDataReaderState.Closed; break; case ServerMessageCode.ProfileInfo: continue; case ServerMessageCode.Pong: case ServerMessageCode.Hello: case ServerMessageCode.Log: throw new ClickHouseException(ClickHouseErrorCodes.ProtocolUnexpectedResponse, $"Unexpected server message: \"{message.MessageCode}\"."); default: throw new NotSupportedException($"Internal error. Message code \"{message.MessageCode}\" not supported."); } } catch (ClickHouseHandledException ex) { if (!disposing) { throw; } State = ClickHouseDataReaderState.Broken; await _session.SetFailed(ex.InnerException, false, async); return; } catch (Exception ex) { State = ClickHouseDataReaderState.Broken; var aggrEx = await _session.SetFailed(ex, false, async); if (disposing) { return; } if (aggrEx != null) { throw aggrEx; } throw; } break; } } _session.Dispose(); _sessionTokenSource?.Dispose(); }