summaryrefslogtreecommitdiff
path: root/internal/db/bundb/domain.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/db/bundb/domain.go')
-rw-r--r--internal/db/bundb/domain.go94
1 files changed, 43 insertions, 51 deletions
diff --git a/internal/db/bundb/domain.go b/internal/db/bundb/domain.go
index 0a752d3f3..3fca8501b 100644
--- a/internal/db/bundb/domain.go
+++ b/internal/db/bundb/domain.go
@@ -20,11 +20,11 @@ package bundb
import (
"context"
- "database/sql"
"net/url"
"strings"
+ "time"
- "github.com/superseriousbusiness/gotosocial/internal/cache"
+ "codeberg.org/gruf/go-cache/v3/result"
"github.com/superseriousbusiness/gotosocial/internal/config"
"github.com/superseriousbusiness/gotosocial/internal/db"
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
@@ -34,7 +34,22 @@ import (
type domainDB struct {
conn *DBConn
- cache *cache.DomainBlockCache
+ cache *result.Cache[*gtsmodel.DomainBlock]
+}
+
+func (d *domainDB) init() {
+ // Initialize domain block result cache
+ d.cache = result.NewSized([]result.Lookup{
+ {Name: "Domain"},
+ }, func(d1 *gtsmodel.DomainBlock) *gtsmodel.DomainBlock {
+ d2 := new(gtsmodel.DomainBlock)
+ *d2 = *d1
+ return d2
+ }, 1000)
+
+ // Set cache TTL and start sweep routine
+ d.cache.SetTTL(time.Minute*5, false)
+ d.cache.Start(time.Second * 10)
}
// normalizeDomain converts the given domain to lowercase
@@ -49,76 +64,53 @@ func normalizeDomain(domain string) (out string, err error) {
}
func (d *domainDB) CreateDomainBlock(ctx context.Context, block *gtsmodel.DomainBlock) db.Error {
- domain, err := normalizeDomain(block.Domain)
+ var err error
+
+ block.Domain, err = normalizeDomain(block.Domain)
if err != nil {
return err
}
- block.Domain = domain
- // Attempt to insert new domain block
- if _, err := d.conn.NewInsert().
- Model(block).
- Exec(ctx); err != nil {
+ return d.cache.Store(block, func() error {
+ _, err := d.conn.NewInsert().
+ Model(block).
+ Exec(ctx)
return d.conn.ProcessError(err)
- }
-
- // Cache this domain block
- d.cache.Put(block.Domain, block)
-
- return nil
+ })
}
func (d *domainDB) GetDomainBlock(ctx context.Context, domain string) (*gtsmodel.DomainBlock, db.Error) {
var err error
+
domain, err = normalizeDomain(domain)
if err != nil {
return nil, err
}
- // Check for easy case, domain referencing *us*
- if domain == "" || domain == config.GetAccountDomain() {
- return nil, db.ErrNoEntries
- }
-
- // Check for already cached rblock
- if block, ok := d.cache.GetByDomain(domain); ok {
- // A 'nil' return value is a sentinel value for no block
- if block == nil {
+ return d.cache.Load("Domain", func() (*gtsmodel.DomainBlock, error) {
+ // Check for easy case, domain referencing *us*
+ if domain == "" || domain == config.GetAccountDomain() {
return nil, db.ErrNoEntries
}
- // Else, this block exists
- return block, nil
- }
+ var block gtsmodel.DomainBlock
- block := &gtsmodel.DomainBlock{}
+ q := d.conn.
+ NewSelect().
+ Model(&block).
+ Where("? = ?", bun.Ident("domain_block.domain"), domain).
+ Limit(1)
+ if err := q.Scan(ctx); err != nil {
+ return nil, d.conn.ProcessError(err)
+ }
- q := d.conn.
- NewSelect().
- Model(block).
- Where("? = ?", bun.Ident("domain_block.domain"), domain).
- Limit(1)
-
- // Query database for domain block
- switch err := q.Scan(ctx); err {
- // No error, block found
- case nil:
- d.cache.Put(domain, block)
- return block, nil
-
- // No error, simply not found
- case sql.ErrNoRows:
- d.cache.Put(domain, nil)
- return nil, db.ErrNoEntries
-
- // Any other db error
- default:
- return nil, d.conn.ProcessError(err)
- }
+ return &block, nil
+ }, domain)
}
func (d *domainDB) DeleteDomainBlock(ctx context.Context, domain string) db.Error {
var err error
+
domain, err = normalizeDomain(domain)
if err != nil {
return err
@@ -133,7 +125,7 @@ func (d *domainDB) DeleteDomainBlock(ctx context.Context, domain string) db.Erro
}
// Clear domain from cache
- d.cache.InvalidateByDomain(domain)
+ d.cache.Invalidate(domain)
return nil
}