2
0

ScanRowValue accepts interface{} dst

This commit is contained in:
Jack Christensen
2020-05-02 17:17:12 -05:00
parent 10838b39f6
commit 37e976192b
4 changed files with 6 additions and 22 deletions
+4 -4
View File
@@ -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
+1 -15
View File
@@ -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
}
-2
View File
@@ -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 {
+1 -1
View File
@@ -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))
}