plugin.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package plugin
  2. import (
  3. "context"
  4. "sort"
  5. "time"
  6. "go-common/app/interface/main/app-resource/conf"
  7. pgdao "go-common/app/interface/main/app-resource/dao/plugin"
  8. "go-common/app/interface/main/app-resource/model/plugin"
  9. "go-common/library/log"
  10. )
  11. type Service struct {
  12. pgDao *pgdao.Dao
  13. tick time.Duration
  14. pluginCache map[string][]*plugin.Plugin
  15. }
  16. func New(c *conf.Config) (s *Service) {
  17. s = &Service{
  18. pgDao: pgdao.New(c),
  19. tick: time.Duration(c.Tick),
  20. pluginCache: map[string][]*plugin.Plugin{},
  21. }
  22. s.load()
  23. go s.loadproc()
  24. return
  25. }
  26. func (s *Service) Plugin(build, baseCode, seed int, name string) (pg *plugin.Plugin) {
  27. if build == 0 || seed == 0 || name == "" {
  28. return
  29. }
  30. if ps, ok := s.pluginCache[name]; ok {
  31. for _, p := range ps {
  32. if ((p.Policy == 1 && baseCode == p.BaseCode) || p.Policy == 2 && baseCode >= p.BaseCode) && seed%100 <= p.Coverage && build >= p.MinBuild && ((p.MaxBuild == 0) || (p.MaxBuild != 0 && build <= p.MaxBuild)) {
  33. pg = p
  34. break
  35. }
  36. }
  37. }
  38. return
  39. }
  40. // load cache data
  41. func (s *Service) load() {
  42. psm, err := s.pgDao.All(context.TODO())
  43. if err != nil {
  44. log.Error("s.pgDao.All() error(%v)", err)
  45. return
  46. }
  47. pgCache := make(map[string][]*plugin.Plugin, len(psm))
  48. for name, ps := range psm {
  49. sort.Sort(plugin.Plugins(ps))
  50. pgCache[name] = ps
  51. }
  52. s.pluginCache = pgCache
  53. }
  54. // cacheproc load cache data
  55. func (s *Service) loadproc() {
  56. for {
  57. time.Sleep(s.tick)
  58. s.load()
  59. }
  60. }