prevent panic when struct with unexport field #1839

Merged
lunny merged 4 commits from :fix_panic_with_unexport_fields into master 2020-12-02 14:07:45 +00:00
2 changed files with 41 additions and 1 deletions

View File

@ -253,7 +253,7 @@ func (parser *Parser) Parse(v reflect.Value) (*schemas.Table, error) {
addIndex(indexName, table, col, indexType)
}
}
} else {
} else if fieldValue.CanSet() {
var sqlType schemas.SQLType
if fieldValue.CanAddr() {
if _, ok := fieldValue.Addr().Interface().(convert.Conversion); ok {
@ -272,6 +272,8 @@ func (parser *Parser) Parse(v reflect.Value) (*schemas.Table, error) {
if fieldType.Kind() == reflect.Int64 && (strings.ToUpper(col.FieldName) == "ID" || strings.HasSuffix(strings.ToUpper(col.FieldName), ".ID")) {
idFieldColName = col.Name
}
} else {
continue
}
if col.IsAutoIncrement {
col.Nullable = false

View File

@ -42,3 +42,41 @@ func TestParseTableName(t *testing.T) {
assert.NoError(t, err)
assert.EqualValues(t, "p_parseTableName", table.Name)
}
func TestUnexportField(t *testing.T) {
parser := NewParser(
"xorm",
dialects.QueryDialect("mysql"),
names.SnakeMapper{},
names.SnakeMapper{},
caches.NewManager(),
)
type VanilaStruct struct {
private int
Public int
}
table, err := parser.Parse(reflect.ValueOf(new(VanilaStruct)))
assert.NoError(t, err)
assert.EqualValues(t, "vanila_struct", table.Name)
assert.EqualValues(t, 1, len(table.Columns()))
for _, col := range table.Columns() {
assert.EqualValues(t, "public", col.Name)
assert.NotEqual(t, "private", col.Name)
}
type TaggedStruct struct {
private int `xorm:"private"`
Public int `xorm:"-"`
}
table, err = parser.Parse(reflect.ValueOf(new(TaggedStruct)))
assert.NoError(t, err)
assert.EqualValues(t, "tagged_struct", table.Name)
assert.EqualValues(t, 1, len(table.Columns()))
for _, col := range table.Columns() {
assert.EqualValues(t, "private", col.Name)
assert.NotEqual(t, "public", col.Name)
}
}