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); }
} // 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; } } } } } } } } } }
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); }
internal RedisClusterInfo(RedisString lines) { Parse(lines); }