pgx/composite_fields.go

77 lines
1.7 KiB
Go

package pgtype
import (
errors "golang.org/x/xerrors"
)
// CompositeFields scans the fields of a composite type into the elements of the CompositeFields value. To scan a
// nullable value use a *CompositeFields. It will be set to nil in case of null.
type CompositeFields []interface{}
func (cf CompositeFields) DecodeBinary(ci *ConnInfo, src []byte) error {
if len(cf) == 0 {
return errors.Errorf("cannot decode into empty CompositeFields")
}
if src == nil {
return errors.Errorf("cannot decode unexpected null into CompositeFields")
}
scanner, err := NewCompositeBinaryScanner(src)
if err != nil {
return err
}
if len(cf) != scanner.FieldCount() {
return errors.Errorf("SQL composite can't be read, field count mismatch. expected %d , found %d", len(cf), scanner.FieldCount())
}
for i := 0; scanner.Scan(); i++ {
err := ci.Scan(scanner.OID(), BinaryFormatCode, scanner.Bytes(), cf[i])
if err != nil {
return err
}
}
if scanner.Err() != nil {
return scanner.Err()
}
return nil
}
func (cf CompositeFields) DecodeText(ci *ConnInfo, src []byte) error {
if len(cf) == 0 {
return errors.Errorf("cannot decode into empty CompositeFields")
}
if src == nil {
return errors.Errorf("cannot decode unexpected null into CompositeFields")
}
scanner, err := NewCompositeTextScanner(src)
if err != nil {
return err
}
fieldCount := 0
for i := 0; scanner.Scan(); i++ {
err := ci.Scan(0, TextFormatCode, scanner.Bytes(), cf[i])
if err != nil {
return err
}
fieldCount += 1
}
if scanner.Err() != nil {
return scanner.Err()
}
if len(cf) != fieldCount {
return errors.Errorf("SQL composite can't be read, field count mismatch. expected %d , found %d", len(cf), fieldCount)
}
return nil
}