#66 partial implement xorm_cache tag

add Engine.disableGlobalCache and explicit using cache via xorm_cache tag
This commit is contained in:
Nash Tsai 2014-05-17 00:39:30 +08:00
parent 8fd2ecc19b
commit f4f07ec079
1 changed files with 48 additions and 1 deletions

View File

@ -38,6 +38,14 @@ type Engine struct {
Logger ILogger // io.Writer Logger ILogger // io.Writer
TZLocation *time.Location TZLocation *time.Location
disableGlobalCache bool
}
func (engine *Engine) SetDisableGlobalCache(disable bool) {
if engine.disableGlobalCache != disable {
engine.disableGlobalCache = disable
}
} }
func (engine *Engine) DriverName() string { func (engine *Engine) DriverName() string {
@ -544,10 +552,39 @@ func addIndex(indexName string, table *core.Table, col *core.Column, indexType i
func (engine *Engine) newTable() *core.Table { func (engine *Engine) newTable() *core.Table {
table := core.NewEmptyTable() table := core.NewEmptyTable()
if !engine.disableGlobalCache {
table.Cacher = engine.Cacher table.Cacher = engine.Cacher
}
return table return table
} }
func (engine *Engine) processCacherTag(table *core.Table, v reflect.Value, cacherTagStr string) {
for _, part := range strings.Split(cacherTagStr, ",") {
switch {
case part == "false": // even if engine has assigned cacher, this table will not have cache support
table.Cacher = nil
return
case part == "true": // use default 'read-write' cache
if engine.Cacher != nil { // !nash! use engine's cacher if provided
table.Cacher = engine.Cacher
} else {
table.Cacher = NewLRUCacher2(NewMemoryStore(), time.Hour, 10000) // !nashtsai! HACK use LRU cacher for now
}
return
// TODO
// case strings.HasPrefix(part, "usage:"):
// usageStr := part[len("usage:"):]
// case strings.HasPrefix(part, "include:"):
// includeStr := part[len("include:"):]
}
}
}
func (engine *Engine) mapType(v reflect.Value) *core.Table { func (engine *Engine) mapType(v reflect.Value) *core.Table {
t := v.Type() t := v.Type()
table := engine.newTable() table := engine.newTable()
@ -573,9 +610,19 @@ func (engine *Engine) mapType(v reflect.Value) *core.Table {
var idFieldColName string var idFieldColName string
var err error var err error
hasProcessedCacheTag := false
for i := 0; i < t.NumField(); i++ { for i := 0; i < t.NumField(); i++ {
tag := t.Field(i).Tag tag := t.Field(i).Tag
ormTagStr := tag.Get(engine.TagIdentifier) ormTagStr := tag.Get(engine.TagIdentifier)
if !hasProcessedCacheTag {
cacheTagStr := tag.Get("xorm_cache")
if cacheTagStr != "" {
hasProcessedCacheTag = true
engine.processCacherTag(table, v, cacheTagStr)
}
}
var col *core.Column var col *core.Column
fieldValue := v.Field(i) fieldValue := v.Field(i)
fieldType := fieldValue.Type() fieldType := fieldValue.Type()