func (w *respWriter) writeError(err error) { w.buff.Write(hack.Slice("-")) if err != nil { w.buff.WriteByte(' ') w.buff.Write(hack.Slice(err.Error())) } w.buff.Write(Delims) }
func formatBinaryValue(value interface{}) ([]byte, error) { switch v := value.(type) { case int8: return Uint64ToBytes(uint64(v)), nil case int16: return Uint64ToBytes(uint64(v)), nil case int32: return Uint64ToBytes(uint64(v)), nil case int64: return Uint64ToBytes(uint64(v)), nil case int: return Uint64ToBytes(uint64(v)), nil case uint8: return Uint64ToBytes(uint64(v)), nil case uint16: return Uint64ToBytes(uint64(v)), nil case uint32: return Uint64ToBytes(uint64(v)), nil case uint64: return Uint64ToBytes(uint64(v)), nil case uint: return Uint64ToBytes(uint64(v)), nil case float32: return Uint64ToBytes(math.Float64bits(float64(v))), nil case float64: return Uint64ToBytes(math.Float64bits(v)), nil case []byte: return v, nil case string: return hack.Slice(v), nil default: return nil, errors.Errorf("invalid type %T", value) } }
func formatTextValue(value interface{}) ([]byte, error) { switch v := value.(type) { case int8: return strconv.AppendInt(nil, int64(v), 10), nil case int16: return strconv.AppendInt(nil, int64(v), 10), nil case int32: return strconv.AppendInt(nil, int64(v), 10), nil case int64: return strconv.AppendInt(nil, int64(v), 10), nil case int: return strconv.AppendInt(nil, int64(v), 10), nil case uint8: return strconv.AppendUint(nil, uint64(v), 10), nil case uint16: return strconv.AppendUint(nil, uint64(v), 10), nil case uint32: return strconv.AppendUint(nil, uint64(v), 10), nil case uint64: return strconv.AppendUint(nil, uint64(v), 10), nil case uint: return strconv.AppendUint(nil, uint64(v), 10), nil case float32: return strconv.AppendFloat(nil, float64(v), 'f', -1, 64), nil case float64: return strconv.AppendFloat(nil, float64(v), 'f', -1, 64), nil case []byte: return v, nil case string: return hack.Slice(v), nil default: return nil, errors.Errorf("invalid type %T", value) } }
func (w *respWriter) writeArray(lst []interface{}) { w.buff.WriteByte('*') if lst == nil { w.buff.Write(NullArray) w.buff.Write(Delims) } else { w.buff.Write(hack.Slice(strconv.Itoa(len(lst)))) w.buff.Write(Delims) for i := 0; i < len(lst); i++ { switch v := lst[i].(type) { case []interface{}: w.writeArray(v) case [][]byte: w.writeSliceArray(v) case []byte: w.writeBulk(v) case nil: w.writeBulk(nil) case int64: w.writeInteger(v) default: panic(fmt.Sprintf("invalid array type %T %v", lst[i], v)) } } } }
func scriptLoadCommand(c *client) error { s := c.app.script l := s.l if len(c.args) != 2 { return ErrCmdParams } h := sha1.Sum(c.args[1]) key := hex.EncodeToString(h[0:20]) if r := l.LoadString(hack.String(c.args[1])); r != 0 { err := fmt.Errorf("%s", l.ToString(-1)) l.Pop(1) return err } else { l.PushValue(-1) l.SetGlobal(key) s.chunks[key] = struct{}{} } c.resp.writeBulk(hack.Slice(key)) return nil }
func (w *respWriter) writeBulkFrom(n int64, rb io.Reader) { w.buff.WriteByte('$') w.buff.Write(hack.Slice(strconv.FormatInt(n, 10))) w.buff.Write(Delims) io.Copy(w.buff, rb) w.buff.Write(Delims) }
func BuildSimpleBinaryResultset(names []string, values [][]interface{}) (*Resultset, error) { r := new(Resultset) r.Fields = make([]*Field, len(names)) var b []byte var err error bitmapLen := ((len(names) + 7 + 2) >> 3) for i, vs := range values { if len(vs) != len(r.Fields) { return nil, errors.Errorf("row %d has %d column not equal %d", i, len(vs), len(r.Fields)) } var row []byte nullBitmap := make([]byte, bitmapLen) row = append(row, 0) row = append(row, nullBitmap...) for j, value := range vs { if i == 0 { field := &Field{} r.Fields[j] = field field.Name = hack.Slice(names[j]) if err = formatField(field, value); err != nil { return nil, errors.Trace(err) } } if value == nil { nullBitmap[(i+2)/8] |= (1 << (uint(i+2) % 8)) continue } b, err = formatBinaryValue(value) if err != nil { return nil, errors.Trace(err) } if r.Fields[j].Type == MYSQL_TYPE_VAR_STRING { row = append(row, PutLengthEncodedString(b)...) } else { row = append(row, b...) } } copy(row[1:], nullBitmap) r.RowDatas = append(r.RowDatas, row) } return r, nil }
func (w *respWriter) writeBulk(b []byte) { w.buff.WriteByte('$') if b == nil { w.buff.Write(NullBulk) } else { w.buff.Write(hack.Slice(strconv.Itoa(len(b)))) w.buff.Write(Delims) w.buff.Write(b) } w.buff.Write(Delims) }
func luaSha1Hex(l *lua.State) int { argc := l.GetTop() if argc != 1 { luaPushError(l, "wrong number of arguments") return 1 } s := l.ToString(1) s = hex.EncodeToString(hack.Slice(s)) l.PushString(s) return 1 }
// only support utf-8 func Escape(sql string) string { dest := make([]byte, 0, 2*len(sql)) for _, w := range hack.Slice(sql) { if c := EncodeMap[w]; c == DONTESCAPE { dest = append(dest, w) } else { dest = append(dest, '\\', c) } } return string(dest) }
func luaReplyToLedisReply(l *lua.State) interface{} { base := l.GetTop() defer func() { l.SetTop(base - 1) }() switch l.Type(-1) { case lua.LUA_TSTRING: return hack.Slice(l.ToString(-1)) case lua.LUA_TBOOLEAN: if l.ToBoolean(-1) { return int64(1) } else { return nil } case lua.LUA_TNUMBER: return int64(l.ToInteger(-1)) case lua.LUA_TTABLE: l.PushString("err") l.GetTable(-2) if l.Type(-1) == lua.LUA_TSTRING { return fmt.Errorf("%s", l.ToString(-1)) } l.Pop(1) l.PushString("ok") l.GetTable(-2) if l.Type(-1) == lua.LUA_TSTRING { return l.ToString(-1) } else { l.Pop(1) ay := make([]interface{}, 0) for i := 1; ; i++ { l.PushInteger(int64(i)) l.GetTable(-2) if l.Type(-1) == lua.LUA_TNIL { l.Pop(1) break } ay = append(ay, luaReplyToLedisReply(l)) } return ay } default: return nil } }
func (w *respWriter) writeSliceArray(lst [][]byte) { w.buff.WriteByte('*') if lst == nil { w.buff.Write(NullArray) w.buff.Write(Delims) } else { w.buff.Write(hack.Slice(strconv.Itoa(len(lst)))) w.buff.Write(Delims) for i := 0; i < len(lst); i++ { w.writeBulk(lst[i]) } } }
func (w *respWriter) writeScorePairArray(lst []ledis.ScorePair, withScores bool) { w.buff.WriteByte('*') if lst == nil { w.buff.Write(NullArray) w.buff.Write(Delims) } else { if withScores { w.buff.Write(hack.Slice(strconv.Itoa(len(lst) * 2))) w.buff.Write(Delims) } else { w.buff.Write(hack.Slice(strconv.Itoa(len(lst)))) w.buff.Write(Delims) } for i := 0; i < len(lst); i++ { w.writeBulk(lst[i].Member) if withScores { w.writeBulk(num.FormatInt64ToSlice(lst[i].Score)) } } } }
func (w *respWriter) writeFVPairArray(lst []ledis.FVPair) { w.buff.WriteByte('*') if lst == nil { w.buff.Write(NullArray) w.buff.Write(Delims) } else { w.buff.Write(hack.Slice(strconv.Itoa(len(lst) * 2))) w.buff.Write(Delims) for i := 0; i < len(lst); i++ { w.writeBulk(lst[i].Field) w.writeBulk(lst[i].Value) } } }
func BuildSimpleTextResultset(names []string, values [][]interface{}) (*Resultset, error) { r := new(Resultset) r.Fields = make([]*Field, len(names)) var b []byte var err error for i, vs := range values { if len(vs) != len(r.Fields) { return nil, errors.Errorf("row %d has %d column not equal %d", i, len(vs), len(r.Fields)) } var row []byte for j, value := range vs { if i == 0 { field := &Field{} r.Fields[j] = field field.Name = hack.Slice(names[j]) if err = formatField(field, value); err != nil { return nil, errors.Trace(err) } } b, err = formatTextValue(value) if err != nil { return nil, errors.Trace(err) } row = append(row, PutLengthEncodedString(b)...) } r.RowDatas = append(r.RowDatas, row) } return r, nil }
func (w *respWriter) writeStatus(status string) { w.buff.WriteByte('+') w.buff.Write(hack.Slice(status)) w.buff.Write(Delims) }