Пример #1
0
func (o Op) IWrite(w *marshal.Writer) {
	w.Write(o.Field)
	if o.Op <= 7 {
		w.Write(o.Op)
	} else {
		w.Write(opmap[o.Op])
	}
	switch v := o.Val.(type) {
	case uint32:
		w.Int8(4)
		w.Uint32(v)
	case uint64:
		w.Int8(8)
		w.Uint64(v)
	case int32:
		w.Int8(4)
		w.Int32(v)
	case int64:
		w.Int8(8)
		w.Int64(v)
	case []byte:
		w.Intvar(len(v))
		w.Bytes(v)
	case string:
		w.Intvar(len(v))
		w.String(v)
	default:
		val := reflect.ValueOf(v)
		wr := marshal.WriterFor(val.Type())
		wr.WithSize(w, val, (*marshal.Writer).Intvar)
	}
}
Пример #2
0
func (i DeleteReq) IWrite(w *marshal.Writer) {
	w.Uint32(i.Space)
	var flags uint32
	if i.Return {
		flags = 1
	}
	w.Uint32(flags)
	WriteTuple(w, i.Key)
}
Пример #3
0
func (u UpdateReq) IWrite(w *marshal.Writer) {
	w.Uint32(u.Space)
	var flags uint32
	if u.Return {
		flags = 1
	}
	w.Uint32(flags)
	WriteTuple(w, u.Key)
	w.Write(u.Ops)
}
Пример #4
0
func (i StoreReq) IWrite(w *marshal.Writer) {
	w.Uint32(i.Space)
	var flags uint32
	if i.Return {
		flags = 1
	}
	flags |= uint32(i.Mode) << 1
	w.Uint32(flags)
	WriteTuple(w, i.Tuple)
}
Пример #5
0
func (s SelectReq) IWrite(w *marshal.Writer) {
	w.Uint32(s.Space)
	w.Uint32(s.Index)
	w.Uint32(s.Offset)
	cnt := CountKeys(s.Keys)
	if s.Limit >= 0 {
		w.Int32(s.Limit)
	} else if s.Limit == SelectN {
		w.Int32(int32(cnt))
	} else {
		w.Int32(1<<31 - 1)
	}
	w.IntUint32(cnt)
	WriteKeys(w, s.Keys)
}
Пример #6
0
func WriteTuple(w *marshal.Writer, i interface{}) {
	switch o := i.(type) {
	case nil:
		return
	case uint8:
		w.Uint32(1)
		w.Uint8(1)
		w.Uint8(o)
	case int8:
		w.Uint32(1)
		w.Uint8(1)
		w.Int8(o)
	case uint16:
		w.Uint32(1)
		w.Uint8(2)
		w.Uint16(o)
	case int16:
		w.Uint32(1)
		w.Uint8(2)
		w.Int16(o)
	case uint32:
		w.Uint32(1)
		w.Uint8(4)
		w.Uint32(o)
	case int32:
		w.Uint32(1)
		w.Uint8(4)
		w.Int32(o)
	case uint64:
		w.Uint32(1)
		w.Uint8(8)
		w.Uint64(o)
	case int64:
		w.Uint32(1)
		w.Uint8(8)
		w.Int64(o)
	case float32:
		w.Uint32(1)
		w.Uint8(4)
		w.Float32(o)
	case float64:
		w.Uint32(1)
		w.Uint8(8)
		w.Float64(o)
	case string:
		w.Uint32(1)
		w.Intvar(len(o))
		w.String(o)
	case []byte:
		w.Uint32(1)
		w.Intvar(len(o))
		w.Bytes(o)
	case []interface{}:
		w.IntUint32(len(o))
		for _, v := range o {
			w.WriteWithSize(v, (*marshal.Writer).Intvar)
		}
	default:
		val := reflect.ValueOf(i)
		rt := val.Type()
		wr := writer(rt)
		wr.Write(w, val)
	}
	return
}