github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/pingcap/go-hbase/iohelper/pbbuffer.go (about) 1 package iohelper 2 3 import ( 4 "encoding/binary" 5 6 pb "github.com/insionng/yougam/libraries/golang/protobuf/proto" 7 "github.com/insionng/yougam/libraries/juju/errors" 8 ) 9 10 type PbBuffer struct { 11 b []byte 12 } 13 14 func NewPbBuffer() *PbBuffer { 15 b := []byte{} 16 return &PbBuffer{ 17 b: b, 18 } 19 } 20 21 func (b *PbBuffer) Bytes() []byte { 22 return b.b 23 } 24 25 func (b *PbBuffer) Write(d []byte) (int, error) { 26 b.b = append(b.b, d...) 27 return len(d), nil 28 } 29 30 func (b *PbBuffer) WriteByte(d byte) error { 31 return binary.Write(b, binary.BigEndian, d) 32 } 33 34 func (b *PbBuffer) WriteString(d string) error { 35 return binary.Write(b, binary.BigEndian, d) 36 } 37 38 func (b *PbBuffer) WriteInt32(d int32) error { 39 return binary.Write(b, binary.BigEndian, d) 40 } 41 42 func (b *PbBuffer) WriteInt64(d int64) error { 43 return binary.Write(b, binary.BigEndian, d) 44 } 45 46 func (b *PbBuffer) WriteFloat32(d float32) error { 47 return binary.Write(b, binary.BigEndian, d) 48 } 49 50 func (b *PbBuffer) WriteFloat64(d float64) error { 51 return binary.Write(b, binary.BigEndian, d) 52 } 53 54 func (b *PbBuffer) WritePBMessage(d pb.Message) error { 55 buf, err := pb.Marshal(d) 56 if err != nil { 57 return errors.Trace(err) 58 } 59 60 _, err = b.Write(buf) 61 return errors.Trace(err) 62 } 63 64 func (b *PbBuffer) WriteDelimitedBuffers(bufs ...*PbBuffer) error { 65 totalLength := 0 66 lens := make([][]byte, len(bufs)) 67 for i, v := range bufs { 68 n := len(v.Bytes()) 69 lenb := pb.EncodeVarint(uint64(n)) 70 71 totalLength += len(lenb) + n 72 lens[i] = lenb 73 } 74 75 err := b.WriteInt32(int32(totalLength)) 76 if err != nil { 77 return errors.Trace(err) 78 } 79 80 for i, v := range bufs { 81 _, err = b.Write(lens[i]) 82 if err != nil { 83 return errors.Trace(err) 84 } 85 86 _, err = b.Write(v.Bytes()) 87 if err != nil { 88 return errors.Trace(err) 89 } 90 } 91 92 return nil 93 } 94 95 func (b *PbBuffer) PrependSize() error { 96 size := int32(len(b.b)) 97 newBuf := NewPbBuffer() 98 99 err := newBuf.WriteInt32(size) 100 if err != nil { 101 return errors.Trace(err) 102 } 103 104 _, err = newBuf.Write(b.b) 105 if err != nil { 106 return errors.Trace(err) 107 } 108 109 *b = *newBuf 110 return nil 111 }