diff --git a/pgtype/aclitem.go b/pgtype/aclitem.go index 821c5001..36cf3bbf 100644 --- a/pgtype/aclitem.go +++ b/pgtype/aclitem.go @@ -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: diff --git a/pgtype/aclitem_array.go b/pgtype/aclitem_array.go index 48f5cd38..13952e5c 100644 --- a/pgtype/aclitem_array.go +++ b/pgtype/aclitem_array.go @@ -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) { diff --git a/pgtype/aclitem_array_test.go b/pgtype/aclitem_array_test.go index e78f14c6..75c672bd 100644 --- a/pgtype/aclitem_array_test.go +++ b/pgtype/aclitem_array_test.go @@ -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) } diff --git a/pgtype/aclitem_test.go b/pgtype/aclitem_test.go index fc429acc..47e6fa84 100644 --- a/pgtype/aclitem_test.go +++ b/pgtype/aclitem_test.go @@ -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) } diff --git a/pgtype/bool.go b/pgtype/bool.go index 9764fafe..04a261c2 100644 --- a/pgtype/bool.go +++ b/pgtype/bool.go @@ -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: diff --git a/pgtype/bool_array.go b/pgtype/bool_array.go index a74e9f90..fdcbf7a0 100644 --- a/pgtype/bool_array.go +++ b/pgtype/bool_array.go @@ -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) { diff --git a/pgtype/bool_array_test.go b/pgtype/bool_array_test.go index c5f15f97..a526d892 100644 --- a/pgtype/bool_array_test.go +++ b/pgtype/bool_array_test.go @@ -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) } diff --git a/pgtype/bool_test.go b/pgtype/bool_test.go index 374f07da..773bd99b 100644 --- a/pgtype/bool_test.go +++ b/pgtype/bool_test.go @@ -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) } diff --git a/pgtype/bytea.go b/pgtype/bytea.go index 709499d2..9d2e20f3 100644 --- a/pgtype/bytea.go +++ b/pgtype/bytea.go @@ -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: diff --git a/pgtype/bytea_array.go b/pgtype/bytea_array.go index 9003eafd..5362944a 100644 --- a/pgtype/bytea_array.go +++ b/pgtype/bytea_array.go @@ -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) { diff --git a/pgtype/bytea_array_test.go b/pgtype/bytea_array_test.go index b39776d9..22c6478b 100644 --- a/pgtype/bytea_array_test.go +++ b/pgtype/bytea_array_test.go @@ -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) } diff --git a/pgtype/bytea_test.go b/pgtype/bytea_test.go index 51941387..4655a1c1 100644 --- a/pgtype/bytea_test.go +++ b/pgtype/bytea_test.go @@ -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) } diff --git a/pgtype/cid.go b/pgtype/cid.go index be93a03e..20957f36 100644 --- a/pgtype/cid.go +++ b/pgtype/cid.go @@ -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 diff --git a/pgtype/cid_test.go b/pgtype/cid_test.go index 7d9fde34..0d114cda 100644 --- a/pgtype/cid_test.go +++ b/pgtype/cid_test.go @@ -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) } diff --git a/pgtype/cidr_array.go b/pgtype/cidr_array.go index e0219ee5..c30c53d3 100644 --- a/pgtype/cidr_array.go +++ b/pgtype/cidr_array.go @@ -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 { diff --git a/pgtype/date.go b/pgtype/date.go index b0d16e64..a3b8d99f 100644 --- a/pgtype/date.go +++ b/pgtype/date.go @@ -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: diff --git a/pgtype/date_array.go b/pgtype/date_array.go index 8f7cba18..ce28e236 100644 --- a/pgtype/date_array.go +++ b/pgtype/date_array.go @@ -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) { diff --git a/pgtype/date_array_test.go b/pgtype/date_array_test.go index 60f15983..a05f4254 100644 --- a/pgtype/date_array_test.go +++ b/pgtype/date_array_test.go @@ -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) } diff --git a/pgtype/date_test.go b/pgtype/date_test.go index 3a473b6a..eff3a521 100644 --- a/pgtype/date_test.go +++ b/pgtype/date_test.go @@ -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) } diff --git a/pgtype/float4.go b/pgtype/float4.go index 26609ab2..a38d24db 100644 --- a/pgtype/float4.go +++ b/pgtype/float4.go @@ -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) } diff --git a/pgtype/float4_array.go b/pgtype/float4_array.go index 632e7e4b..410a8b37 100644 --- a/pgtype/float4_array.go +++ b/pgtype/float4_array.go @@ -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) { diff --git a/pgtype/float4_array_test.go b/pgtype/float4_array_test.go index b22f4fbc..06a1d2e0 100644 --- a/pgtype/float4_array_test.go +++ b/pgtype/float4_array_test.go @@ -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) } diff --git a/pgtype/float4_test.go b/pgtype/float4_test.go index 62420b8d..ea60cd3a 100644 --- a/pgtype/float4_test.go +++ b/pgtype/float4_test.go @@ -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) } diff --git a/pgtype/float8.go b/pgtype/float8.go index 9ec9a665..9129e8ba 100644 --- a/pgtype/float8.go +++ b/pgtype/float8.go @@ -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) } diff --git a/pgtype/float8_array.go b/pgtype/float8_array.go index 68cf30f2..b2f70f51 100644 --- a/pgtype/float8_array.go +++ b/pgtype/float8_array.go @@ -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) { diff --git a/pgtype/float8_array_test.go b/pgtype/float8_array_test.go index d4402281..635e249a 100644 --- a/pgtype/float8_array_test.go +++ b/pgtype/float8_array_test.go @@ -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) } diff --git a/pgtype/float8_test.go b/pgtype/float8_test.go index 748ffd25..724e9350 100644 --- a/pgtype/float8_test.go +++ b/pgtype/float8_test.go @@ -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) } diff --git a/pgtype/inet.go b/pgtype/inet.go index f94622f4..00bfb30c 100644 --- a/pgtype/inet.go +++ b/pgtype/inet.go @@ -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: diff --git a/pgtype/inet_array.go b/pgtype/inet_array.go index 629cd51f..4d865b4f 100644 --- a/pgtype/inet_array.go +++ b/pgtype/inet_array.go @@ -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) { diff --git a/pgtype/inet_array_test.go b/pgtype/inet_array_test.go index 523a9f8d..fe22285d 100644 --- a/pgtype/inet_array_test.go +++ b/pgtype/inet_array_test.go @@ -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) } diff --git a/pgtype/inet_test.go b/pgtype/inet_test.go index 5a326810..90b0723f 100644 --- a/pgtype/inet_test.go +++ b/pgtype/inet_test.go @@ -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) } diff --git a/pgtype/int2.go b/pgtype/int2.go index 7bdbacfe..525427c5 100644 --- a/pgtype/int2.go +++ b/pgtype/int2.go @@ -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) } diff --git a/pgtype/int2_array.go b/pgtype/int2_array.go index d8268c0a..28792fa5 100644 --- a/pgtype/int2_array.go +++ b/pgtype/int2_array.go @@ -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) { diff --git a/pgtype/int2_array_test.go b/pgtype/int2_array_test.go index ced0eab4..8af4523d 100644 --- a/pgtype/int2_array_test.go +++ b/pgtype/int2_array_test.go @@ -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) } diff --git a/pgtype/int2_test.go b/pgtype/int2_test.go index 8601309d..2bd8e016 100644 --- a/pgtype/int2_test.go +++ b/pgtype/int2_test.go @@ -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) } diff --git a/pgtype/int4.go b/pgtype/int4.go index 2d96ea48..b3203a28 100644 --- a/pgtype/int4.go +++ b/pgtype/int4.go @@ -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) } diff --git a/pgtype/int4_array.go b/pgtype/int4_array.go index dcdb50c1..61cedb2e 100644 --- a/pgtype/int4_array.go +++ b/pgtype/int4_array.go @@ -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) { diff --git a/pgtype/int4_array_test.go b/pgtype/int4_array_test.go index 38ba27cb..111cb56b 100644 --- a/pgtype/int4_array_test.go +++ b/pgtype/int4_array_test.go @@ -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) } diff --git a/pgtype/int4_test.go b/pgtype/int4_test.go index 0ac2e5b5..3e000182 100644 --- a/pgtype/int4_test.go +++ b/pgtype/int4_test.go @@ -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) } diff --git a/pgtype/int8.go b/pgtype/int8.go index 91f5b877..15ad6715 100644 --- a/pgtype/int8.go +++ b/pgtype/int8.go @@ -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) } diff --git a/pgtype/int8_array.go b/pgtype/int8_array.go index ed82f079..9f4373e8 100644 --- a/pgtype/int8_array.go +++ b/pgtype/int8_array.go @@ -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) { diff --git a/pgtype/int8_array_test.go b/pgtype/int8_array_test.go index 137768c6..349a1f7e 100644 --- a/pgtype/int8_array_test.go +++ b/pgtype/int8_array_test.go @@ -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) } diff --git a/pgtype/int8_test.go b/pgtype/int8_test.go index 15762a50..e1fe69fb 100644 --- a/pgtype/int8_test.go +++ b/pgtype/int8_test.go @@ -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) } diff --git a/pgtype/json.go b/pgtype/json.go index 8a258ea4..ecdb3dab 100644 --- a/pgtype/json.go +++ b/pgtype/json.go @@ -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: diff --git a/pgtype/json_test.go b/pgtype/json_test.go index 87770f31..b0aa8c9b 100644 --- a/pgtype/json_test.go +++ b/pgtype/json_test.go @@ -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) } diff --git a/pgtype/jsonb.go b/pgtype/jsonb.go index 0739a468..13062e8e 100644 --- a/pgtype/jsonb.go +++ b/pgtype/jsonb.go @@ -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 { diff --git a/pgtype/jsonb_test.go b/pgtype/jsonb_test.go index e42931d5..3978b0d4 100644 --- a/pgtype/jsonb_test.go +++ b/pgtype/jsonb_test.go @@ -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) } diff --git a/pgtype/name.go b/pgtype/name.go index 513abfc7..9eb12ece 100644 --- a/pgtype/name.go +++ b/pgtype/name.go @@ -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 { diff --git a/pgtype/name_test.go b/pgtype/name_test.go index c5f7de17..81a766b8 100644 --- a/pgtype/name_test.go +++ b/pgtype/name_test.go @@ -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) } diff --git a/pgtype/oid.go b/pgtype/oid.go index c77f3f10..e57bb2e6 100644 --- a/pgtype/oid.go +++ b/pgtype/oid.go @@ -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 diff --git a/pgtype/oid_test.go b/pgtype/oid_test.go index bbab6699..b3b96959 100644 --- a/pgtype/oid_test.go +++ b/pgtype/oid_test.go @@ -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) } diff --git a/pgtype/pgtype.go b/pgtype/pgtype.go index cbcd6bd5..5a51172e 100644 --- a/pgtype/pgtype.go +++ b/pgtype/pgtype.go @@ -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 } diff --git a/pgtype/pguint32.go b/pgtype/pguint32.go index c636e1c4..05c79c0e 100644 --- a/pgtype/pguint32.go +++ b/pgtype/pguint32.go @@ -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 { diff --git a/pgtype/qchar.go b/pgtype/qchar.go index 0da1e88b..b6392cf9 100644 --- a/pgtype/qchar.go +++ b/pgtype/qchar.go @@ -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) } diff --git a/pgtype/qchar_test.go b/pgtype/qchar_test.go index ea7b56a8..a1b6d22e 100644 --- a/pgtype/qchar_test.go +++ b/pgtype/qchar_test.go @@ -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) } diff --git a/pgtype/text.go b/pgtype/text.go index baf62d1e..50db2349 100644 --- a/pgtype/text.go +++ b/pgtype/text.go @@ -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: diff --git a/pgtype/text_array.go b/pgtype/text_array.go index 06e3c0df..3a5a64ce 100644 --- a/pgtype/text_array.go +++ b/pgtype/text_array.go @@ -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) { diff --git a/pgtype/text_array_test.go b/pgtype/text_array_test.go index a22e003d..5a78d7bc 100644 --- a/pgtype/text_array_test.go +++ b/pgtype/text_array_test.go @@ -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) } diff --git a/pgtype/text_test.go b/pgtype/text_test.go index 6e944857..f5e20055 100644 --- a/pgtype/text_test.go +++ b/pgtype/text_test.go @@ -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) } diff --git a/pgtype/tid.go b/pgtype/tid.go index b67892ff..20d962df 100644 --- a/pgtype/tid.go +++ b/pgtype/tid.go @@ -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} diff --git a/pgtype/timestamp.go b/pgtype/timestamp.go index a8b628e9..a84f3881 100644 --- a/pgtype/timestamp.go +++ b/pgtype/timestamp.go @@ -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: diff --git a/pgtype/timestamp_array.go b/pgtype/timestamp_array.go index 1ea30ba4..ec0facb2 100644 --- a/pgtype/timestamp_array.go +++ b/pgtype/timestamp_array.go @@ -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) { diff --git a/pgtype/timestamp_array_test.go b/pgtype/timestamp_array_test.go index 68189cc7..a15d3696 100644 --- a/pgtype/timestamp_array_test.go +++ b/pgtype/timestamp_array_test.go @@ -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) } diff --git a/pgtype/timestamp_test.go b/pgtype/timestamp_test.go index 6d6e738c..7297ed1f 100644 --- a/pgtype/timestamp_test.go +++ b/pgtype/timestamp_test.go @@ -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) } diff --git a/pgtype/timestamptz.go b/pgtype/timestamptz.go index f4c67b0b..a6922d5b 100644 --- a/pgtype/timestamptz.go +++ b/pgtype/timestamptz.go @@ -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: diff --git a/pgtype/timestamptz_array.go b/pgtype/timestamptz_array.go index fc3ce08c..775ec970 100644 --- a/pgtype/timestamptz_array.go +++ b/pgtype/timestamptz_array.go @@ -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) { diff --git a/pgtype/timestamptz_array_test.go b/pgtype/timestamptz_array_test.go index af2c004b..e0017828 100644 --- a/pgtype/timestamptz_array_test.go +++ b/pgtype/timestamptz_array_test.go @@ -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) } diff --git a/pgtype/timestamptz_test.go b/pgtype/timestamptz_test.go index 8f80ca81..242cd05f 100644 --- a/pgtype/timestamptz_test.go +++ b/pgtype/timestamptz_test.go @@ -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) } diff --git a/pgtype/typed_array.go.erb b/pgtype/typed_array.go.erb index 98c8d845..c62e2896 100644 --- a/pgtype/typed_array.go.erb +++ b/pgtype/typed_array.go.erb @@ -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| %> diff --git a/pgtype/varchar_array.go b/pgtype/varchar_array.go index b9d87b7f..693b9a61 100644 --- a/pgtype/varchar_array.go +++ b/pgtype/varchar_array.go @@ -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 { diff --git a/pgtype/xid.go b/pgtype/xid.go index 7deaa4f0..a53120de 100644 --- a/pgtype/xid.go +++ b/pgtype/xid.go @@ -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 diff --git a/pgtype/xid_test.go b/pgtype/xid_test.go index a5c5df51..fecfb64b 100644 --- a/pgtype/xid_test.go +++ b/pgtype/xid_test.go @@ -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) } diff --git a/query.go b/query.go index bc7aeda4..8adb7d80 100644 --- a/query.go +++ b/query.go @@ -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 { diff --git a/values.go b/values.go index bc9e5c64..e976d0d3 100644 --- a/values.go +++ b/values.go @@ -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 }