From 4920229a3b6e1d7dde536bc9ff766542b05d935c Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Fri, 20 Aug 2021 12:26:56 +0200 Subject: Database updates (#144) * start moving some database stuff around * continue moving db stuff around * more fiddling * more updates * and some more * and yet more * i broke SOMETHING but what, it's a mystery * tidy up * vendor ttlcache * use ttlcache * fix up some tests * rename some stuff * little reminder * some more updates --- internal/cache/cache.go | 20 ++++++++++++++++++++ internal/cache/error.go | 27 +++++++++++++++++++++++++++ internal/cache/fetch.go | 28 ++++++++++++++++++++++++++++ internal/cache/store.go | 24 ++++++++++++++++++++++++ 4 files changed, 99 insertions(+) create mode 100644 internal/cache/error.go create mode 100644 internal/cache/fetch.go create mode 100644 internal/cache/store.go (limited to 'internal/cache') diff --git a/internal/cache/cache.go b/internal/cache/cache.go index 1d2d0533b..eb3744cfe 100644 --- a/internal/cache/cache.go +++ b/internal/cache/cache.go @@ -18,8 +18,28 @@ package cache +import ( + "time" + + "github.com/ReneKroon/ttlcache" +) + // Cache defines an in-memory cache that is safe to be wiped when the application is restarted type Cache interface { Store(k string, v interface{}) error Fetch(k string) (interface{}, error) } + +type cache struct { + c *ttlcache.Cache +} + +// New returns a new in-memory cache. +func New() Cache { + c := ttlcache.NewCache() + c.SetTTL(30 * time.Second) + cache := &cache{ + c: c, + } + return cache +} diff --git a/internal/cache/error.go b/internal/cache/error.go new file mode 100644 index 000000000..3f32aa7ce --- /dev/null +++ b/internal/cache/error.go @@ -0,0 +1,27 @@ +/* + GoToSocial + Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package cache + +import "errors" + +// Error models an error returned by the in-memory cache. +type Error error + +// ErrNotFound means that a value for the requested key was not found in the cache. +var ErrNotFound = errors.New("value not found in cache") diff --git a/internal/cache/fetch.go b/internal/cache/fetch.go new file mode 100644 index 000000000..c107b9b26 --- /dev/null +++ b/internal/cache/fetch.go @@ -0,0 +1,28 @@ +/* + GoToSocial + Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package cache + +func (c *cache) Fetch(k string) (interface{}, error) { + i, stored := c.c.Get(k) + if !stored { + return nil, ErrNotFound + } + + return i, nil +} diff --git a/internal/cache/store.go b/internal/cache/store.go new file mode 100644 index 000000000..6b4024476 --- /dev/null +++ b/internal/cache/store.go @@ -0,0 +1,24 @@ +/* + GoToSocial + Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package cache + +func (c *cache) Store(k string, v interface{}) error { + c.c.Set(k, v) + return nil +} -- cgit v1.2.3