cache for string primary key
This commit is contained in:
parent
d9efbdccd7
commit
a98e9405e1
95
session.go
95
session.go
|
@ -636,10 +636,16 @@ func (statement *Statement) convertIdSql(sqlStr string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interface{}) (has bool, err error) {
|
func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interface{}) (has bool, err error) {
|
||||||
// if has no reftable or number of pks is not equal to 1, then don't use cache currently
|
// if has no reftable, then don't use cache currently
|
||||||
if session.Statement.RefTable == nil || len(session.Statement.RefTable.PrimaryKeys) != 1 {
|
if session.Statement.RefTable == nil {
|
||||||
return false, ErrCacheFailed
|
return false, ErrCacheFailed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: remove this after support multi pk cache
|
||||||
|
if len(session.Statement.RefTable.PrimaryKeys) != 1 {
|
||||||
|
return false, ErrCacheFailed
|
||||||
|
}
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
@ -652,8 +658,9 @@ func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interf
|
||||||
tableName := session.Statement.TableName()
|
tableName := session.Statement.TableName()
|
||||||
session.Engine.LogDebug("[xorm:cacheGet] find sql:", newsql, args)
|
session.Engine.LogDebug("[xorm:cacheGet] find sql:", newsql, args)
|
||||||
ids, err := core.GetCacheSql(cacher, tableName, newsql, args)
|
ids, err := core.GetCacheSql(cacher, tableName, newsql, args)
|
||||||
|
table := session.Statement.RefTable
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var res core.PK = make([]interface{}, len(session.Statement.RefTable.PrimaryKeys))
|
var res = make([]string, len(table.PrimaryKeys))
|
||||||
rows, err := session.Db.Query(newsql, args...)
|
rows, err := session.Db.Query(newsql, args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
|
@ -669,7 +676,22 @@ func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interf
|
||||||
return false, ErrCacheFailed
|
return false, ErrCacheFailed
|
||||||
}
|
}
|
||||||
|
|
||||||
ids = []core.PK{res}
|
var pk core.PK = make([]interface{}, len(table.PrimaryKeys))
|
||||||
|
for i, col := range table.PKColumns() {
|
||||||
|
if col.SQLType.IsText() {
|
||||||
|
pk[i] = res[i]
|
||||||
|
} else if col.SQLType.IsNumeric() {
|
||||||
|
n, err := strconv.ParseInt(res[i], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
pk[i] = n
|
||||||
|
} else {
|
||||||
|
return false, errors.New("unsupported")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ids = []core.PK{pk}
|
||||||
session.Engine.LogDebug("[xorm:cacheGet] cache ids:", newsql, ids)
|
session.Engine.LogDebug("[xorm:cacheGet] cache ids:", newsql, ids)
|
||||||
err = core.PutCacheSql(cacher, ids, tableName, newsql, args)
|
err = core.PutCacheSql(cacher, ids, tableName, newsql, args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -717,7 +739,7 @@ func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interf
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (session *Session) cacheFind(v reflect.Value, t reflect.Type, sqlStr string, rowsSlicePtr interface{}, args ...interface{}) (err error) {
|
func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr interface{}, args ...interface{}) (err error) {
|
||||||
if session.Statement.RefTable == nil ||
|
if session.Statement.RefTable == nil ||
|
||||||
len(session.Statement.RefTable.PrimaryKeys) != 1 ||
|
len(session.Statement.RefTable.PrimaryKeys) != 1 ||
|
||||||
indexNoCase(sqlStr, "having") != -1 ||
|
indexNoCase(sqlStr, "having") != -1 ||
|
||||||
|
@ -752,15 +774,28 @@ func (session *Session) cacheFind(v reflect.Value, t reflect.Type, sqlStr string
|
||||||
session.Engine.LogDebug("[xorm:cacheFind] ids length > 500, no cache")
|
session.Engine.LogDebug("[xorm:cacheFind] ids length > 500, no cache")
|
||||||
return ErrCacheFailed
|
return ErrCacheFailed
|
||||||
}
|
}
|
||||||
fmt.Println("v.interface", v.Interface())
|
var res = make([]string, len(table.PrimaryKeys))
|
||||||
var res = session.Engine.IdOf(v.Interface())
|
|
||||||
fmt.Println("!!!!!", res)
|
|
||||||
err = rows.ScanSlice(&res)
|
err = rows.ScanSlice(&res)
|
||||||
fmt.Println("-----", res)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ids = append(ids, res)
|
|
||||||
|
var pk core.PK = make([]interface{}, len(table.PrimaryKeys))
|
||||||
|
for i, col := range table.PKColumns() {
|
||||||
|
if col.SQLType.IsNumeric() {
|
||||||
|
n, err := strconv.ParseInt(res[i], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
pk[i] = n
|
||||||
|
} else if col.SQLType.IsText() {
|
||||||
|
pk[i] = res[i]
|
||||||
|
} else {
|
||||||
|
return errors.New("not supported")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ids = append(ids, pk)
|
||||||
}
|
}
|
||||||
|
|
||||||
tableName := session.Statement.TableName()
|
tableName := session.Statement.TableName()
|
||||||
|
@ -881,6 +916,8 @@ func (session *Session) cacheFind(v reflect.Value, t reflect.Type, sqlStr string
|
||||||
} else {
|
} else {
|
||||||
sliceValue.SetMapIndex(reflect.ValueOf(ikey), reflect.Indirect(reflect.ValueOf(bean)))
|
sliceValue.SetMapIndex(reflect.ValueOf(ikey), reflect.Indirect(reflect.ValueOf(bean)))
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return errors.New("table have multiple primary keys")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*} else {
|
/*} else {
|
||||||
|
@ -1071,17 +1108,16 @@ func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{})
|
||||||
|
|
||||||
sliceElementType := sliceValue.Type().Elem()
|
sliceElementType := sliceValue.Type().Elem()
|
||||||
var table *core.Table
|
var table *core.Table
|
||||||
var pv reflect.Value
|
|
||||||
if session.Statement.RefTable == nil {
|
if session.Statement.RefTable == nil {
|
||||||
if sliceElementType.Kind() == reflect.Ptr {
|
if sliceElementType.Kind() == reflect.Ptr {
|
||||||
if sliceElementType.Elem().Kind() == reflect.Struct {
|
if sliceElementType.Elem().Kind() == reflect.Struct {
|
||||||
pv = reflect.New(sliceElementType.Elem())
|
pv := reflect.New(sliceElementType.Elem())
|
||||||
table = session.Engine.autoMapType(pv.Elem())
|
table = session.Engine.autoMapType(pv.Elem())
|
||||||
} else {
|
} else {
|
||||||
return errors.New("slice type")
|
return errors.New("slice type")
|
||||||
}
|
}
|
||||||
} else if sliceElementType.Kind() == reflect.Struct {
|
} else if sliceElementType.Kind() == reflect.Struct {
|
||||||
pv = reflect.New(sliceElementType)
|
pv := reflect.New(sliceElementType)
|
||||||
table = session.Engine.autoMapType(pv.Elem())
|
table = session.Engine.autoMapType(pv.Elem())
|
||||||
} else {
|
} else {
|
||||||
return errors.New("slice type")
|
return errors.New("slice type")
|
||||||
|
@ -1089,11 +1125,8 @@ func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{})
|
||||||
session.Statement.RefTable = table
|
session.Statement.RefTable = table
|
||||||
} else {
|
} else {
|
||||||
table = session.Statement.RefTable
|
table = session.Statement.RefTable
|
||||||
pv = reflect.New(sliceElementType)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("xxxxxxx", pv.Interface())
|
|
||||||
|
|
||||||
if len(condiBean) > 0 {
|
if len(condiBean) > 0 {
|
||||||
colNames, args := buildConditions(session.Engine, table, condiBean[0], true, true,
|
colNames, args := buildConditions(session.Engine, table, condiBean[0], true, true,
|
||||||
false, true, session.Statement.allUseBool, session.Statement.useAllCols,
|
false, true, session.Statement.allUseBool, session.Statement.useAllCols,
|
||||||
|
@ -1134,8 +1167,8 @@ func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{})
|
||||||
if cacher := session.Engine.getCacher2(table); cacher != nil &&
|
if cacher := session.Engine.getCacher2(table); cacher != nil &&
|
||||||
session.Statement.UseCache &&
|
session.Statement.UseCache &&
|
||||||
!session.Statement.IsDistinct {
|
!session.Statement.IsDistinct {
|
||||||
fmt.Println("......", pv.Interface())
|
|
||||||
err = session.cacheFind(pv, sliceElementType, sqlStr, rowsSlicePtr, args...)
|
err = session.cacheFind(sliceElementType, sqlStr, rowsSlicePtr, args...)
|
||||||
if err != ErrCacheFailed {
|
if err != ErrCacheFailed {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -2083,7 +2116,6 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error
|
||||||
strings.Join(colMultiPlaces, "),("))
|
strings.Join(colMultiPlaces, "),("))
|
||||||
|
|
||||||
res, err := session.exec(statement, args...)
|
res, err := session.exec(statement, args...)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
@ -2113,7 +2145,6 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error
|
||||||
copy(afterClosures, session.afterClosures)
|
copy(afterClosures, session.afterClosures)
|
||||||
session.afterInsertBeans[elemValue] = &afterClosures
|
session.afterInsertBeans[elemValue] = &afterClosures
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if _, ok := interface{}(elemValue).(AfterInsertProcessor); ok {
|
if _, ok := interface{}(elemValue).(AfterInsertProcessor); ok {
|
||||||
session.afterInsertBeans[elemValue] = nil
|
session.afterInsertBeans[elemValue] = nil
|
||||||
|
@ -2589,7 +2620,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
|
||||||
if fieldType.Elem().Kind() == reflect.Struct {
|
if fieldType.Elem().Kind() == reflect.Struct {
|
||||||
if session.Statement.UseCascade {
|
if session.Statement.UseCascade {
|
||||||
structInter := reflect.New(fieldType.Elem())
|
structInter := reflect.New(fieldType.Elem())
|
||||||
fmt.Println(structInter, fieldType.Elem())
|
//fmt.Println(structInter, fieldType.Elem())
|
||||||
table := session.Engine.autoMapType(structInter.Elem())
|
table := session.Engine.autoMapType(structInter.Elem())
|
||||||
if table != nil {
|
if table != nil {
|
||||||
x, err := strconv.ParseInt(string(data), 10, 64)
|
x, err := strconv.ParseInt(string(data), 10, 64)
|
||||||
|
@ -2994,7 +3025,7 @@ func (session *Session) cacheInsert(tables ...string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (session *Session) cacheUpdate(v reflect.Value, sqlStr string, args ...interface{}) error {
|
func (session *Session) cacheUpdate(sqlStr string, args ...interface{}) error {
|
||||||
if session.Statement.RefTable == nil || len(session.Statement.RefTable.PrimaryKeys) != 1 {
|
if session.Statement.RefTable == nil || len(session.Statement.RefTable.PrimaryKeys) != 1 {
|
||||||
return ErrCacheFailed
|
return ErrCacheFailed
|
||||||
}
|
}
|
||||||
|
@ -3031,13 +3062,27 @@ func (session *Session) cacheUpdate(v reflect.Value, sqlStr string, args ...inte
|
||||||
|
|
||||||
ids = make([]core.PK, 0)
|
ids = make([]core.PK, 0)
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var res = session.Engine.IdOf(v.Interface())
|
var res = make([]string, len(table.PrimaryKeys))
|
||||||
fmt.Println("00000000", res)
|
|
||||||
err = rows.ScanSlice(&res)
|
err = rows.ScanSlice(&res)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ids = append(ids, res)
|
var pk core.PK = make([]interface{}, len(table.PrimaryKeys))
|
||||||
|
for i, col := range table.PKColumns() {
|
||||||
|
if col.SQLType.IsNumeric() {
|
||||||
|
n, err := strconv.ParseInt(res[i], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
pk[i] = n
|
||||||
|
} else if col.SQLType.IsText() {
|
||||||
|
pk[i] = res[i]
|
||||||
|
} else {
|
||||||
|
return errors.New("not supported")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ids = append(ids, pk)
|
||||||
}
|
}
|
||||||
session.Engine.LogDebug("[xorm:cacheUpdate] find updated id", ids)
|
session.Engine.LogDebug("[xorm:cacheUpdate] find updated id", ids)
|
||||||
} /*else {
|
} /*else {
|
||||||
|
|
Loading…
Reference in New Issue