Skip to content

Commit eb54fbc

Browse files
committed
feat: create rows with slices
Author: Rennbon <[email protected]>
1 parent 79f6b89 commit eb54fbc

File tree

2 files changed

+12
-51
lines changed

2 files changed

+12
-51
lines changed

rows.go

+11-50
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"io"
1010
"reflect"
1111
"strings"
12-
"time"
1312
)
1413

1514
const 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
}

rows_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,7 @@ func TestNewRowsFromStructs(t *testing.T) {
796796
for _, v := range arr {
797797
excepted.AddRow(v.Type, v.Name, v.CreateTime)
798798
}
799-
actual, err := NewRowsFromStructs("mock", m1, m2)
799+
actual, err := NewRowsFromStructs("mock", arr[0],arr[1])
800800
if err != nil {
801801
t.Fatal(err)
802802
}

0 commit comments

Comments
 (0)