diff options
Diffstat (limited to 'internal/db')
-rw-r--r-- | internal/db/bundb/account.go | 4 | ||||
-rw-r--r-- | internal/db/bundb/bundb.go | 3 | ||||
-rw-r--r-- | internal/db/bundb/media.go | 81 |
3 files changed, 62 insertions, 26 deletions
diff --git a/internal/db/bundb/account.go b/internal/db/bundb/account.go index dccfee45b..9fdd28342 100644 --- a/internal/db/bundb/account.go +++ b/internal/db/bundb/account.go @@ -41,9 +41,7 @@ type accountDB struct { func (a *accountDB) newAccountQ(account *gtsmodel.Account) *bun.SelectQuery { return a.conn. NewSelect(). - Model(account). - Relation("AvatarMediaAttachment"). - Relation("HeaderMediaAttachment") + Model(account) } func (a *accountDB) GetAccountByID(ctx context.Context, id string) (*gtsmodel.Account, db.Error) { diff --git a/internal/db/bundb/bundb.go b/internal/db/bundb/bundb.go index 2f7a8a022..990eccb6b 100644 --- a/internal/db/bundb/bundb.go +++ b/internal/db/bundb/bundb.go @@ -178,7 +178,8 @@ func NewBunDBService(ctx context.Context, state *state.State) (db.DB, error) { conn: conn, }, Media: &mediaDB{ - conn: conn, + conn: conn, + state: state, }, Mention: &mentionDB{ conn: conn, diff --git a/internal/db/bundb/media.go b/internal/db/bundb/media.go index 3350f9584..ee2bea6e5 100644 --- a/internal/db/bundb/media.go +++ b/internal/db/bundb/media.go @@ -24,38 +24,58 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/log" + "github.com/superseriousbusiness/gotosocial/internal/state" "github.com/uptrace/bun" ) type mediaDB struct { - conn *DBConn + conn *DBConn + state *state.State } -func (m *mediaDB) newMediaQ(i interface{}) *bun.SelectQuery { +func (m *mediaDB) newMediaQ(i *gtsmodel.MediaAttachment) *bun.SelectQuery { return m.conn. NewSelect(). - Model(i). - Relation("Account") + Model(i) } func (m *mediaDB) GetAttachmentByID(ctx context.Context, id string) (*gtsmodel.MediaAttachment, db.Error) { - attachment := >smodel.MediaAttachment{} + return m.getAttachment( + ctx, + "ID", + func(attachment *gtsmodel.MediaAttachment) error { + return m.newMediaQ(attachment).Where("? = ?", bun.Ident("media_attachment.id"), id).Scan(ctx) + }, + id, + ) +} - q := m.newMediaQ(attachment). - Where("? = ?", bun.Ident("media_attachment.id"), id) +func (m *mediaDB) getAttachments(ctx context.Context, ids []string) ([]*gtsmodel.MediaAttachment, db.Error) { + attachments := make([]*gtsmodel.MediaAttachment, 0, len(ids)) - if err := q.Scan(ctx); err != nil { - return nil, m.conn.ProcessError(err) + for _, id := range ids { + // Attempt fetch from DB + attachment, err := m.GetAttachmentByID(ctx, id) + if err != nil { + log.Errorf("error getting attachment %q: %v", id, err) + continue + } + + // Append attachment + attachments = append(attachments, attachment) } - return attachment, nil + + return attachments, nil } func (m *mediaDB) GetRemoteOlderThan(ctx context.Context, olderThan time.Time, limit int) ([]*gtsmodel.MediaAttachment, db.Error) { - attachments := []*gtsmodel.MediaAttachment{} + attachmentIDs := []string{} q := m.conn. NewSelect(). - Model(&attachments). + TableExpr("? AS ?", bun.Ident("media_attachments"), bun.Ident("media_attachment")). + Column("media_attachment.id"). Where("? = ?", bun.Ident("media_attachment.cached"), true). Where("? < ?", bun.Ident("media_attachment.created_at"), olderThan). WhereGroup(" AND ", whereNotEmptyAndNotNull("media_attachment.remote_url")). @@ -65,11 +85,11 @@ func (m *mediaDB) GetRemoteOlderThan(ctx context.Context, olderThan time.Time, l q = q.Limit(limit) } - if err := q.Scan(ctx); err != nil { + if err := q.Scan(ctx, &attachmentIDs); err != nil { return nil, m.conn.ProcessError(err) } - return attachments, nil + return m.getAttachments(ctx, attachmentIDs) } func (m *mediaDB) CountRemoteOlderThan(ctx context.Context, olderThan time.Time) (int, db.Error) { @@ -90,9 +110,11 @@ func (m *mediaDB) CountRemoteOlderThan(ctx context.Context, olderThan time.Time) } func (m *mediaDB) GetAvatarsAndHeaders(ctx context.Context, maxID string, limit int) ([]*gtsmodel.MediaAttachment, db.Error) { - attachments := []*gtsmodel.MediaAttachment{} + attachmentIDs := []string{} - q := m.newMediaQ(&attachments). + q := m.conn.NewSelect(). + TableExpr("? AS ?", bun.Ident("media_attachments"), bun.Ident("media_attachment")). + Column("media_attachment.id"). WhereGroup(" AND ", func(innerQ *bun.SelectQuery) *bun.SelectQuery { return innerQ. WhereOr("? = ?", bun.Ident("media_attachment.avatar"), true). @@ -108,17 +130,20 @@ func (m *mediaDB) GetAvatarsAndHeaders(ctx context.Context, maxID string, limit q = q.Limit(limit) } - if err := q.Scan(ctx); err != nil { + if err := q.Scan(ctx, &attachmentIDs); err != nil { return nil, m.conn.ProcessError(err) } - return attachments, nil + return m.getAttachments(ctx, attachmentIDs) } func (m *mediaDB) GetLocalUnattachedOlderThan(ctx context.Context, olderThan time.Time, limit int) ([]*gtsmodel.MediaAttachment, db.Error) { - attachments := []*gtsmodel.MediaAttachment{} + attachmentIDs := []string{} - q := m.newMediaQ(&attachments). + q := m.conn. + NewSelect(). + TableExpr("? AS ?", bun.Ident("media_attachments"), bun.Ident("media_attachment")). + Column("media_attachment.id"). Where("? = ?", bun.Ident("media_attachment.cached"), true). Where("? = ?", bun.Ident("media_attachment.avatar"), false). Where("? = ?", bun.Ident("media_attachment.header"), false). @@ -131,11 +156,11 @@ func (m *mediaDB) GetLocalUnattachedOlderThan(ctx context.Context, olderThan tim q = q.Limit(limit) } - if err := q.Scan(ctx); err != nil { + if err := q.Scan(ctx, &attachmentIDs); err != nil { return nil, m.conn.ProcessError(err) } - return attachments, nil + return m.getAttachments(ctx, attachmentIDs) } func (m *mediaDB) CountLocalUnattachedOlderThan(ctx context.Context, olderThan time.Time) (int, db.Error) { @@ -157,3 +182,15 @@ func (m *mediaDB) CountLocalUnattachedOlderThan(ctx context.Context, olderThan t return count, nil } + +func (m *mediaDB) getAttachment(ctx context.Context, lookup string, dbQuery func(*gtsmodel.MediaAttachment) error, keyParts ...any) (*gtsmodel.MediaAttachment, db.Error) { + // Fetch attachment from database + // todo: cache this lookup + attachment := new(gtsmodel.MediaAttachment) + + if err := dbQuery(attachment); err != nil { + return nil, m.conn.ProcessError(err) + } + + return attachment, nil +} |