From 0079108e29e16232f4f091461f8f59d1d826d01a Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Fri, 8 Nov 2019 14:59:19 -0500 Subject: [PATCH] Fixes #11 -- support initializing Array types from a slice of the value --- aclitem_array.go | 16 ++++++++++++++-- bool_array.go | 18 +++++++++++++++--- bpchar_array.go | 18 +++++++++++++++--- bytea_array.go | 18 +++++++++++++++--- cidr_array.go | 18 +++++++++++++++--- date_array.go | 18 +++++++++++++++--- enum_array.go | 16 ++++++++++++++-- float4_array.go | 18 +++++++++++++++--- float8_array.go | 18 +++++++++++++++--- hstore_array.go | 18 +++++++++++++++--- inet_array.go | 18 +++++++++++++++--- int2_array.go | 18 +++++++++++++++--- int4_array.go | 37 +++++++++++++++---------------------- int8_array.go | 18 +++++++++++++++--- macaddr_array.go | 18 +++++++++++++++--- numeric_array.go | 18 +++++++++++++++--- text_array.go | 18 +++++++++++++++--- timestamp_array.go | 18 +++++++++++++++--- timestamptz_array.go | 18 +++++++++++++++--- typed_array.go.erb | 14 ++++++++++++++ uuid_array.go | 18 +++++++++++++++--- varchar_array.go | 18 +++++++++++++++--- 22 files changed, 327 insertions(+), 80 deletions(-) diff --git a/aclitem_array.go b/aclitem_array.go index e8142091..e41edaea 100644 --- a/aclitem_array.go +++ b/aclitem_array.go @@ -40,6 +40,18 @@ func (dst *ACLItemArray) Set(src interface{}) error { } } + case []ACLItem: + if value == nil { + *dst = ACLItemArray{Status: Null} + } else if len(value) == 0 { + *dst = ACLItemArray{Status: Present} + } else { + *dst = ACLItemArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -124,7 +136,7 @@ func (dst *ACLItemArray) DecodeText(ci *ConnInfo, src []byte) error { return nil } -func (src ACLItemArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *ACLItemArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -200,7 +212,7 @@ func (dst *ACLItemArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src ACLItemArray) Value() (driver.Value, error) { +func (src *ACLItemArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/bool_array.go b/bool_array.go index ba453254..89fac9ec 100644 --- a/bool_array.go +++ b/bool_array.go @@ -42,6 +42,18 @@ func (dst *BoolArray) Set(src interface{}) error { } } + case []Bool: + if value == nil { + *dst = BoolArray{Status: Null} + } else if len(value) == 0 { + *dst = BoolArray{Status: Present} + } else { + *dst = BoolArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -168,7 +180,7 @@ func (dst *BoolArray) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src BoolArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *BoolArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -225,7 +237,7 @@ func (src BoolArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src BoolArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *BoolArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -288,7 +300,7 @@ func (dst *BoolArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src BoolArray) Value() (driver.Value, error) { +func (src *BoolArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/bpchar_array.go b/bpchar_array.go index da601d0d..d974df16 100644 --- a/bpchar_array.go +++ b/bpchar_array.go @@ -42,6 +42,18 @@ func (dst *BPCharArray) Set(src interface{}) error { } } + case []BPChar: + if value == nil { + *dst = BPCharArray{Status: Null} + } else if len(value) == 0 { + *dst = BPCharArray{Status: Present} + } else { + *dst = BPCharArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -168,7 +180,7 @@ func (dst *BPCharArray) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src BPCharArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *BPCharArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -225,7 +237,7 @@ func (src BPCharArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src BPCharArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *BPCharArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -288,7 +300,7 @@ func (dst *BPCharArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src BPCharArray) Value() (driver.Value, error) { +func (src *BPCharArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/bytea_array.go b/bytea_array.go index 1c2f6548..a8a67368 100644 --- a/bytea_array.go +++ b/bytea_array.go @@ -42,6 +42,18 @@ func (dst *ByteaArray) Set(src interface{}) error { } } + case []Bytea: + if value == nil { + *dst = ByteaArray{Status: Null} + } else if len(value) == 0 { + *dst = ByteaArray{Status: Present} + } else { + *dst = ByteaArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -168,7 +180,7 @@ func (dst *ByteaArray) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src ByteaArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *ByteaArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -225,7 +237,7 @@ func (src ByteaArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src ByteaArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *ByteaArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -288,7 +300,7 @@ func (dst *ByteaArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src ByteaArray) Value() (driver.Value, error) { +func (src *ByteaArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/cidr_array.go b/cidr_array.go index 234c6aff..bddf74ec 100644 --- a/cidr_array.go +++ b/cidr_array.go @@ -62,6 +62,18 @@ func (dst *CIDRArray) Set(src interface{}) error { } } + case []CIDR: + if value == nil { + *dst = CIDRArray{Status: Null} + } else if len(value) == 0 { + *dst = CIDRArray{Status: Present} + } else { + *dst = CIDRArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -197,7 +209,7 @@ func (dst *CIDRArray) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src CIDRArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *CIDRArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -254,7 +266,7 @@ func (src CIDRArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src CIDRArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *CIDRArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -317,7 +329,7 @@ func (dst *CIDRArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src CIDRArray) Value() (driver.Value, error) { +func (src *CIDRArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/date_array.go b/date_array.go index 69fc3e5e..95f52ac0 100644 --- a/date_array.go +++ b/date_array.go @@ -43,6 +43,18 @@ func (dst *DateArray) Set(src interface{}) error { } } + case []Date: + if value == nil { + *dst = DateArray{Status: Null} + } else if len(value) == 0 { + *dst = DateArray{Status: Present} + } else { + *dst = DateArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -169,7 +181,7 @@ func (dst *DateArray) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src DateArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *DateArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -226,7 +238,7 @@ func (src DateArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src DateArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *DateArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -289,7 +301,7 @@ func (dst *DateArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src DateArray) Value() (driver.Value, error) { +func (src *DateArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/enum_array.go b/enum_array.go index f4609169..f32be61c 100644 --- a/enum_array.go +++ b/enum_array.go @@ -40,6 +40,18 @@ func (dst *EnumArray) Set(src interface{}) error { } } + case []GenericText: + if value == nil { + *dst = EnumArray{Status: Null} + } else if len(value) == 0 { + *dst = EnumArray{Status: Present} + } else { + *dst = EnumArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -124,7 +136,7 @@ func (dst *EnumArray) DecodeText(ci *ConnInfo, src []byte) error { return nil } -func (src EnumArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *EnumArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -200,7 +212,7 @@ func (dst *EnumArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src EnumArray) Value() (driver.Value, error) { +func (src *EnumArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/float4_array.go b/float4_array.go index 80aff879..a21e0a1f 100644 --- a/float4_array.go +++ b/float4_array.go @@ -42,6 +42,18 @@ func (dst *Float4Array) Set(src interface{}) error { } } + case []Float4: + if value == nil { + *dst = Float4Array{Status: Null} + } else if len(value) == 0 { + *dst = Float4Array{Status: Present} + } else { + *dst = Float4Array{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -168,7 +180,7 @@ func (dst *Float4Array) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src Float4Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *Float4Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -225,7 +237,7 @@ func (src Float4Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src Float4Array) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *Float4Array) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -288,7 +300,7 @@ func (dst *Float4Array) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src Float4Array) Value() (driver.Value, error) { +func (src *Float4Array) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/float8_array.go b/float8_array.go index 3999cf7d..6a44339a 100644 --- a/float8_array.go +++ b/float8_array.go @@ -42,6 +42,18 @@ func (dst *Float8Array) Set(src interface{}) error { } } + case []Float8: + if value == nil { + *dst = Float8Array{Status: Null} + } else if len(value) == 0 { + *dst = Float8Array{Status: Present} + } else { + *dst = Float8Array{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -168,7 +180,7 @@ func (dst *Float8Array) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src Float8Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *Float8Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -225,7 +237,7 @@ func (src Float8Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src Float8Array) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *Float8Array) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -288,7 +300,7 @@ func (dst *Float8Array) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src Float8Array) Value() (driver.Value, error) { +func (src *Float8Array) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/hstore_array.go b/hstore_array.go index 8269fb40..a0a2b3a9 100644 --- a/hstore_array.go +++ b/hstore_array.go @@ -42,6 +42,18 @@ func (dst *HstoreArray) Set(src interface{}) error { } } + case []Hstore: + if value == nil { + *dst = HstoreArray{Status: Null} + } else if len(value) == 0 { + *dst = HstoreArray{Status: Present} + } else { + *dst = HstoreArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -168,7 +180,7 @@ func (dst *HstoreArray) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src HstoreArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *HstoreArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -225,7 +237,7 @@ func (src HstoreArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src HstoreArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *HstoreArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -288,7 +300,7 @@ func (dst *HstoreArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src HstoreArray) Value() (driver.Value, error) { +func (src *HstoreArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/inet_array.go b/inet_array.go index a6fd419e..d754fab3 100644 --- a/inet_array.go +++ b/inet_array.go @@ -62,6 +62,18 @@ func (dst *InetArray) Set(src interface{}) error { } } + case []Inet: + if value == nil { + *dst = InetArray{Status: Null} + } else if len(value) == 0 { + *dst = InetArray{Status: Present} + } else { + *dst = InetArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -197,7 +209,7 @@ func (dst *InetArray) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src InetArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *InetArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -254,7 +266,7 @@ func (src InetArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src InetArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *InetArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -317,7 +329,7 @@ func (dst *InetArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src InetArray) Value() (driver.Value, error) { +func (src *InetArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/int2_array.go b/int2_array.go index beea543f..59c05de3 100644 --- a/int2_array.go +++ b/int2_array.go @@ -61,6 +61,18 @@ func (dst *Int2Array) Set(src interface{}) error { } } + case []Int2: + if value == nil { + *dst = Int2Array{Status: Null} + } else if len(value) == 0 { + *dst = Int2Array{Status: Present} + } else { + *dst = Int2Array{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -196,7 +208,7 @@ func (dst *Int2Array) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src Int2Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *Int2Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -253,7 +265,7 @@ func (src Int2Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src Int2Array) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *Int2Array) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -316,7 +328,7 @@ func (dst *Int2Array) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src Int2Array) Value() (driver.Value, error) { +func (src *Int2Array) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/int4_array.go b/int4_array.go index 83ee4c26..08040955 100644 --- a/int4_array.go +++ b/int4_array.go @@ -23,25 +23,6 @@ func (dst *Int4Array) Set(src interface{}) error { switch value := src.(type) { - case []int: - if value == nil { - *dst = Int4Array{Status: Null} - } else if len(value) == 0 { - *dst = Int4Array{Status: Present} - } else { - elements := make([]Int4, len(value)) - for i := range value { - if err := elements[i].Set(value[i]); err != nil { - return err - } - } - *dst = Int4Array{ - Elements: elements, - Dimensions: []ArrayDimension{{Length: int32(len(elements)), LowerBound: 1}}, - Status: Present, - } - } - case []int32: if value == nil { *dst = Int4Array{Status: Null} @@ -80,6 +61,18 @@ func (dst *Int4Array) Set(src interface{}) error { } } + case []Int4: + if value == nil { + *dst = Int4Array{Status: Null} + } else if len(value) == 0 { + *dst = Int4Array{Status: Present} + } else { + *dst = Int4Array{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -215,7 +208,7 @@ func (dst *Int4Array) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src Int4Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *Int4Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -272,7 +265,7 @@ func (src Int4Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src Int4Array) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *Int4Array) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -335,7 +328,7 @@ func (dst *Int4Array) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src Int4Array) Value() (driver.Value, error) { +func (src *Int4Array) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/int8_array.go b/int8_array.go index f118bc83..8cb446eb 100644 --- a/int8_array.go +++ b/int8_array.go @@ -61,6 +61,18 @@ func (dst *Int8Array) Set(src interface{}) error { } } + case []Int8: + if value == nil { + *dst = Int8Array{Status: Null} + } else if len(value) == 0 { + *dst = Int8Array{Status: Present} + } else { + *dst = Int8Array{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -196,7 +208,7 @@ func (dst *Int8Array) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src Int8Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *Int8Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -253,7 +265,7 @@ func (src Int8Array) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src Int8Array) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *Int8Array) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -316,7 +328,7 @@ func (dst *Int8Array) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src Int8Array) Value() (driver.Value, error) { +func (src *Int8Array) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/macaddr_array.go b/macaddr_array.go index 7c62da2b..88bc44fd 100644 --- a/macaddr_array.go +++ b/macaddr_array.go @@ -43,6 +43,18 @@ func (dst *MacaddrArray) Set(src interface{}) error { } } + case []Macaddr: + if value == nil { + *dst = MacaddrArray{Status: Null} + } else if len(value) == 0 { + *dst = MacaddrArray{Status: Present} + } else { + *dst = MacaddrArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -169,7 +181,7 @@ func (dst *MacaddrArray) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src MacaddrArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *MacaddrArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -226,7 +238,7 @@ func (src MacaddrArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src MacaddrArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *MacaddrArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -289,7 +301,7 @@ func (dst *MacaddrArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src MacaddrArray) Value() (driver.Value, error) { +func (src *MacaddrArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/numeric_array.go b/numeric_array.go index 8757b14d..cbd2e93f 100644 --- a/numeric_array.go +++ b/numeric_array.go @@ -99,6 +99,18 @@ func (dst *NumericArray) Set(src interface{}) error { } } + case []Numeric: + if value == nil { + *dst = NumericArray{Status: Null} + } else if len(value) == 0 { + *dst = NumericArray{Status: Present} + } else { + *dst = NumericArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -252,7 +264,7 @@ func (dst *NumericArray) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src NumericArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *NumericArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -309,7 +321,7 @@ func (src NumericArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src NumericArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *NumericArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -372,7 +384,7 @@ func (dst *NumericArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src NumericArray) Value() (driver.Value, error) { +func (src *NumericArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/text_array.go b/text_array.go index fca36ec8..d6aa3cfb 100644 --- a/text_array.go +++ b/text_array.go @@ -42,6 +42,18 @@ func (dst *TextArray) Set(src interface{}) error { } } + case []Text: + if value == nil { + *dst = TextArray{Status: Null} + } else if len(value) == 0 { + *dst = TextArray{Status: Present} + } else { + *dst = TextArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -168,7 +180,7 @@ func (dst *TextArray) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src TextArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *TextArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -225,7 +237,7 @@ func (src TextArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src TextArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *TextArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -288,7 +300,7 @@ func (dst *TextArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src TextArray) Value() (driver.Value, error) { +func (src *TextArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/timestamp_array.go b/timestamp_array.go index 204b22eb..18d54b38 100644 --- a/timestamp_array.go +++ b/timestamp_array.go @@ -43,6 +43,18 @@ func (dst *TimestampArray) Set(src interface{}) error { } } + case []Timestamp: + if value == nil { + *dst = TimestampArray{Status: Null} + } else if len(value) == 0 { + *dst = TimestampArray{Status: Present} + } else { + *dst = TimestampArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -169,7 +181,7 @@ func (dst *TimestampArray) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src TimestampArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *TimestampArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -226,7 +238,7 @@ func (src TimestampArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src TimestampArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *TimestampArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -289,7 +301,7 @@ func (dst *TimestampArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src TimestampArray) Value() (driver.Value, error) { +func (src *TimestampArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/timestamptz_array.go b/timestamptz_array.go index 9bef64c6..98593305 100644 --- a/timestamptz_array.go +++ b/timestamptz_array.go @@ -43,6 +43,18 @@ func (dst *TimestamptzArray) Set(src interface{}) error { } } + case []Timestamptz: + if value == nil { + *dst = TimestamptzArray{Status: Null} + } else if len(value) == 0 { + *dst = TimestamptzArray{Status: Present} + } else { + *dst = TimestamptzArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -169,7 +181,7 @@ func (dst *TimestamptzArray) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src TimestamptzArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *TimestamptzArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -226,7 +238,7 @@ func (src TimestamptzArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) return buf, nil } -func (src TimestamptzArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *TimestamptzArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -289,7 +301,7 @@ func (dst *TimestamptzArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src TimestamptzArray) Value() (driver.Value, error) { +func (src *TimestamptzArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/typed_array.go.erb b/typed_array.go.erb index 3ee637aa..2279380b 100644 --- a/typed_array.go.erb +++ b/typed_array.go.erb @@ -23,6 +23,7 @@ func (dst *<%= pgtype_array_type %>) Set(src interface{}) error { switch value := src.(type) { <% go_array_types.split(",").each do |t| %> + <% if t != pgtype_element_type %> case <%= t %>: if value == nil { *dst = <%= pgtype_array_type %>{Status: Null} @@ -42,6 +43,19 @@ func (dst *<%= pgtype_array_type %>) Set(src interface{}) error { } } <% end %> + <% end %> + case []<%= pgtype_element_type %>: + if value == nil { + *dst = <%= pgtype_array_type %>{Status: Null} + } else if len(value) == 0 { + *dst = <%= pgtype_array_type %>{Status: Present} + } else { + *dst = <%= pgtype_array_type %>{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status : Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) diff --git a/uuid_array.go b/uuid_array.go index c3f18882..25bf21a8 100644 --- a/uuid_array.go +++ b/uuid_array.go @@ -80,6 +80,18 @@ func (dst *UUIDArray) Set(src interface{}) error { } } + case []UUID: + if value == nil { + *dst = UUIDArray{Status: Null} + } else if len(value) == 0 { + *dst = UUIDArray{Status: Present} + } else { + *dst = UUIDArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -224,7 +236,7 @@ func (dst *UUIDArray) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src UUIDArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *UUIDArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -281,7 +293,7 @@ func (src UUIDArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src UUIDArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *UUIDArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -344,7 +356,7 @@ func (dst *UUIDArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src UUIDArray) Value() (driver.Value, error) { +func (src *UUIDArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err diff --git a/varchar_array.go b/varchar_array.go index 1e60c344..aa505404 100644 --- a/varchar_array.go +++ b/varchar_array.go @@ -42,6 +42,18 @@ func (dst *VarcharArray) Set(src interface{}) error { } } + case []Varchar: + if value == nil { + *dst = VarcharArray{Status: Null} + } else if len(value) == 0 { + *dst = VarcharArray{Status: Present} + } else { + *dst = VarcharArray{ + Elements: value, + Dimensions: []ArrayDimension{{Length: int32(len(value)), LowerBound: 1}}, + Status: Present, + } + } default: if originalSrc, ok := underlyingSliceType(src); ok { return dst.Set(originalSrc) @@ -168,7 +180,7 @@ func (dst *VarcharArray) DecodeBinary(ci *ConnInfo, src []byte) error { return nil } -func (src VarcharArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *VarcharArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -225,7 +237,7 @@ func (src VarcharArray) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) { return buf, nil } -func (src VarcharArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { +func (src *VarcharArray) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) { switch src.Status { case Null: return nil, nil @@ -288,7 +300,7 @@ func (dst *VarcharArray) Scan(src interface{}) error { } // Value implements the database/sql/driver Valuer interface. -func (src VarcharArray) Value() (driver.Value, error) { +func (src *VarcharArray) Value() (driver.Value, error) { buf, err := src.EncodeText(nil, nil) if err != nil { return nil, err