99 "io"
1010 "reflect"
1111 "strings"
12- "time"
1312)
1413
1514const invalidate = "☠☠☠ MEMORY OVERWRITTEN ☠☠☠ "
@@ -155,7 +154,7 @@ func NewRowsFromStruct(m interface{}, tagName ...string) (*Rows, error) {
155154 column := f .Tag .Get (tag )
156155 if len (column ) > 0 {
157156 columns = append (columns , column )
158- values = append (values , val .Field (i ))
157+ values = append (values , val .Field (i ). Interface () )
159158 }
160159 }
161160 if len (columns ) == 0 {
@@ -164,53 +163,11 @@ func NewRowsFromStruct(m interface{}, tagName ...string) (*Rows, error) {
164163 rows := & Rows {
165164 cols : columns ,
166165 nextErr : make (map [int ]error ),
167- converter : reflectTypeConverter {} ,
166+ converter : driver . DefaultParameterConverter ,
168167 }
169168 return rows .AddRow (values ... ), nil
170169}
171170
172- var timeKind = reflect .TypeOf (time.Time {}).Kind ()
173-
174- type reflectTypeConverter struct {}
175-
176- func (reflectTypeConverter ) ConvertValue (v interface {}) (driver.Value , error ) {
177- rv := v .(reflect.Value )
178- switch rv .Kind () {
179- case reflect .Ptr :
180- // indirect pointers
181- if rv .IsNil () {
182- return nil , nil
183- } else {
184- return driver .DefaultParameterConverter .ConvertValue (rv .Elem ().Interface ())
185- }
186- case reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 :
187- return rv .Int (), nil
188- case reflect .Uint , reflect .Uint8 , reflect .Uint16 , reflect .Uint32 :
189- return int64 (rv .Uint ()), nil
190- case reflect .Uint64 :
191- u64 := rv .Uint ()
192- if u64 >= 1 << 63 {
193- return nil , fmt .Errorf ("uint64 values with high bit set are not supported" )
194- }
195- return int64 (u64 ), nil
196- case reflect .Float32 , reflect .Float64 :
197- return rv .Float (), nil
198- case reflect .Bool :
199- return rv .Bool (), nil
200- case reflect .Slice :
201- ek := rv .Type ().Elem ().Kind ()
202- if ek == reflect .Uint8 {
203- return rv .Bytes (), nil
204- }
205- return nil , fmt .Errorf ("unsupported type %T, a slice of %s" , v , ek )
206- case reflect .String :
207- return rv .String (), nil
208- case timeKind :
209- return rv .Interface ().(time.Time ), nil
210- }
211- return nil , fmt .Errorf ("unsupported type %T, a %s" , v , rv .Kind ())
212- }
213-
214171// NewRowsFromStructs new Rows from struct slice reflect with tagName
215172// NOTE: arr must be of the same type
216173// tagName default "json"
@@ -226,15 +183,18 @@ func NewRowsFromStructs(tagName string, arr ...interface{}) (*Rows, error) {
226183 return nil , errors .New ("no properties available" )
227184 }
228185 var columns []string
186+ var idx []int
229187 tag := "json"
230188 if len (tagName ) > 0 {
231189 tag = tagName
232190 }
191+
233192 for i := 0 ; i < typ .NumField (); i ++ {
234193 f := typ .Field (i )
235194 column := f .Tag .Get (tag )
236195 if len (column ) > 0 {
237196 columns = append (columns , column )
197+ idx = append (idx , i )
238198 }
239199 }
240200 if len (columns ) == 0 {
@@ -243,14 +203,15 @@ func NewRowsFromStructs(tagName string, arr ...interface{}) (*Rows, error) {
243203 rows := & Rows {
244204 cols : columns ,
245205 nextErr : make (map [int ]error ),
246- converter : reflectTypeConverter {} ,
206+ converter : driver . DefaultParameterConverter ,
247207 }
208+
248209 for _ , m := range arr {
249- v := m
250- val := reflect .ValueOf (v ).Elem ()
210+ val := reflect .ValueOf (m ).Elem ()
251211 var values []driver.Value
252- for _ , column := range columns {
253- values = append (values , val .FieldByName (column ))
212+ for _ , i := range idx {
213+ // NOTE: field by name ptr nil
214+ values = append (values , val .Field (i ).Interface ())
254215 }
255216 rows .AddRow (values ... )
256217 }
0 commit comments