From 3472d80a6dd1ad3b510558712b449a7b0cff2e9d Mon Sep 17 00:00:00 2001 From: finelog Date: Wed, 2 Dec 2020 22:07:35 +0800 Subject: [PATCH] prevent panic when struct with unexport field (#1839) prevent panic when struct with unexport field add test for prevent panic when vanial struct with unexport field panic minor code fix minor fix part II Co-authored-by: finelog Reviewed-on: https://gitea.com/xorm/xorm/pulls/1839 Reviewed-by: Lunny Xiao Co-Authored-By: finelog Co-Committed-By: finelog --- tags/parser.go | 4 +++- tags/parser_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/tags/parser.go b/tags/parser.go index add30a13..a301d124 100644 --- a/tags/parser.go +++ b/tags/parser.go @@ -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 diff --git a/tags/parser_test.go b/tags/parser_test.go index 6065bf2e..ff304a5b 100644 --- a/tags/parser_test.go +++ b/tags/parser_test.go @@ -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) + } +}