diff options
Diffstat (limited to 'internal/db/bundb/status.go')
-rw-r--r-- | internal/db/bundb/status.go | 186 |
1 files changed, 121 insertions, 65 deletions
diff --git a/internal/db/bundb/status.go b/internal/db/bundb/status.go index 2d920ee3f..bc72c2849 100644 --- a/internal/db/bundb/status.go +++ b/internal/db/bundb/status.go @@ -72,7 +72,7 @@ func (s *statusDB) GetStatusByID(ctx context.Context, id string) (*gtsmodel.Stat return s.cache.GetByID(id) }, func(status *gtsmodel.Status) error { - return s.newStatusQ(status).Where("status.id = ?", id).Scan(ctx) + return s.newStatusQ(status).Where("? = ?", bun.Ident("status.id"), id).Scan(ctx) }, ) } @@ -84,7 +84,7 @@ func (s *statusDB) GetStatusByURI(ctx context.Context, uri string) (*gtsmodel.St return s.cache.GetByURI(uri) }, func(status *gtsmodel.Status) error { - return s.newStatusQ(status).Where("status.uri = ?", uri).Scan(ctx) + return s.newStatusQ(status).Where("? = ?", bun.Ident("status.uri"), uri).Scan(ctx) }, ) } @@ -96,7 +96,7 @@ func (s *statusDB) GetStatusByURL(ctx context.Context, url string) (*gtsmodel.St return s.cache.GetByURL(url) }, func(status *gtsmodel.Status) error { - return s.newStatusQ(status).Where("status.url = ?", url).Scan(ctx) + return s.newStatusQ(status).Where("? = ?", bun.Ident("status.url"), url).Scan(ctx) }, ) } @@ -109,8 +109,7 @@ func (s *statusDB) getStatus(ctx context.Context, cacheGet func() (*gtsmodel.Sta status = >smodel.Status{} // Not cached! Perform database query - err := dbQuery(status) - if err != nil { + if err := dbQuery(status); err != nil { return nil, s.conn.ProcessError(err) } @@ -138,24 +137,34 @@ func (s *statusDB) getStatus(ctx context.Context, cacheGet func() (*gtsmodel.Sta } func (s *statusDB) PutStatus(ctx context.Context, status *gtsmodel.Status) db.Error { - return s.conn.RunInTx(ctx, func(tx bun.Tx) error { + err := s.conn.RunInTx(ctx, func(tx bun.Tx) error { // create links between this status and any emojis it uses for _, i := range status.EmojiIDs { - if _, err := tx.NewInsert().Model(>smodel.StatusToEmoji{ - StatusID: status.ID, - EmojiID: i, - }).Exec(ctx); err != nil { - return err + if _, err := tx. + NewInsert(). + Model(>smodel.StatusToEmoji{ + StatusID: status.ID, + EmojiID: i, + }).Exec(ctx); err != nil { + err = s.conn.errProc(err) + if !errors.Is(err, db.ErrAlreadyExists) { + return err + } } } // create links between this status and any tags it uses for _, i := range status.TagIDs { - if _, err := tx.NewInsert().Model(>smodel.StatusToTag{ - StatusID: status.ID, - TagID: i, - }).Exec(ctx); err != nil { - return err + if _, err := tx. + NewInsert(). + Model(>smodel.StatusToTag{ + StatusID: status.ID, + TagID: i, + }).Exec(ctx); err != nil { + err = s.conn.errProc(err) + if !errors.Is(err, db.ErrAlreadyExists) { + return err + } } } @@ -163,27 +172,46 @@ func (s *statusDB) PutStatus(ctx context.Context, status *gtsmodel.Status) db.Er for _, a := range status.Attachments { a.StatusID = status.ID a.UpdatedAt = time.Now() - if _, err := tx.NewUpdate().Model(a). - Where("id = ?", a.ID). + if _, err := tx. + NewUpdate(). + Model(a). + Where("? = ?", bun.Ident("media_attachment.id"), a.ID). Exec(ctx); err != nil { - return err + err = s.conn.errProc(err) + if !errors.Is(err, db.ErrAlreadyExists) { + return err + } } } // Finally, insert the status - _, err := tx.NewInsert().Model(status).Exec(ctx) - return err + if _, err := tx. + NewInsert(). + Model(status). + Exec(ctx); err != nil { + return err + } + + return nil }) + if err != nil { + return s.conn.ProcessError(err) + } + + s.cache.Put(status) + return nil } func (s *statusDB) UpdateStatus(ctx context.Context, status *gtsmodel.Status) (*gtsmodel.Status, db.Error) { err := s.conn.RunInTx(ctx, func(tx bun.Tx) error { // create links between this status and any emojis it uses for _, i := range status.EmojiIDs { - if _, err := tx.NewInsert().Model(>smodel.StatusToEmoji{ - StatusID: status.ID, - EmojiID: i, - }).Exec(ctx); err != nil { + if _, err := tx. + NewInsert(). + Model(>smodel.StatusToEmoji{ + StatusID: status.ID, + EmojiID: i, + }).Exec(ctx); err != nil { err = s.conn.errProc(err) if !errors.Is(err, db.ErrAlreadyExists) { return err @@ -193,10 +221,12 @@ func (s *statusDB) UpdateStatus(ctx context.Context, status *gtsmodel.Status) (* // create links between this status and any tags it uses for _, i := range status.TagIDs { - if _, err := tx.NewInsert().Model(>smodel.StatusToTag{ - StatusID: status.ID, - TagID: i, - }).Exec(ctx); err != nil { + if _, err := tx. + NewInsert(). + Model(>smodel.StatusToTag{ + StatusID: status.ID, + TagID: i, + }).Exec(ctx); err != nil { err = s.conn.errProc(err) if !errors.Is(err, db.ErrAlreadyExists) { return err @@ -208,23 +238,32 @@ func (s *statusDB) UpdateStatus(ctx context.Context, status *gtsmodel.Status) (* for _, a := range status.Attachments { a.StatusID = status.ID a.UpdatedAt = time.Now() - if _, err := tx.NewUpdate().Model(a). - Where("id = ?", a.ID). + if _, err := tx. + NewUpdate(). + Model(a). + Where("? = ?", bun.Ident("media_attachment.id"), a.ID). Exec(ctx); err != nil { return err } } // Finally, update the status itself - if _, err := tx.NewUpdate().Model(status).WherePK().Exec(ctx); err != nil { + if _, err := tx. + NewUpdate(). + Model(status). + Where("? = ?", bun.Ident("status.id"), status.ID). + Exec(ctx); err != nil { return err } - s.cache.Put(status) return nil }) + if err != nil { + return nil, s.conn.ProcessError(err) + } - return status, err + s.cache.Put(status) + return status, nil } func (s *statusDB) DeleteStatusByID(ctx context.Context, id string) db.Error { @@ -232,8 +271,8 @@ func (s *statusDB) DeleteStatusByID(ctx context.Context, id string) db.Error { // delete links between this status and any emojis it uses if _, err := tx. NewDelete(). - Model(>smodel.StatusToEmoji{}). - Where("status_id = ?", id). + TableExpr("? AS ?", bun.Ident("status_to_emojis"), bun.Ident("status_to_emoji")). + Where("? = ?", bun.Ident("status_to_emoji.status_id"), id). Exec(ctx); err != nil { return err } @@ -241,8 +280,8 @@ func (s *statusDB) DeleteStatusByID(ctx context.Context, id string) db.Error { // delete links between this status and any tags it uses if _, err := tx. NewDelete(). - Model(>smodel.StatusToTag{}). - Where("status_id = ?", id). + TableExpr("? AS ?", bun.Ident("status_to_tags"), bun.Ident("status_to_tag")). + Where("? = ?", bun.Ident("status_to_tag.status_id"), id). Exec(ctx); err != nil { return err } @@ -250,17 +289,20 @@ func (s *statusDB) DeleteStatusByID(ctx context.Context, id string) db.Error { // delete the status itself if _, err := tx. NewDelete(). - Model(>smodel.Status{ID: id}). - WherePK(). + TableExpr("? AS ?", bun.Ident("statuses"), bun.Ident("status")). + Where("? = ?", bun.Ident("status.id"), id). Exec(ctx); err != nil { return err } - s.cache.Invalidate(id) return nil }) + if err != nil { + return s.conn.ProcessError(err) + } - return s.conn.ProcessError(err) + s.cache.Invalidate(id) + return nil } func (s *statusDB) GetStatusParents(ctx context.Context, status *gtsmodel.Status, onlyDirect bool) ([]*gtsmodel.Status, db.Error) { @@ -312,11 +354,11 @@ func (s *statusDB) statusChildren(ctx context.Context, status *gtsmodel.Status, q := s.conn. NewSelect(). - Table("statuses"). - Column("id"). - Where("in_reply_to_id = ?", status.ID) + TableExpr("? AS ?", bun.Ident("statuses"), bun.Ident("status")). + Column("status.id"). + Where("? = ?", bun.Ident("status.in_reply_to_id"), status.ID) if minID != "" { - q = q.Where("id > ?", minID) + q = q.Where("? > ?", bun.Ident("status.id"), minID) } if err := q.Scan(ctx, &childIDs); err != nil { @@ -356,23 +398,35 @@ func (s *statusDB) statusChildren(ctx context.Context, status *gtsmodel.Status, } func (s *statusDB) CountStatusReplies(ctx context.Context, status *gtsmodel.Status) (int, db.Error) { - return s.conn.NewSelect().Model(>smodel.Status{}).Where("in_reply_to_id = ?", status.ID).Count(ctx) + return s.conn. + NewSelect(). + TableExpr("? AS ?", bun.Ident("statuses"), bun.Ident("status")). + Where("? = ?", bun.Ident("status.in_reply_to_id"), status.ID). + Count(ctx) } func (s *statusDB) CountStatusReblogs(ctx context.Context, status *gtsmodel.Status) (int, db.Error) { - return s.conn.NewSelect().Model(>smodel.Status{}).Where("boost_of_id = ?", status.ID).Count(ctx) + return s.conn. + NewSelect(). + TableExpr("? AS ?", bun.Ident("statuses"), bun.Ident("status")). + Where("? = ?", bun.Ident("status.boost_of_id"), status.ID). + Count(ctx) } func (s *statusDB) CountStatusFaves(ctx context.Context, status *gtsmodel.Status) (int, db.Error) { - return s.conn.NewSelect().Model(>smodel.StatusFave{}).Where("status_id = ?", status.ID).Count(ctx) + return s.conn. + NewSelect(). + TableExpr("? AS ?", bun.Ident("status_faves"), bun.Ident("status_fave")). + Where("? = ?", bun.Ident("status_fave.status_id"), status.ID). + Count(ctx) } func (s *statusDB) IsStatusFavedBy(ctx context.Context, status *gtsmodel.Status, accountID string) (bool, db.Error) { q := s.conn. NewSelect(). - Model(>smodel.StatusFave{}). - Where("status_id = ?", status.ID). - Where("account_id = ?", accountID) + TableExpr("? AS ?", bun.Ident("status_faves"), bun.Ident("status_fave")). + Where("? = ?", bun.Ident("status_fave.status_id"), status.ID). + Where("? = ?", bun.Ident("status_fave.account_id"), accountID) return s.conn.Exists(ctx, q) } @@ -380,9 +434,9 @@ func (s *statusDB) IsStatusFavedBy(ctx context.Context, status *gtsmodel.Status, func (s *statusDB) IsStatusRebloggedBy(ctx context.Context, status *gtsmodel.Status, accountID string) (bool, db.Error) { q := s.conn. NewSelect(). - Model(>smodel.Status{}). - Where("boost_of_id = ?", status.ID). - Where("account_id = ?", accountID) + TableExpr("? AS ?", bun.Ident("statuses"), bun.Ident("status")). + Where("? = ?", bun.Ident("status.boost_of_id"), status.ID). + Where("? = ?", bun.Ident("status.account_id"), accountID) return s.conn.Exists(ctx, q) } @@ -390,9 +444,9 @@ func (s *statusDB) IsStatusRebloggedBy(ctx context.Context, status *gtsmodel.Sta func (s *statusDB) IsStatusMutedBy(ctx context.Context, status *gtsmodel.Status, accountID string) (bool, db.Error) { q := s.conn. NewSelect(). - Model(>smodel.StatusMute{}). - Where("status_id = ?", status.ID). - Where("account_id = ?", accountID) + TableExpr("? AS ?", bun.Ident("status_mutes"), bun.Ident("status_mute")). + Where("? = ?", bun.Ident("status_mute.status_id"), status.ID). + Where("? = ?", bun.Ident("status_mute.account_id"), accountID) return s.conn.Exists(ctx, q) } @@ -400,9 +454,9 @@ func (s *statusDB) IsStatusMutedBy(ctx context.Context, status *gtsmodel.Status, func (s *statusDB) IsStatusBookmarkedBy(ctx context.Context, status *gtsmodel.Status, accountID string) (bool, db.Error) { q := s.conn. NewSelect(). - Model(>smodel.StatusBookmark{}). - Where("status_id = ?", status.ID). - Where("account_id = ?", accountID) + TableExpr("? AS ?", bun.Ident("status_bookmarks"), bun.Ident("status_bookmark")). + Where("? = ?", bun.Ident("status_bookmark.status_id"), status.ID). + Where("? = ?", bun.Ident("status_bookmark.account_id"), accountID) return s.conn.Exists(ctx, q) } @@ -410,8 +464,9 @@ func (s *statusDB) IsStatusBookmarkedBy(ctx context.Context, status *gtsmodel.St func (s *statusDB) GetStatusFaves(ctx context.Context, status *gtsmodel.Status) ([]*gtsmodel.StatusFave, db.Error) { faves := []*gtsmodel.StatusFave{} - q := s.newFaveQ(&faves). - Where("status_id = ?", status.ID) + q := s. + newFaveQ(&faves). + Where("? = ?", bun.Ident("status_fave.status_id"), status.ID) if err := q.Scan(ctx); err != nil { return nil, s.conn.ProcessError(err) @@ -422,8 +477,9 @@ func (s *statusDB) GetStatusFaves(ctx context.Context, status *gtsmodel.Status) func (s *statusDB) GetStatusReblogs(ctx context.Context, status *gtsmodel.Status) ([]*gtsmodel.Status, db.Error) { reblogs := []*gtsmodel.Status{} - q := s.newStatusQ(&reblogs). - Where("boost_of_id = ?", status.ID) + q := s. + newStatusQ(&reblogs). + Where("? = ?", bun.Ident("status.boost_of_id"), status.ID) if err := q.Scan(ctx); err != nil { return nil, s.conn.ProcessError(err) |