func DelCommand(cmd command.Command, msg protocol.Message) (msgAck protocol.Message) { var ( elements []protocol.Message = msg.GetArraysValue() element protocol.Message hashSlot uint16 classification map[uint16]protocol.Message = make(map[uint16]protocol.Message) msgSpice protocol.Message ok bool ) for _, element = range elements[1:] { hashSlot = crc16.HashSlot(element.GetBytesValue()) if msgSpice, ok = classification[hashSlot]; !ok { msgSpice = protocol.NewMessage().AppendArraysValue(elements[0]) } classification[hashSlot] = msgSpice.AppendArraysValue(element) } // 按slot分命令 var ( node nodes.Nodes msgAckSplit protocol.Message ) msgAck = protocol.NewMessage() for hashSlot, msgSpice = range classification { if node, ok = cluster.GetClusterParameter().GetSlot(hashSlot); !ok { logger.Warningf("获取不到slot节点: %d", hashSlot) continue } msgAckSplit = forwardMsg(msgSpice, node, cmd.CheckReadonly()) msgAck.AppendIntegersValue(msgAckSplit) } return }
func MGetCommand(cmd command.Command, msg protocol.Message) (msgAck protocol.Message) { var ( elements []protocol.Message = msg.GetArraysValue() element protocol.Message hashSlot uint16 classification map[uint16]protocol.Message = make(map[uint16]protocol.Message) msgSpice protocol.Message ok bool ) for _, element = range elements[1:] { hashSlot = crc16.HashSlot(element.GetBytesValue()) if msgSpice, ok = classification[hashSlot]; !ok { msgSpice = protocol.NewMessage().AppendArraysValue(elements[0]) } classification[hashSlot] = msgSpice.AppendArraysValue(element) } // 按slot分命令 var ( node nodes.Nodes msgAckSplit protocol.Message msgAckMap map[protocol.Message]protocol.Message = make(map[protocol.Message]protocol.Message) msgKey int msgValue protocol.Message ) for hashSlot, msgSpice = range classification { if node, ok = cluster.GetClusterParameter().GetSlot(hashSlot); !ok { logger.Warningf("获取不到slot节点: %d", hashSlot) continue } msgAckSplit = forwardMsg(msgSpice, node, cmd.CheckReadonly()) if msgAckSplit.GetProtocolType() != protocol.ArraysType { logger.Warningf("命令结果预期不符: %v", msgSpice) continue } if msgSpice.GetIntegersValue()-1 != msgAckSplit.GetIntegersValue() { logger.Warningf("命令结果预期不符: %v", msgSpice) continue } for msgKey, msgValue = range msgSpice.GetArraysValue()[1:] { msgAckMap[msgValue] = msgAckSplit.GetArraysValue()[msgKey] } } // 整合结果 msgAck = protocol.NewMessage() for _, element = range elements[1:] { if msgValue, ok = msgAckMap[element]; ok { msgAck.AppendArraysValue(msgAckMap[element]) } else { msgAck.AppendArraysValue(protocol.NullBulkString) } } return }
func MSetCommand(cmd command.Command, msg protocol.Message) (msgAck protocol.Message) { var elements []protocol.Message = msg.GetArraysValue() if msg.GetIntegersValue()%2 != 1 { return protocol.NewMessageString(protocol.ERR_wrong_number_command, cmd.Name()) } var ( keyIndex int64 hashSlot uint16 classification map[uint16]protocol.Message = make(map[uint16]protocol.Message) msgSpice protocol.Message ok bool ) for keyIndex = 1; keyIndex < msg.GetIntegersValue(); keyIndex += 2 { hashSlot = crc16.HashSlot(elements[keyIndex].GetBytesValue()) if msgSpice, ok = classification[hashSlot]; !ok { msgSpice = protocol.NewMessage().AppendArraysValue(elements[0]) } classification[hashSlot] = msgSpice.AppendArraysValue(elements[keyIndex]).AppendArraysValue(elements[keyIndex+1]) } // 按slot分命令 var node nodes.Nodes for hashSlot, msgSpice = range classification { if node, ok = cluster.GetClusterParameter().GetSlot(hashSlot); !ok { logger.Warningf("获取不到slot节点: %d", hashSlot) continue } forwardMsg(msgSpice, node, cmd.CheckReadonly()) } return protocol.OK }
func (msg *MessageTest) TestNullBulkStrings(c *C) { var ( buf *bytes.Buffer = bytes.NewBufferString("$-1\r\n") br *bufio.Reader = bufio.NewReader(buf) pmsg protocol.Message = protocol.NewMessage() err error ) err = pmsg.ReadOne(br) c.Assert(err, IsNil) // c.Error(pmsg) }
func (msg *MessageTest) TestNullElementsArrays(c *C) { var ( buf *bytes.Buffer = bytes.NewBufferString("*3\r\n$3\r\nfoo\r\n$-1\r\n$3\r\nbar\r\n") br *bufio.Reader = bufio.NewReader(buf) pmsg protocol.Message = protocol.NewMessage() err error ) err = pmsg.ReadOne(br) c.Assert(err, IsNil) // c.Error(pmsg) }
func (msg *MessageTest) TestMultiArrays(c *C) { var ( buf *bytes.Buffer = bytes.NewBufferString("*2\r\n*3\r\n:1\r\n:2\r\n:3\r\n*2\r\n+Foo\r\n-Bar\r\n") br *bufio.Reader = bufio.NewReader(buf) pmsg protocol.Message = protocol.NewMessage() err error ) err = pmsg.ReadOne(br) c.Assert(err, IsNil) // c.Error(pmsg) }
func (msg *MessageTest) TestIntegersBulkStringArrays(c *C) { var ( buf *bytes.Buffer = bytes.NewBufferString("*5\r\n:1\r\n:2\r\n:3\r\n:4\r\n$6\r\nfoobar\r\n") br *bufio.Reader = bufio.NewReader(buf) pmsg protocol.Message = protocol.NewMessage() err error ) err = pmsg.ReadOne(br) c.Assert(err, IsNil) // c.Error(pmsg) }
func (conn *conn) HandelMessage(msg protocol.Message) (msgAck protocol.Message, err error) { conn.c.SetWriteDeadline(time.Now().Add(conn.writeTimeout)) if err = msg.WriteOne(conn.bw); err != nil { return } conn.c.SetReadDeadline(time.Now().Add(conn.readTimeout)) msgAck = protocol.NewMessage() if err = msgAck.ReadOne(conn.br); err != nil { return } return }
func main() { c := commands.NewCommandTree() c.AddCommand([]byte("aBcD"), commands.NewCommand()) fmt.Println(c.SearchCommand([]byte("ABCD"))) fmt.Println(c.SearchCommand([]byte("AbCD"))) fmt.Println(c.SearchCommand([]byte("ABCd"))) fmt.Println(c.SearchCommand([]byte("ABC"))) for i := 'a'; i <= 'z'; i++ { j := util.ToUpper(byte(i)) k := util.ToLower(j) fmt.Println(i, j, k) } return socketClent, err := socket.NewTClientSocket("10.10.10.227:6679") // socketClent, err := socket.NewTClientSocket("127.0.0.1:6679") fmt.Println(socketClent, err) conn, err := socketClent.DialTimeout(time.Duration(3 * time.Second)) fmt.Println(conn, err) var ( br *bufio.Reader = bufio.NewReader(conn) bw *bufio.Writer = bufio.NewWriter(conn) msgAck protocol.Message = protocol.NewMessage() ) // 发数据 var rawBytes []byte = []byte("*1\r\n$4\r\nINFO\r\n") //var rawBytes []byte = []byte{42, 50, 13, 10, 36, 55, 13, 10, 99, 108, 117, 115, 116, 101, 114, 13, 10, 36, 53, 13, 10, 115, 108, 111, 116, 115, 13, 10} //var rawBytes []byte = []byte("*2\r\n$7\r\nCLUSTER\r\n$5\r\nSLOTS\r\n") fmt.Println(string(rawBytes)) if _, err = bw.Write(rawBytes); err != nil { fmt.Println(err) return } bw.Flush() // 收数据 if err = msgAck.ReadOne(br); err != nil { fmt.Println(err) } fmt.Println(msgAck) }
func (conn *conn) readMessage() (msg protocol.Message, err error) { msg = protocol.NewMessage() err = msg.ReadOne(conn.br) conn.error(err, "readMessage 出错") return }