more Find supports
This commit is contained in:
parent
c8ac6bb65c
commit
e8fbd41c16
|
@ -438,10 +438,10 @@ func (session *Session) getField(dataStruct *reflect.Value, key string, table *c
|
||||||
type Cell *interface{}
|
type Cell *interface{}
|
||||||
|
|
||||||
func (session *Session) rows2Beans(rows *core.Rows, fields []string, fieldsCount int,
|
func (session *Session) rows2Beans(rows *core.Rows, fields []string, fieldsCount int,
|
||||||
table *core.Table, newElemFunc func() reflect.Value,
|
table *core.Table, newElemFunc func([]string) reflect.Value,
|
||||||
sliceValueSetFunc func(*reflect.Value, core.PK) error) error {
|
sliceValueSetFunc func(*reflect.Value, core.PK) error) error {
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var newValue = newElemFunc()
|
var newValue = newElemFunc(fields)
|
||||||
bean := newValue.Interface()
|
bean := newValue.Interface()
|
||||||
dataStruct := rValue(bean)
|
dataStruct := rValue(bean)
|
||||||
pk, err := session._row2Bean(rows, fields, fieldsCount, bean, &dataStruct, table)
|
pk, err := session._row2Bean(rows, fields, fieldsCount, bean, &dataStruct, table)
|
||||||
|
|
|
@ -169,31 +169,43 @@ func (session *Session) noCacheFind(table *core.Table, containerValue reflect.Va
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var newElemFunc func() reflect.Value
|
var newElemFunc func(fields []string) reflect.Value
|
||||||
elemType := containerValue.Type().Elem()
|
elemType := containerValue.Type().Elem()
|
||||||
|
var isPointer bool
|
||||||
if elemType.Kind() == reflect.Ptr {
|
if elemType.Kind() == reflect.Ptr {
|
||||||
newElemFunc = func() reflect.Value {
|
isPointer = true
|
||||||
return reflect.New(elemType.Elem())
|
elemType = elemType.Elem()
|
||||||
}
|
}
|
||||||
} else {
|
if elemType.Kind() == reflect.Ptr {
|
||||||
newElemFunc = func() reflect.Value {
|
return errors.New("pointer to pointer is not supported")
|
||||||
return reflect.New(elemType)
|
}
|
||||||
|
|
||||||
|
newElemFunc = func(fields []string) reflect.Value {
|
||||||
|
switch elemType.Kind() {
|
||||||
|
case reflect.Slice:
|
||||||
|
slice := reflect.MakeSlice(elemType, len(fields), len(fields))
|
||||||
|
x := reflect.New(slice.Type())
|
||||||
|
x.Elem().Set(slice)
|
||||||
|
return x
|
||||||
|
case reflect.Map:
|
||||||
|
mp := reflect.MakeMap(elemType)
|
||||||
|
x := reflect.New(mp.Type())
|
||||||
|
x.Elem().Set(mp)
|
||||||
|
return x
|
||||||
}
|
}
|
||||||
|
return reflect.New(elemType)
|
||||||
}
|
}
|
||||||
|
|
||||||
var containerValueSetFunc func(*reflect.Value, core.PK) error
|
var containerValueSetFunc func(*reflect.Value, core.PK) error
|
||||||
|
|
||||||
if containerValue.Kind() == reflect.Slice {
|
if containerValue.Kind() == reflect.Slice {
|
||||||
if elemType.Kind() == reflect.Ptr {
|
containerValueSetFunc = func(newValue *reflect.Value, pk core.PK) error {
|
||||||
containerValueSetFunc = func(newValue *reflect.Value, pk core.PK) error {
|
if isPointer {
|
||||||
containerValue.Set(reflect.Append(containerValue, reflect.ValueOf(newValue.Interface())))
|
containerValue.Set(reflect.Append(containerValue, newValue.Elem().Addr()))
|
||||||
return nil
|
} else {
|
||||||
}
|
containerValue.Set(reflect.Append(containerValue, newValue.Elem()))
|
||||||
} else {
|
|
||||||
containerValueSetFunc = func(newValue *reflect.Value, pk core.PK) error {
|
|
||||||
containerValue.Set(reflect.Append(containerValue, reflect.Indirect(reflect.ValueOf(newValue.Interface()))))
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
keyType := containerValue.Type().Key()
|
keyType := containerValue.Type().Key()
|
||||||
|
@ -204,40 +216,41 @@ func (session *Session) noCacheFind(table *core.Table, containerValue reflect.Va
|
||||||
return errors.New("don't support multiple primary key's map has non-slice key type")
|
return errors.New("don't support multiple primary key's map has non-slice key type")
|
||||||
}
|
}
|
||||||
|
|
||||||
if elemType.Kind() == reflect.Ptr {
|
containerValueSetFunc = func(newValue *reflect.Value, pk core.PK) error {
|
||||||
containerValueSetFunc = func(newValue *reflect.Value, pk core.PK) error {
|
keyValue := reflect.New(keyType)
|
||||||
keyValue := reflect.New(keyType)
|
err := convertPKToValue(table, keyValue.Interface(), pk)
|
||||||
err := convertPKToValue(table, keyValue.Interface(), pk)
|
if err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
return err
|
|
||||||
}
|
|
||||||
containerValue.SetMapIndex(keyValue.Elem(), reflect.ValueOf(newValue.Interface()))
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
} else {
|
if isPointer {
|
||||||
containerValueSetFunc = func(newValue *reflect.Value, pk core.PK) error {
|
containerValue.SetMapIndex(keyValue.Elem(), newValue.Elem().Addr())
|
||||||
keyValue := reflect.New(keyType)
|
} else {
|
||||||
err := convertPKToValue(table, keyValue.Interface(), pk)
|
containerValue.SetMapIndex(keyValue.Elem(), newValue.Elem())
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
containerValue.SetMapIndex(keyValue.Elem(), reflect.Indirect(reflect.ValueOf(newValue.Interface())))
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var newValue = newElemFunc()
|
if elemType.Kind() == reflect.Struct {
|
||||||
dataStruct := rValue(newValue.Interface())
|
var newValue = newElemFunc(fields)
|
||||||
if dataStruct.Kind() == reflect.Struct {
|
dataStruct := rValue(newValue.Interface())
|
||||||
return session.rows2Beans(rawRows, fields, len(fields), session.Engine.autoMapType(dataStruct), newElemFunc, containerValueSetFunc)
|
return session.rows2Beans(rawRows, fields, len(fields), session.Engine.autoMapType(dataStruct), newElemFunc, containerValueSetFunc)
|
||||||
}
|
}
|
||||||
|
|
||||||
for rawRows.Next() {
|
for rawRows.Next() {
|
||||||
var newValue = newElemFunc()
|
var newValue = newElemFunc(fields)
|
||||||
bean := newValue.Interface()
|
bean := newValue.Interface()
|
||||||
|
|
||||||
if err := rawRows.Scan(bean); err != nil {
|
switch elemType.Kind() {
|
||||||
|
case reflect.Slice:
|
||||||
|
err = rawRows.ScanSlice(bean)
|
||||||
|
case reflect.Map:
|
||||||
|
err = rawRows.ScanMap(bean)
|
||||||
|
default:
|
||||||
|
err = rawRows.Scan(bean)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue