Skip to content

Commit e971f9e

Browse files
author
Ian Bishop
committed
memory storage message limit
1 parent 2f131a5 commit e971f9e

1 file changed

Lines changed: 30 additions & 2 deletions

File tree

memory.go

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,48 @@ import (
1010
type InMemory struct {
1111
MessageIDIndex map[string]int
1212
Messages []*data.Message
13+
14+
sliceIndexMap map[int]string
15+
messageLimit int
16+
writeIndex int
1317
}
1418

1519
// CreateInMemory creates a new in memory storage backend
1620
func CreateInMemory() *InMemory {
1721
return &InMemory{
1822
MessageIDIndex: make(map[string]int),
1923
Messages: make([]*data.Message, 0),
24+
sliceIndexMap: make(map[int]string),
2025
}
2126
}
2227

28+
// Set a limit on the number of messages that will be stored.
29+
// Once this limit is reached, the oldest message will be overwritten
30+
// by every new message.
31+
func (memory *InMemory) SetMessageLimit(limit int) error {
32+
memory.messageLimit = limit
33+
return nil
34+
}
35+
2336
// Store stores a message and returns its storage ID
2437
func (memory *InMemory) Store(m *data.Message) (string, error) {
25-
memory.Messages = append(memory.Messages, m)
26-
memory.MessageIDIndex[string(m.ID)] = len(memory.Messages) - 1
38+
if memory.messageLimit > 0 && len(memory.Messages) == memory.messageLimit {
39+
// overwrite oldest message
40+
memory.Messages[memory.writeIndex] = m
41+
messageID := memory.sliceIndexMap[memory.writeIndex]
42+
delete(memory.MessageIDIndex, messageID)
43+
memory.MessageIDIndex[string(m.ID)] = memory.writeIndex
44+
memory.sliceIndexMap[memory.writeIndex] = string(m.ID)
45+
memory.writeIndex++
46+
// if we reach the end of the slice then start over
47+
if memory.writeIndex == len(memory.Messages) {
48+
memory.writeIndex = 0
49+
}
50+
} else {
51+
memory.Messages = append(memory.Messages, m)
52+
memory.MessageIDIndex[string(m.ID)] = len(memory.Messages) - 1
53+
memory.sliceIndexMap[len(memory.Messages)-1] = string(m.ID)
54+
}
2755
return string(m.ID), nil
2856
}
2957

0 commit comments

Comments
 (0)