105 lines
2.1 KiB
Go
105 lines
2.1 KiB
Go
|
package param
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"strconv"
|
||
|
"time"
|
||
|
|
||
|
"go-common/app/interface/main/app-resource/conf"
|
||
|
"go-common/app/interface/main/app-resource/dao/param"
|
||
|
"go-common/app/interface/main/app-resource/model"
|
||
|
mparam "go-common/app/interface/main/app-resource/model/param"
|
||
|
"go-common/library/ecode"
|
||
|
"go-common/library/log"
|
||
|
|
||
|
farm "github.com/dgryski/go-farm"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
_initVersion = "param_version"
|
||
|
_platKey = "param_%d"
|
||
|
)
|
||
|
|
||
|
// Service param service.
|
||
|
type Service struct {
|
||
|
dao *param.Dao
|
||
|
tick time.Duration
|
||
|
// model param cache
|
||
|
cache map[string][]*mparam.Param
|
||
|
}
|
||
|
|
||
|
// New new a param service.
|
||
|
func New(c *conf.Config) (s *Service) {
|
||
|
s = &Service{
|
||
|
dao: param.New(c),
|
||
|
tick: time.Duration(c.Tick),
|
||
|
cache: map[string][]*mparam.Param{},
|
||
|
}
|
||
|
s.load()
|
||
|
go s.loadproc()
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Param return param to string
|
||
|
func (s *Service) Param(plat int8, build int, ver string) (res map[string]string, version string, err error) {
|
||
|
res, version, err = s.getCache(plat, build, ver)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (s *Service) getCache(plat int8, build int, ver string) (res map[string]string, version string, err error) {
|
||
|
var (
|
||
|
pk = fmt.Sprintf(_platKey, plat)
|
||
|
)
|
||
|
res = map[string]string{}
|
||
|
for _, p := range s.cache[pk] {
|
||
|
if model.InvalidBuild(build, p.Build, p.Condition) {
|
||
|
continue
|
||
|
}
|
||
|
res[p.Name] = p.Value
|
||
|
}
|
||
|
if version = s.hash(res); version == ver {
|
||
|
err = ecode.NotModified
|
||
|
res = nil
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (s *Service) load() {
|
||
|
tmp, err := s.dao.All(context.TODO())
|
||
|
if err != nil {
|
||
|
log.Error("param s.dao.All() error(%v)", err)
|
||
|
return
|
||
|
}
|
||
|
s.cache = tmp
|
||
|
log.Info("param cacheproc success")
|
||
|
}
|
||
|
|
||
|
// cacheproc load cache data
|
||
|
func (s *Service) loadproc() {
|
||
|
for {
|
||
|
time.Sleep(s.tick)
|
||
|
s.load()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (s *Service) hash(v map[string]string) string {
|
||
|
bs, err := json.Marshal(v)
|
||
|
if err != nil {
|
||
|
log.Error("json.Marshal error(%v)", err)
|
||
|
return _initVersion
|
||
|
}
|
||
|
return strconv.FormatUint(farm.Hash64(bs), 10)
|
||
|
}
|
||
|
|
||
|
// key get banner cache key.
|
||
|
func (s *Service) key(plat int8, build int) string {
|
||
|
return fmt.Sprintf("%d_%d", plat, build)
|
||
|
}
|
||
|
|
||
|
// Close dao
|
||
|
func (s *Service) Close() {
|
||
|
s.dao.Close()
|
||
|
}
|