diff --git a/pgtype/box.go b/pgtype/box.go index 67e24237..7db7d5a2 100644 --- a/pgtype/box.go +++ b/pgtype/box.go @@ -126,19 +126,7 @@ func (BoxCodec) PlanScan(ci *ConnInfo, oid uint32, format int16, target interfac } func (c BoxCodec) DecodeDatabaseSQLValue(ci *ConnInfo, oid uint32, format int16, src []byte) (driver.Value, error) { - if format == TextFormatCode { - return string(src), nil - } else { - box, err := c.DecodeValue(ci, oid, format, src) - if err != nil { - return nil, err - } - buf, err := c.Encode(ci, oid, TextFormatCode, box, nil) - if err != nil { - return nil, err - } - return string(buf), nil - } + return codecDecodeToTextFormat(c, ci, oid, format, src) } func (c BoxCodec) DecodeValue(ci *ConnInfo, oid uint32, format int16, src []byte) (interface{}, error) { diff --git a/pgtype/circle.go b/pgtype/circle.go index 83c97453..f1f66175 100644 --- a/pgtype/circle.go +++ b/pgtype/circle.go @@ -124,19 +124,7 @@ func (CircleCodec) PlanScan(ci *ConnInfo, oid uint32, format int16, target inter } func (c CircleCodec) DecodeDatabaseSQLValue(ci *ConnInfo, oid uint32, format int16, src []byte) (driver.Value, error) { - if format == TextFormatCode { - return string(src), nil - } else { - circle, err := c.DecodeValue(ci, oid, format, src) - if err != nil { - return nil, err - } - buf, err := c.Encode(ci, oid, TextFormatCode, circle, nil) - if err != nil { - return nil, err - } - return string(buf), nil - } + return codecDecodeToTextFormat(c, ci, oid, format, src) } func (c CircleCodec) DecodeValue(ci *ConnInfo, oid uint32, format int16, src []byte) (interface{}, error) { diff --git a/pgtype/int.go b/pgtype/int.go index 609a58a3..21259beb 100644 --- a/pgtype/int.go +++ b/pgtype/int.go @@ -209,11 +209,7 @@ func (c Int2Codec) DecodeDatabaseSQLValue(ci *ConnInfo, oid uint32, format int16 } var n int64 - scanPlan := c.PlanScan(ci, oid, format, &n, true) - if scanPlan == nil { - return nil, fmt.Errorf("PlanScan did not find a plan") - } - err := scanPlan.Scan(ci, oid, format, src, &n) + err := codecScan(c, ci, oid, format, src, &n) if err != nil { return nil, err } @@ -693,11 +689,7 @@ func (c Int4Codec) DecodeDatabaseSQLValue(ci *ConnInfo, oid uint32, format int16 } var n int64 - scanPlan := c.PlanScan(ci, oid, format, &n, true) - if scanPlan == nil { - return nil, fmt.Errorf("PlanScan did not find a plan") - } - err := scanPlan.Scan(ci, oid, format, src, &n) + err := codecScan(c, ci, oid, format, src, &n) if err != nil { return nil, err } @@ -1188,11 +1180,7 @@ func (c Int8Codec) DecodeDatabaseSQLValue(ci *ConnInfo, oid uint32, format int16 } var n int64 - scanPlan := c.PlanScan(ci, oid, format, &n, true) - if scanPlan == nil { - return nil, fmt.Errorf("PlanScan did not find a plan") - } - err := scanPlan.Scan(ci, oid, format, src, &n) + err := codecScan(c, ci, oid, format, src, &n) if err != nil { return nil, err } diff --git a/pgtype/int.go.erb b/pgtype/int.go.erb index 6803c2ea..546494d4 100644 --- a/pgtype/int.go.erb +++ b/pgtype/int.go.erb @@ -210,11 +210,7 @@ func (c Int<%= pg_byte_size %>Codec) DecodeDatabaseSQLValue(ci *ConnInfo, oid ui } var n int64 - scanPlan := c.PlanScan(ci, oid, format, &n, true) - if scanPlan == nil { - return nil, fmt.Errorf("PlanScan did not find a plan") - } - err := scanPlan.Scan(ci, oid, format, src, &n) + err := codecScan(c, ci, oid, format, src, &n) if err != nil { return nil, err } diff --git a/pgtype/pgtype.go b/pgtype/pgtype.go index d5e52830..5e924e1b 100644 --- a/pgtype/pgtype.go +++ b/pgtype/pgtype.go @@ -968,3 +968,19 @@ func codecScan(codec Codec, ci *ConnInfo, oid uint32, format int16, src []byte, } return scanPlan.Scan(ci, oid, format, src, dst) } + +func codecDecodeToTextFormat(codec Codec, ci *ConnInfo, oid uint32, format int16, src []byte) (driver.Value, error) { + if format == TextFormatCode { + return string(src), nil + } else { + value, err := codec.DecodeValue(ci, oid, format, src) + if err != nil { + return nil, err + } + buf, err := codec.Encode(ci, oid, TextFormatCode, value, nil) + if err != nil { + return nil, err + } + return string(buf), nil + } +}