aboutsummaryrefslogtreecommitdiff
path: root/lib/ignore/cache.go
blob: e169c1b47031e4b2cba287388ffd49109ef09a13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Copyright (C) 2014 The Syncthing Authors.
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// You can obtain one at https://mozilla.org/MPL/2.0/.

package ignore

import (
	"time"

	"github.com/syncthing/syncthing/lib/ignore/ignoreresult"
)

type nower interface {
	Now() time.Time
}

var clock = nower(defaultClock{})

type cache struct {
	patterns []Pattern
	entries  map[string]cacheEntry
}

type cacheEntry struct {
	result ignoreresult.R
	access int64 // Unix nanosecond count. Sufficient until the year 2262.
}

func newCache(patterns []Pattern) *cache {
	return &cache{
		patterns: patterns,
		entries:  make(map[string]cacheEntry),
	}
}

func (c *cache) clean(d time.Duration) {
	for k, v := range c.entries {
		if clock.Now().Sub(time.Unix(0, v.access)) > d {
			delete(c.entries, k)
		}
	}
}

func (c *cache) get(key string) (ignoreresult.R, bool) {
	entry, ok := c.entries[key]
	if ok {
		entry.access = clock.Now().UnixNano()
		c.entries[key] = entry
	}
	return entry.result, ok
}

func (c *cache) set(key string, result ignoreresult.R) {
	c.entries[key] = cacheEntry{result, time.Now().UnixNano()}
}

func (c *cache) len() int {
	l := len(c.entries)
	return l
}

type defaultClock struct{}

func (defaultClock) Now() time.Time {
	return time.Now()
}