cache_mem.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package server
  2. import (
  3. _ "github.com/mattn/go-sqlite3" // SQLite driver
  4. "sync"
  5. "time"
  6. )
  7. type memCache struct {
  8. messages map[string][]*message
  9. mu sync.Mutex
  10. }
  11. var _ cache = (*memCache)(nil)
  12. func newMemCache() *memCache {
  13. return &memCache{
  14. messages: make(map[string][]*message),
  15. }
  16. }
  17. func (s *memCache) AddMessage(m *message) error {
  18. s.mu.Lock()
  19. defer s.mu.Unlock()
  20. if _, ok := s.messages[m.Topic]; !ok {
  21. s.messages[m.Topic] = make([]*message, 0)
  22. }
  23. s.messages[m.Topic] = append(s.messages[m.Topic], m)
  24. return nil
  25. }
  26. func (s *memCache) Messages(topic string, since sinceTime) ([]*message, error) {
  27. s.mu.Lock()
  28. defer s.mu.Unlock()
  29. if _, ok := s.messages[topic]; !ok {
  30. return make([]*message, 0), nil
  31. }
  32. messages := make([]*message, 0) // copy!
  33. for _, m := range s.messages[topic] {
  34. msgTime := time.Unix(m.Time, 0)
  35. if msgTime == since.Time() || msgTime.After(since.Time()) {
  36. messages = append(messages, m)
  37. }
  38. }
  39. return messages, nil
  40. }
  41. func (s *memCache) MessageCount(topic string) (int, error) {
  42. s.mu.Lock()
  43. defer s.mu.Unlock()
  44. if _, ok := s.messages[topic]; !ok {
  45. return 0, nil
  46. }
  47. return len(s.messages[topic]), nil
  48. }
  49. func (s *memCache) Topics() (map[string]*topic, error) {
  50. // Hack since we know when this is called there are no messages!
  51. return make(map[string]*topic), nil
  52. }
  53. func (s *memCache) Prune(keep time.Duration) error {
  54. s.mu.Lock()
  55. defer s.mu.Unlock()
  56. for topic, _ := range s.messages {
  57. s.pruneTopic(topic, keep)
  58. }
  59. return nil
  60. }
  61. func (s *memCache) pruneTopic(topic string, keep time.Duration) {
  62. for i, m := range s.messages[topic] {
  63. msgTime := time.Unix(m.Time, 0)
  64. if time.Since(msgTime) < keep {
  65. s.messages[topic] = s.messages[topic][i:]
  66. return
  67. }
  68. }
  69. s.messages[topic] = make([]*message, 0) // all messages expired
  70. }