add some comments and improvements

This commit is contained in:
Lunny Xiao 2017-03-27 21:49:25 +08:00
parent cf44e45230
commit 7c1515f50f
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
2 changed files with 64 additions and 42 deletions

View File

@ -904,6 +904,11 @@ func (engine *Engine) mapType(v reflect.Value) (*core.Table, error) {
} }
for j, key := range tags { for j, key := range tags {
if ctx.ignoreNext {
ctx.ignoreNext = false
continue
}
k := strings.ToUpper(key) k := strings.ToUpper(key)
ctx.tagName = k ctx.tagName = k
@ -934,9 +939,6 @@ func (engine *Engine) mapType(v reflect.Value) (*core.Table, error) {
return nil, err return nil, err
} }
} else { } else {
if ctx.preTag == "DEFAULT" {
continue
}
if strings.HasPrefix(key, "'") && strings.HasSuffix(key, "'") { if strings.HasPrefix(key, "'") && strings.HasSuffix(key, "'") {
col.Name = key[1 : len(key)-1] col.Name = key[1 : len(key)-1]
} else { } else {

78
tag.go
View File

@ -27,6 +27,7 @@ type tagContext struct {
engine *Engine engine *Engine
hasCacheTag bool hasCacheTag bool
hasNoCacheTag bool hasNoCacheTag bool
ignoreNext bool
} }
// tagHandler describes tag handler for XORM // tagHandler describes tag handler for XORM
@ -35,8 +36,8 @@ type tagHandler func(ctx *tagContext) error
var ( var (
// defaultTagHandlers enumerates all the default tag handler // defaultTagHandlers enumerates all the default tag handler
defaultTagHandlers = map[string]tagHandler{ defaultTagHandlers = map[string]tagHandler{
"<-": DirectTagHandler, "<-": OnlyFromDBTagHandler,
"->": DirectTagHandler, "->": OnlyToDBTagHandler,
"PK": PKTagHandler, "PK": PKTagHandler,
"NULL": NULLTagHandler, "NULL": NULLTagHandler,
"NOT": IgnoreTagHandler, "NOT": IgnoreTagHandler,
@ -52,90 +53,100 @@ var (
"INDEX": IndexTagHandler, "INDEX": IndexTagHandler,
"UNIQUE": UniqueTagHandler, "UNIQUE": UniqueTagHandler,
"CACHE": CacheTagHandler, "CACHE": CacheTagHandler,
"NOCACHE": CacheTagHandler, "NOCACHE": NoCacheTagHandler,
} }
) )
func init() { func init() {
for k, _ := range core.SqlTypes { for k := range core.SqlTypes {
defaultTagHandlers[k] = SQLTypeTagHandler defaultTagHandlers[k] = SQLTypeTagHandler
} }
} }
// IgnoreTagHandler describes ignored tag handler
func IgnoreTagHandler(ctx *tagContext) error { func IgnoreTagHandler(ctx *tagContext) error {
return nil return nil
} }
// DirectTagHandler describes handle mapping type handler // OnlyFromDBTagHandler describes mapping direction tag handler
func DirectTagHandler(ctx *tagContext) error { func OnlyFromDBTagHandler(ctx *tagContext) error {
if ctx.tagName == "<-" {
ctx.col.MapType = core.ONLYFROMDB ctx.col.MapType = core.ONLYFROMDB
} else if ctx.tagName == "->" {
ctx.col.MapType = core.ONLYTODB
}
return nil return nil
} }
// PKTagHandler decribes handle pk // OnlyToDBTagHandler describes mapping direction tag handler
func OnlyToDBTagHandler(ctx *tagContext) error {
ctx.col.MapType = core.ONLYTODB
return nil
}
// PKTagHandler decribes primary key tag handler
func PKTagHandler(ctx *tagContext) error { func PKTagHandler(ctx *tagContext) error {
ctx.col.IsPrimaryKey = true ctx.col.IsPrimaryKey = true
ctx.col.Nullable = false ctx.col.Nullable = false
return nil return nil
} }
// NULLTagHandler // NULLTagHandler describes null tag handler
func NULLTagHandler(ctx *tagContext) error { func NULLTagHandler(ctx *tagContext) error {
if len(ctx.preTag) == 0 {
ctx.col.Nullable = true
} else {
ctx.col.Nullable = (strings.ToUpper(ctx.preTag) != "NOT") ctx.col.Nullable = (strings.ToUpper(ctx.preTag) != "NOT")
}
return nil return nil
} }
// NotNullTagHandler describes notnull tag handler
func NotNullTagHandler(ctx *tagContext) error { func NotNullTagHandler(ctx *tagContext) error {
ctx.col.Nullable = false ctx.col.Nullable = false
return nil return nil
} }
// AutoIncrTagHandler describes autoincr tag handler
func AutoIncrTagHandler(ctx *tagContext) error { func AutoIncrTagHandler(ctx *tagContext) error {
ctx.col.IsAutoIncrement = true ctx.col.IsAutoIncrement = true
//col.AutoIncrStart = 1 /*
if len(ctx.params) > 0 {
// TODO: for postgres how add autoincr? autoStartInt, err := strconv.Atoi(ctx.params[0])
/*case strings.HasPrefix(k, "AUTOINCR(") && strings.HasSuffix(k, ")"):
col.IsAutoIncrement = true
autoStart := k[len("AUTOINCR")+1 : len(k)-1]
autoStartInt, err := strconv.Atoi(autoStart)
if err != nil { if err != nil {
engine.LogError(err) return err
} }
col.AutoIncrStart = autoStartInt*/ ctx.col.AutoIncrStart = autoStartInt
} else {
ctx.col.AutoIncrStart = 1
}
*/
return nil return nil
} }
// DefaultTagHandler describes default tag handler
func DefaultTagHandler(ctx *tagContext) error { func DefaultTagHandler(ctx *tagContext) error {
if len(ctx.params) > 0 {
ctx.col.Default = ctx.params[0]
} else {
ctx.col.Default = ctx.nextTag ctx.col.Default = ctx.nextTag
ctx.ignoreNext = true
}
return nil return nil
} }
// CreatedTagHandler describes created tag handler
func CreatedTagHandler(ctx *tagContext) error { func CreatedTagHandler(ctx *tagContext) error {
ctx.col.IsCreated = true ctx.col.IsCreated = true
return nil return nil
} }
// VersionTagHandler describes version tag handler
func VersionTagHandler(ctx *tagContext) error { func VersionTagHandler(ctx *tagContext) error {
ctx.col.IsVersion = true ctx.col.IsVersion = true
ctx.col.Default = "1" ctx.col.Default = "1"
return nil return nil
} }
// UTCTagHandler describes utc tag handler
func UTCTagHandler(ctx *tagContext) error { func UTCTagHandler(ctx *tagContext) error {
ctx.col.TimeZone = time.UTC ctx.col.TimeZone = time.UTC
return nil return nil
} }
// LocalTagHandler describes local tag handler
func LocalTagHandler(ctx *tagContext) error { func LocalTagHandler(ctx *tagContext) error {
if len(ctx.params) == 0 { if len(ctx.params) == 0 {
ctx.col.TimeZone = time.Local ctx.col.TimeZone = time.Local
@ -149,16 +160,19 @@ func LocalTagHandler(ctx *tagContext) error {
return nil return nil
} }
// UpdatedTagHandler describes updated tag handler
func UpdatedTagHandler(ctx *tagContext) error { func UpdatedTagHandler(ctx *tagContext) error {
ctx.col.IsUpdated = true ctx.col.IsUpdated = true
return nil return nil
} }
// DeletedTagHandler describes deleted tag handler
func DeletedTagHandler(ctx *tagContext) error { func DeletedTagHandler(ctx *tagContext) error {
ctx.col.IsDeleted = true ctx.col.IsDeleted = true
return nil return nil
} }
// IndexTagHandler describes index tag handler
func IndexTagHandler(ctx *tagContext) error { func IndexTagHandler(ctx *tagContext) error {
if len(ctx.params) > 0 { if len(ctx.params) > 0 {
ctx.indexNames[ctx.params[0]] = core.IndexType ctx.indexNames[ctx.params[0]] = core.IndexType
@ -168,6 +182,7 @@ func IndexTagHandler(ctx *tagContext) error {
return nil return nil
} }
// UniqueTagHandler describes unique tag handler
func UniqueTagHandler(ctx *tagContext) error { func UniqueTagHandler(ctx *tagContext) error {
if len(ctx.params) > 0 { if len(ctx.params) > 0 {
ctx.indexNames[ctx.params[0]] = core.UniqueType ctx.indexNames[ctx.params[0]] = core.UniqueType
@ -177,6 +192,7 @@ func UniqueTagHandler(ctx *tagContext) error {
return nil return nil
} }
// SQLTypeTagHandler describes SQL Type tag handler
func SQLTypeTagHandler(ctx *tagContext) error { func SQLTypeTagHandler(ctx *tagContext) error {
ctx.col.SQLType = core.SQLType{Name: ctx.tagName} ctx.col.SQLType = core.SQLType{Name: ctx.tagName}
if len(ctx.params) > 0 { if len(ctx.params) > 0 {
@ -216,6 +232,7 @@ func SQLTypeTagHandler(ctx *tagContext) error {
return nil return nil
} }
// ExtendsTagHandler describes extends tag handler
func ExtendsTagHandler(ctx *tagContext) error { func ExtendsTagHandler(ctx *tagContext) error {
var fieldValue = ctx.fieldValue var fieldValue = ctx.fieldValue
switch fieldValue.Kind() { switch fieldValue.Kind() {
@ -247,15 +264,18 @@ func ExtendsTagHandler(ctx *tagContext) error {
return nil return nil
} }
// CacheTagHandler describes cache tag handler
func CacheTagHandler(ctx *tagContext) error { func CacheTagHandler(ctx *tagContext) error {
if ctx.tagName == "CACHE" {
if !ctx.hasCacheTag { if !ctx.hasCacheTag {
ctx.hasCacheTag = true ctx.hasCacheTag = true
} }
} else if ctx.tagName == "NOCACHE" { return nil
}
// NoCacheTagHandler describes nocache tag handler
func NoCacheTagHandler(ctx *tagContext) error {
if !ctx.hasNoCacheTag { if !ctx.hasNoCacheTag {
ctx.hasNoCacheTag = true ctx.hasNoCacheTag = true
} }
}
return nil return nil
} }