cubefs
211 строк · 3.9 Кб
1package sarama2
3import (4"encoding/binary"5"errors"6"fmt"7"math"8
9"github.com/rcrowley/go-metrics"10)
11
12type prepEncoder struct {13stack []pushEncoder14length int15}
16
17// primitives
18
19func (pe *prepEncoder) putInt8(in int8) {20pe.length++21}
22
23func (pe *prepEncoder) putInt16(in int16) {24pe.length += 225}
26
27func (pe *prepEncoder) putInt32(in int32) {28pe.length += 429}
30
31func (pe *prepEncoder) putInt64(in int64) {32pe.length += 833}
34
35func (pe *prepEncoder) putVarint(in int64) {36var buf [binary.MaxVarintLen64]byte37pe.length += binary.PutVarint(buf[:], in)38}
39
40func (pe *prepEncoder) putUVarint(in uint64) {41var buf [binary.MaxVarintLen64]byte42pe.length += binary.PutUvarint(buf[:], in)43}
44
45func (pe *prepEncoder) putFloat64(in float64) {46pe.length += 847}
48
49func (pe *prepEncoder) putArrayLength(in int) error {50if in > math.MaxInt32 {51return PacketEncodingError{fmt.Sprintf("array too long (%d)", in)}52}53pe.length += 454return nil55}
56
57func (pe *prepEncoder) putCompactArrayLength(in int) {58pe.putUVarint(uint64(in + 1))59}
60
61func (pe *prepEncoder) putBool(in bool) {62pe.length++63}
64
65// arrays
66
67func (pe *prepEncoder) putBytes(in []byte) error {68pe.length += 469if in == nil {70return nil71}72return pe.putRawBytes(in)73}
74
75func (pe *prepEncoder) putVarintBytes(in []byte) error {76if in == nil {77pe.putVarint(-1)78return nil79}80pe.putVarint(int64(len(in)))81return pe.putRawBytes(in)82}
83
84func (pe *prepEncoder) putCompactBytes(in []byte) error {85pe.putUVarint(uint64(len(in) + 1))86return pe.putRawBytes(in)87}
88
89func (pe *prepEncoder) putCompactString(in string) error {90pe.putCompactArrayLength(len(in))91return pe.putRawBytes([]byte(in))92}
93
94func (pe *prepEncoder) putNullableCompactString(in *string) error {95if in == nil {96pe.putUVarint(0)97return nil98} else {99return pe.putCompactString(*in)100}101}
102
103func (pe *prepEncoder) putRawBytes(in []byte) error {104if len(in) > math.MaxInt32 {105return PacketEncodingError{fmt.Sprintf("byteslice too long (%d)", len(in))}106}107pe.length += len(in)108return nil109}
110
111func (pe *prepEncoder) putNullableString(in *string) error {112if in == nil {113pe.length += 2114return nil115}116return pe.putString(*in)117}
118
119func (pe *prepEncoder) putString(in string) error {120pe.length += 2121if len(in) > math.MaxInt16 {122return PacketEncodingError{fmt.Sprintf("string too long (%d)", len(in))}123}124pe.length += len(in)125return nil126}
127
128func (pe *prepEncoder) putStringArray(in []string) error {129err := pe.putArrayLength(len(in))130if err != nil {131return err132}133
134for _, str := range in {135if err := pe.putString(str); err != nil {136return err137}138}139
140return nil141}
142
143func (pe *prepEncoder) putCompactInt32Array(in []int32) error {144if in == nil {145return errors.New("expected int32 array to be non null")146}147
148pe.putUVarint(uint64(len(in)) + 1)149pe.length += 4 * len(in)150return nil151}
152
153func (pe *prepEncoder) putNullableCompactInt32Array(in []int32) error {154if in == nil {155pe.putUVarint(0)156return nil157}158
159pe.putUVarint(uint64(len(in)) + 1)160pe.length += 4 * len(in)161return nil162}
163
164func (pe *prepEncoder) putInt32Array(in []int32) error {165err := pe.putArrayLength(len(in))166if err != nil {167return err168}169pe.length += 4 * len(in)170return nil171}
172
173func (pe *prepEncoder) putInt64Array(in []int64) error {174err := pe.putArrayLength(len(in))175if err != nil {176return err177}178pe.length += 8 * len(in)179return nil180}
181
182func (pe *prepEncoder) putEmptyTaggedFieldArray() {183pe.putUVarint(0)184}
185
186func (pe *prepEncoder) offset() int {187return pe.length188}
189
190// stackable
191
192func (pe *prepEncoder) push(in pushEncoder) {193in.saveOffset(pe.length)194pe.length += in.reserveLength()195pe.stack = append(pe.stack, in)196}
197
198func (pe *prepEncoder) pop() error {199in := pe.stack[len(pe.stack)-1]200pe.stack = pe.stack[:len(pe.stack)-1]201if dpe, ok := in.(dynamicPushEncoder); ok {202pe.length += dpe.adjustLength(pe.length)203}204
205return nil206}
207
208// we do not record metrics during the prep encoder pass
209func (pe *prepEncoder) metricRegistry() metrics.Registry {210return nil211}
212