node_temp.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package core
  2. import (
  3. "encoding/json"
  4. "io/ioutil"
  5. "path/filepath"
  6. "sync"
  7. "time"
  8. "github.com/cdle/sillyplus/utils"
  9. )
  10. var temp *PersistentKeyValueStore
  11. var tempPath = filepath.Join(utils.GetDataHome(), "cache.json")
  12. var cache = func(pre string, sec int) interface{} {
  13. return map[string]interface{}{
  14. "set": func(key string, value interface{}, num int) {
  15. if sec != 0 && num == 0 {
  16. num = sec
  17. }
  18. temp.Set(pre+"_"+key, value, num)
  19. },
  20. "get": func(key string, def interface{}) interface{} {
  21. v := temp.Get(pre + "_" + key)
  22. if v == nil {
  23. v = def
  24. }
  25. return v
  26. },
  27. "delete": func(key string) {
  28. temp.Delete(pre + "_" + key)
  29. },
  30. }
  31. }
  32. type PersistentKeyValueStore struct {
  33. sync.RWMutex
  34. data map[string]Value
  35. }
  36. type Value struct {
  37. Data interface{} `json:"data"`
  38. ExpiredAt time.Time `json:"expired_at"`
  39. }
  40. func NewPersistentKeyValueStore() *PersistentKeyValueStore {
  41. return &PersistentKeyValueStore{
  42. data: make(map[string]Value),
  43. }
  44. }
  45. func (s *PersistentKeyValueStore) Set(key string, value interface{}, dur int) error {
  46. s.Lock()
  47. defer s.Unlock()
  48. if dur == 0 {
  49. dur = 86400
  50. }
  51. expiredAt := time.Now().Add(time.Duration(dur) * time.Second)
  52. s.data[key] = Value{
  53. Data: value,
  54. ExpiredAt: expiredAt,
  55. }
  56. go func() {
  57. s.RLock()
  58. defer s.RUnlock()
  59. defer func() {
  60. recover()
  61. }()
  62. jsonBytes, err := json.Marshal(s.data)
  63. if err == nil {
  64. ioutil.WriteFile(tempPath, jsonBytes, 0644)
  65. }
  66. }()
  67. return nil
  68. }
  69. func (s *PersistentKeyValueStore) Get(key string) interface{} {
  70. s.RLock()
  71. defer s.RUnlock()
  72. value, ok := s.data[key]
  73. if !ok || time.Now().After(value.ExpiredAt) {
  74. return nil
  75. }
  76. return value.Data
  77. }
  78. func (s *PersistentKeyValueStore) Delete(key string) error {
  79. s.Lock()
  80. defer s.Unlock()
  81. delete(s.data, key)
  82. // Serialize data to JSON and write to file
  83. jsonBytes, err := json.Marshal(s.data)
  84. if err != nil {
  85. return err
  86. }
  87. err = ioutil.WriteFile(tempPath, jsonBytes, 0644)
  88. if err != nil {
  89. return err
  90. }
  91. return nil
  92. }
  93. func (s *PersistentKeyValueStore) LoadFromFile() error {
  94. s.Lock()
  95. defer s.Unlock()
  96. // Read data from file
  97. jsonBytes, err := ioutil.ReadFile(tempPath)
  98. if err != nil {
  99. return err
  100. }
  101. // Deserialize JSON data
  102. err = json.Unmarshal(jsonBytes, &s.data)
  103. if err != nil {
  104. return err
  105. }
  106. // Delete expired data
  107. now := time.Now()
  108. for key, value := range s.data {
  109. if now.After(value.ExpiredAt) {
  110. delete(s.data, key)
  111. }
  112. }
  113. // Serialize data to JSON and write to file
  114. jsonBytes, err = json.Marshal(s.data)
  115. if err != nil {
  116. return err
  117. }
  118. err = ioutil.WriteFile(tempPath, jsonBytes, 0644)
  119. if err != nil {
  120. return err
  121. }
  122. return nil
  123. }
  124. func init() {
  125. temp = NewPersistentKeyValueStore()
  126. // Load data from file
  127. temp.LoadFromFile()
  128. // if err != nil {
  129. // fmt.Println("Failed to load data from file:", err)
  130. // }
  131. // // Set a key-value pair
  132. // err = store.Set("foo", map[string]interface{}{
  133. // "bar": "baz",
  134. // }, 1000)
  135. // if err != nil {
  136. // fmt.Println("Failed to set key-value pair:", err)
  137. // }
  138. // // Get a value
  139. // value := store.Get("foo")
  140. // fmt.Println(value)
  141. // // Delete a key-value pair
  142. // err = store.Delete("foo")
  143. // if err != nil {
  144. // fmt.Println("Failed to delete key-value pair:", err)
  145. // }
  146. }