fix update map with table name (#888)
* fix update map with table name * fix bug update map when cache enabled * refactor cacheInsert * fix cache test
This commit is contained in:
parent
bfdf773629
commit
636ccefbc7
89
engine.go
89
engine.go
|
@ -49,6 +49,35 @@ type Engine struct {
|
||||||
tagHandlers map[string]tagHandler
|
tagHandlers map[string]tagHandler
|
||||||
|
|
||||||
engineGroup *EngineGroup
|
engineGroup *EngineGroup
|
||||||
|
|
||||||
|
cachers map[string]core.Cacher
|
||||||
|
cacherLock sync.RWMutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func (engine *Engine) setCacher(tableName string, cacher core.Cacher) {
|
||||||
|
engine.cacherLock.Lock()
|
||||||
|
engine.cachers[tableName] = cacher
|
||||||
|
engine.cacherLock.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (engine *Engine) SetCacher(tableName string, cacher core.Cacher) {
|
||||||
|
engine.setCacher(tableName, cacher)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (engine *Engine) getCacher(tableName string) core.Cacher {
|
||||||
|
var cacher core.Cacher
|
||||||
|
var ok bool
|
||||||
|
engine.cacherLock.RLock()
|
||||||
|
cacher, ok = engine.cachers[tableName]
|
||||||
|
engine.cacherLock.RUnlock()
|
||||||
|
if !ok && !engine.disableGlobalCache {
|
||||||
|
cacher = engine.Cacher
|
||||||
|
}
|
||||||
|
return cacher
|
||||||
|
}
|
||||||
|
|
||||||
|
func (engine *Engine) GetCacher(tableName string) core.Cacher {
|
||||||
|
return engine.getCacher(tableName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// BufferSize sets buffer size for iterate
|
// BufferSize sets buffer size for iterate
|
||||||
|
@ -245,13 +274,7 @@ func (engine *Engine) NoCascade() *Session {
|
||||||
|
|
||||||
// MapCacher Set a table use a special cacher
|
// MapCacher Set a table use a special cacher
|
||||||
func (engine *Engine) MapCacher(bean interface{}, cacher core.Cacher) error {
|
func (engine *Engine) MapCacher(bean interface{}, cacher core.Cacher) error {
|
||||||
v := rValue(bean)
|
engine.setCacher(engine.TableName(bean, true), cacher)
|
||||||
tb, err := engine.autoMapType(v)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
tb.Cacher = cacher
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -834,15 +857,6 @@ func addIndex(indexName string, table *core.Table, col *core.Column, indexType i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (engine *Engine) newTable() *core.Table {
|
|
||||||
table := core.NewEmptyTable()
|
|
||||||
|
|
||||||
if !engine.disableGlobalCache {
|
|
||||||
table.Cacher = engine.Cacher
|
|
||||||
}
|
|
||||||
return table
|
|
||||||
}
|
|
||||||
|
|
||||||
// TableName table name interface to define customerize table name
|
// TableName table name interface to define customerize table name
|
||||||
type TableName interface {
|
type TableName interface {
|
||||||
TableName() string
|
TableName() string
|
||||||
|
@ -854,7 +868,7 @@ var (
|
||||||
|
|
||||||
func (engine *Engine) mapType(v reflect.Value) (*core.Table, error) {
|
func (engine *Engine) mapType(v reflect.Value) (*core.Table, error) {
|
||||||
t := v.Type()
|
t := v.Type()
|
||||||
table := engine.newTable()
|
table := core.NewEmptyTable()
|
||||||
table.Type = t
|
table.Type = t
|
||||||
table.Name = engine.tbNameForMap(v)
|
table.Name = engine.tbNameForMap(v)
|
||||||
|
|
||||||
|
@ -1010,15 +1024,15 @@ func (engine *Engine) mapType(v reflect.Value) (*core.Table, error) {
|
||||||
if hasCacheTag {
|
if hasCacheTag {
|
||||||
if engine.Cacher != nil { // !nash! use engine's cacher if provided
|
if engine.Cacher != nil { // !nash! use engine's cacher if provided
|
||||||
engine.logger.Info("enable cache on table:", table.Name)
|
engine.logger.Info("enable cache on table:", table.Name)
|
||||||
table.Cacher = engine.Cacher
|
engine.setCacher(table.Name, engine.Cacher)
|
||||||
} else {
|
} else {
|
||||||
engine.logger.Info("enable LRU cache on table:", table.Name)
|
engine.logger.Info("enable LRU cache on table:", table.Name)
|
||||||
table.Cacher = NewLRUCacher2(NewMemoryStore(), time.Hour, 10000) // !nashtsai! HACK use LRU cacher for now
|
engine.setCacher(table.Name, NewLRUCacher2(NewMemoryStore(), time.Hour, 10000))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if hasNoCacheTag {
|
if hasNoCacheTag {
|
||||||
engine.logger.Info("no cache on table:", table.Name)
|
engine.logger.Info("disable cache on table:", table.Name)
|
||||||
table.Cacher = nil
|
engine.setCacher(table.Name, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
return table, nil
|
return table, nil
|
||||||
|
@ -1123,26 +1137,10 @@ func (engine *Engine) CreateUniques(bean interface{}) error {
|
||||||
return session.CreateUniques(bean)
|
return session.CreateUniques(bean)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (engine *Engine) getCacher2(table *core.Table) core.Cacher {
|
|
||||||
return table.Cacher
|
|
||||||
}
|
|
||||||
|
|
||||||
// ClearCacheBean if enabled cache, clear the cache bean
|
// ClearCacheBean if enabled cache, clear the cache bean
|
||||||
func (engine *Engine) ClearCacheBean(bean interface{}, id string) error {
|
func (engine *Engine) ClearCacheBean(bean interface{}, id string) error {
|
||||||
v := rValue(bean)
|
|
||||||
t := v.Type()
|
|
||||||
if t.Kind() != reflect.Struct {
|
|
||||||
return errors.New("error params")
|
|
||||||
}
|
|
||||||
tableName := engine.TableName(bean)
|
tableName := engine.TableName(bean)
|
||||||
table, err := engine.autoMapType(v)
|
cacher := engine.getCacher(tableName)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
cacher := table.Cacher
|
|
||||||
if cacher == nil {
|
|
||||||
cacher = engine.Cacher
|
|
||||||
}
|
|
||||||
if cacher != nil {
|
if cacher != nil {
|
||||||
cacher.ClearIds(tableName)
|
cacher.ClearIds(tableName)
|
||||||
cacher.DelBean(tableName, id)
|
cacher.DelBean(tableName, id)
|
||||||
|
@ -1153,21 +1151,8 @@ func (engine *Engine) ClearCacheBean(bean interface{}, id string) error {
|
||||||
// ClearCache if enabled cache, clear some tables' cache
|
// ClearCache if enabled cache, clear some tables' cache
|
||||||
func (engine *Engine) ClearCache(beans ...interface{}) error {
|
func (engine *Engine) ClearCache(beans ...interface{}) error {
|
||||||
for _, bean := range beans {
|
for _, bean := range beans {
|
||||||
v := rValue(bean)
|
|
||||||
t := v.Type()
|
|
||||||
if t.Kind() != reflect.Struct {
|
|
||||||
return errors.New("error params")
|
|
||||||
}
|
|
||||||
tableName := engine.TableName(bean)
|
tableName := engine.TableName(bean)
|
||||||
table, err := engine.autoMapType(v)
|
cacher := engine.getCacher(tableName)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
cacher := table.Cacher
|
|
||||||
if cacher == nil {
|
|
||||||
cacher = engine.Cacher
|
|
||||||
}
|
|
||||||
if cacher != nil {
|
if cacher != nil {
|
||||||
cacher.ClearIds(tableName)
|
cacher.ClearIds(tableName)
|
||||||
cacher.ClearBeans(tableName)
|
cacher.ClearBeans(tableName)
|
||||||
|
|
|
@ -77,6 +77,7 @@ type EngineInterface interface {
|
||||||
Dialect() core.Dialect
|
Dialect() core.Dialect
|
||||||
DropTables(...interface{}) error
|
DropTables(...interface{}) error
|
||||||
DumpAllToFile(fp string, tp ...core.DbType) error
|
DumpAllToFile(fp string, tp ...core.DbType) error
|
||||||
|
GetCacher(string) core.Cacher
|
||||||
GetColumnMapper() core.IMapper
|
GetColumnMapper() core.IMapper
|
||||||
GetDefaultCacher() core.Cacher
|
GetDefaultCacher() core.Cacher
|
||||||
GetTableMapper() core.IMapper
|
GetTableMapper() core.IMapper
|
||||||
|
@ -85,6 +86,7 @@ type EngineInterface interface {
|
||||||
NewSession() *Session
|
NewSession() *Session
|
||||||
NoAutoTime() *Session
|
NoAutoTime() *Session
|
||||||
Quote(string) string
|
Quote(string) string
|
||||||
|
SetCacher(string, core.Cacher)
|
||||||
SetDefaultCacher(core.Cacher)
|
SetDefaultCacher(core.Cacher)
|
||||||
SetLogLevel(core.LogLevel)
|
SetLogLevel(core.LogLevel)
|
||||||
SetMapper(core.IMapper)
|
SetMapper(core.IMapper)
|
||||||
|
|
|
@ -27,7 +27,7 @@ func (session *Session) cacheDelete(table *core.Table, tableName, sqlStr string,
|
||||||
return ErrCacheFailed
|
return ErrCacheFailed
|
||||||
}
|
}
|
||||||
|
|
||||||
cacher := session.engine.getCacher2(table)
|
cacher := session.engine.getCacher(tableName)
|
||||||
pkColumns := table.PKColumns()
|
pkColumns := table.PKColumns()
|
||||||
ids, err := core.GetCacheSql(cacher, tableName, newsql, args)
|
ids, err := core.GetCacheSql(cacher, tableName, newsql, args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -199,7 +199,7 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache {
|
if cacher := session.engine.getCacher(tableName); cacher != nil && session.statement.UseCache {
|
||||||
session.cacheDelete(table, tableNameNoQuote, deleteSQL, argsForCache...)
|
session.cacheDelete(table, tableNameNoQuote, deleteSQL, argsForCache...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -176,7 +176,7 @@ func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{})
|
||||||
}
|
}
|
||||||
|
|
||||||
if session.canCache() {
|
if session.canCache() {
|
||||||
if cacher := session.engine.getCacher2(table); cacher != nil &&
|
if cacher := session.engine.getCacher(table.Name); cacher != nil &&
|
||||||
!session.statement.IsDistinct &&
|
!session.statement.IsDistinct &&
|
||||||
!session.statement.unscoped {
|
!session.statement.unscoped {
|
||||||
err = session.cacheFind(sliceElementType, sqlStr, rowsSlicePtr, args...)
|
err = session.cacheFind(sliceElementType, sqlStr, rowsSlicePtr, args...)
|
||||||
|
@ -321,6 +321,12 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in
|
||||||
return ErrCacheFailed
|
return ErrCacheFailed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tableName := session.statement.TableName()
|
||||||
|
cacher := session.engine.getCacher(tableName)
|
||||||
|
if cacher == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
for _, filter := range session.engine.dialect.Filters() {
|
for _, filter := range session.engine.dialect.Filters() {
|
||||||
sqlStr = filter.Do(sqlStr, session.engine.dialect, session.statement.RefTable)
|
sqlStr = filter.Do(sqlStr, session.engine.dialect, session.statement.RefTable)
|
||||||
}
|
}
|
||||||
|
@ -330,9 +336,7 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in
|
||||||
return ErrCacheFailed
|
return ErrCacheFailed
|
||||||
}
|
}
|
||||||
|
|
||||||
tableName := session.statement.TableName()
|
|
||||||
table := session.statement.RefTable
|
table := session.statement.RefTable
|
||||||
cacher := session.engine.getCacher2(table)
|
|
||||||
ids, err := core.GetCacheSql(cacher, tableName, newsql, args)
|
ids, err := core.GetCacheSql(cacher, tableName, newsql, args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
rows, err := session.queryRows(newsql, args...)
|
rows, err := session.queryRows(newsql, args...)
|
||||||
|
|
|
@ -57,7 +57,7 @@ func (session *Session) get(bean interface{}) (bool, error) {
|
||||||
table := session.statement.RefTable
|
table := session.statement.RefTable
|
||||||
|
|
||||||
if session.canCache() && beanValue.Elem().Kind() == reflect.Struct {
|
if session.canCache() && beanValue.Elem().Kind() == reflect.Struct {
|
||||||
if cacher := session.engine.getCacher2(table); cacher != nil &&
|
if cacher := session.engine.getCacher(table.Name); cacher != nil &&
|
||||||
!session.statement.unscoped {
|
!session.statement.unscoped {
|
||||||
has, err := session.cacheGet(bean, sqlStr, args...)
|
has, err := session.cacheGet(bean, sqlStr, args...)
|
||||||
if err != ErrCacheFailed {
|
if err != ErrCacheFailed {
|
||||||
|
@ -134,8 +134,9 @@ func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interf
|
||||||
return false, ErrCacheFailed
|
return false, ErrCacheFailed
|
||||||
}
|
}
|
||||||
|
|
||||||
cacher := session.engine.getCacher2(session.statement.RefTable)
|
|
||||||
tableName := session.statement.TableName()
|
tableName := session.statement.TableName()
|
||||||
|
cacher := session.engine.getCacher(tableName)
|
||||||
|
|
||||||
session.engine.logger.Debug("[cacheGet] find sql:", newsql, args)
|
session.engine.logger.Debug("[cacheGet] find sql:", newsql, args)
|
||||||
table := session.statement.RefTable
|
table := session.statement.RefTable
|
||||||
ids, err := core.GetCacheSql(cacher, tableName, newsql, args)
|
ids, err := core.GetCacheSql(cacher, tableName, newsql, args)
|
||||||
|
|
|
@ -70,7 +70,8 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(session.statement.TableName()) <= 0 {
|
tableName := session.statement.TableName()
|
||||||
|
if len(tableName) <= 0 {
|
||||||
return 0, ErrTableNotFound
|
return 0, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,7 +206,6 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error
|
||||||
|
|
||||||
var sql = "INSERT INTO %s (%v%v%v) VALUES (%v)"
|
var sql = "INSERT INTO %s (%v%v%v) VALUES (%v)"
|
||||||
var statement string
|
var statement string
|
||||||
var tableName = session.statement.TableName()
|
|
||||||
if session.engine.dialect.DBType() == core.ORACLE {
|
if session.engine.dialect.DBType() == core.ORACLE {
|
||||||
sql = "INSERT ALL INTO %s (%v%v%v) VALUES (%v) SELECT 1 FROM DUAL"
|
sql = "INSERT ALL INTO %s (%v%v%v) VALUES (%v) SELECT 1 FROM DUAL"
|
||||||
temp := fmt.Sprintf(") INTO %s (%v%v%v) VALUES (",
|
temp := fmt.Sprintf(") INTO %s (%v%v%v) VALUES (",
|
||||||
|
@ -232,9 +232,7 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache {
|
session.cacheInsert(tableName)
|
||||||
session.cacheInsert(table, tableName)
|
|
||||||
}
|
|
||||||
|
|
||||||
lenAfterClosures := len(session.afterClosures)
|
lenAfterClosures := len(session.afterClosures)
|
||||||
for i := 0; i < size; i++ {
|
for i := 0; i < size; i++ {
|
||||||
|
@ -394,9 +392,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) {
|
||||||
|
|
||||||
defer handleAfterInsertProcessorFunc(bean)
|
defer handleAfterInsertProcessorFunc(bean)
|
||||||
|
|
||||||
if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache {
|
session.cacheInsert(tableName)
|
||||||
session.cacheInsert(table, tableName)
|
|
||||||
}
|
|
||||||
|
|
||||||
if table.Version != "" && session.statement.checkVersion {
|
if table.Version != "" && session.statement.checkVersion {
|
||||||
verValue, err := table.VersionColumn().ValueOf(bean)
|
verValue, err := table.VersionColumn().ValueOf(bean)
|
||||||
|
@ -439,9 +435,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) {
|
||||||
}
|
}
|
||||||
defer handleAfterInsertProcessorFunc(bean)
|
defer handleAfterInsertProcessorFunc(bean)
|
||||||
|
|
||||||
if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache {
|
session.cacheInsert(tableName)
|
||||||
session.cacheInsert(table, tableName)
|
|
||||||
}
|
|
||||||
|
|
||||||
if table.Version != "" && session.statement.checkVersion {
|
if table.Version != "" && session.statement.checkVersion {
|
||||||
verValue, err := table.VersionColumn().ValueOf(bean)
|
verValue, err := table.VersionColumn().ValueOf(bean)
|
||||||
|
@ -482,9 +476,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) {
|
||||||
|
|
||||||
defer handleAfterInsertProcessorFunc(bean)
|
defer handleAfterInsertProcessorFunc(bean)
|
||||||
|
|
||||||
if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache {
|
session.cacheInsert(tableName)
|
||||||
session.cacheInsert(table, tableName)
|
|
||||||
}
|
|
||||||
|
|
||||||
if table.Version != "" && session.statement.checkVersion {
|
if table.Version != "" && session.statement.checkVersion {
|
||||||
verValue, err := table.VersionColumn().ValueOf(bean)
|
verValue, err := table.VersionColumn().ValueOf(bean)
|
||||||
|
@ -531,17 +523,16 @@ func (session *Session) InsertOne(bean interface{}) (int64, error) {
|
||||||
return session.innerInsert(bean)
|
return session.innerInsert(bean)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (session *Session) cacheInsert(table *core.Table, tables ...string) error {
|
func (session *Session) cacheInsert(table string) error {
|
||||||
if table == nil {
|
if !session.statement.UseCache {
|
||||||
return ErrCacheFailed
|
return nil
|
||||||
}
|
}
|
||||||
|
cacher := session.engine.getCacher(table)
|
||||||
cacher := session.engine.getCacher2(table)
|
if cacher == nil {
|
||||||
for _, t := range tables {
|
return nil
|
||||||
session.engine.logger.Debug("[cache] clear sql:", t)
|
|
||||||
cacher.ClearIds(t)
|
|
||||||
}
|
}
|
||||||
|
session.engine.logger.Debug("[cache] clear sql:", table)
|
||||||
|
cacher.ClearIds(table)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ func (session *Session) cacheUpdate(table *core.Table, tableName, sqlStr string,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cacher := session.engine.getCacher2(table)
|
cacher := session.engine.getCacher(tableName)
|
||||||
session.engine.logger.Debug("[cacheUpdate] get cache sql", newsql, args[nStart:])
|
session.engine.logger.Debug("[cacheUpdate] get cache sql", newsql, args[nStart:])
|
||||||
ids, err := core.GetCacheSql(cacher, tableName, newsql, args[nStart:])
|
ids, err := core.GetCacheSql(cacher, tableName, newsql, args[nStart:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -361,12 +361,11 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if table != nil {
|
if cacher := session.engine.getCacher(tableName); cacher != nil && session.statement.UseCache {
|
||||||
if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache {
|
//session.cacheUpdate(table, tableName, sqlStr, args...)
|
||||||
//session.cacheUpdate(table, tableName, sqlStr, args...)
|
session.engine.logger.Debug("[cacheUpdate] clear table ", tableName)
|
||||||
cacher.ClearIds(tableName)
|
cacher.ClearIds(tableName)
|
||||||
cacher.ClearBeans(tableName)
|
cacher.ClearBeans(tableName)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle after update processors
|
// handle after update processors
|
||||||
|
|
|
@ -1198,7 +1198,7 @@ func TestUpdateMapContent(t *testing.T) {
|
||||||
assert.EqualValues(t, 0, c1.Age)
|
assert.EqualValues(t, 0, c1.Age)
|
||||||
|
|
||||||
cnt, err = testEngine.Table(new(UpdateMapContent)).ID(c.Id).Update(map[string]interface{}{
|
cnt, err = testEngine.Table(new(UpdateMapContent)).ID(c.Id).Update(map[string]interface{}{
|
||||||
"age": 16,
|
"age": 16,
|
||||||
"is_man": false,
|
"is_man": false,
|
||||||
"gender": 2,
|
"gender": 2,
|
||||||
})
|
})
|
||||||
|
@ -1212,4 +1212,20 @@ func TestUpdateMapContent(t *testing.T) {
|
||||||
assert.EqualValues(t, 16, c2.Age)
|
assert.EqualValues(t, 16, c2.Age)
|
||||||
assert.EqualValues(t, false, c2.IsMan)
|
assert.EqualValues(t, false, c2.IsMan)
|
||||||
assert.EqualValues(t, 2, c2.Gender)
|
assert.EqualValues(t, 2, c2.Gender)
|
||||||
|
|
||||||
|
cnt, err = testEngine.Table(testEngine.TableName(new(UpdateMapContent))).ID(c.Id).Update(map[string]interface{}{
|
||||||
|
"age": 15,
|
||||||
|
"is_man": true,
|
||||||
|
"gender": 1,
|
||||||
|
})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, cnt)
|
||||||
|
|
||||||
|
var c3 UpdateMapContent
|
||||||
|
has, err = testEngine.ID(c.Id).Get(&c3)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, has)
|
||||||
|
assert.EqualValues(t, 15, c3.Age)
|
||||||
|
assert.EqualValues(t, true, c3.IsMan)
|
||||||
|
assert.EqualValues(t, 1, c3.Gender)
|
||||||
}
|
}
|
||||||
|
|
10
statement.go
10
statement.go
|
@ -950,14 +950,14 @@ func (statement *Statement) genGetSQL(bean interface{}) (string, []interface{},
|
||||||
columnStr = "*"
|
columnStr = "*"
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := statement.processIDParam(); err != nil {
|
|
||||||
return "", nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if isStruct {
|
if isStruct {
|
||||||
if err := statement.mergeConds(bean); err != nil {
|
if err := statement.mergeConds(bean); err != nil {
|
||||||
return "", nil, err
|
return "", nil, err
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if err := statement.processIDParam(); err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
condSQL, condArgs, err := builder.ToSQL(statement.cond)
|
condSQL, condArgs, err := builder.ToSQL(statement.cond)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1143,7 +1143,7 @@ func (statement *Statement) genSelectSQL(columnStr, condSQL string, needLimit, n
|
||||||
}
|
}
|
||||||
|
|
||||||
func (statement *Statement) processIDParam() error {
|
func (statement *Statement) processIDParam() error {
|
||||||
if statement.idParam == nil {
|
if statement.idParam == nil || statement.RefTable == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,9 +19,7 @@ func TestCacheTag(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
assert.NoError(t, testEngine.CreateTables(&CacheDomain{}))
|
assert.NoError(t, testEngine.CreateTables(&CacheDomain{}))
|
||||||
|
assert.True(t, testEngine.GetCacher(testEngine.TableName(&CacheDomain{})) != nil)
|
||||||
table := testEngine.TableInfo(&CacheDomain{})
|
|
||||||
assert.True(t, table.Cacher != nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNoCacheTag(t *testing.T) {
|
func TestNoCacheTag(t *testing.T) {
|
||||||
|
@ -33,7 +31,5 @@ func TestNoCacheTag(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
assert.NoError(t, testEngine.CreateTables(&NoCacheDomain{}))
|
assert.NoError(t, testEngine.CreateTables(&NoCacheDomain{}))
|
||||||
|
assert.True(t, testEngine.GetCacher(testEngine.TableName(&NoCacheDomain{})) == nil)
|
||||||
table := testEngine.TableInfo(&NoCacheDomain{})
|
|
||||||
assert.True(t, table.Cacher == nil)
|
|
||||||
}
|
}
|
||||||
|
|
1
xorm.go
1
xorm.go
|
@ -90,6 +90,7 @@ func NewEngine(driverName string, dataSourceName string) (*Engine, error) {
|
||||||
TagIdentifier: "xorm",
|
TagIdentifier: "xorm",
|
||||||
TZLocation: time.Local,
|
TZLocation: time.Local,
|
||||||
tagHandlers: defaultTagHandlers,
|
tagHandlers: defaultTagHandlers,
|
||||||
|
cachers: make(map[string]core.Cacher),
|
||||||
}
|
}
|
||||||
|
|
||||||
if uri.DbType == core.SQLITE {
|
if uri.DbType == core.SQLITE {
|
||||||
|
|
Loading…
Reference in New Issue