From 37e976192b45fab340e6c8d7cf60dfbe799406f2 Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Sat, 2 May 2020 17:17:12 -0500 Subject: [PATCH] ScanRowValue accepts interface{} dst --- convert.go | 8 ++++---- custom_composite_test.go | 16 +--------------- pgtype.go | 2 -- record_test.go | 2 +- 4 files changed, 6 insertions(+), 22 deletions(-) diff --git a/convert.go b/convert.go index 8008d677..115f33a3 100644 --- a/convert.go +++ b/convert.go @@ -442,7 +442,7 @@ func GetAssignToDstType(dst interface{}) (interface{}, bool) { // most of them implement BinaryDecoder interface. // // ScanRowValue takes ownership of src, caller MUST not use it after call -func ScanRowValue(ci *ConnInfo, src []byte, dst ...BinaryDecoder) error { +func ScanRowValue(ci *ConnInfo, src []byte, dst ...interface{}) error { fieldIter, fieldCount, err := binary.NewRecordFieldIterator(src) if err != nil { return err @@ -452,17 +452,17 @@ func ScanRowValue(ci *ConnInfo, src []byte, dst ...BinaryDecoder) error { return errors.Errorf("can't scan row value, number of fields don't match: found=%d expected=%d", fieldCount, len(dst)) } - _, fieldBytes, eof, err := fieldIter.Next() + fieldOID, fieldBytes, eof, err := fieldIter.Next() for i := 0; !eof; i++ { if err != nil { return err } - if err = dst[i].DecodeBinary(ci, fieldBytes); err != nil { + if err = ci.Scan(fieldOID, BinaryFormatCode, fieldBytes, dst[i]); err != nil { return err } - _, fieldBytes, eof, err = fieldIter.Next() + fieldOID, fieldBytes, eof, err = fieldIter.Next() } return nil diff --git a/custom_composite_test.go b/custom_composite_test.go index 61ea91c5..f6f37ec7 100644 --- a/custom_composite_test.go +++ b/custom_composite_test.go @@ -20,21 +20,7 @@ func (dst *MyType) DecodeBinary(ci *pgtype.ConnInfo, src []byte) error { return errors.New("NULL values can't be decoded. Scan into a &*MyType to handle NULLs") } - a := pgtype.Int4{} - b := pgtype.Text{} - - if err := pgtype.ScanRowValue(ci, src, &a, &b); err != nil { - return err - } - - // type compatibility is checked by AssignTo - // only lossless assignments will succeed - if err := a.AssignTo(&dst.a); err != nil { - return err - } - - // AssignTo also deals with null value handling - if err := b.AssignTo(&dst.b); err != nil { + if err := pgtype.ScanRowValue(ci, src, &dst.a, &dst.b); err != nil { return err } diff --git a/pgtype.go b/pgtype.go index d0d4885c..eead52af 100644 --- a/pgtype.go +++ b/pgtype.go @@ -459,8 +459,6 @@ func (ci *ConnInfo) Scan(oid uint32, formatCode int16, buf []byte, dest interfac } else { return errors.Errorf("%T is not a pgtype.TextDecoder", dt.Value) } - default: - return errors.Errorf("unknown format code: %v", formatCode) } if !isFastType { diff --git a/record_test.go b/record_test.go index 9516612e..3794fcd7 100644 --- a/record_test.go +++ b/record_test.go @@ -93,7 +93,7 @@ func TestScanRowValue(t *testing.T) { t.Fatal(err) } t.Run(tt.sql, func(t *testing.T) { - desc := []pgtype.BinaryDecoder{} + desc := []interface{}{} for _, f := range tt.expected.Fields { desc = append(desc, f.(pgtype.BinaryDecoder)) }