Exemplo n.º 1
0
func commandSet(q queue.Queue, tokens []string, r *bufio.Reader, w *bufio.Writer) error {

	var noreply string

	fields := len(tokens)
	if fields != 5 && fields != 6 {
		fmt.Fprint(w, CLIENT_ERROR_BADCMD_FORMAT)
		return errors.NotValidf("mc tokens %v ", tokens)
	}
	cmd := tokens[0]
	key := tokens[1]
	if fields == 6 {
		noreply = tokens[5]
	}

	flag, err := strconv.ParseUint(tokens[2], 10, 32)
	if err != nil {
		fmt.Fprint(w, CLIENT_ERROR_BADCMD_FORMAT)
		return errors.Trace(err)
	}

	length, err := strconv.ParseUint(tokens[4], 10, 32)
	if err != nil {
		fmt.Fprint(w, CLIENT_ERROR_BADCMD_FORMAT)
		return errors.Trace(err)
	}

	data := make([]byte, length)
	_, err = io.ReadAtLeast(r, data, int(length))
	if err != nil {
		fmt.Fprint(w, CLIENT_ERROR_BAD_DATACHUNK)
		return errors.Trace(err)
	}
	r.ReadString('\n')

	keys := strings.Split(key, ".")
	group := defaultGroup
	queue := keys[0]
	if len(keys) > 1 {
		group = keys[0]
		queue = keys[1]
	}

	id, err := q.SendMessage(queue, group, data, flag)
	if err != nil {
		fmt.Fprintf(w, "%s %s\r\n", ENGINE_ERROR_PREFIX, err)
		return nil
	}

	if NOREPLY == noreply {
		return nil
	}

	// if eset command, return message id
	if strings.EqualFold(cmd, ESET_NAME) {
		fmt.Fprint(w, id+" "+STORED)
		return nil
	}
	fmt.Fprint(w, STORED)
	return nil
}