Expand pgtype.Value interface

- Include and rename ConvertFrom to Set
- Add Get
- Include AssignTo
v3-numeric-wip
Jack Christensen 2017-03-11 19:53:02 -06:00
parent 542eac08c6
commit 57494a6a0f
74 changed files with 568 additions and 185 deletions

View File

@ -23,7 +23,7 @@ type Aclitem struct {
Status Status
}
func (dst *Aclitem) ConvertFrom(src interface{}) error {
func (dst *Aclitem) Set(src interface{}) error {
switch value := src.(type) {
case Aclitem:
*dst = value
@ -37,7 +37,7 @@ func (dst *Aclitem) ConvertFrom(src interface{}) error {
}
default:
if originalSrc, ok := underlyingStringType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Aclitem", value)
}
@ -45,6 +45,17 @@ func (dst *Aclitem) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Aclitem) Get() interface{} {
switch dst.Status {
case Present:
return dst.String
case Null:
return nil
default:
return dst.Status
}
}
func (src *Aclitem) AssignTo(dst interface{}) error {
switch v := dst.(type) {
case *string:

View File

@ -14,7 +14,7 @@ type AclitemArray struct {
Status Status
}
func (dst *AclitemArray) ConvertFrom(src interface{}) error {
func (dst *AclitemArray) Set(src interface{}) error {
switch value := src.(type) {
case AclitemArray:
*dst = value
@ -27,7 +27,7 @@ func (dst *AclitemArray) ConvertFrom(src interface{}) error {
} else {
elements := make([]Aclitem, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -40,7 +40,7 @@ func (dst *AclitemArray) ConvertFrom(src interface{}) error {
default:
if originalSrc, ok := underlyingSliceType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Aclitem", value)
}
@ -48,6 +48,17 @@ func (dst *AclitemArray) ConvertFrom(src interface{}) error {
return nil
}
func (dst *AclitemArray) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *AclitemArray) AssignTo(dst interface{}) error {
switch v := dst.(type) {

View File

@ -51,7 +51,7 @@ func TestAclitemArrayTranscode(t *testing.T) {
})
}
func TestAclitemArrayConvertFrom(t *testing.T) {
func TestAclitemArraySet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.AclitemArray
@ -71,7 +71,7 @@ func TestAclitemArrayConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.AclitemArray
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -15,7 +15,7 @@ func TestAclitemTranscode(t *testing.T) {
})
}
func TestAclitemConvertFrom(t *testing.T) {
func TestAclitemSet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Aclitem
@ -27,7 +27,7 @@ func TestAclitemConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var d pgtype.Aclitem
err := d.ConvertFrom(tt.source)
err := d.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -12,7 +12,7 @@ type Bool struct {
Status Status
}
func (dst *Bool) ConvertFrom(src interface{}) error {
func (dst *Bool) Set(src interface{}) error {
switch value := src.(type) {
case Bool:
*dst = value
@ -26,7 +26,7 @@ func (dst *Bool) ConvertFrom(src interface{}) error {
*dst = Bool{Bool: bb, Status: Present}
default:
if originalSrc, ok := underlyingBoolType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Bool", value)
}
@ -34,6 +34,17 @@ func (dst *Bool) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Bool) Get() interface{} {
switch dst.Status {
case Present:
return dst.Bool
case Null:
return nil
default:
return dst.Status
}
}
func (src *Bool) AssignTo(dst interface{}) error {
switch v := dst.(type) {
case *bool:

View File

@ -15,7 +15,7 @@ type BoolArray struct {
Status Status
}
func (dst *BoolArray) ConvertFrom(src interface{}) error {
func (dst *BoolArray) Set(src interface{}) error {
switch value := src.(type) {
case BoolArray:
*dst = value
@ -28,7 +28,7 @@ func (dst *BoolArray) ConvertFrom(src interface{}) error {
} else {
elements := make([]Bool, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -41,7 +41,7 @@ func (dst *BoolArray) ConvertFrom(src interface{}) error {
default:
if originalSrc, ok := underlyingSliceType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Bool", value)
}
@ -49,6 +49,17 @@ func (dst *BoolArray) ConvertFrom(src interface{}) error {
return nil
}
func (dst *BoolArray) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *BoolArray) AssignTo(dst interface{}) error {
switch v := dst.(type) {

View File

@ -51,7 +51,7 @@ func TestBoolArrayTranscode(t *testing.T) {
})
}
func TestBoolArrayConvertFrom(t *testing.T) {
func TestBoolArraySet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.BoolArray
@ -71,7 +71,7 @@ func TestBoolArrayConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.BoolArray
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -15,7 +15,7 @@ func TestBoolTranscode(t *testing.T) {
})
}
func TestBoolConvertFrom(t *testing.T) {
func TestBoolSet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Bool
@ -33,7 +33,7 @@ func TestBoolConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Bool
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -12,7 +12,7 @@ type Bytea struct {
Status Status
}
func (dst *Bytea) ConvertFrom(src interface{}) error {
func (dst *Bytea) Set(src interface{}) error {
switch value := src.(type) {
case Bytea:
*dst = value
@ -24,7 +24,7 @@ func (dst *Bytea) ConvertFrom(src interface{}) error {
}
default:
if originalSrc, ok := underlyingBytesType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Bytea", value)
}
@ -32,6 +32,17 @@ func (dst *Bytea) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Bytea) Get() interface{} {
switch dst.Status {
case Present:
return dst.Bytes
case Null:
return nil
default:
return dst.Status
}
}
func (src *Bytea) AssignTo(dst interface{}) error {
switch v := dst.(type) {
case *[]byte:

View File

@ -15,7 +15,7 @@ type ByteaArray struct {
Status Status
}
func (dst *ByteaArray) ConvertFrom(src interface{}) error {
func (dst *ByteaArray) Set(src interface{}) error {
switch value := src.(type) {
case ByteaArray:
*dst = value
@ -28,7 +28,7 @@ func (dst *ByteaArray) ConvertFrom(src interface{}) error {
} else {
elements := make([]Bytea, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -41,7 +41,7 @@ func (dst *ByteaArray) ConvertFrom(src interface{}) error {
default:
if originalSrc, ok := underlyingSliceType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Bytea", value)
}
@ -49,6 +49,17 @@ func (dst *ByteaArray) ConvertFrom(src interface{}) error {
return nil
}
func (dst *ByteaArray) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *ByteaArray) AssignTo(dst interface{}) error {
switch v := dst.(type) {

View File

@ -51,7 +51,7 @@ func TestByteaArrayTranscode(t *testing.T) {
})
}
func TestByteaArrayConvertFrom(t *testing.T) {
func TestByteaArraySet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.ByteaArray
@ -71,7 +71,7 @@ func TestByteaArrayConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.ByteaArray
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -15,7 +15,7 @@ func TestByteaTranscode(t *testing.T) {
})
}
func TestByteaConvertFrom(t *testing.T) {
func TestByteaSet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Bytea
@ -30,7 +30,7 @@ func TestByteaConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Bytea
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -17,11 +17,15 @@ import (
// in the PostgreSQL sources.
type Cid pguint32
// ConvertFrom converts from src to dst. Note that as Cid is not a general
// number type ConvertFrom does not do automatic type conversion as other number
// Set converts from src to dst. Note that as Cid is not a general
// number type Set does not do automatic type conversion as other number
// types do.
func (dst *Cid) ConvertFrom(src interface{}) error {
return (*pguint32)(dst).ConvertFrom(src)
func (dst *Cid) Set(src interface{}) error {
return (*pguint32)(dst).Set(src)
}
func (dst *Cid) Get() interface{} {
return (*pguint32)(dst).Get()
}
// AssignTo assigns from src to dst. Note that as Cid is not a general number

View File

@ -14,7 +14,7 @@ func TestCidTranscode(t *testing.T) {
})
}
func TestCidConvertFrom(t *testing.T) {
func TestCidSet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Cid
@ -24,7 +24,7 @@ func TestCidConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Cid
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -6,8 +6,12 @@ import (
type CidrArray InetArray
func (dst *CidrArray) ConvertFrom(src interface{}) error {
return (*InetArray)(dst).ConvertFrom(src)
func (dst *CidrArray) Set(src interface{}) error {
return (*InetArray)(dst).Set(src)
}
func (dst *CidrArray) Get() interface{} {
return (*InetArray)(dst).Get()
}
func (src *CidrArray) AssignTo(dst interface{}) error {

View File

@ -21,7 +21,7 @@ const (
infinityDayOffset = 2147483647
)
func (dst *Date) ConvertFrom(src interface{}) error {
func (dst *Date) Set(src interface{}) error {
switch value := src.(type) {
case Date:
*dst = value
@ -29,7 +29,7 @@ func (dst *Date) ConvertFrom(src interface{}) error {
*dst = Date{Time: value, Status: Present}
default:
if originalSrc, ok := underlyingTimeType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Date", value)
}
@ -37,6 +37,17 @@ func (dst *Date) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Date) Get() interface{} {
switch dst.Status {
case Present:
return dst.Time
case Null:
return nil
default:
return dst.Status
}
}
func (src *Date) AssignTo(dst interface{}) error {
switch v := dst.(type) {
case *time.Time:

View File

@ -16,7 +16,7 @@ type DateArray struct {
Status Status
}
func (dst *DateArray) ConvertFrom(src interface{}) error {
func (dst *DateArray) Set(src interface{}) error {
switch value := src.(type) {
case DateArray:
*dst = value
@ -29,7 +29,7 @@ func (dst *DateArray) ConvertFrom(src interface{}) error {
} else {
elements := make([]Date, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -42,7 +42,7 @@ func (dst *DateArray) ConvertFrom(src interface{}) error {
default:
if originalSrc, ok := underlyingSliceType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Date", value)
}
@ -50,6 +50,17 @@ func (dst *DateArray) ConvertFrom(src interface{}) error {
return nil
}
func (dst *DateArray) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *DateArray) AssignTo(dst interface{}) error {
switch v := dst.(type) {

View File

@ -52,7 +52,7 @@ func TestDateArrayTranscode(t *testing.T) {
})
}
func TestDateArrayConvertFrom(t *testing.T) {
func TestDateArraySet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.DateArray
@ -72,7 +72,7 @@ func TestDateArrayConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.DateArray
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -22,7 +22,7 @@ func TestDateTranscode(t *testing.T) {
})
}
func TestDateConvertFrom(t *testing.T) {
func TestDateSet(t *testing.T) {
type _time time.Time
successfulTests := []struct {
@ -41,7 +41,7 @@ func TestDateConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var d pgtype.Date
err := d.ConvertFrom(tt.source)
err := d.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -15,7 +15,7 @@ type Float4 struct {
Status Status
}
func (dst *Float4) ConvertFrom(src interface{}) error {
func (dst *Float4) Set(src interface{}) error {
switch value := src.(type) {
case Float4:
*dst = value
@ -81,7 +81,7 @@ func (dst *Float4) ConvertFrom(src interface{}) error {
*dst = Float4{Float: float32(num), Status: Present}
default:
if originalSrc, ok := underlyingNumberType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Float8", value)
}
@ -89,6 +89,17 @@ func (dst *Float4) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Float4) Get() interface{} {
switch dst.Status {
case Present:
return dst.Float
case Null:
return nil
default:
return dst.Status
}
}
func (src *Float4) AssignTo(dst interface{}) error {
return float64AssignTo(float64(src.Float), src.Status, dst)
}

View File

@ -15,7 +15,7 @@ type Float4Array struct {
Status Status
}
func (dst *Float4Array) ConvertFrom(src interface{}) error {
func (dst *Float4Array) Set(src interface{}) error {
switch value := src.(type) {
case Float4Array:
*dst = value
@ -28,7 +28,7 @@ func (dst *Float4Array) ConvertFrom(src interface{}) error {
} else {
elements := make([]Float4, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -41,7 +41,7 @@ func (dst *Float4Array) ConvertFrom(src interface{}) error {
default:
if originalSrc, ok := underlyingSliceType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Float4", value)
}
@ -49,6 +49,17 @@ func (dst *Float4Array) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Float4Array) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *Float4Array) AssignTo(dst interface{}) error {
switch v := dst.(type) {

View File

@ -51,7 +51,7 @@ func TestFloat4ArrayTranscode(t *testing.T) {
})
}
func TestFloat4ArrayConvertFrom(t *testing.T) {
func TestFloat4ArraySet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Float4Array
@ -71,7 +71,7 @@ func TestFloat4ArrayConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Float4Array
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -18,7 +18,7 @@ func TestFloat4Transcode(t *testing.T) {
})
}
func TestFloat4ConvertFrom(t *testing.T) {
func TestFloat4Set(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Float4
@ -43,7 +43,7 @@ func TestFloat4ConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Float4
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -15,7 +15,7 @@ type Float8 struct {
Status Status
}
func (dst *Float8) ConvertFrom(src interface{}) error {
func (dst *Float8) Set(src interface{}) error {
switch value := src.(type) {
case Float8:
*dst = value
@ -71,7 +71,7 @@ func (dst *Float8) ConvertFrom(src interface{}) error {
*dst = Float8{Float: float64(num), Status: Present}
default:
if originalSrc, ok := underlyingNumberType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Float8", value)
}
@ -79,6 +79,17 @@ func (dst *Float8) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Float8) Get() interface{} {
switch dst.Status {
case Present:
return dst.Float
case Null:
return nil
default:
return dst.Status
}
}
func (src *Float8) AssignTo(dst interface{}) error {
return float64AssignTo(src.Float, src.Status, dst)
}

View File

@ -15,7 +15,7 @@ type Float8Array struct {
Status Status
}
func (dst *Float8Array) ConvertFrom(src interface{}) error {
func (dst *Float8Array) Set(src interface{}) error {
switch value := src.(type) {
case Float8Array:
*dst = value
@ -28,7 +28,7 @@ func (dst *Float8Array) ConvertFrom(src interface{}) error {
} else {
elements := make([]Float8, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -41,7 +41,7 @@ func (dst *Float8Array) ConvertFrom(src interface{}) error {
default:
if originalSrc, ok := underlyingSliceType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Float8", value)
}
@ -49,6 +49,17 @@ func (dst *Float8Array) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Float8Array) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *Float8Array) AssignTo(dst interface{}) error {
switch v := dst.(type) {

View File

@ -51,7 +51,7 @@ func TestFloat8ArrayTranscode(t *testing.T) {
})
}
func TestFloat8ArrayConvertFrom(t *testing.T) {
func TestFloat8ArraySet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Float8Array
@ -71,7 +71,7 @@ func TestFloat8ArrayConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Float8Array
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -18,7 +18,7 @@ func TestFloat8Transcode(t *testing.T) {
})
}
func TestFloat8ConvertFrom(t *testing.T) {
func TestFloat8Set(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Float8
@ -43,7 +43,7 @@ func TestFloat8ConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Float8
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -23,7 +23,7 @@ type Inet struct {
Status Status
}
func (dst *Inet) ConvertFrom(src interface{}) error {
func (dst *Inet) Set(src interface{}) error {
switch value := src.(type) {
case Inet:
*dst = value
@ -43,7 +43,7 @@ func (dst *Inet) ConvertFrom(src interface{}) error {
*dst = Inet{IPNet: ipnet, Status: Present}
default:
if originalSrc, ok := underlyingPtrType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Inet", value)
}
@ -51,6 +51,17 @@ func (dst *Inet) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Inet) Get() interface{} {
switch dst.Status {
case Present:
return dst.IPNet
case Null:
return nil
default:
return dst.Status
}
}
func (src *Inet) AssignTo(dst interface{}) error {
switch v := dst.(type) {
case *net.IPNet:

View File

@ -16,7 +16,7 @@ type InetArray struct {
Status Status
}
func (dst *InetArray) ConvertFrom(src interface{}) error {
func (dst *InetArray) Set(src interface{}) error {
switch value := src.(type) {
case InetArray:
*dst = value
@ -29,7 +29,7 @@ func (dst *InetArray) ConvertFrom(src interface{}) error {
} else {
elements := make([]Inet, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -48,7 +48,7 @@ func (dst *InetArray) ConvertFrom(src interface{}) error {
} else {
elements := make([]Inet, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -61,7 +61,7 @@ func (dst *InetArray) ConvertFrom(src interface{}) error {
default:
if originalSrc, ok := underlyingSliceType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Inet", value)
}
@ -69,6 +69,17 @@ func (dst *InetArray) ConvertFrom(src interface{}) error {
return nil
}
func (dst *InetArray) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *InetArray) AssignTo(dst interface{}) error {
switch v := dst.(type) {

View File

@ -52,7 +52,7 @@ func TestInetArrayTranscode(t *testing.T) {
})
}
func TestInetArrayConvertFrom(t *testing.T) {
func TestInetArraySet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.InetArray
@ -83,7 +83,7 @@ func TestInetArrayConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.InetArray
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -26,7 +26,7 @@ func TestInetTranscode(t *testing.T) {
}
}
func TestInetConvertFrom(t *testing.T) {
func TestInetSet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Inet
@ -39,7 +39,7 @@ func TestInetConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Inet
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -15,7 +15,7 @@ type Int2 struct {
Status Status
}
func (dst *Int2) ConvertFrom(src interface{}) error {
func (dst *Int2) Set(src interface{}) error {
switch value := src.(type) {
case Int2:
*dst = value
@ -77,7 +77,7 @@ func (dst *Int2) ConvertFrom(src interface{}) error {
*dst = Int2{Int: int16(num), Status: Present}
default:
if originalSrc, ok := underlyingNumberType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Int2", value)
}
@ -85,6 +85,17 @@ func (dst *Int2) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Int2) Get() interface{} {
switch dst.Status {
case Present:
return dst.Int
case Null:
return nil
default:
return dst.Status
}
}
func (src *Int2) AssignTo(dst interface{}) error {
return int64AssignTo(int64(src.Int), src.Status, dst)
}

View File

@ -15,7 +15,7 @@ type Int2Array struct {
Status Status
}
func (dst *Int2Array) ConvertFrom(src interface{}) error {
func (dst *Int2Array) Set(src interface{}) error {
switch value := src.(type) {
case Int2Array:
*dst = value
@ -28,7 +28,7 @@ func (dst *Int2Array) ConvertFrom(src interface{}) error {
} else {
elements := make([]Int2, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -47,7 +47,7 @@ func (dst *Int2Array) ConvertFrom(src interface{}) error {
} else {
elements := make([]Int2, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -60,7 +60,7 @@ func (dst *Int2Array) ConvertFrom(src interface{}) error {
default:
if originalSrc, ok := underlyingSliceType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Int2", value)
}
@ -68,6 +68,17 @@ func (dst *Int2Array) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Int2Array) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *Int2Array) AssignTo(dst interface{}) error {
switch v := dst.(type) {

View File

@ -51,7 +51,7 @@ func TestInt2ArrayTranscode(t *testing.T) {
})
}
func TestInt2ArrayConvertFrom(t *testing.T) {
func TestInt2ArraySet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Int2Array
@ -78,7 +78,7 @@ func TestInt2ArrayConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Int2Array
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -19,7 +19,7 @@ func TestInt2Transcode(t *testing.T) {
})
}
func TestInt2ConvertFrom(t *testing.T) {
func TestInt2Set(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Int2
@ -42,7 +42,7 @@ func TestInt2ConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Int2
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -15,7 +15,7 @@ type Int4 struct {
Status Status
}
func (dst *Int4) ConvertFrom(src interface{}) error {
func (dst *Int4) Set(src interface{}) error {
switch value := src.(type) {
case Int4:
*dst = value
@ -68,7 +68,7 @@ func (dst *Int4) ConvertFrom(src interface{}) error {
*dst = Int4{Int: int32(num), Status: Present}
default:
if originalSrc, ok := underlyingNumberType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Int8", value)
}
@ -76,6 +76,17 @@ func (dst *Int4) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Int4) Get() interface{} {
switch dst.Status {
case Present:
return dst.Int
case Null:
return nil
default:
return dst.Status
}
}
func (src *Int4) AssignTo(dst interface{}) error {
return int64AssignTo(int64(src.Int), src.Status, dst)
}

View File

@ -15,7 +15,7 @@ type Int4Array struct {
Status Status
}
func (dst *Int4Array) ConvertFrom(src interface{}) error {
func (dst *Int4Array) Set(src interface{}) error {
switch value := src.(type) {
case Int4Array:
*dst = value
@ -28,7 +28,7 @@ func (dst *Int4Array) ConvertFrom(src interface{}) error {
} else {
elements := make([]Int4, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -47,7 +47,7 @@ func (dst *Int4Array) ConvertFrom(src interface{}) error {
} else {
elements := make([]Int4, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -60,7 +60,7 @@ func (dst *Int4Array) ConvertFrom(src interface{}) error {
default:
if originalSrc, ok := underlyingSliceType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Int4", value)
}
@ -68,6 +68,17 @@ func (dst *Int4Array) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Int4Array) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *Int4Array) AssignTo(dst interface{}) error {
switch v := dst.(type) {

View File

@ -51,7 +51,7 @@ func TestInt4ArrayTranscode(t *testing.T) {
})
}
func TestInt4ArrayConvertFrom(t *testing.T) {
func TestInt4ArraySet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Int4Array
@ -78,7 +78,7 @@ func TestInt4ArrayConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Int4Array
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -19,7 +19,7 @@ func TestInt4Transcode(t *testing.T) {
})
}
func TestInt4ConvertFrom(t *testing.T) {
func TestInt4Set(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Int4
@ -42,7 +42,7 @@ func TestInt4ConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Int4
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -15,7 +15,7 @@ type Int8 struct {
Status Status
}
func (dst *Int8) ConvertFrom(src interface{}) error {
func (dst *Int8) Set(src interface{}) error {
switch value := src.(type) {
case Int8:
*dst = value
@ -59,7 +59,7 @@ func (dst *Int8) ConvertFrom(src interface{}) error {
*dst = Int8{Int: num, Status: Present}
default:
if originalSrc, ok := underlyingNumberType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Int8", value)
}
@ -67,6 +67,17 @@ func (dst *Int8) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Int8) Get() interface{} {
switch dst.Status {
case Present:
return dst.Int
case Null:
return nil
default:
return dst.Status
}
}
func (src *Int8) AssignTo(dst interface{}) error {
return int64AssignTo(int64(src.Int), src.Status, dst)
}

View File

@ -15,7 +15,7 @@ type Int8Array struct {
Status Status
}
func (dst *Int8Array) ConvertFrom(src interface{}) error {
func (dst *Int8Array) Set(src interface{}) error {
switch value := src.(type) {
case Int8Array:
*dst = value
@ -28,7 +28,7 @@ func (dst *Int8Array) ConvertFrom(src interface{}) error {
} else {
elements := make([]Int8, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -47,7 +47,7 @@ func (dst *Int8Array) ConvertFrom(src interface{}) error {
} else {
elements := make([]Int8, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -60,7 +60,7 @@ func (dst *Int8Array) ConvertFrom(src interface{}) error {
default:
if originalSrc, ok := underlyingSliceType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Int8", value)
}
@ -68,6 +68,17 @@ func (dst *Int8Array) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Int8Array) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *Int8Array) AssignTo(dst interface{}) error {
switch v := dst.(type) {

View File

@ -51,7 +51,7 @@ func TestInt8ArrayTranscode(t *testing.T) {
})
}
func TestInt8ArrayConvertFrom(t *testing.T) {
func TestInt8ArraySet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Int8Array
@ -78,7 +78,7 @@ func TestInt8ArrayConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Int8Array
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -19,7 +19,7 @@ func TestInt8Transcode(t *testing.T) {
})
}
func TestInt8ConvertFrom(t *testing.T) {
func TestInt8Set(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Int8
@ -42,7 +42,7 @@ func TestInt8ConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Int8
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -10,7 +10,7 @@ type Json struct {
Status Status
}
func (dst *Json) ConvertFrom(src interface{}) error {
func (dst *Json) Set(src interface{}) error {
switch value := src.(type) {
case string:
*dst = Json{Bytes: []byte(value), Status: Present}
@ -37,6 +37,22 @@ func (dst *Json) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Json) Get() interface{} {
switch dst.Status {
case Present:
var i interface{}
err := json.Unmarshal(dst.Bytes, &i)
if err != nil {
return dst
}
return i
case Null:
return nil
default:
return dst.Status
}
}
func (src *Json) AssignTo(dst interface{}) error {
switch v := dst.(type) {
case *string:

View File

@ -18,7 +18,7 @@ func TestJsonTranscode(t *testing.T) {
})
}
func TestJsonConvertFrom(t *testing.T) {
func TestJsonSet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Json
@ -33,7 +33,7 @@ func TestJsonConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var d pgtype.Json
err := d.ConvertFrom(tt.source)
err := d.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -7,8 +7,12 @@ import (
type Jsonb Json
func (dst *Jsonb) ConvertFrom(src interface{}) error {
return (*Json)(dst).ConvertFrom(src)
func (dst *Jsonb) Set(src interface{}) error {
return (*Json)(dst).Set(src)
}
func (dst *Jsonb) Get() interface{} {
return (*Json)(dst).Get()
}
func (src *Jsonb) AssignTo(dst interface{}) error {

View File

@ -18,7 +18,7 @@ func TestJsonbTranscode(t *testing.T) {
})
}
func TestJsonbConvertFrom(t *testing.T) {
func TestJsonbSet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Jsonb
@ -33,7 +33,7 @@ func TestJsonbConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var d pgtype.Jsonb
err := d.ConvertFrom(tt.source)
err := d.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -19,8 +19,12 @@ import (
// bytes applies, rather than the default 63.
type Name Text
func (dst *Name) ConvertFrom(src interface{}) error {
return (*Text)(dst).ConvertFrom(src)
func (dst *Name) Set(src interface{}) error {
return (*Text)(dst).Set(src)
}
func (dst *Name) Get() interface{} {
return (*Text)(dst).Get()
}
func (src *Name) AssignTo(dst interface{}) error {

View File

@ -15,7 +15,7 @@ func TestNameTranscode(t *testing.T) {
})
}
func TestNameConvertFrom(t *testing.T) {
func TestNameSet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Name
@ -27,7 +27,7 @@ func TestNameConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var d pgtype.Name
err := d.ConvertFrom(tt.source)
err := d.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -11,11 +11,15 @@ import (
// found in src/include/postgres_ext.h in the PostgreSQL sources.
type Oid pguint32
// ConvertFrom converts from src to dst. Note that as Oid is not a general
// number type ConvertFrom does not do automatic type conversion as other number
// Set converts from src to dst. Note that as Oid is not a general
// number type Set does not do automatic type conversion as other number
// types do.
func (dst *Oid) ConvertFrom(src interface{}) error {
return (*pguint32)(dst).ConvertFrom(src)
func (dst *Oid) Set(src interface{}) error {
return (*pguint32)(dst).Set(src)
}
func (dst *Oid) Get() interface{} {
return (*pguint32)(dst).Get()
}
// AssignTo assigns from src to dst. Note that as Oid is not a general number

View File

@ -14,7 +14,7 @@ func TestOidTranscode(t *testing.T) {
})
}
func TestOidConvertFrom(t *testing.T) {
func TestOidSet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Oid
@ -24,7 +24,7 @@ func TestOidConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Oid
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -66,13 +66,16 @@ const (
NegativeInfinity InfinityModifier = -Infinity
)
type Value interface{}
type Value interface {
// Set converts and assigns src to itself.
Set(src interface{}) error
type ConverterFrom interface {
ConvertFrom(src interface{}) error
}
// Get returns the simplest representation of Value. If the Value is Null or
// Undefined that is the return value. If no simpler representation is
// possible, then Get() returns Value.
Get() interface{}
type AssignerTo interface {
// AssignTo converts and assigns the Value to dst.
AssignTo(dst interface{}) error
}

View File

@ -16,10 +16,10 @@ type pguint32 struct {
Status Status
}
// ConvertFrom converts from src to dst. Note that as pguint32 is not a general
// number type ConvertFrom does not do automatic type conversion as other number
// Set converts from src to dst. Note that as pguint32 is not a general
// number type Set does not do automatic type conversion as other number
// types do.
func (dst *pguint32) ConvertFrom(src interface{}) error {
func (dst *pguint32) Set(src interface{}) error {
switch value := src.(type) {
case uint32:
*dst = pguint32{Uint: value, Status: Present}
@ -30,6 +30,17 @@ func (dst *pguint32) ConvertFrom(src interface{}) error {
return nil
}
func (dst *pguint32) Get() interface{} {
switch dst.Status {
case Present:
return dst.Uint
case Null:
return nil
default:
return dst.Status
}
}
// AssignTo assigns from src to dst. Note that as pguint32 is not a general number
// type AssignTo does not do automatic type conversion as other number types do.
func (src *pguint32) AssignTo(dst interface{}) error {

View File

@ -23,7 +23,7 @@ type QChar struct {
Status Status
}
func (dst *QChar) ConvertFrom(src interface{}) error {
func (dst *QChar) Set(src interface{}) error {
switch value := src.(type) {
case QChar:
*dst = value
@ -94,7 +94,7 @@ func (dst *QChar) ConvertFrom(src interface{}) error {
*dst = QChar{Int: int8(num), Status: Present}
default:
if originalSrc, ok := underlyingNumberType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to QChar", value)
}
@ -102,6 +102,17 @@ func (dst *QChar) ConvertFrom(src interface{}) error {
return nil
}
func (dst *QChar) Get() interface{} {
switch dst.Status {
case Present:
return dst.Int
case Null:
return nil
default:
return dst.Status
}
}
func (src *QChar) AssignTo(dst interface{}) error {
return int64AssignTo(int64(src.Int), src.Status, dst)
}

View File

@ -19,7 +19,7 @@ func TestQCharTranscode(t *testing.T) {
})
}
func TestQCharConvertFrom(t *testing.T) {
func TestQCharSet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.QChar
@ -42,7 +42,7 @@ func TestQCharConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.QChar
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -11,7 +11,7 @@ type Text struct {
Status Status
}
func (dst *Text) ConvertFrom(src interface{}) error {
func (dst *Text) Set(src interface{}) error {
switch value := src.(type) {
case Text:
*dst = value
@ -25,7 +25,7 @@ func (dst *Text) ConvertFrom(src interface{}) error {
}
default:
if originalSrc, ok := underlyingStringType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Text", value)
}
@ -33,6 +33,17 @@ func (dst *Text) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Text) Get() interface{} {
switch dst.Status {
case Present:
return dst.String
case Null:
return nil
default:
return dst.Status
}
}
func (src *Text) AssignTo(dst interface{}) error {
switch v := dst.(type) {
case *string:

View File

@ -15,7 +15,7 @@ type TextArray struct {
Status Status
}
func (dst *TextArray) ConvertFrom(src interface{}) error {
func (dst *TextArray) Set(src interface{}) error {
switch value := src.(type) {
case TextArray:
*dst = value
@ -28,7 +28,7 @@ func (dst *TextArray) ConvertFrom(src interface{}) error {
} else {
elements := make([]Text, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -41,7 +41,7 @@ func (dst *TextArray) ConvertFrom(src interface{}) error {
default:
if originalSrc, ok := underlyingSliceType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Text", value)
}
@ -49,6 +49,17 @@ func (dst *TextArray) ConvertFrom(src interface{}) error {
return nil
}
func (dst *TextArray) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *TextArray) AssignTo(dst interface{}) error {
switch v := dst.(type) {

View File

@ -51,7 +51,7 @@ func TestTextArrayTranscode(t *testing.T) {
})
}
func TestTextArrayConvertFrom(t *testing.T) {
func TestTextArraySet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.TextArray
@ -71,7 +71,7 @@ func TestTextArrayConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.TextArray
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -17,7 +17,7 @@ func TestTextTranscode(t *testing.T) {
}
}
func TestTextConvertFrom(t *testing.T) {
func TestTextSet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Text
@ -30,7 +30,7 @@ func TestTextConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var d pgtype.Text
err := d.ConvertFrom(tt.source)
err := d.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -27,6 +27,25 @@ type Tid struct {
Status Status
}
func (dst *Tid) Set(src interface{}) error {
return fmt.Errorf("cannot convert %v to Tid", src)
}
func (dst *Tid) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *Tid) AssignTo(dst interface{}) error {
return fmt.Errorf("cannot assign %v to %T", src, dst)
}
func (dst *Tid) DecodeText(src []byte) error {
if src == nil {
*dst = Tid{Status: Null}

View File

@ -23,9 +23,9 @@ type Timestamp struct {
InfinityModifier
}
// ConvertFrom converts src into a Timestamp and stores in dst. If src is a
// Set converts src into a Timestamp and stores in dst. If src is a
// time.Time in a non-UTC time zone, the time zone is discarded.
func (dst *Timestamp) ConvertFrom(src interface{}) error {
func (dst *Timestamp) Set(src interface{}) error {
switch value := src.(type) {
case Timestamp:
*dst = value
@ -33,7 +33,7 @@ func (dst *Timestamp) ConvertFrom(src interface{}) error {
*dst = Timestamp{Time: time.Date(value.Year(), value.Month(), value.Day(), value.Hour(), value.Minute(), value.Second(), value.Nanosecond(), time.UTC), Status: Present}
default:
if originalSrc, ok := underlyingTimeType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Timestamp", value)
}
@ -41,6 +41,20 @@ func (dst *Timestamp) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Timestamp) Get() interface{} {
switch dst.Status {
case Present:
if dst.InfinityModifier != None {
return dst.InfinityModifier
}
return dst.Time
case Null:
return nil
default:
return dst.Status
}
}
func (src *Timestamp) AssignTo(dst interface{}) error {
switch v := dst.(type) {
case *time.Time:

View File

@ -16,7 +16,7 @@ type TimestampArray struct {
Status Status
}
func (dst *TimestampArray) ConvertFrom(src interface{}) error {
func (dst *TimestampArray) Set(src interface{}) error {
switch value := src.(type) {
case TimestampArray:
*dst = value
@ -29,7 +29,7 @@ func (dst *TimestampArray) ConvertFrom(src interface{}) error {
} else {
elements := make([]Timestamp, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -42,7 +42,7 @@ func (dst *TimestampArray) ConvertFrom(src interface{}) error {
default:
if originalSrc, ok := underlyingSliceType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Timestamp", value)
}
@ -50,6 +50,17 @@ func (dst *TimestampArray) ConvertFrom(src interface{}) error {
return nil
}
func (dst *TimestampArray) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *TimestampArray) AssignTo(dst interface{}) error {
switch v := dst.(type) {

View File

@ -68,7 +68,7 @@ func TestTimestampArrayTranscode(t *testing.T) {
})
}
func TestTimestampArrayConvertFrom(t *testing.T) {
func TestTimestampArraySet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.TimestampArray
@ -88,7 +88,7 @@ func TestTimestampArrayConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.TimestampArray
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -31,7 +31,7 @@ func TestTimestampTranscode(t *testing.T) {
})
}
func TestTimestampConvertFrom(t *testing.T) {
func TestTimestampSet(t *testing.T) {
type _time time.Time
successfulTests := []struct {
@ -51,7 +51,7 @@ func TestTimestampConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Timestamp
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -26,7 +26,7 @@ type Timestamptz struct {
InfinityModifier
}
func (dst *Timestamptz) ConvertFrom(src interface{}) error {
func (dst *Timestamptz) Set(src interface{}) error {
switch value := src.(type) {
case Timestamptz:
*dst = value
@ -34,7 +34,7 @@ func (dst *Timestamptz) ConvertFrom(src interface{}) error {
*dst = Timestamptz{Time: value, Status: Present}
default:
if originalSrc, ok := underlyingTimeType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Timestamptz", value)
}
@ -42,6 +42,20 @@ func (dst *Timestamptz) ConvertFrom(src interface{}) error {
return nil
}
func (dst *Timestamptz) Get() interface{} {
switch dst.Status {
case Present:
if dst.InfinityModifier != None {
return dst.InfinityModifier
}
return dst.Time
case Null:
return nil
default:
return dst.Status
}
}
func (src *Timestamptz) AssignTo(dst interface{}) error {
switch v := dst.(type) {
case *time.Time:

View File

@ -16,7 +16,7 @@ type TimestamptzArray struct {
Status Status
}
func (dst *TimestamptzArray) ConvertFrom(src interface{}) error {
func (dst *TimestamptzArray) Set(src interface{}) error {
switch value := src.(type) {
case TimestamptzArray:
*dst = value
@ -29,7 +29,7 @@ func (dst *TimestamptzArray) ConvertFrom(src interface{}) error {
} else {
elements := make([]Timestamptz, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -42,7 +42,7 @@ func (dst *TimestamptzArray) ConvertFrom(src interface{}) error {
default:
if originalSrc, ok := underlyingSliceType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to Timestamptz", value)
}
@ -50,6 +50,17 @@ func (dst *TimestamptzArray) ConvertFrom(src interface{}) error {
return nil
}
func (dst *TimestamptzArray) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *TimestamptzArray) AssignTo(dst interface{}) error {
switch v := dst.(type) {

View File

@ -68,7 +68,7 @@ func TestTimestamptzArrayTranscode(t *testing.T) {
})
}
func TestTimestamptzArrayConvertFrom(t *testing.T) {
func TestTimestamptzArraySet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.TimestamptzArray
@ -88,7 +88,7 @@ func TestTimestamptzArrayConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.TimestamptzArray
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -31,7 +31,7 @@ func TestTimestamptzTranscode(t *testing.T) {
})
}
func TestTimestamptzConvertFrom(t *testing.T) {
func TestTimestamptzSet(t *testing.T) {
type _time time.Time
successfulTests := []struct {
@ -50,7 +50,7 @@ func TestTimestamptzConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Timestamptz
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -14,7 +14,7 @@ type <%= pgtype_array_type %> struct {
Status Status
}
func (dst *<%= pgtype_array_type %>) ConvertFrom(src interface{}) error {
func (dst *<%= pgtype_array_type %>) Set(src interface{}) error {
switch value := src.(type) {
case <%= pgtype_array_type %>:
*dst = value
@ -27,7 +27,7 @@ func (dst *<%= pgtype_array_type %>) ConvertFrom(src interface{}) error {
} else {
elements := make([]<%= pgtype_element_type %>, len(value))
for i := range value {
if err := elements[i].ConvertFrom(value[i]); err != nil {
if err := elements[i].Set(value[i]); err != nil {
return err
}
}
@ -40,7 +40,7 @@ func (dst *<%= pgtype_array_type %>) ConvertFrom(src interface{}) error {
<% end %>
default:
if originalSrc, ok := underlyingSliceType(src); ok {
return dst.ConvertFrom(originalSrc)
return dst.Set(originalSrc)
}
return fmt.Errorf("cannot convert %v to <%= pgtype_element_type %>", value)
}
@ -48,6 +48,17 @@ func (dst *<%= pgtype_array_type %>) ConvertFrom(src interface{}) error {
return nil
}
func (dst *<%= pgtype_array_type %>) Get() interface{} {
switch dst.Status {
case Present:
return dst
case Null:
return nil
default:
return dst.Status
}
}
func (src *<%= pgtype_array_type %>) AssignTo(dst interface{}) error {
switch v := dst.(type) {
<% go_array_types.split(",").each do |t| %>

View File

@ -6,8 +6,12 @@ import (
type VarcharArray TextArray
func (dst *VarcharArray) ConvertFrom(src interface{}) error {
return (*TextArray)(dst).ConvertFrom(src)
func (dst *VarcharArray) Set(src interface{}) error {
return (*TextArray)(dst).Set(src)
}
func (dst *VarcharArray) Get() interface{} {
return (*TextArray)(dst).Get()
}
func (src *VarcharArray) AssignTo(dst interface{}) error {

View File

@ -20,11 +20,15 @@ import (
// in the PostgreSQL sources.
type Xid pguint32
// ConvertFrom converts from src to dst. Note that as Xid is not a general
// number type ConvertFrom does not do automatic type conversion as other number
// Set converts from src to dst. Note that as Xid is not a general
// number type Set does not do automatic type conversion as other number
// types do.
func (dst *Xid) ConvertFrom(src interface{}) error {
return (*pguint32)(dst).ConvertFrom(src)
func (dst *Xid) Set(src interface{}) error {
return (*pguint32)(dst).Set(src)
}
func (dst *Xid) Get() interface{} {
return (*pguint32)(dst).Get()
}
// AssignTo assigns from src to dst. Note that as Xid is not a general number

View File

@ -14,7 +14,7 @@ func TestXidTranscode(t *testing.T) {
})
}
func TestXidConvertFrom(t *testing.T) {
func TestXidSet(t *testing.T) {
successfulTests := []struct {
source interface{}
result pgtype.Xid
@ -24,7 +24,7 @@ func TestXidConvertFrom(t *testing.T) {
for i, tt := range successfulTests {
var r pgtype.Xid
err := r.ConvertFrom(tt.source)
err := r.Set(tt.source)
if err != nil {
t.Errorf("%d: %v", i, err)
}

View File

@ -288,12 +288,8 @@ func (rows *Rows) Scan(dest ...interface{}) (err error) {
vr.Fatal(fmt.Errorf("unknown format code: %v", vr.Type().FormatCode))
}
if assignerTo, ok := pgVal.(pgtype.AssignerTo); ok {
if err := assignerTo.AssignTo(d); err != nil {
vr.Fatal(err)
}
} else {
vr.Fatal(fmt.Errorf("cannot assign %T", pgVal))
if err := pgVal.AssignTo(d); err != nil {
vr.Fatal(err)
}
} else {
if err := Decode(vr, d); err != nil {

View File

@ -773,13 +773,9 @@ func Encode(wbuf *WriteBuf, oid Oid, arg interface{}) error {
}
if value, ok := wbuf.conn.oidPgtypeValues[oid]; ok {
if converterFrom, ok := value.(pgtype.ConverterFrom); ok {
err := converterFrom.ConvertFrom(arg)
if err != nil {
return err
}
} else {
return SerializationError(fmt.Sprintf("Cannot encode %T into oid %v - %T must implement Encoder or be converted to a string", arg, oid, arg))
err := value.Set(arg)
if err != nil {
return err
}
buf := &bytes.Buffer{}
@ -1275,7 +1271,7 @@ func encodeTime(w *WriteBuf, oid Oid, value time.Time) error {
switch oid {
case DateOid:
var d pgtype.Date
err := d.ConvertFrom(value)
err := d.Set(value)
if err != nil {
return err
}
@ -1295,7 +1291,7 @@ func encodeTime(w *WriteBuf, oid Oid, value time.Time) error {
case TimestampTzOid, TimestampOid:
var t pgtype.Timestamptz
err := t.ConvertFrom(value)
err := t.Set(value)
if err != nil {
return err
}