planner/plan/storage/memory.go

101 lines
1.8 KiB
Go
Raw Normal View History

2024-09-30 07:34:40 +02:00
package storage
2024-09-23 07:48:18 +02:00
import (
"errors"
"sort"
"sync"
"go-mod.ewintr.nl/planner/item"
)
type Memory struct {
2024-10-03 07:32:48 +02:00
events map[string]item.Event
localIDs map[int]string
mutex sync.RWMutex
2024-09-23 07:48:18 +02:00
}
func NewMemory() *Memory {
return &Memory{
2024-10-03 07:32:48 +02:00
events: make(map[string]item.Event),
localIDs: make(map[int]string),
2024-09-23 07:48:18 +02:00
}
}
func (r *Memory) Find(id string) (item.Event, error) {
r.mutex.RLock()
defer r.mutex.RUnlock()
event, exists := r.events[id]
if !exists {
return item.Event{}, errors.New("event not found")
}
return event, nil
}
2024-10-03 07:32:48 +02:00
func (r *Memory) FindByLocal(localID int) (item.Event, error) {
r.mutex.RLock()
defer r.mutex.RUnlock()
id, exists := r.localIDs[localID]
if !exists {
return item.Event{}, errors.New("event not found")
}
event, exists := r.events[id]
if !exists {
return item.Event{}, errors.New("id an localid mismatch")
}
return event, nil
}
func (r *Memory) FindAll() (map[int]string, []item.Event, error) {
2024-09-23 07:48:18 +02:00
r.mutex.RLock()
defer r.mutex.RUnlock()
events := make([]item.Event, 0, len(r.events))
for _, event := range r.events {
events = append(events, event)
}
sort.Slice(events, func(i, j int) bool {
return events[i].ID < events[j].ID
})
2024-10-03 07:32:48 +02:00
return r.localIDs, events, nil
2024-09-23 07:48:18 +02:00
}
func (r *Memory) Store(e item.Event) error {
r.mutex.Lock()
defer r.mutex.Unlock()
2024-10-03 07:32:48 +02:00
if _, exists := r.events[e.ID]; !exists {
cur := make([]int, 0, len(r.localIDs))
for i := range r.localIDs {
cur = append(cur, i)
}
localID := NextLocalID(cur)
r.localIDs[localID] = e.ID
}
2024-09-23 07:48:18 +02:00
r.events[e.ID] = e
2024-10-03 07:32:48 +02:00
2024-09-23 07:48:18 +02:00
return nil
}
func (r *Memory) Delete(id string) error {
r.mutex.Lock()
defer r.mutex.Unlock()
if _, exists := r.events[id]; !exists {
return errors.New("event not found")
}
delete(r.events, id)
2024-10-03 07:32:48 +02:00
for localID, eventID := range r.localIDs {
if id == eventID {
delete(r.localIDs, localID)
}
}
2024-09-23 07:48:18 +02:00
return nil
}