changed to cache and nocache tag value support
public Engine.TableInfo() API
This commit is contained in:
parent
c8fdc8ec21
commit
0491cec2e6
73
engine.go
73
engine.go
|
@ -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 {
|
||||
|
|
2
rows.go
2
rows.go
|
@ -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 {
|
||||
|
|
16
session.go
16
session.go
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue