54 lines
881 B
Go
54 lines
881 B
Go
// Copyright (C) 2021 Marius Schellenberger
|
|
|
|
package cache
|
|
|
|
import (
|
|
"git.giftfish.de/ston1th/gowiki/pkg/core"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
type CachedPage struct {
|
|
Page *core.Page
|
|
CacheTime time.Time
|
|
}
|
|
|
|
type Cache struct {
|
|
sync.RWMutex
|
|
Cache map[string]*CachedPage
|
|
}
|
|
|
|
func NewCache() *Cache {
|
|
return &Cache{Cache: make(map[string]*CachedPage)}
|
|
}
|
|
|
|
func (c *Cache) Add(title string, p *core.Page) {
|
|
now := time.Now()
|
|
c.Lock()
|
|
defer c.Unlock()
|
|
cp, ok := c.Cache[title]
|
|
if ok && now.After(cp.CacheTime) {
|
|
cp.Page = p
|
|
cp.CacheTime = now
|
|
c.Cache[title] = cp
|
|
return
|
|
}
|
|
c.Cache[title] = &CachedPage{p, now}
|
|
}
|
|
|
|
func (c *Cache) Get(title string) (p *core.Page) {
|
|
c.RLock()
|
|
defer c.RUnlock()
|
|
if cp, ok := c.Cache[title]; ok {
|
|
p = new(core.Page)
|
|
*p = *cp.Page
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
func (c *Cache) Delete(title string) {
|
|
c.Lock()
|
|
delete(c.Cache, title)
|
|
c.Unlock()
|
|
}
|