From 7c1515f50f405a61e8e33ad879f8f85b7c9d5b2f Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 27 Mar 2017 21:49:25 +0800 Subject: [PATCH] add some comments and improvements --- engine.go | 8 +++-- tag.go | 98 +++++++++++++++++++++++++++++++++---------------------- 2 files changed, 64 insertions(+), 42 deletions(-) diff --git a/engine.go b/engine.go index a349be85..134e6b14 100644 --- a/engine.go +++ b/engine.go @@ -904,6 +904,11 @@ func (engine *Engine) mapType(v reflect.Value) (*core.Table, error) { } for j, key := range tags { + if ctx.ignoreNext { + ctx.ignoreNext = false + continue + } + k := strings.ToUpper(key) ctx.tagName = k @@ -934,9 +939,6 @@ func (engine *Engine) mapType(v reflect.Value) (*core.Table, error) { return nil, err } } else { - if ctx.preTag == "DEFAULT" { - continue - } if strings.HasPrefix(key, "'") && strings.HasSuffix(key, "'") { col.Name = key[1 : len(key)-1] } else { diff --git a/tag.go b/tag.go index 9c7c31cb..4b0e3f54 100644 --- a/tag.go +++ b/tag.go @@ -27,6 +27,7 @@ type tagContext struct { engine *Engine hasCacheTag bool hasNoCacheTag bool + ignoreNext bool } // tagHandler describes tag handler for XORM @@ -35,8 +36,8 @@ type tagHandler func(ctx *tagContext) error var ( // defaultTagHandlers enumerates all the default tag handler defaultTagHandlers = map[string]tagHandler{ - "<-": DirectTagHandler, - "->": DirectTagHandler, + "<-": OnlyFromDBTagHandler, + "->": OnlyToDBTagHandler, "PK": PKTagHandler, "NULL": NULLTagHandler, "NOT": IgnoreTagHandler, @@ -52,90 +53,100 @@ var ( "INDEX": IndexTagHandler, "UNIQUE": UniqueTagHandler, "CACHE": CacheTagHandler, - "NOCACHE": CacheTagHandler, + "NOCACHE": NoCacheTagHandler, } ) func init() { - for k, _ := range core.SqlTypes { + for k := range core.SqlTypes { defaultTagHandlers[k] = SQLTypeTagHandler } } +// IgnoreTagHandler describes ignored tag handler func IgnoreTagHandler(ctx *tagContext) error { return nil } -// DirectTagHandler describes handle mapping type handler -func DirectTagHandler(ctx *tagContext) error { - if ctx.tagName == "<-" { - ctx.col.MapType = core.ONLYFROMDB - } else if ctx.tagName == "->" { - ctx.col.MapType = core.ONLYTODB - } +// OnlyFromDBTagHandler describes mapping direction tag handler +func OnlyFromDBTagHandler(ctx *tagContext) error { + ctx.col.MapType = core.ONLYFROMDB 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 { ctx.col.IsPrimaryKey = true ctx.col.Nullable = false return nil } -// NULLTagHandler +// NULLTagHandler describes null tag handler 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 } +// NotNullTagHandler describes notnull tag handler func NotNullTagHandler(ctx *tagContext) error { ctx.col.Nullable = false return nil } +// AutoIncrTagHandler describes autoincr tag handler func AutoIncrTagHandler(ctx *tagContext) error { ctx.col.IsAutoIncrement = true - //col.AutoIncrStart = 1 - - // TODO: for postgres how add autoincr? - /*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 { - engine.LogError(err) - } - col.AutoIncrStart = autoStartInt*/ + /* + if len(ctx.params) > 0 { + autoStartInt, err := strconv.Atoi(ctx.params[0]) + if err != nil { + return err + } + ctx.col.AutoIncrStart = autoStartInt + } else { + ctx.col.AutoIncrStart = 1 + } + */ return nil } +// DefaultTagHandler describes default tag handler func DefaultTagHandler(ctx *tagContext) error { - ctx.col.Default = ctx.nextTag + if len(ctx.params) > 0 { + ctx.col.Default = ctx.params[0] + } else { + ctx.col.Default = ctx.nextTag + ctx.ignoreNext = true + } return nil } +// CreatedTagHandler describes created tag handler func CreatedTagHandler(ctx *tagContext) error { ctx.col.IsCreated = true return nil } +// VersionTagHandler describes version tag handler func VersionTagHandler(ctx *tagContext) error { ctx.col.IsVersion = true ctx.col.Default = "1" return nil } +// UTCTagHandler describes utc tag handler func UTCTagHandler(ctx *tagContext) error { ctx.col.TimeZone = time.UTC return nil } +// LocalTagHandler describes local tag handler func LocalTagHandler(ctx *tagContext) error { if len(ctx.params) == 0 { ctx.col.TimeZone = time.Local @@ -149,16 +160,19 @@ func LocalTagHandler(ctx *tagContext) error { return nil } +// UpdatedTagHandler describes updated tag handler func UpdatedTagHandler(ctx *tagContext) error { ctx.col.IsUpdated = true return nil } +// DeletedTagHandler describes deleted tag handler func DeletedTagHandler(ctx *tagContext) error { ctx.col.IsDeleted = true return nil } +// IndexTagHandler describes index tag handler func IndexTagHandler(ctx *tagContext) error { if len(ctx.params) > 0 { ctx.indexNames[ctx.params[0]] = core.IndexType @@ -168,6 +182,7 @@ func IndexTagHandler(ctx *tagContext) error { return nil } +// UniqueTagHandler describes unique tag handler func UniqueTagHandler(ctx *tagContext) error { if len(ctx.params) > 0 { ctx.indexNames[ctx.params[0]] = core.UniqueType @@ -177,6 +192,7 @@ func UniqueTagHandler(ctx *tagContext) error { return nil } +// SQLTypeTagHandler describes SQL Type tag handler func SQLTypeTagHandler(ctx *tagContext) error { ctx.col.SQLType = core.SQLType{Name: ctx.tagName} if len(ctx.params) > 0 { @@ -216,6 +232,7 @@ func SQLTypeTagHandler(ctx *tagContext) error { return nil } +// ExtendsTagHandler describes extends tag handler func ExtendsTagHandler(ctx *tagContext) error { var fieldValue = ctx.fieldValue switch fieldValue.Kind() { @@ -247,15 +264,18 @@ func ExtendsTagHandler(ctx *tagContext) error { return nil } +// CacheTagHandler describes cache tag handler func CacheTagHandler(ctx *tagContext) error { - if ctx.tagName == "CACHE" { - if !ctx.hasCacheTag { - ctx.hasCacheTag = true - } - } else if ctx.tagName == "NOCACHE" { - if !ctx.hasNoCacheTag { - ctx.hasNoCacheTag = true - } + if !ctx.hasCacheTag { + ctx.hasCacheTag = true + } + return nil +} + +// NoCacheTagHandler describes nocache tag handler +func NoCacheTagHandler(ctx *tagContext) error { + if !ctx.hasNoCacheTag { + ctx.hasNoCacheTag = true } return nil }