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

View File

@ -34,7 +34,7 @@ func newRows(session *Session, bean interface{}) (*Rows, error) {
var sqlStr string var sqlStr string
var args []interface{} 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 == "" { if rows.session.Statement.RawSQL == "" {
sqlStr, args = rows.session.Statement.genGetSql(bean) sqlStr, args = rows.session.Statement.genGetSql(bean)
} else { } 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 // this function create a table according a bean
func (session *Session) CreateTable(bean interface{}) error { func (session *Session) CreateTable(bean interface{}) error {
session.Statement.RefTable = session.Engine.autoMap(bean) session.Statement.RefTable = session.Engine.TableInfo(bean)
err := session.newDb() err := session.newDb()
if err != nil { if err != nil {
@ -487,7 +487,7 @@ func (session *Session) CreateTable(bean interface{}) error {
// create indexes // create indexes
func (session *Session) CreateIndexes(bean interface{}) error { func (session *Session) CreateIndexes(bean interface{}) error {
session.Statement.RefTable = session.Engine.autoMap(bean) session.Statement.RefTable = session.Engine.TableInfo(bean)
err := session.newDb() err := session.newDb()
if err != nil { if err != nil {
@ -510,7 +510,7 @@ func (session *Session) CreateIndexes(bean interface{}) error {
// create uniques // create uniques
func (session *Session) CreateUniques(bean interface{}) error { func (session *Session) CreateUniques(bean interface{}) error {
session.Statement.RefTable = session.Engine.autoMap(bean) session.Statement.RefTable = session.Engine.TableInfo(bean)
err := session.newDb() err := session.newDb()
if err != nil { if err != nil {
@ -597,7 +597,7 @@ func (session *Session) DropTable(bean interface{}) error {
if t.Kind() == reflect.String { if t.Kind() == reflect.String {
session.Statement.AltTableName = bean.(string) session.Statement.AltTableName = bean.(string)
} else if t.Kind() == reflect.Struct { } else if t.Kind() == reflect.Struct {
session.Statement.RefTable = session.Engine.autoMap(bean) session.Statement.RefTable = session.Engine.TableInfo(bean)
} else { } else {
return errors.New("Unsupported type") return errors.New("Unsupported type")
} }
@ -954,7 +954,7 @@ func (session *Session) Get(bean interface{}) (bool, error) {
var args []interface{} var args []interface{}
if session.Statement.RefTable == nil { if session.Statement.RefTable == nil {
session.Statement.RefTable = session.Engine.autoMap(bean) session.Statement.RefTable = session.Engine.TableInfo(bean)
} }
if session.Statement.RawSQL == "" { 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) { func (session *Session) innerInsert(bean interface{}) (int64, error) {
table := session.Engine.autoMap(bean) table := session.Engine.TableInfo(bean)
session.Statement.RefTable = table session.Statement.RefTable = table
// handle BeforeInsertProcessor // handle BeforeInsertProcessor
@ -3046,7 +3046,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
// -- // --
if t.Kind() == reflect.Struct { if t.Kind() == reflect.Struct {
table = session.Engine.autoMap(bean) table = session.Engine.TableInfo(bean)
session.Statement.RefTable = table session.Statement.RefTable = table
if session.Statement.ColumnStr == "" { 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 session.Statement.RefTable = table
colNames, args := buildConditions(session.Engine, table, bean, true, true, colNames, args := buildConditions(session.Engine, table, bean, true, true,
false, true, session.Statement.allUseBool, session.Statement.useAllCols, 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{} { /*func (statement *Statement) genFields(bean interface{}) map[string]interface{} {
results := make(map[string]interface{}) results := make(map[string]interface{})
table := statement.Engine.autoMap(bean) table := statement.Engine.TableInfo(bean)
for _, col := range table.Columns { for _, col := range table.Columns {
fieldValue := col.ValueOf(bean) fieldValue := col.ValueOf(bean)
fieldType := reflect.TypeOf(fieldValue.Interface()) fieldType := reflect.TypeOf(fieldValue.Interface())
@ -1020,7 +1020,7 @@ func (s *Statement) genDropSQL() string {
func (statement *Statement) genGetSql(bean interface{}) (string, []interface{}) { func (statement *Statement) genGetSql(bean interface{}) (string, []interface{}) {
var table *core.Table var table *core.Table
if statement.RefTable == nil { if statement.RefTable == nil {
table = statement.Engine.autoMap(bean) table = statement.Engine.TableInfo(bean)
statement.RefTable = table statement.RefTable = table
} else { } else {
table = statement.RefTable 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{}) { func (statement *Statement) genCountSql(bean interface{}) (string, []interface{}) {
table := statement.Engine.autoMap(bean) table := statement.Engine.TableInfo(bean)
statement.RefTable = table statement.RefTable = table
colNames, args := buildConditions(statement.Engine, table, bean, true, true, false, colNames, args := buildConditions(statement.Engine, table, bean, true, true, false,