From 218c15a4eb76c1f4d3c99e8f008464e2fc19631c Mon Sep 17 00:00:00 2001 From: jennifersp Date: Wed, 21 Aug 2024 12:04:54 -0700 Subject: [PATCH 1/4] support text scanner for binary format for uint32 --- pgtype/uint32.go | 23 +++++++++++++++++++++++ pgtype/uint32_test.go | 1 + 2 files changed, 24 insertions(+) diff --git a/pgtype/uint32.go b/pgtype/uint32.go index 098c516c1..76de8bcdf 100644 --- a/pgtype/uint32.go +++ b/pgtype/uint32.go @@ -205,6 +205,8 @@ func (Uint32Codec) PlanScan(m *Map, oid uint32, format int16, target any) ScanPl return scanPlanBinaryUint32ToUint32{} case Uint32Scanner: return scanPlanBinaryUint32ToUint32Scanner{} + case TextScanner: + return scanPlanBinaryTextToUint32Scanner{} } case TextFormatCode: switch target.(type) { @@ -282,6 +284,27 @@ func (scanPlanBinaryUint32ToUint32Scanner) Scan(src []byte, dst any) error { return s.ScanUint32(Uint32{Uint32: n, Valid: true}) } +type scanPlanBinaryTextToUint32Scanner struct{} + +func (scanPlanBinaryTextToUint32Scanner) Scan(src []byte, dst any) error { + s, ok := (dst).(TextScanner) + if !ok { + return ErrScanTargetTypeChanged + } + + if src == nil { + return s.ScanText(Text{}) + } + + if len(src) != 4 { + return fmt.Errorf("invalid length for uint4: %v", len(src)) + } + + n := uint64(binary.BigEndian.Uint32(src)) + + return s.ScanText(Text{String: strconv.FormatUint(n, 10), Valid: true}) +} + type scanPlanTextAnyToUint32Scanner struct{} func (scanPlanTextAnyToUint32Scanner) Scan(src []byte, dst any) error { diff --git a/pgtype/uint32_test.go b/pgtype/uint32_test.go index 842de643f..efa4e2730 100644 --- a/pgtype/uint32_test.go +++ b/pgtype/uint32_test.go @@ -17,5 +17,6 @@ func TestUint32Codec(t *testing.T) { }, {pgtype.Uint32{}, new(pgtype.Uint32), isExpectedEq(pgtype.Uint32{})}, {nil, new(pgtype.Uint32), isExpectedEq(pgtype.Uint32{})}, + {"1147", new(string), isExpectedEq("1147")}, }) } From b9f77cb1b333ae368d5bfcbfc477961f50a017f5 Mon Sep 17 00:00:00 2001 From: jennifersp Date: Wed, 21 Aug 2024 12:27:23 -0700 Subject: [PATCH 2/4] fix typo --- pgtype/uint32.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgtype/uint32.go b/pgtype/uint32.go index 76de8bcdf..a668bda45 100644 --- a/pgtype/uint32.go +++ b/pgtype/uint32.go @@ -297,7 +297,7 @@ func (scanPlanBinaryTextToUint32Scanner) Scan(src []byte, dst any) error { } if len(src) != 4 { - return fmt.Errorf("invalid length for uint4: %v", len(src)) + return fmt.Errorf("invalid length for uint32: %v", len(src)) } n := uint64(binary.BigEndian.Uint32(src)) From 926913ad66413e673df59e515d464a3497c88158 Mon Sep 17 00:00:00 2001 From: jennifersp Date: Wed, 21 Aug 2024 15:12:36 -0700 Subject: [PATCH 3/4] rm bound check --- pgtype/uint32.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pgtype/uint32.go b/pgtype/uint32.go index a668bda45..3f0e8fec7 100644 --- a/pgtype/uint32.go +++ b/pgtype/uint32.go @@ -296,12 +296,7 @@ func (scanPlanBinaryTextToUint32Scanner) Scan(src []byte, dst any) error { return s.ScanText(Text{}) } - if len(src) != 4 { - return fmt.Errorf("invalid length for uint32: %v", len(src)) - } - n := uint64(binary.BigEndian.Uint32(src)) - return s.ScanText(Text{String: strconv.FormatUint(n, 10), Valid: true}) } From 57fd684068b6032108554dad43b9611dd4149ed0 Mon Sep 17 00:00:00 2001 From: jennifersp Date: Thu, 22 Aug 2024 16:51:42 -0700 Subject: [PATCH 4/4] update struct name --- pgtype/uint32.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pgtype/uint32.go b/pgtype/uint32.go index 3f0e8fec7..c01341099 100644 --- a/pgtype/uint32.go +++ b/pgtype/uint32.go @@ -206,7 +206,7 @@ func (Uint32Codec) PlanScan(m *Map, oid uint32, format int16, target any) ScanPl case Uint32Scanner: return scanPlanBinaryUint32ToUint32Scanner{} case TextScanner: - return scanPlanBinaryTextToUint32Scanner{} + return scanPlanBinaryUint32ToTextScanner{} } case TextFormatCode: switch target.(type) { @@ -284,9 +284,9 @@ func (scanPlanBinaryUint32ToUint32Scanner) Scan(src []byte, dst any) error { return s.ScanUint32(Uint32{Uint32: n, Valid: true}) } -type scanPlanBinaryTextToUint32Scanner struct{} +type scanPlanBinaryUint32ToTextScanner struct{} -func (scanPlanBinaryTextToUint32Scanner) Scan(src []byte, dst any) error { +func (scanPlanBinaryUint32ToTextScanner) Scan(src []byte, dst any) error { s, ok := (dst).(TextScanner) if !ok { return ErrScanTargetTypeChanged