github.com/hdt3213/godis@v1.2.9/cluster/multi_helper.go (about)

     1  package cluster
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/base64"
     6  	"github.com/hdt3213/godis/redis/parser"
     7  	"github.com/hdt3213/godis/redis/protocol"
     8  )
     9  
    10  func encodeCmdLine(cmdLines []CmdLine) [][]byte {
    11  	var result [][]byte
    12  	for _, line := range cmdLines {
    13  		raw := protocol.MakeMultiBulkReply(line).ToBytes()
    14  		encoded := make([]byte, base64.StdEncoding.EncodedLen(len(raw)))
    15  		base64.StdEncoding.Encode(encoded, raw)
    16  		result = append(result, encoded)
    17  	}
    18  	return result
    19  }
    20  
    21  func parseEncodedMultiRawReply(args [][]byte) (*protocol.MultiRawReply, error) {
    22  	cmdBuf := new(bytes.Buffer)
    23  	for _, arg := range args {
    24  		dbuf := make([]byte, base64.StdEncoding.DecodedLen(len(arg)))
    25  		n, err := base64.StdEncoding.Decode(dbuf, arg)
    26  		if err != nil {
    27  			continue
    28  		}
    29  		cmdBuf.Write(dbuf[:n])
    30  	}
    31  	cmds, err := parser.ParseBytes(cmdBuf.Bytes())
    32  	if err != nil {
    33  		return nil, protocol.MakeErrReply(err.Error())
    34  	}
    35  	return protocol.MakeMultiRawReply(cmds), nil
    36  }
    37  
    38  func encodeMultiRawReply(src *protocol.MultiRawReply) *protocol.MultiBulkReply {
    39  	args := make([][]byte, 0, len(src.Replies))
    40  	for _, rep := range src.Replies {
    41  		raw := rep.ToBytes()
    42  		encoded := make([]byte, base64.StdEncoding.EncodedLen(len(raw)))
    43  		base64.StdEncoding.Encode(encoded, raw)
    44  		args = append(args, encoded)
    45  	}
    46  	return protocol.MakeMultiBulkReply(args)
    47  }