コード例 #1
0
        public static RedisClusterNodeInfo[] Parse(RedisString lines)
        {
            if (!ReferenceEquals(lines, null))
            {
                var linesValue = lines.Value;
                if (!linesValue.IsEmpty())
                {
                    var items = linesValue.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
                    if (items != null)
                    {
                        var count = items.Length;
                        if (count > 0)
                        {
                            var result = new List <RedisClusterNodeInfo>(count);

                            for (var i = 0; i < count; i++)
                            {
                                var item = items[i];
                                if (!item.IsEmpty())
                                {
                                    var parts = item.Split(new[] { ' ' }, StringSplitOptions.None);
                                    if (!parts.IsEmpty())
                                    {
                                        result.Add(new RedisClusterNodeInfo(parts));
                                    }
                                }
                            }

                            return(result.ToArray());
                        }
                    }
                }
            }
            return(null);
        }
コード例 #2
0
        }                                                                                                    // 1117

        #endregion Properties

        #region Methods

        protected virtual void Parse(RedisString lines)
        {
            if (!ReferenceEquals(lines, null))
            {
                var linesValue = lines.Value;
                if (!linesValue.IsEmpty())
                {
                    var items = linesValue.Split(new[] { RedisConstants.CRLF }, StringSplitOptions.RemoveEmptyEntries);
                    if (items != null)
                    {
                        var count = items.Length;
                        if (count > 0)
                        {
                            for (var i = 0; i < count; i += 2)
                            {
                                var item = items[i];
                                if (item != null)
                                {
                                    var length = item.Length;
                                    if (length > 0)
                                    {
                                        var pos = item.IndexOf(':');
                                        if (pos > -1)
                                        {
                                            var key = (item.Substring(0, pos) ?? String.Empty).Trim();
                                            if (!key.IsEmpty())
                                            {
                                                var value = pos < length - 1 ? (item.Substring(pos + 1, length - pos - 1) ?? String.Empty).Trim() : null;
                                                base[key] = value.IsEmpty() ? null : value;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
コード例 #3
0
        protected static RedisMonitorMessage ToMonitorMessage(RedisString str)
        {
            if (!ReferenceEquals(str, null))
            {
                var data = str.Value;
                if (data != null)
                {
                    var dataLength = data.Length;
                    if (dataLength > 0)
                    {
                        var startPos     = 0;
                        var partStartPos = -1;
                        var currentState = MessageParseState.Undefined;

                        var timeDotPos = -1;
                        var time       = DateTime.MinValue;

                        var command    = (string)null;
                        var msgData    = (string)null;
                        var clientInfo = (string)null;

                        for (var i = 0; i < dataLength; i++)
                        {
                            if (i - startPos > RedisConstants.KByte)
                            {
                                break;
                            }

                            var ch = data[i];
                            switch (currentState)
                            {
                            case MessageParseState.Undefined:
                            {
                                if (char.IsWhiteSpace(ch))
                                {
                                    continue;
                                }
                                startPos     = i;
                                partStartPos = i;
                                currentState = MessageParseState.Time;
                            }
                            break;

                            case MessageParseState.Time:
                            {
                                if (char.IsNumber(ch))
                                {
                                    if (i - partStartPos > 25)
                                    {
                                        currentState = MessageParseState.Invalid;
                                    }
                                    continue;
                                }

                                if (ch == '.')
                                {
                                    timeDotPos = i;
                                }
                                else if (ch != ' ')
                                {
                                    currentState = MessageParseState.Invalid;
                                }
                                else
                                {
                                    var length = i - partStartPos;
                                    if (length < 1)
                                    {
                                        currentState = MessageParseState.Invalid;
                                    }
                                    else
                                    {
                                        var timeStr = data.Substring(partStartPos, length);

                                        if (timeDotPos < 0)
                                        {
                                            time = timeStr.ToInt().FromUnixTimeStamp();
                                        }
                                        else
                                        {
                                            time = ((timeDotPos == 0) ? "0" : timeStr.Substring(0, timeDotPos)).ToInt()
                                                   .FromUnixTimeStamp(timeStr.Substring(timeDotPos + 1, timeStr.Length - timeDotPos - 1).ToInt(0));
                                        }

                                        partStartPos = i + 1;
                                        currentState = MessageParseState.ClientInfoStart;
                                    }
                                }
                            }
                            break;

                            case MessageParseState.ClientInfoStart:
                            {
                                if (char.IsWhiteSpace(ch))
                                {
                                    if (i - partStartPos > 100)
                                    {
                                        currentState = MessageParseState.Invalid;
                                    }
                                    continue;
                                }

                                if (ch != '[')
                                {
                                    currentState = MessageParseState.Invalid;
                                }
                                else
                                {
                                    partStartPos = i + 1;
                                    currentState = MessageParseState.ClientInfo;
                                }
                            }
                            break;

                            case MessageParseState.ClientInfo:
                            {
                                var length = i - partStartPos;
                                if (ch == ']')
                                {
                                    if (length < 0)
                                    {
                                        currentState = MessageParseState.Invalid;
                                    }
                                    else
                                    {
                                        clientInfo = data.Substring(partStartPos, length);

                                        partStartPos = i + 1;
                                        currentState = MessageParseState.MessageStart;
                                    }
                                    continue;
                                }

                                if (length > 50)
                                {
                                    currentState = MessageParseState.Invalid;
                                }
                            }
                            break;

                            case MessageParseState.MessageStart:
                            {
                                if (char.IsWhiteSpace(ch))
                                {
                                    if (i - partStartPos > 100)
                                    {
                                        currentState = MessageParseState.Invalid;
                                    }
                                    continue;
                                }

                                partStartPos = i;
                                currentState = MessageParseState.Message;
                            }
                            break;

                            case MessageParseState.Message:
                            {
                                var length = dataLength - partStartPos;
                                if (length > 0)
                                {
                                    command = data.Substring(partStartPos, length);

                                    var dataPos = command.IndexOf("\" ", 0, Math.Min(25, length), StringComparison.Ordinal);
                                    if (dataPos > -1)
                                    {
                                        msgData = command.Substring(dataPos + 2);
                                        command = command.Substring(0, dataPos + 1);
                                    }
                                }
                                return(new RedisMonitorMessage(time, clientInfo, command, msgData));
                            }

                            default:
                                return(RedisMonitorMessage.Empty);
                            }
                        }

                        if (currentState == MessageParseState.Message ||
                            currentState == MessageParseState.MessageStart)
                        {
                            return(new RedisMonitorMessage(time, clientInfo, command, msgData));
                        }
                    }
                }
            }
            return(RedisMonitorMessage.Empty);
        }
コード例 #4
0
 internal RedisClusterInfo(RedisString lines)
 {
     Parse(lines);
 }