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
|
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 {
|
||||||
|
|
2
rows.go
2
rows.go
|
@ -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 {
|
||||||
|
|
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
|
// 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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue