From afff6abc6c79872e19ac2b84748de37883da964a Mon Sep 17 00:00:00 2001 From: Pablo Morelli Date: Wed, 20 May 2020 15:01:21 +0200 Subject: [PATCH] TID AssignTo string --- tid.go | 13 +++++++++++++ tid_test.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/tid.go b/tid.go index 98b95e2a..f7b80f94 100644 --- a/tid.go +++ b/tid.go @@ -44,6 +44,19 @@ func (dst TID) Get() interface{} { } func (src *TID) AssignTo(dst interface{}) error { + if src.Status == Present { + switch v := dst.(type) { + case *string: + *v = fmt.Sprintf(`(%d,%d)`, src.BlockNumber, src.OffsetNumber) + return nil + default: + if nextDst, retry := GetAssignToDstType(dst); retry { + return src.AssignTo(nextDst) + } + return errors.Errorf("unable to assign to %T", dst) + } + } + return errors.Errorf("cannot assign %v to %T", src, dst) } diff --git a/tid_test.go b/tid_test.go index 773bd96f..818be8af 100644 --- a/tid_test.go +++ b/tid_test.go @@ -1,6 +1,7 @@ package pgtype_test import ( + "reflect" "testing" "github.com/jackc/pgtype" @@ -14,3 +15,49 @@ func TestTIDTranscode(t *testing.T) { &pgtype.TID{Status: pgtype.Null}, }) } + +func TestTIDAssignTo(t *testing.T) { + var s string + var sp *string + + simpleTests := []struct { + src pgtype.TID + dst interface{} + expected interface{} + }{ + {src: pgtype.TID{BlockNumber: 42, OffsetNumber: 43, Status: pgtype.Present}, dst: &s, expected: "(42,43)"}, + {src: pgtype.TID{BlockNumber: 4294967295, OffsetNumber: 65535, Status: pgtype.Present}, dst: &s, expected: "(4294967295,65535)"}, + } + + for i, tt := range simpleTests { + err := tt.src.AssignTo(tt.dst) + if err != nil { + t.Errorf("%d: %v", i, err) + } + + if dst := reflect.ValueOf(tt.dst).Elem().Interface(); dst != tt.expected { + t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst) + } + } + + pointerAllocTests := []struct { + src pgtype.TID + dst interface{} + expected interface{} + }{ + {src: pgtype.TID{BlockNumber: 42, OffsetNumber: 43, Status: pgtype.Present}, dst: &sp, expected: "(42,43)"}, + {src: pgtype.TID{BlockNumber: 4294967295, OffsetNumber: 65535, Status: pgtype.Present}, dst: &sp, expected: "(4294967295,65535)"}, + } + + for i, tt := range pointerAllocTests { + err := tt.src.AssignTo(tt.dst) + if err != nil { + t.Errorf("%d: %v", i, err) + } + + if dst := reflect.ValueOf(tt.dst).Elem().Elem().Interface(); dst != tt.expected { + t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst) + } + } +} +