database_storage.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package distcache
  2. import (
  3. "time"
  4. "github.com/grafana/grafana/pkg/services/sqlstore"
  5. )
  6. type databaseCache struct {
  7. SQLStore *sqlstore.SqlStore
  8. }
  9. var getTime = time.Now
  10. func (dc *databaseCache) Get(key string) (interface{}, error) {
  11. //now := getTime().Unix()
  12. cacheHits := []CacheData{}
  13. err := dc.SQLStore.NewSession().Where(`key = ?`, key).Find(&cacheHits)
  14. if err != nil {
  15. return nil, err
  16. }
  17. var cacheHit CacheData
  18. if len(cacheHits) == 0 {
  19. return nil, ErrCacheItemNotFound
  20. }
  21. cacheHit = cacheHits[0]
  22. if cacheHit.Expires > 0 {
  23. if getTime().Unix()-cacheHit.CreatedAt >= cacheHit.Expires {
  24. dc.Delete(key)
  25. return nil, ErrCacheItemNotFound
  26. }
  27. }
  28. item := &Item{}
  29. if err = DecodeGob(cacheHit.Data, item); err != nil {
  30. return nil, err
  31. }
  32. return item.Val, nil
  33. }
  34. type CacheData struct {
  35. Key string
  36. Data []byte
  37. Expires int64
  38. CreatedAt int64
  39. }
  40. func (dc *databaseCache) Put(key string, value interface{}, expire int64) error {
  41. item := &Item{Val: value}
  42. data, err := EncodeGob(item)
  43. if err != nil {
  44. return err
  45. }
  46. now := getTime().Unix()
  47. cacheHits := []CacheData{}
  48. err = dc.SQLStore.NewSession().Where(`key = ?`, key).Find(&cacheHits)
  49. if err != nil {
  50. return err
  51. }
  52. if len(cacheHits) > 0 {
  53. _, err = dc.SQLStore.NewSession().Exec("UPDATE cached_data SET data=?, created=?, expire=? WHERE key=?", data, now, expire, key)
  54. } else {
  55. _, err = dc.SQLStore.NewSession().Exec("INSERT INTO cache_data(key,data,created_at,expires) VALUES(?,?,?,?)", key, data, now, expire)
  56. }
  57. return err
  58. }
  59. func (dc *databaseCache) Delete(key string) error {
  60. sql := `DELETE FROM cache_data WHERE key = ?`
  61. _, err := dc.SQLStore.NewSession().Exec(sql, key)
  62. return err
  63. }