TID AssignTo string

non-blocking
Pablo Morelli 2020-05-20 15:01:21 +02:00
parent 238967ec4e
commit afff6abc6c
No known key found for this signature in database
GPG Key ID: 3A02E9B834932F47
2 changed files with 60 additions and 0 deletions

13
tid.go
View File

@ -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)
}

View File

@ -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)
}
}
}