#66 partial implement xorm_cache tag
add Engine.disableGlobalCache and explicit using cache via xorm_cache tag
This commit is contained in:
parent
8fd2ecc19b
commit
f4f07ec079
47
engine.go
47
engine.go
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue