Skip to content

Commit

Permalink
util/codec: use passed-in buffer in encode functions
Browse files Browse the repository at this point in the history
  • Loading branch information
disksing committed Dec 10, 2015
1 parent ef71bb7 commit c5480f2
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 31 deletions.
7 changes: 3 additions & 4 deletions kv/index_iter.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,16 +138,15 @@ func (c *kvIndex) GenIndexKey(indexedValues []interface{}, h int64) (key []byte,
}
}

var encVal []byte
key = append(key, []byte(c.prefix)...)
if distinct {
encVal, err = codec.EncodeKey(indexedValues...)
key, err = codec.EncodeKey(key, indexedValues...)
} else {
encVal, err = codec.EncodeKey(append(indexedValues, h)...)
key, err = codec.EncodeKey(key, append(indexedValues, h)...)
}
if err != nil {
return nil, false, errors.Trace(err)
}
key = append([]byte(c.prefix), encVal...)
return
}

Expand Down
2 changes: 1 addition & 1 deletion table/tables/tables.go
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@ func (t *Table) EncodeValue(raw interface{}) ([]byte, error) {
if err != nil {
return nil, errors.Trace(err)
}
b, err := codec.EncodeValue(v)
b, err := codec.EncodeValue([]byte(nil), v)
return b, errors.Trace(err)
}

Expand Down
25 changes: 12 additions & 13 deletions util/codec/codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,9 @@ const (
durationFlag
)

func encode(args []interface{}, comparable bool) ([]byte, error) {
var b []byte
for _, arg := range args {
switch v := arg.(type) {
func encode(b []byte, vals []interface{}, comparable bool) ([]byte, error) {
for _, val := range vals {
switch v := val.(type) {
case bool:
b = append(b, intFlag)
if v {
Expand Down Expand Up @@ -129,23 +128,23 @@ func encode(args []interface{}, comparable bool) ([]byte, error) {
case nil:
b = append(b, nilFlag)
default:
return nil, errors.Errorf("unsupport encode type %T", arg)
return nil, errors.Errorf("unsupport encode type %T", val)
}
}

return b, nil
}

// EncodeKey encodes args to a slice which can be sorted lexicographically later.
// EncodeKey guarantees the encoded slice is in ascending order for comparison.
func EncodeKey(args ...interface{}) ([]byte, error) {
return encode(args, true)
// EncodeKey appends the encoded values to byte slice b, returns the appended
// slice. It guarantees the encoded value is in ascending order for comparison.
func EncodeKey(b []byte, v ...interface{}) ([]byte, error) {
return encode(b, v, true)
}

// EncodeValue encodes args to a byte slice which can be decoded later.
// It does not guarantee the order for comparison.
func EncodeValue(args ...interface{}) ([]byte, error) {
return encode(args, false)
// EncodeValue appends the encoded values to byte slice b, returning the appended
// slice. It does not guarantee the order for comparison.
func EncodeValue(b []byte, v ...interface{}) ([]byte, error) {
return encode(b, v, false)
}

// Decode decodes values from a byte slice generated with EncodeKey or EncodeValue
Expand Down
26 changes: 13 additions & 13 deletions util/codec/codec_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,13 +83,13 @@ func (s *testCodecSuite) TestCodecKey(c *C) {
}

for _, t := range table {
b, err := EncodeKey(t.Input...)
b, err := EncodeKey([]byte(nil), t.Input...)
c.Assert(err, IsNil)
args, err := Decode(b)
c.Assert(err, IsNil)
c.Assert(args, DeepEquals, t.Expect)

b, err = EncodeValue(t.Input...)
b, err = EncodeValue([]byte(nil), t.Input...)
c.Assert(err, IsNil)
args, err = Decode(b)
c.Assert(err, IsNil)
Expand Down Expand Up @@ -196,10 +196,10 @@ func (s *testCodecSuite) TestCodecKeyCompare(c *C) {
}

for _, t := range table {
b1, err := EncodeKey(t.Left...)
b1, err := EncodeKey([]byte(nil), t.Left...)
c.Assert(err, IsNil)

b2, err := EncodeKey(t.Right...)
b2, err := EncodeKey([]byte(nil), t.Right...)
c.Assert(err, IsNil)

c.Assert(bytes.Compare(b1, b2), Equals, t.Expect, Commentf("%v - %v - %v - %v - %v", t.Left, t.Right, b1, b2, t.Expect))
Expand Down Expand Up @@ -491,7 +491,7 @@ func (s *testCodecSuite) TestTime(c *C) {
for _, t := range tbl {
m := parseTime(c, t)

b, err := EncodeKey(m)
b, err := EncodeKey([]byte(nil), m)
c.Assert(err, IsNil)
v, err := Decode(b)
c.Assert(err, IsNil)
Expand All @@ -512,9 +512,9 @@ func (s *testCodecSuite) TestTime(c *C) {
m1 := parseTime(c, t.Arg1)
m2 := parseTime(c, t.Arg2)

b1, err := EncodeKey(m1)
b1, err := EncodeKey([]byte(nil), m1)
c.Assert(err, IsNil)
b2, err := EncodeKey(m2)
b2, err := EncodeKey([]byte(nil), m2)
c.Assert(err, IsNil)

ret := bytes.Compare(b1, b2)
Expand All @@ -532,7 +532,7 @@ func (s *testCodecSuite) TestDuration(c *C) {
for _, t := range tbl {
m := parseDuration(c, t)

b, err := EncodeKey(m)
b, err := EncodeKey([]byte(nil), m)
c.Assert(err, IsNil)
v, err := Decode(b)
c.Assert(err, IsNil)
Expand All @@ -554,9 +554,9 @@ func (s *testCodecSuite) TestDuration(c *C) {
m1 := parseDuration(c, t.Arg1)
m2 := parseDuration(c, t.Arg2)

b1, err := EncodeKey(m1)
b1, err := EncodeKey([]byte(nil), m1)
c.Assert(err, IsNil)
b2, err := EncodeKey(m2)
b2, err := EncodeKey([]byte(nil), m2)
c.Assert(err, IsNil)

ret := bytes.Compare(b1, b2)
Expand Down Expand Up @@ -584,7 +584,7 @@ func (s *testCodecSuite) TestDecimal(c *C) {
for _, t := range tbl {
m, err := mysql.ParseDecimal(t)
c.Assert(err, IsNil)
b, err := EncodeKey(m)
b, err := EncodeKey([]byte(nil), m)
c.Assert(err, IsNil)
v, err := Decode(b)
c.Assert(err, IsNil)
Expand Down Expand Up @@ -662,9 +662,9 @@ func (s *testCodecSuite) TestDecimal(c *C) {
m2, err := mysql.ConvertToDecimal(t.Arg2)
c.Assert(err, IsNil)

b1, err := EncodeKey(m1)
b1, err := EncodeKey([]byte(nil), m1)
c.Assert(err, IsNil)
b2, err := EncodeKey(m2)
b2, err := EncodeKey([]byte(nil), m2)
c.Assert(err, IsNil)

ret := bytes.Compare(b1, b2)
Expand Down

0 comments on commit c5480f2

Please sign in to comment.