mirror of
https://github.com/geektutu/7days-golang.git
synced 2024-04-21 12:32:11 +00:00
77 lines
1.7 KiB
Go
77 lines
1.7 KiB
Go
package schema
|
|
|
|
import (
|
|
"geeorm/dialect"
|
|
"go/ast"
|
|
"reflect"
|
|
)
|
|
|
|
// Field represents a column of database
|
|
type Field struct {
|
|
Name string
|
|
Type string
|
|
Tag string
|
|
}
|
|
|
|
// Schema represents a table of database
|
|
type Schema struct {
|
|
Model interface{}
|
|
Name string
|
|
Fields []*Field
|
|
FieldNames []string
|
|
fieldMap map[string]*Field
|
|
}
|
|
|
|
// GetField returns field by name
|
|
func (schema *Schema) GetField(name string) *Field {
|
|
return schema.fieldMap[name]
|
|
}
|
|
|
|
// Values return the values of dest's member variables
|
|
func (schema *Schema) RecordValues(dest interface{}) []interface{} {
|
|
destValue := reflect.Indirect(reflect.ValueOf(dest))
|
|
var fieldValues []interface{}
|
|
for _, field := range schema.Fields {
|
|
fieldValues = append(fieldValues, destValue.FieldByName(field.Name).Interface())
|
|
}
|
|
return fieldValues
|
|
}
|
|
|
|
type ITableName interface {
|
|
TableName() string
|
|
}
|
|
|
|
// Parse a struct to a Schema instance
|
|
func Parse(dest interface{}, d dialect.Dialect) *Schema {
|
|
modelType := reflect.Indirect(reflect.ValueOf(dest)).Type()
|
|
var tableName string
|
|
t, ok := dest.(ITableName)
|
|
if !ok {
|
|
tableName = modelType.Name()
|
|
} else {
|
|
tableName = t.TableName()
|
|
}
|
|
schema := &Schema{
|
|
Model: dest,
|
|
Name: tableName,
|
|
fieldMap: make(map[string]*Field),
|
|
}
|
|
|
|
for i := 0; i < modelType.NumField(); i++ {
|
|
p := modelType.Field(i)
|
|
if !p.Anonymous && ast.IsExported(p.Name) {
|
|
field := &Field{
|
|
Name: p.Name,
|
|
Type: d.DataTypeOf(reflect.Indirect(reflect.New(p.Type))),
|
|
}
|
|
if v, ok := p.Tag.Lookup("geeorm"); ok {
|
|
field.Tag = v
|
|
}
|
|
schema.Fields = append(schema.Fields, field)
|
|
schema.FieldNames = append(schema.FieldNames, p.Name)
|
|
schema.fieldMap[p.Name] = field
|
|
}
|
|
}
|
|
return schema
|
|
}
|