ScanRowValue accepts interface{} dst
This commit is contained in:
+4
-4
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user