changed to cache and nocache tag value support

public Engine.TableInfo() API
This commit is contained in:
Nash Tsai 2014-08-29 00:34:09 +08:00
parent c8fdc8ec21
commit 0491cec2e6
4 changed files with 43 additions and 54 deletions

View File

@ -623,7 +623,7 @@ func (engine *Engine) autoMapType(v reflect.Value) *core.Table {
return table
}
func (engine *Engine) autoMap(bean interface{}) *core.Table {
func (engine *Engine) TableInfo(bean interface{}) *core.Table {
v := rValue(bean)
return engine.autoMapType(v)
}
@ -649,32 +649,6 @@ func (engine *Engine) newTable() *core.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 {
t := v.Type()
table := engine.newTable()
@ -700,20 +674,13 @@ func (engine *Engine) mapType(v reflect.Value) *core.Table {
var idFieldColName string
var err error
hasProcessedCacheTag := false
hasCacheTag := false
hasNoCacheTag := false
for i := 0; i < t.NumField(); i++ {
tag := t.Field(i).Tag
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
fieldValue := v.Field(i)
fieldType := fieldValue.Type()
@ -804,6 +771,14 @@ func (engine *Engine) mapType(v reflect.Value) *core.Table {
isUnique = true
case k == "NOTNULL":
col.Nullable = false
case k == "CACHE":
if !hasCacheTag {
hasCacheTag = true
}
case k == "NOCACHE":
if !hasNoCacheTag {
hasNoCacheTag = true
}
case k == "NOT":
default:
if strings.HasPrefix(k, "'") && strings.HasSuffix(k, "'") {
@ -912,7 +887,7 @@ func (engine *Engine) mapType(v reflect.Value) *core.Table {
if fieldType.Kind() == reflect.Int64 && (col.FieldName == "Id" || strings.HasSuffix(col.FieldName, ".Id")) {
idFieldColName = col.Name
}
}
} // end for
if idFieldColName != "" && len(table.PrimaryKeys) == 0 {
col := table.GetColumn(idFieldColName)
@ -923,6 +898,20 @@ func (engine *Engine) mapType(v reflect.Value) *core.Table {
table.AutoIncrement = col.Name
}
if hasCacheTag {
if engine.Cacher != nil { // !nash! use engine's cacher if provided
engine.Logger.Info("enable cache on table:", table.Name)
table.Cacher = engine.Cacher
} else {
engine.Logger.Info("enable LRU cache on table:", table.Name)
table.Cacher = NewLRUCacher2(NewMemoryStore(), time.Hour, 10000) // !nashtsai! HACK use LRU cacher for now
}
}
if hasNoCacheTag {
engine.Logger.Info("no cache on table:", table.Name)
table.Cacher = nil
}
return table
}
@ -971,7 +960,7 @@ func (engine *Engine) IsTableExist(bean interface{}) (bool, error) {
}
func (engine *Engine) IdOf(bean interface{}) core.PK {
table := engine.autoMap(bean)
table := engine.TableInfo(bean)
v := reflect.Indirect(reflect.ValueOf(bean))
pk := make([]interface{}, len(table.PrimaryKeys))
for i, col := range table.PKColumns() {
@ -1019,7 +1008,7 @@ func (engine *Engine) ClearCacheBean(bean interface{}, id string) error {
if t.Kind() != reflect.Struct {
return errors.New("error params")
}
table := engine.autoMap(bean)
table := engine.TableInfo(bean)
cacher := table.Cacher
if cacher == nil {
cacher = engine.Cacher
@ -1038,7 +1027,7 @@ func (engine *Engine) ClearCache(beans ...interface{}) error {
if t.Kind() != reflect.Struct {
return errors.New("error params")
}
table := engine.autoMap(bean)
table := engine.TableInfo(bean)
cacher := table.Cacher
if cacher == nil {
cacher = engine.Cacher
@ -1056,7 +1045,7 @@ func (engine *Engine) ClearCache(beans ...interface{}) error {
// If you change some field, you should change the database manually.
func (engine *Engine) Sync(beans ...interface{}) error {
for _, bean := range beans {
table := engine.autoMap(bean)
table := engine.TableInfo(bean)
s := engine.NewSession()
defer s.Close()
@ -1153,7 +1142,7 @@ func (engine *Engine) Sync2(beans ...interface{}) error {
}
for _, bean := range beans {
table := engine.autoMap(bean)
table := engine.TableInfo(bean)
var oriTable *core.Table
for _, tb := range tables {

View File

@ -34,7 +34,7 @@ func newRows(session *Session, bean interface{}) (*Rows, error) {
var sqlStr string
var args []interface{}
rows.session.Statement.RefTable = rows.session.Engine.autoMap(bean)
rows.session.Statement.RefTable = rows.session.Engine.TableInfo(bean)
if rows.session.Statement.RawSQL == "" {
sqlStr, args = rows.session.Statement.genGetSql(bean)
} else {

View File

@ -471,7 +471,7 @@ func (session *Session) Exec(sqlStr string, args ...interface{}) (sql.Result, er
// this function create a table according a bean
func (session *Session) CreateTable(bean interface{}) error {
session.Statement.RefTable = session.Engine.autoMap(bean)
session.Statement.RefTable = session.Engine.TableInfo(bean)
err := session.newDb()
if err != nil {
@ -487,7 +487,7 @@ func (session *Session) CreateTable(bean interface{}) error {
// create indexes
func (session *Session) CreateIndexes(bean interface{}) error {
session.Statement.RefTable = session.Engine.autoMap(bean)
session.Statement.RefTable = session.Engine.TableInfo(bean)
err := session.newDb()
if err != nil {
@ -510,7 +510,7 @@ func (session *Session) CreateIndexes(bean interface{}) error {
// create uniques
func (session *Session) CreateUniques(bean interface{}) error {
session.Statement.RefTable = session.Engine.autoMap(bean)
session.Statement.RefTable = session.Engine.TableInfo(bean)
err := session.newDb()
if err != nil {
@ -597,7 +597,7 @@ func (session *Session) DropTable(bean interface{}) error {
if t.Kind() == reflect.String {
session.Statement.AltTableName = bean.(string)
} else if t.Kind() == reflect.Struct {
session.Statement.RefTable = session.Engine.autoMap(bean)
session.Statement.RefTable = session.Engine.TableInfo(bean)
} else {
return errors.New("Unsupported type")
}
@ -954,7 +954,7 @@ func (session *Session) Get(bean interface{}) (bool, error) {
var args []interface{}
if session.Statement.RefTable == nil {
session.Statement.RefTable = session.Engine.autoMap(bean)
session.Statement.RefTable = session.Engine.TableInfo(bean)
}
if session.Statement.RawSQL == "" {
@ -2649,7 +2649,7 @@ func (session *Session) value2Interface(col *core.Column, fieldValue reflect.Val
}
func (session *Session) innerInsert(bean interface{}) (int64, error) {
table := session.Engine.autoMap(bean)
table := session.Engine.TableInfo(bean)
session.Statement.RefTable = table
// handle BeforeInsertProcessor
@ -3046,7 +3046,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
// --
if t.Kind() == reflect.Struct {
table = session.Engine.autoMap(bean)
table = session.Engine.TableInfo(bean)
session.Statement.RefTable = table
if session.Statement.ColumnStr == "" {
@ -3300,7 +3300,7 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
}
// --
table := session.Engine.autoMap(bean)
table := session.Engine.TableInfo(bean)
session.Statement.RefTable = table
colNames, args := buildConditions(session.Engine, table, bean, true, true,
false, true, session.Statement.allUseBool, session.Statement.useAllCols,

View File

@ -151,7 +151,7 @@ func (statement *Statement) Table(tableNameOrBean interface{}) *Statement {
/*func (statement *Statement) genFields(bean interface{}) map[string]interface{} {
results := make(map[string]interface{})
table := statement.Engine.autoMap(bean)
table := statement.Engine.TableInfo(bean)
for _, col := range table.Columns {
fieldValue := col.ValueOf(bean)
fieldType := reflect.TypeOf(fieldValue.Interface())
@ -1020,7 +1020,7 @@ func (s *Statement) genDropSQL() string {
func (statement *Statement) genGetSql(bean interface{}) (string, []interface{}) {
var table *core.Table
if statement.RefTable == nil {
table = statement.Engine.autoMap(bean)
table = statement.Engine.TableInfo(bean)
statement.RefTable = table
} else {
table = statement.RefTable
@ -1070,7 +1070,7 @@ func (s *Statement) genAddUniqueStr(uqeName string, cols []string) (string, []in
}*/
func (statement *Statement) genCountSql(bean interface{}) (string, []interface{}) {
table := statement.Engine.autoMap(bean)
table := statement.Engine.TableInfo(bean)
statement.RefTable = table
colNames, args := buildConditions(statement.Engine, table, bean, true, true, false,