Beispiel #1
0
 private static void WriteBulkString(Stream stream, RespValue value)
 {
     if (value.IsNull())
     {
         WriteNullable(stream, '$');
     }
     else
     {
         WriteBytes(stream, value, '$', true);
     }
 }
Beispiel #2
0
        private static void WriteBytes(Stream stream, RespValue value, char header, bool withLength = false)
        {
            WriteHeader(stream, header);
            var bytes = value.GetBytes();
            if (withLength)
            {
                WriteInt(stream, bytes.Length);
                WriteCrLf(stream);
            }

            WriteBytes(stream, bytes);
            WriteCrLf(stream);
        }
Beispiel #3
0
 public RespValue Execute(IExecutionContext context, RespValue request)
 {
     try
     {
         EnsureArray(request);
         var requestParts = request.GetItems();
         EnsureNonEmptyArray(requestParts);
         var commandPart = requestParts.First();
         var argumentsPart = requestParts.Skip(1).ToArray();
         var commandName = commandPart.GetString().ToUpperInvariant();
         ICommand command;
         if (!commandsMap.TryGetValue(commandName, out command))
         {
             return RespValue.Error(string.Format("ERR Unknown command '{0}'", commandName));
         }
         return command.Execute(context, argumentsPart);
     }
     catch (Exception)
     {
         return SharedContrants.UnknownError;
     }
 }
Beispiel #4
0
 private static void WriteRespValue(Stream stream, RespValue respValue)
 {
     switch (respValue.Type)
     {
         case RespValueType.SimpleString:
             WriteSimpleString(stream, respValue);
             break;
         case RespValueType.Error:
             WriteErrorString(stream, respValue);
             break;
         case RespValueType.BulkString:
             WriteBulkString(stream, respValue);
             break;
         case RespValueType.Array:
         {
             if (respValue.IsNull())
             {
                 WriteNullable(stream, '*');
             }
             else
             {
                 var respValues = respValue.GetItems();
                 WriteHeader(stream, '*');
                 WriteInt(stream, respValues.Length);
                 WriteCrLf(stream);
                 foreach (var item in respValues)
                     WriteRespValue(stream, item);
             }
             break;
         }
         case RespValueType.Integer:
         {
             WriteInteger(stream, respValue);
             break;
         }
         default:
             throw new ArgumentOutOfRangeException("respValue", respValue.Type.ToString());
     }
 }
Beispiel #5
0
 private void EnsureNonEmptyArray(RespValue[] arguments)
 {
     if (arguments != null && arguments.Any())
         return;
     throw new Exception();
 }
Beispiel #6
0
 private void EnsureArray(RespValue request)
 {
     if (request.Type == RespValueType.Array)
         return;
     throw new Exception();
 }
Beispiel #7
0
        public bool TryPollRequest(out RespValue request)
        {
            request = null;
            if (!Paused && socket.Poll(0, SelectMode.SelectRead))
            {
                var pollBufferFreeSpace = ResizeBufferAndGetFreeSpace(ref pollBuffer, pollBytes);
                var receivedBytes = socket.Receive(pollBuffer, pollBytes, pollBufferFreeSpace, SocketFlags.None);
                pollBytes += receivedBytes;

                var respParseResult = RespParser.Parse(pollBuffer, 0, pollBytes);
                if (respParseResult.Status == RespParseStatus.Success)
                {
                    request = respParseResult.Value;
                    var valueBytes = respParseResult.ValueBytes;
                    var remainingBytes = pollBytes - valueBytes;
                    if (remainingBytes != 0)
                    {
                        Buffer.BlockCopy(pollBuffer, valueBytes, pollBuffer, 0, remainingBytes);
                        pollBytes = remainingBytes;
                    }
                    else
                    {
                        pollBytes = 0;
                    }
                    return true;
                }
            }
            return false;
        }
Beispiel #8
0
 public void PushResponse(RespValue response)
 {
     var bytes = RespGenerator.Generate(response);
     socket.Send(bytes);
 }
Beispiel #9
0
 public static RespValue Array(RespValue[] values)
 {
     return new RespValue(RespValueType.Array, values);
 }
Beispiel #10
0
 public static byte[] Generate(RespValue respValue)
 {
     var stream = new MemoryStream();
     WriteRespValue(stream, respValue);
     return stream.ToArray();
 }
Beispiel #11
0
 private static void WriteInteger(Stream stream, RespValue respValue)
 {
     WriteHeader(stream, ':');
     WriteInt(stream, respValue.GetInt());
     WriteCrLf(stream);
 }
Beispiel #12
0
 private static void WriteErrorString(Stream stream, RespValue value)
 {
     WriteBytes(stream, value, '-');
 }
Beispiel #13
0
 private static void WriteSimpleString(Stream stream, RespValue value)
 {
     WriteBytes(stream, value, '+');
 }