diff options
Diffstat (limited to 'internal/database')
| -rw-r--r-- | internal/database/db.go | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/internal/database/db.go b/internal/database/db.go index 2fbfe74..d5aa1f4 100644 --- a/internal/database/db.go +++ b/internal/database/db.go @@ -11,11 +11,13 @@ import ( "bytes" "fmt" "os" + "sync" ) type DB struct { fp *os.File cache map[string]struct{} + mu *sync.RWMutex } func New(path string) (*DB, error) { @@ -28,6 +30,7 @@ func New(path string) (*DB, error) { db := &DB{ fp: fp, cache: map[string]struct{}{}, + mu: &sync.RWMutex{}, } for part := range bytes.SplitSeq(cache, []byte("\n")) { db.cache[string(part)] = struct{}{} @@ -41,14 +44,22 @@ func (d *DB) Close() error { } func (d *DB) Exists(s string) bool { + d.mu.RLock() + defer d.mu.RUnlock() + _, ok := d.cache[s] return ok } func (d *DB) Append(s string) error { + d.mu.Lock() + defer d.mu.Unlock() + if d.Exists(s) { return nil } + + d.cache[s] = struct{}{} _, err := fmt.Fprintln(d.fp, s) return err } |
