コード例 #1
0
        private static byte[] ReadBulkStringValue(RespReader reader)
        {
            RespDataType dataType = reader.ReadDataType();

            if (dataType == RespDataType.Error)
            {
                string err = reader.ReadErrorValue();
                throw new RedisErrorException(err);
            }

            if (dataType != RespDataType.BulkString)
            {
                throw new InvalidDataException();
            }

            return(reader.ReadBulkStringValue());
        }
コード例 #2
0
        private static long ReadIntegerValue(RespReader reader)
        {
            RespDataType dataType = reader.ReadDataType();

            if (dataType == RespDataType.Error)
            {
                string err = reader.ReadErrorValue();
                throw new RedisErrorException(err);
            }

            if (dataType != RespDataType.Integer)
            {
                throw new InvalidDataException();
            }

            return(reader.ReadIntegerValue());
        }
コード例 #3
0
        protected override CommandResult <byte[]> ReadResult(IRespReader reader)
        {
            RespDataType dataType = reader.ReadDataType();

            if (dataType == RespDataType.Error)
            {
                string err = reader.ReadErrorValue();
                return(CommandResult <byte[]> .Error(err));
            }

            if (dataType != RespDataType.BulkString)
            {
                throw new InvalidDataException();
            }

            byte[] value = reader.ReadBulkStringValue();
            return(CommandResult.Success(value));
        }
コード例 #4
0
        protected override CommandResult <long> ReadResult(IRespReader reader)
        {
            RespDataType dataType = reader.ReadDataType();

            if (dataType == RespDataType.Error)
            {
                string err = reader.ReadErrorValue();
                return(CommandResult <long> .Error(err));
            }

            if (dataType != RespDataType.Integer)
            {
                throw new InvalidDataException();
            }

            long value = reader.ReadIntegerValue();

            return(CommandResult.Success(value));
        }
コード例 #5
0
        private static IList <byte[]> ReadArrayOfBulkStrings(RespReader reader)
        {
            RespDataType dataType = reader.ReadDataType();

            if (dataType == RespDataType.Error)
            {
                string err = reader.ReadErrorValue();
                throw new RedisErrorException(err);
            }

            if (dataType != RespDataType.Array)
            {
                throw new InvalidDataException();
            }

            if (!reader.TryReadStartArray(out long length))
            {
                return(null);
            }

            var values = new List <byte[]>();

            for (var i = 0; i < length; i++)
            {
                dataType = reader.ReadDataType();

                if (dataType != RespDataType.BulkString)
                {
                    throw new InvalidDataException();
                }

                byte[] value = reader.ReadBulkStringValue();
                values.Add(value);
            }

            return(values);
        }
コード例 #6
0
        protected override CommandResult <IList <byte[]> > ReadResult(IRespReader reader)
        {
            RespDataType dataType = reader.ReadDataType();

            if (dataType == RespDataType.Error)
            {
                string err = reader.ReadErrorValue();
                return(CommandResult <IList <byte[]> > .Error(err));
            }

            if (dataType != RespDataType.Array)
            {
                throw new InvalidDataException();
            }

            if (!reader.TryReadStartArray(out long length))
            {
                return(CommandResult <IList <byte[]> > .Success(null));
            }

            var values = new byte[length][];

            for (var i = 0; i < length; i++)
            {
                dataType = reader.ReadDataType();

                if (dataType != RespDataType.BulkString)
                {
                    throw new InvalidDataException();
                }

                values[i] = reader.ReadBulkStringValue();
            }

            return(CommandResult.Success((IList <byte[]>)values));
        }
コード例 #7
0
        private void Listen()
        {
            while (true)
            {
                ValidateNotDisposed();
                RespDataType dataType = _reader.ReadDataType();

                if (dataType == RespDataType.Error)
                {
                    string err = _reader.ReadErrorValue();
                    throw new RedisErrorException(err);
                }

                if (dataType != RespDataType.Array)
                {
                    throw new InvalidDataException();
                }

                if (!_reader.TryReadStartArray(out _))
                {
                    continue;
                }

                dataType = _reader.ReadDataType();

                if (dataType != RespDataType.BulkString)
                {
                    throw new InvalidDataException();
                }

                byte[] kindBytes = _reader.ReadBulkStringValue();
                string kind      = _encoding.GetString(kindBytes);

                switch (kind)
                {
                case "subscribe":
                {
                    dataType = _reader.ReadDataType();

                    if (dataType != RespDataType.BulkString)
                    {
                        throw new InvalidDataException();
                    }

                    byte[] channelBytes = _reader.ReadBulkStringValue();
                    string channel      = _encoding.GetString(channelBytes);

                    dataType = _reader.ReadDataType();

                    if (dataType != RespDataType.Integer)
                    {
                        throw new InvalidDataException();
                    }

                    long count = _reader.ReadIntegerValue();
                    Debug.WriteLine("subscribe: {0} ({1})", channel, count);
                    break;
                }

                case "unsubscribe":
                {
                    dataType = _reader.ReadDataType();

                    if (dataType != RespDataType.BulkString)
                    {
                        throw new InvalidDataException();
                    }

                    byte[] channelBytes = _reader.ReadBulkStringValue();
                    string channel      = _encoding.GetString(channelBytes);

                    dataType = _reader.ReadDataType();

                    if (dataType != RespDataType.Integer)
                    {
                        throw new InvalidDataException();
                    }

                    long count = _reader.ReadIntegerValue();
                    Debug.WriteLine("unsubscribe: {0} ({1})", channel, count);
                    break;
                }

                case "message":
                {
                    dataType = _reader.ReadDataType();

                    if (dataType != RespDataType.BulkString)
                    {
                        throw new InvalidDataException();
                    }

                    byte[] channelBytes = _reader.ReadBulkStringValue();
                    string channel      = _encoding.GetString(channelBytes);

                    dataType = _reader.ReadDataType();

                    if (dataType != RespDataType.BulkString)
                    {
                        throw new InvalidDataException();
                    }

                    byte[] messageBytes  = _reader.ReadBulkStringValue();
                    string messageString = _encoding.GetString(messageBytes);

                    Debug.WriteLine("message from {0}: {1}", channel, messageString);
                    break;
                }
                }
            }
        }