cache.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package datasources
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/grafana/grafana/pkg/bus"
  6. m "github.com/grafana/grafana/pkg/models"
  7. "github.com/grafana/grafana/pkg/registry"
  8. "github.com/grafana/grafana/pkg/services/cache"
  9. )
  10. type CacheService interface {
  11. GetDatasource(datasourceID int64, user *m.SignedInUser, skipCache bool) (*m.DataSource, error)
  12. }
  13. type CacheServiceImpl struct {
  14. Bus bus.Bus `inject:""`
  15. CacheService *cache.CacheService `inject:""`
  16. }
  17. func init() {
  18. registry.RegisterService(&CacheServiceImpl{})
  19. }
  20. func (dc *CacheServiceImpl) Init() error {
  21. return nil
  22. }
  23. func (dc *CacheServiceImpl) GetDatasource(datasourceID int64, user *m.SignedInUser, skipCache bool) (*m.DataSource, error) {
  24. cacheKey := fmt.Sprintf("ds-%d", datasourceID)
  25. if !skipCache {
  26. if cached, found := dc.CacheService.Get(cacheKey); found {
  27. ds := cached.(*m.DataSource)
  28. if ds.OrgId == user.OrgId {
  29. return ds, nil
  30. }
  31. }
  32. }
  33. query := m.GetDataSourceByIdQuery{Id: datasourceID, OrgId: user.OrgId}
  34. if err := dc.Bus.Dispatch(&query); err != nil {
  35. return nil, err
  36. }
  37. dc.CacheService.Set(cacheKey, query.Result, time.Second*5)
  38. return query.Result, nil
  39. }