Skip to content

Commit c11908e

Browse files
authored
docstore: fixes to improve handling of byte arrays and non-pointer protocol buffers (#2926)
1 parent e269dcd commit c11908e

File tree

5 files changed

+336
-7
lines changed

5 files changed

+336
-7
lines changed

docstore/awsdynamodb/testdata/TestConformance/Proto.replay

Lines changed: 264 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docstore/driver/codec.go

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,14 @@ func encode(v reflect.Value, enc Encoder) error {
144144
}
145145
return nil
146146
}
147+
if reflect.PtrTo(v.Type()).Implements(protoMessageType) {
148+
bytes, err := proto.Marshal(v.Addr().Interface().(proto.Message))
149+
if err != nil {
150+
return err
151+
}
152+
enc.EncodeBytes(bytes)
153+
return nil
154+
}
147155
if v.Type().Implements(textMarshalerType) {
148156
bytes, err := v.Interface().(encoding.TextMarshaler).MarshalText()
149157
if err != nil {
@@ -388,8 +396,11 @@ func decode(v reflect.Value, d Decoder) error {
388396
if err != nil {
389397
return err
390398
}
391-
v.Set(reflect.ValueOf(val))
392-
return nil
399+
if reflect.TypeOf(val).AssignableTo(v.Type()) {
400+
v.Set(reflect.ValueOf(val))
401+
return nil
402+
}
403+
return decodingError(v, d)
393404
}
394405

395406
// Handle implemented interfaces first.
@@ -510,7 +521,16 @@ func decodeList(v reflect.Value, d Decoder) error {
510521
// supports that, then do the decoding.
511522
if v.Type().Elem().Kind() == reflect.Uint8 {
512523
if b, ok := d.AsBytes(); ok {
513-
v.SetBytes(b)
524+
if v.Kind() == reflect.Slice {
525+
v.SetBytes(b)
526+
return nil
527+
}
528+
// It's an array; copy the data in.
529+
err := prepareLength(v, len(b))
530+
if err != nil {
531+
return err
532+
}
533+
reflect.Copy(v, reflect.ValueOf(b))
514534
return nil
515535
}
516536
// Fall through to decode the []byte as an ordinary slice.
@@ -704,11 +724,11 @@ func fieldByIndexCreate(v reflect.Value, index []int) (reflect.Value, bool) {
704724
}
705725

706726
func decodingError(v reflect.Value, d Decoder) error {
707-
return gcerr.Newf(gcerr.InvalidArgument, nil, "cannot set type %s to %v", v.Type(), d)
727+
return gcerr.New(gcerr.InvalidArgument, nil, 2, fmt.Sprintf("cannot set type %s to %v", v.Type(), d))
708728
}
709729

710730
func overflowError(x interface{}, t reflect.Type) error {
711-
return gcerr.Newf(gcerr.InvalidArgument, nil, "value %v overflows type %s", x, t)
731+
return gcerr.New(gcerr.InvalidArgument, nil, 2, fmt.Sprintf("value %v overflows type %s", x, t))
712732
}
713733

714734
func wrap(err error, code gcerr.ErrorCode) error {

0 commit comments

Comments
 (0)