123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- 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()
- }
|