Exemple #1
0
        public override int Read(byte[] buffer, int offset, int count)
        {
            CheckDisposed();
            if (!CanRead)
            {
                throw new InvalidOperationException("Stream not open for reading");
            }

            var totalRead = 0;

            do
            {
                if (_leftToReadInDataMsg == 0)
                {
                    if (_isConsumed)
                    {
                        return(0);
                    }
                    var msg = _connector.ReadSingleMessage();
                    switch (msg.Code)
                    {
                    case BackendMessageCode.CopyData:
                        _leftToReadInDataMsg = ((CopyDataMessage)msg).Length;
                        break;

                    case BackendMessageCode.CopyDone:
                        _connector.ReadExpecting <CommandCompleteMessage>();
                        _connector.ReadExpecting <ReadyForQueryMessage>();
                        _isConsumed = true;
                        goto done;

                    default:
                        _connector.State = ConnectorState.Broken;
                        throw new Exception("Received unexpected message type in COPY OUT: " + msg.Code);
                    }
                }

                var len = Math.Min(count, _leftToReadInDataMsg);
                _buf.ReadBytesSimple(buffer, offset, len);
                offset += len;
                count  -= len;
                _leftToReadInDataMsg -= len;
                totalRead            += len;
            } while (count > 0);

done:
            return(totalRead);
        }