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
|
||
}
|