Fix two issues with dumptables (#1903)
There are two issues with #1872 which have become apparent after testing on Gitea. 1. Ensure structs which are have before processors run correctly 2. Ensure structs extending other structs work 3. Ensure that numerical enums become numeric Signed-off-by: Andrew Thornton <art27@cantab.net> Reviewed-on: https://gitea.com/xorm/xorm/pulls/1903 Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: Andrew Thornton <art27@cantab.net> Co-committed-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
parent
912c2524f8
commit
210c30a7dd
21
engine.go
21
engine.go
|
@ -496,7 +496,7 @@ func formatColumnValue(dstDialect dialects.Dialect, d interface{}, col *schemas.
|
|||
}
|
||||
return fmt.Sprintf("%v", strconv.FormatBool(v))
|
||||
}
|
||||
return fmt.Sprintf("%v", d)
|
||||
return fmt.Sprintf("%d", d)
|
||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
||||
if col.SQLType.Name == schemas.Bool {
|
||||
v := reflect.ValueOf(d).Uint() > 0
|
||||
|
@ -508,7 +508,7 @@ func formatColumnValue(dstDialect dialects.Dialect, d interface{}, col *schemas.
|
|||
}
|
||||
return fmt.Sprintf("%v", strconv.FormatBool(v))
|
||||
}
|
||||
return fmt.Sprintf("%v", d)
|
||||
return fmt.Sprintf("%d", d)
|
||||
default:
|
||||
return fmt.Sprintf("%v", d)
|
||||
}
|
||||
|
@ -554,7 +554,7 @@ func (engine *Engine) dumpTables(tables []*schemas.Table, w io.Writer, tp ...sch
|
|||
for i, table := range tables {
|
||||
dstTable := table
|
||||
if table.Type != nil {
|
||||
dstTable, err = dstTableCache.Parse(reflect.New(table.Type))
|
||||
dstTable, err = dstTableCache.Parse(reflect.New(table.Type).Elem())
|
||||
if err != nil {
|
||||
engine.logger.Errorf("Unable to infer table for %s in new dialect. Error: %v", table.Name)
|
||||
dstTable = table
|
||||
|
@ -610,7 +610,8 @@ func (engine *Engine) dumpTables(tables []*schemas.Table, w io.Writer, tp ...sch
|
|||
sess := engine.NewSession()
|
||||
defer sess.Close()
|
||||
for rows.Next() {
|
||||
bean := reflect.New(table.Type)
|
||||
beanValue := reflect.New(table.Type)
|
||||
bean := beanValue.Interface()
|
||||
fields, err := rows.Columns()
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -620,8 +621,8 @@ func (engine *Engine) dumpTables(tables []*schemas.Table, w io.Writer, tp ...sch
|
|||
return err
|
||||
}
|
||||
|
||||
dataStruct := utils.ReflectValue(bean.Interface())
|
||||
_, err = sess.slice2Bean(scanResults, fields, bean.Interface(), &dataStruct, table)
|
||||
dataStruct := utils.ReflectValue(bean)
|
||||
_, err = sess.slice2Bean(scanResults, fields, bean, &dataStruct, table)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -637,7 +638,13 @@ func (engine *Engine) dumpTables(tables []*schemas.Table, w io.Writer, tp ...sch
|
|||
if col == nil {
|
||||
return errors.New("unknown column error")
|
||||
}
|
||||
temp += "," + formatColumnValue(dstDialect, bean.Elem().FieldByName(col.FieldName).Interface(), col)
|
||||
|
||||
fields := strings.Split(col.FieldName, ".")
|
||||
field := dataStruct
|
||||
for _, fieldName := range fields {
|
||||
field = field.FieldByName(fieldName)
|
||||
}
|
||||
temp += "," + formatColumnValue(dstDialect, field.Interface(), col)
|
||||
}
|
||||
_, err = io.WriteString(w, temp[1:]+");\n")
|
||||
if err != nil {
|
||||
|
|
Loading…
Reference in New Issue