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  }