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

	fields := len(tokens)
	if fields < 2 {
		fmt.Fprint(w, ERROR)
		return errors.NotValidf("mc tokens %v ", tokens)
	}
	cmd := tokens[0]
	keyValues := make([]pair, 0)
	for _, key := range tokens[1:] {
		k := strings.Split(key, ".")
		queue := k[0]
		group := defaultGroup
		if len(k) > 1 {
			group = k[0]
			queue = k[1]
		}

		id, data, flag, err := q.RecvMessage(queue, group)
		if err != nil {
			if errors.Cause(err) == kafka.ErrTimeout {
				w.WriteString(END)
			} else {
				fmt.Fprintf(w, "%s %s\r\n", ENGINE_ERROR_PREFIX, err)
			}
			return nil
		}
		// eset data : idlen id data
		if strings.EqualFold(cmd, EGET_NAME) {
			idLen := (byte)(len(id))
			esetData := make([]byte, 0)
			esetData = append(esetData, idLen)
			esetData = append(esetData, ([]byte)(id)...)
			data = append(esetData, data...)
		}

		keyValues = append(keyValues, pair{
			key:   key,
			queue: queue,
			group: group,
			id:    id,
			value: data,
			flag:  flag,
		})
	}

	for _, kv := range keyValues {
		fmt.Fprintf(w, "%s %s %d %d\r\n", VALUE, kv.key, kv.flag, len(kv.value))
		w.Write(kv.value)
		w.WriteString("\r\n")
		if strings.EqualFold(cmd, GET_NAME) {
			q.AckMessage(kv.queue, kv.group, kv.id)
		}
	}
	w.WriteString(END)
	return nil
}