9
9
"io"
10
10
"reflect"
11
11
"strings"
12
- "time"
13
12
)
14
13
15
14
const invalidate = "☠☠☠ MEMORY OVERWRITTEN ☠☠☠ "
@@ -155,7 +154,7 @@ func NewRowsFromStruct(m interface{}, tagName ...string) (*Rows, error) {
155
154
column := f .Tag .Get (tag )
156
155
if len (column ) > 0 {
157
156
columns = append (columns , column )
158
- values = append (values , val .Field (i ))
157
+ values = append (values , val .Field (i ). Interface () )
159
158
}
160
159
}
161
160
if len (columns ) == 0 {
@@ -164,53 +163,11 @@ func NewRowsFromStruct(m interface{}, tagName ...string) (*Rows, error) {
164
163
rows := & Rows {
165
164
cols : columns ,
166
165
nextErr : make (map [int ]error ),
167
- converter : reflectTypeConverter {} ,
166
+ converter : driver . DefaultParameterConverter ,
168
167
}
169
168
return rows .AddRow (values ... ), nil
170
169
}
171
170
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
-
214
171
// NewRowsFromStructs new Rows from struct slice reflect with tagName
215
172
// NOTE: arr must be of the same type
216
173
// tagName default "json"
@@ -226,15 +183,18 @@ func NewRowsFromStructs(tagName string, arr ...interface{}) (*Rows, error) {
226
183
return nil , errors .New ("no properties available" )
227
184
}
228
185
var columns []string
186
+ var idx []int
229
187
tag := "json"
230
188
if len (tagName ) > 0 {
231
189
tag = tagName
232
190
}
191
+
233
192
for i := 0 ; i < typ .NumField (); i ++ {
234
193
f := typ .Field (i )
235
194
column := f .Tag .Get (tag )
236
195
if len (column ) > 0 {
237
196
columns = append (columns , column )
197
+ idx = append (idx , i )
238
198
}
239
199
}
240
200
if len (columns ) == 0 {
@@ -243,14 +203,15 @@ func NewRowsFromStructs(tagName string, arr ...interface{}) (*Rows, error) {
243
203
rows := & Rows {
244
204
cols : columns ,
245
205
nextErr : make (map [int ]error ),
246
- converter : reflectTypeConverter {} ,
206
+ converter : driver . DefaultParameterConverter ,
247
207
}
208
+
248
209
for _ , m := range arr {
249
- v := m
250
- val := reflect .ValueOf (v ).Elem ()
210
+ val := reflect .ValueOf (m ).Elem ()
251
211
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 ())
254
215
}
255
216
rows .AddRow (values ... )
256
217
}
0 commit comments