From a6b65d30c745e951bd2243b02f00bcbf21e6f3f6 Mon Sep 17 00:00:00 2001 From: finelog Date: Wed, 2 Dec 2020 21:03:38 +0800 Subject: [PATCH 1/4] prevent panic when struct with unexport field --- tags/parser.go | 4 +++- 1 file changed, 3 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 -- 2.40.1 From dfe9f387cf545a1a7d7ce7ceff2b45f216a671a9 Mon Sep 17 00:00:00 2001 From: finelog Date: Wed, 2 Dec 2020 21:47:06 +0800 Subject: [PATCH 2/4] add test for prevent panic when vanial struct with unexport field panic --- tags/parser_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tags/parser_test.go b/tags/parser_test.go index 6065bf2e..f6e99572 100644 --- a/tags/parser_test.go +++ b/tags/parser_test.go @@ -42,3 +42,43 @@ func TestParseTableName(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, "p_parseTableName", table.Name) } + +type VanilaStruct struct { + private int + Public int +} + +type TaggedStruct struct { + private int `xorm:"private"` + Public int `xorm:"-"` +} + +func TestUnexportField(t *testing.T) { + parser := NewParser( + "xorm", + dialects.QueryDialect("mysql"), + names.SnakeMapper{}, + names.SnakeMapper{}, + caches.NewManager(), + ) + + 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 _, v := range table.Columns() { + assert.EqualValues(t, "public", v.Name) + assert.NotEqual(t, "private", v.Name) + } + + 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 _, v := range table.Columns() { + assert.EqualValues(t, "private", v.Name) + assert.NotEqual(t, "public", v.Name) + } +} -- 2.40.1 From 45387259498de04c6525ce2b946931918fbf3b52 Mon Sep 17 00:00:00 2001 From: finelog Date: Wed, 2 Dec 2020 21:53:17 +0800 Subject: [PATCH 3/4] minor code fix --- tags/parser_test.go | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/tags/parser_test.go b/tags/parser_test.go index f6e99572..ed9aa956 100644 --- a/tags/parser_test.go +++ b/tags/parser_test.go @@ -43,17 +43,13 @@ func TestParseTableName(t *testing.T) { assert.EqualValues(t, "p_parseTableName", table.Name) } -type VanilaStruct struct { - private int - Public int -} - -type TaggedStruct struct { - private int `xorm:"private"` - Public int `xorm:"-"` -} - func TestUnexportField(t *testing.T) { + + type VanilaStruct struct { + private int + Public int + } + parser := NewParser( "xorm", dialects.QueryDialect("mysql"), @@ -67,9 +63,14 @@ func TestUnexportField(t *testing.T) { assert.EqualValues(t, "vanila_struct", table.Name) assert.EqualValues(t, 1, len(table.Columns())) - for _, v := range table.Columns() { - assert.EqualValues(t, "public", v.Name) - assert.NotEqual(t, "private", v.Name) + 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))) @@ -77,8 +78,8 @@ func TestUnexportField(t *testing.T) { assert.EqualValues(t, "tagged_struct", table.Name) assert.EqualValues(t, 1, len(table.Columns())) - for _, v := range table.Columns() { - assert.EqualValues(t, "private", v.Name) - assert.NotEqual(t, "public", v.Name) + for _, col := range table.Columns() { + assert.EqualValues(t, "private", col.Name) + assert.NotEqual(t, "public", col.Name) } } -- 2.40.1 From 55e7f68a77b2df90caedf83eff98c3ddb63404e2 Mon Sep 17 00:00:00 2001 From: finelog Date: Wed, 2 Dec 2020 21:54:38 +0800 Subject: [PATCH 4/4] minor fix part II --- tags/parser_test.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tags/parser_test.go b/tags/parser_test.go index ed9aa956..ff304a5b 100644 --- a/tags/parser_test.go +++ b/tags/parser_test.go @@ -44,12 +44,6 @@ func TestParseTableName(t *testing.T) { } func TestUnexportField(t *testing.T) { - - type VanilaStruct struct { - private int - Public int - } - parser := NewParser( "xorm", dialects.QueryDialect("mysql"), @@ -58,6 +52,10 @@ func TestUnexportField(t *testing.T) { 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) @@ -72,7 +70,6 @@ func TestUnexportField(t *testing.T) { 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) -- 2.40.1