blob: 0cb2ef74a07bbfd4b4c62748b3571bf953f343ae [file] [log] [blame]
package mem_ignorestore
import (
"fmt"
"sync"
"time"
"go.skia.org/infra/golden/go/ignore"
)
// MemIgnoreStore is an in-memory implementation of IgnoreStore.
type MemIgnoreStore struct {
rules []*ignore.IgnoreRule
mutex sync.Mutex
nextId int64
revision int64
}
func New() *MemIgnoreStore {
return &MemIgnoreStore{
rules: []*ignore.IgnoreRule{},
}
}
func (m *MemIgnoreStore) inc() {
m.revision += 1
}
// Create, see IgnoreStore interface.
func (m *MemIgnoreStore) Create(rule *ignore.IgnoreRule) error {
m.mutex.Lock()
defer m.mutex.Unlock()
rule.ID = m.nextId
m.nextId++
m.rules = append(m.rules, rule)
m.inc()
return nil
}
// List, see IgnoreStore interface.
func (m *MemIgnoreStore) List() ([]*ignore.IgnoreRule, error) {
m.mutex.Lock()
defer m.mutex.Unlock()
m.expire()
result := make([]*ignore.IgnoreRule, len(m.rules))
copy(result, m.rules)
return result, nil
}
// Update, see IgnoreStore interface.
func (m *MemIgnoreStore) Update(id int64, updated *ignore.IgnoreRule) error {
m.mutex.Lock()
defer m.mutex.Unlock()
for i := range m.rules {
if updated.ID == id {
m.rules[i] = updated
m.inc()
return nil
}
}
return fmt.Errorf("Did not find an IgnoreRule with id: %d", id)
}
// Delete, see IgnoreStore interface.
func (m *MemIgnoreStore) Delete(id int64) (int, error) {
m.mutex.Lock()
defer m.mutex.Unlock()
for idx, rule := range m.rules {
if rule.ID == id {
m.rules = append(m.rules[:idx], m.rules[idx+1:]...)
m.inc()
return 1, nil
}
}
return 0, nil
}
func (m *MemIgnoreStore) Revision() int64 {
m.mutex.Lock()
defer m.mutex.Unlock()
return m.revision
}
func (m *MemIgnoreStore) expire() {
newrules := make([]*ignore.IgnoreRule, 0, len(m.rules))
now := time.Now()
for _, rule := range m.rules {
if rule.Expires.After(now) {
newrules = append(newrules, rule)
}
}
m.rules = newrules
}
// BuildRuleMatcher, see IgnoreStore interface.
func (m *MemIgnoreStore) BuildRuleMatcher() (ignore.RuleMatcher, error) {
return ignore.BuildRuleMatcher(m)
}