예제 #1
0
        private void CreateStorageCommand(Opcode cmdType, bool noreply)
        {
            int offset = 0;
            uint flags = 0;
            long exp = 0;

            switch (cmdType)
            {
                case Opcode.Append:
                case Opcode.Prepend:
                case Opcode.AppendQ:
                case Opcode.PrependQ:
                    break;
                default:
                    flags = MemcachedEncoding.BinaryConverter.ToUInt32(_rawData,offset);
                    exp = (long)MemcachedEncoding.BinaryConverter.ToInt32(_rawData,offset+4);;
                    offset += 8;
                    break;
            }
            string key = MemcachedEncoding.BinaryConverter.GetString(_rawData, offset, _requestHeader.KeyLength);
            byte[] value = new byte[_requestHeader.ValueLength];
            Buffer.BlockCopy(_rawData, _requestHeader.KeyLength + offset, value, 0, _requestHeader.ValueLength);
            StorageCommand cmd = new StorageCommand(cmdType, key, flags, exp, _requestHeader.CAS, _requestHeader.ValueLength);
            cmd.DataBlock = value;
            cmd.NoReply = noreply;
            cmd.Opaque = _requestHeader.Opaque;
            _command = cmd;
        }
예제 #2
0
 public static byte[] BuildStorageResponse(StorageCommand command)
 {
     BinaryResponseStatus status = BinaryResponseStatus.no_error;
     ulong cas = 0;
     if (command.ExceptionOccured)
     {
         status = BinaryResponseStatus.item_not_stored;
     }
     else
     {
         switch (command.OperationResult.ReturnResult)
         {
             case Result.SUCCESS:
                 if (command.NoReply == true)
                     return null;
                 cas = (ulong)command.OperationResult.Value;
                 break;
             case Result.ITEM_EXISTS:
                 status = BinaryResponseStatus.key_exists;
                 break;
             case Result.ITEM_NOT_FOUND:
                 status = BinaryResponseStatus.key_not_found;
                 break;
             case Result.ITEM_MODIFIED:
                 status = BinaryResponseStatus.key_exists;
                 break;
             default:
                 status = BinaryResponseStatus.item_not_stored;
                 break;
         }
     }
     return BuildResposne(command.Opcode, status, command.Opaque, cas, null, null, null);
 }
예제 #3
0
        private void CreateStorageCommand(string arguments, Opcode cmdType)
        {
            if (arguments == null)
            {
                CreateInvalidCommand();
                return;
            }

            string[] argumentsArray = arguments.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            if (argumentsArray.Length < 4 || argumentsArray.Length > 6)
            {
                CreateInvalidCommand("CLIENT_ERROR bad command line format");
                return;
            }
            else
            {
                try
                {
                    string key = argumentsArray[0];
                    uint flags = UInt32.Parse(argumentsArray[1]);
                    long expTime = long.Parse(argumentsArray[2]);
                    int bytes = int.Parse(argumentsArray[3]);

                    if (cmdType == Opcode.CAS)
                    {
                        ulong casUnique = ulong.Parse(argumentsArray[4]);
                        _command = new StorageCommand(cmdType, key, flags, expTime, casUnique, bytes);
                        if (argumentsArray.Length > 5 && argumentsArray[5] == "noreply")
                            _command.NoReply = true;
                    }
                    else
                    {
                        _command = new StorageCommand(cmdType, key, flags, expTime, bytes);
                        if (argumentsArray.Length > 4 && argumentsArray[4] == "noreply")
                            _command.NoReply = true;
                    }

                    this.State = ParserState.WaitingForData;
                }
                catch (Exception e)
                {
                    CreateInvalidCommand("CLIENT_ERROR bad command line format");
                    return;
                }
            }
        }