This commit is contained in:
Sergey Kurt 2017-01-23 14:42:31 +03:00
parent 1b301d982d
commit c389e21302
1 changed files with 423 additions and 410 deletions

View File

@ -460,23 +460,20 @@ func (session *Session) doPrepare(sqlStr string) (stmt *core.Stmt, err error) {
return
}
func (session *Session) getField(dataStruct *reflect.Value, key string, table *core.Table, idx int) *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
}
func (session *Session) getField(dataStruct *reflect.Value, table *core.Table, col *core.Column) *reflect.Value {
fieldValue, err := col.ValueOfV(dataStruct)
if err != nil {
session.Engine.logger.Error(err)
return nil
}
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 fieldValue
}
@ -510,6 +507,24 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
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 {
scanResults := make([]interface{}, fieldsCount)
for i := 0; i < len(fields); i++ {
@ -534,19 +549,23 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
}
}()
var tempMap = make(map[string]int)
for ii, key := range fields {
var idx int
var ok bool
var lKey = strings.ToLower(key)
if idx, ok = tempMap[lKey]; !ok {
idx = 0
} else {
idx = idx + 1
}
tempMap[lKey] = idx
var ndx int
var col *core.Column
var fieldValue *reflect.Value
var mColumnNdx = make(map[string]int)
for ii, key := range fields {
ndx = session.getColumnNdx(mColumnNdx, key)
if col = table.GetColumnIdx(key, ndx); col == nil {
//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]))
// if row is null then ignore
@ -582,7 +601,6 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
fieldType := fieldValue.Type()
hasAssigned := false
col := table.GetColumnIdx(key, idx)
if col.SQLType.IsJson() {
var bs []byte
@ -616,10 +634,6 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
continue
}
case reflect.Struct:
if fieldType.ConvertibleTo(core.TimeType) {
if rawValueType == core.TimeType {
hasAssigned = true
switch fieldType.Kind() {
case reflect.Complex64, reflect.Complex128:
@ -985,7 +999,6 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
}
}
}
}
return nil
}