144 lines
3.5 KiB
Go
144 lines
3.5 KiB
Go
|
package datadao
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"encoding/json"
|
|||
|
"fmt"
|
|||
|
"go-common/app/interface/main/mcn/conf"
|
|||
|
"go-common/app/interface/main/mcn/model/mcnmodel"
|
|||
|
"go-common/app/interface/main/mcn/tool/cache"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
var (
|
|||
|
dateFmt = "20060102"
|
|||
|
)
|
|||
|
|
|||
|
//CacheBaseLoader base loader
|
|||
|
type CacheBaseLoader struct {
|
|||
|
SignID int64
|
|||
|
Date time.Time
|
|||
|
Val interface{}
|
|||
|
desc string
|
|||
|
}
|
|||
|
|
|||
|
func descHelper(d cache.DataLoader) (key string) {
|
|||
|
return d.Desc()
|
|||
|
}
|
|||
|
|
|||
|
func newCacheBaseLoader(signID int64, date time.Time, val interface{}, desc string) CacheBaseLoader {
|
|||
|
return CacheBaseLoader{SignID: signID, Date: date, Val: val, desc: desc}
|
|||
|
}
|
|||
|
|
|||
|
//Key cache's key
|
|||
|
func (s *CacheBaseLoader) Key() (key string) {
|
|||
|
return fmt.Sprintf("%s_%d_%s", descHelper(s), s.SignID, s.Date.Format(dateFmt))
|
|||
|
}
|
|||
|
|
|||
|
//Value cache's value
|
|||
|
func (s *CacheBaseLoader) Value() (value interface{}) {
|
|||
|
return s.Val
|
|||
|
}
|
|||
|
|
|||
|
//LoadValue need load value
|
|||
|
func (s *CacheBaseLoader) LoadValue(c context.Context) (value interface{}, err error) {
|
|||
|
panic("implement me")
|
|||
|
}
|
|||
|
|
|||
|
//Expire expiration
|
|||
|
func (s *CacheBaseLoader) Expire() time.Duration {
|
|||
|
return time.Duration(conf.Conf.Memcache.McnDataCacheExpire)
|
|||
|
}
|
|||
|
|
|||
|
//Desc key desc
|
|||
|
func (s *CacheBaseLoader) Desc() string {
|
|||
|
return s.desc
|
|||
|
}
|
|||
|
|
|||
|
// -----------------------------------------
|
|||
|
|
|||
|
//LoadFuncWithTp sign with type
|
|||
|
type LoadFuncWithTp func(c context.Context, signID int64, date time.Time, tp string) (res interface{}, err error)
|
|||
|
|
|||
|
//LoadFuncOnlySign only sign
|
|||
|
type LoadFuncOnlySign func(c context.Context, signID int64, date time.Time) (res interface{}, err error)
|
|||
|
|
|||
|
//NewCacheMcnDataWithTp reply
|
|||
|
func NewCacheMcnDataWithTp(signID int64, date time.Time, tp string, val interface{}, desc string, loadFunc LoadFuncWithTp) *cacheMcnDataWithTp {
|
|||
|
return &cacheMcnDataWithTp{
|
|||
|
CacheBaseLoader: newCacheBaseLoader(signID, date, val, desc),
|
|||
|
Tp: tp,
|
|||
|
LoadFunc: loadFunc,
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//cacheMcnDataWithTp cache
|
|||
|
type cacheMcnDataWithTp struct {
|
|||
|
CacheBaseLoader
|
|||
|
Tp string
|
|||
|
LoadFunc LoadFuncWithTp
|
|||
|
}
|
|||
|
|
|||
|
//Key key
|
|||
|
func (s *cacheMcnDataWithTp) Key() (key string) {
|
|||
|
return fmt.Sprintf("%s_%d_%s_%s", s.Desc(), s.SignID, s.Date.Format(dateFmt), s.Tp)
|
|||
|
}
|
|||
|
|
|||
|
//LoadValue load
|
|||
|
func (s *cacheMcnDataWithTp) LoadValue(c context.Context) (value interface{}, err error) {
|
|||
|
value, err = s.LoadFunc(c, s.SignID, s.Date, s.Tp)
|
|||
|
if err != nil {
|
|||
|
s.Val = nil
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if sorter, ok := value.(mcnmodel.Sorter); ok {
|
|||
|
sorter.Sort()
|
|||
|
}
|
|||
|
|
|||
|
// 如果s.Val存在,则将结果populate到s.Val上,因为外部会直接使用原始传入的s.Val值
|
|||
|
if s.Val != nil {
|
|||
|
var b, _ = json.Marshal(value)
|
|||
|
json.Unmarshal(b, s.Val)
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// NewCacheMcnDataSignID 请求只有sign id的情况
|
|||
|
func NewCacheMcnDataSignID(signID int64, date time.Time, val interface{}, desc string, loadFunc LoadFuncOnlySign) *cacheMcnDataSignID {
|
|||
|
return &cacheMcnDataSignID{
|
|||
|
CacheBaseLoader: newCacheBaseLoader(signID, date, val, desc),
|
|||
|
LoadFunc: loadFunc,
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
type cacheMcnDataSignID struct {
|
|||
|
CacheBaseLoader
|
|||
|
LoadFunc LoadFuncOnlySign
|
|||
|
}
|
|||
|
|
|||
|
//Key key
|
|||
|
func (s *cacheMcnDataSignID) Key() (key string) {
|
|||
|
return fmt.Sprintf("%s_%d_%s", s.Desc(), s.SignID, s.Date.Format(dateFmt))
|
|||
|
}
|
|||
|
|
|||
|
//LoadValue load
|
|||
|
func (s *cacheMcnDataSignID) LoadValue(c context.Context) (value interface{}, err error) {
|
|||
|
value, err = s.LoadFunc(c, s.SignID, s.Date)
|
|||
|
if err != nil {
|
|||
|
s.Val = nil
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if sorter, ok := value.(mcnmodel.Sorter); ok {
|
|||
|
sorter.Sort()
|
|||
|
}
|
|||
|
|
|||
|
// 如果s.Val存在,则将结果populate到s.Val上,因为外部会直接使用原始传入的s.Val值
|
|||
|
if s.Val != nil {
|
|||
|
var b, _ = json.Marshal(value)
|
|||
|
json.Unmarshal(b, s.Val)
|
|||
|
}
|
|||
|
return
|
|||
|
}
|