Optimized session._row2bean function
This commit is contained in:
parent
f31f552026
commit
5480b6d000
60
session.go
60
session.go
|
@ -1606,23 +1606,20 @@ func (session *Session) dropAll() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (session *Session) getField(dataStruct *reflect.Value, key string, table *core.Table, idx int) *reflect.Value {
|
func (session *Session) getField(dataStruct *reflect.Value, table *core.Table, col *core.Column) *reflect.Value {
|
||||||
var col *core.Column
|
|
||||||
if col = table.GetColumnIdx(key, idx); col == nil {
|
|
||||||
//session.Engine.logger.Warnf("table %v has no column %v. %v", table.Name, key, table.ColumnsSeq())
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldValue, err := col.ValueOfV(dataStruct)
|
fieldValue, err := col.ValueOfV(dataStruct)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.Engine.logger.Error(err)
|
session.Engine.logger.Error(err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if !fieldValue.IsValid() || !fieldValue.CanSet() {
|
if !fieldValue.IsValid() || !fieldValue.CanSet() {
|
||||||
session.Engine.logger.Warnf("table %v's column %v is not valid or cannot set", table.Name, key)
|
session.Engine.logger.Warnf("Table %v's column %v is not valid or cannot be set", table.Name, col.Name)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return fieldValue
|
return fieldValue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1656,6 +1653,24 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
|
||||||
return session._row2Bean(rows, fields, fieldsCount, bean, &dataStruct, session.Statement.RefTable)
|
return session._row2Bean(rows, fields, fieldsCount, bean, &dataStruct, session.Statement.RefTable)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (session *Session) getColumnNdx(m map[string]int, name string) int {
|
||||||
|
|
||||||
|
n := len(name)
|
||||||
|
|
||||||
|
for k := range m {
|
||||||
|
if len(k) != n {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if strings.EqualFold(k, name) {
|
||||||
|
m[k] = m[k] + 1
|
||||||
|
return m[k]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m[name] = 0
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount int, bean interface{}, dataStruct *reflect.Value, table *core.Table) error {
|
func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount int, bean interface{}, dataStruct *reflect.Value, table *core.Table) error {
|
||||||
scanResults := make([]interface{}, fieldsCount)
|
scanResults := make([]interface{}, fieldsCount)
|
||||||
for i := 0; i < len(fields); i++ {
|
for i := 0; i < len(fields); i++ {
|
||||||
|
@ -1680,19 +1695,24 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
var tempMap = make(map[string]int)
|
var ndx int
|
||||||
for ii, key := range fields {
|
var col *core.Column
|
||||||
var idx int
|
var fieldValue *reflect.Value
|
||||||
var ok bool
|
var mColumnNdx = make(map[string]int)
|
||||||
var lKey = strings.ToLower(key)
|
|
||||||
if idx, ok = tempMap[lKey]; !ok {
|
for ii, key := range fields {
|
||||||
idx = 0
|
|
||||||
} else {
|
ndx = session.getColumnNdx(mColumnNdx, key)
|
||||||
idx = idx + 1
|
|
||||||
}
|
if col = table.GetColumnIdx(key, ndx); col == nil {
|
||||||
tempMap[lKey] = idx
|
//session.Engine.logger.Warnf("table %v has no column %v. %v", table.Name, key, table.ColumnsSeq())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if fieldValue = session.getField(dataStruct, table, col); fieldValue == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if fieldValue := session.getField(dataStruct, key, table, idx); fieldValue != nil {
|
|
||||||
rawValue := reflect.Indirect(reflect.ValueOf(scanResults[ii]))
|
rawValue := reflect.Indirect(reflect.ValueOf(scanResults[ii]))
|
||||||
|
|
||||||
// if row is null then ignore
|
// if row is null then ignore
|
||||||
|
@ -1728,7 +1748,6 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
|
||||||
|
|
||||||
fieldType := fieldValue.Type()
|
fieldType := fieldValue.Type()
|
||||||
hasAssigned := false
|
hasAssigned := false
|
||||||
col := table.GetColumnIdx(key, idx)
|
|
||||||
|
|
||||||
if col.SQLType.IsJson() {
|
if col.SQLType.IsJson() {
|
||||||
var bs []byte
|
var bs []byte
|
||||||
|
@ -2119,7 +2138,6 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue