Пример #1
0
        public async Task MultipleMessageReadTest()
        {
            SetupStream("+OK\r\n+Test\r\n:100\r\n*3\r\n:1\r\n:2\r\n:3\r\n$6\r\nfoobar\r\n-Error message\r\n");

            IRedisType result = await ReadAsync <RedisString>();

            Assert.Equal(new RedisString("OK"), result);

            result = await ReadAsync <RedisString>();

            Assert.Equal(new RedisString("Test"), result);

            result = await ReadAsync <RedisInteger>();

            Assert.Equal(new RedisInteger(100), result);

            result = await ReadAsync <RedisArray>();

            Assert.Equal(new RedisArray(new RedisInteger(1), new RedisInteger(2), new RedisInteger(3)), result);

            result = await ReadAsync <RedisBulkString>();

            Assert.Equal(RedisBulkString.FromString("foobar"), result);

            result = await ReadAsync <RedisErorr>();

            Assert.Equal(new RedisErorr("Error message"), result);
        }
Пример #2
0
        public async Task <IRedisType> SendAsync(IRedisType data, CancellationToken cancellationToken)
        {
            await _sem.WaitAsync(cancellationToken);

            try
            {
                await _writer.WriteAsync(data, cancellationToken);

                return(await _reader.ReadAsync(cancellationToken));
            }
            finally
            {
                _sem.Release();
            }
        }
Пример #3
0
        private async Task <IRedisType> ReadArrayAsync(string value, CancellationToken cancellationToken)
        {
            int length;

            if (!int.TryParse(value, out length) || length < -1)
            {
                throw new IOException($"Invalid Array length '{value}'");
            }

            if (length == -1)
            {
                return(RedisArray.Null);
            }

            var items = new IRedisType[length];

            for (int i = 0; i < length; i++)
            {
                items[i] = await ReadAsync(cancellationToken);
            }

            return(new RedisArray(items));
        }
Пример #4
0
        private async Task <T> SendAsync <T>(IRedisType request, CancellationToken cancellationToken) where T : IRedisType
        {
            var state = GetState <Connected>();

            IRedisType response;

            try
            {
                response = await state.Client.SendAsync(request, cancellationToken);
            }
            catch (Exception ex)
            {
                Close();
                throw new ConnectionException("Error while making request", ex);
            }

            if (response is T)
            {
                return((T)response);
            }

            throw new ConnectionException($"Invalid Response type - expected '{typeof(T).Name}' but got '{response.GetType().Name}'");
        }
Пример #5
0
        public Task WriteAsync(IRedisType value, CancellationToken cancellationToken)
        {
            switch (value.RedisType)
            {
            case RedisType.String:
                return(WriteAsync(value as RedisString, cancellationToken));

            case RedisType.Error:
                return(WriteAsync(value as RedisErorr, cancellationToken));

            case RedisType.Integer:
                return(WriteAsync(value as RedisInteger, cancellationToken));

            case RedisType.BulkString:
                return(WriteAsync(value as RedisBulkString, cancellationToken));

            case RedisType.Array:
                return(WriteAsync(value as RedisArray, cancellationToken));

            default:
                throw new ArgumentOutOfRangeException(nameof(value));
            }
        }
Пример #6
0
 public CommandBuilder WithArg(IRedisType arg)
 {
     _args.Add(arg);
     return(this);
 }
Пример #7
0
 private async Task WriteSimpleAsync(IRedisType value, CancellationToken cancellationToken)
 {
     var bytes = DefaultEncoding.GetBytes($"{value.RedisType.Prefix()}{value}{NewLine}");
     await _stream.WriteAsync(bytes, 0, bytes.Length, cancellationToken);
 }
Пример #8
0
        private async Task <string> WriteAsync(IRedisType dataType)
        {
            await _writer.WriteAsync(dataType, CancellationToken.None);

            return(Encoding.ASCII.GetString(_stream.ToArray()));
        }