prevent panic when struct with unexport field #1839
|
@ -253,7 +253,7 @@ func (parser *Parser) Parse(v reflect.Value) (*schemas.Table, error) {
|
||||||
addIndex(indexName, table, col, indexType)
|
addIndex(indexName, table, col, indexType)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else if fieldValue.CanSet() {
|
||||||
var sqlType schemas.SQLType
|
var sqlType schemas.SQLType
|
||||||
if fieldValue.CanAddr() {
|
if fieldValue.CanAddr() {
|
||||||
if _, ok := fieldValue.Addr().Interface().(convert.Conversion); ok {
|
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")) {
|
if fieldType.Kind() == reflect.Int64 && (strings.ToUpper(col.FieldName) == "ID" || strings.HasSuffix(strings.ToUpper(col.FieldName), ".ID")) {
|
||||||
idFieldColName = col.Name
|
idFieldColName = col.Name
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
if col.IsAutoIncrement {
|
if col.IsAutoIncrement {
|
||||||
col.Nullable = false
|
col.Nullable = false
|
||||||
|
|
|
@ -42,3 +42,41 @@ func TestParseTableName(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, "p_parseTableName", table.Name)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user