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;
                }
            }
        }
Beispiel #2
0
        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();
        }