Parcourir la source

UpdateIssueUsersByMentions was calling database write operations while (#443)

a transaction session was in progress. MailParticipants was failing
silently because of the SQLITE_LOCKED error. Make sure failures in
MailParticipants enter the log, and pass on the transaction context.

issue: let caller pass in database context, and use it
issue_comment: obtain database context to pass to UpdateIssueMentions
issue_comment: log any error from call to MailParticipants
issue_mail: pass on database context to UpdateIssueMentions
tags/v1.0.0
Lunny Xiao il y a 7 ans
Parent
révision
0c5c34d7dd
3 fichiers modifiés avec 13 ajouts et 11 suppressions
  1. 7
    7
      models/issue.go
  2. 5
    3
      models/issue_comment.go
  3. 1
    1
      models/issue_mail.go

+ 7
- 7
models/issue.go Voir le fichier



// UpdateIssueMentions extracts mentioned people from content and // UpdateIssueMentions extracts mentioned people from content and
// updates issue-user relations for them. // updates issue-user relations for them.
func UpdateIssueMentions(issueID int64, mentions []string) error {
func UpdateIssueMentions(e Engine, issueID int64, mentions []string) error {
if len(mentions) == 0 { if len(mentions) == 0 {
return nil return nil
} }
} }
users := make([]*User, 0, len(mentions)) users := make([]*User, 0, len(mentions))


if err := x.In("lower_name", mentions).Asc("lower_name").Find(&users); err != nil {
if err := e.In("lower_name", mentions).Asc("lower_name").Find(&users); err != nil {
return fmt.Errorf("find mentioned users: %v", err) return fmt.Errorf("find mentioned users: %v", err)
} }


ids = append(ids, memberIDs...) ids = append(ids, memberIDs...)
} }


if err := UpdateIssueUsersByMentions(issueID, ids); err != nil {
if err := UpdateIssueUsersByMentions(e, issueID, ids); err != nil {
return fmt.Errorf("UpdateIssueUsersByMentions: %v", err) return fmt.Errorf("UpdateIssueUsersByMentions: %v", err)
} }


} }


// UpdateIssueUsersByMentions updates issue-user pairs by mentioning. // UpdateIssueUsersByMentions updates issue-user pairs by mentioning.
func UpdateIssueUsersByMentions(issueID int64, uids []int64) error {
func UpdateIssueUsersByMentions(e Engine, issueID int64, uids []int64) error {
for _, uid := range uids { for _, uid := range uids {
iu := &IssueUser{ iu := &IssueUser{
UID: uid, UID: uid,
IssueID: issueID, IssueID: issueID,
} }
has, err := x.Get(iu)
has, err := e.Get(iu)
if err != nil { if err != nil {
return err return err
} }


iu.IsMentioned = true iu.IsMentioned = true
if has { if has {
_, err = x.Id(iu.ID).AllCols().Update(iu)
_, err = e.Id(iu.ID).AllCols().Update(iu)
} else { } else {
_, err = x.Insert(iu)
_, err = e.Insert(iu)
} }
if err != nil { if err != nil {
return err return err

+ 5
- 3
models/issue_comment.go Voir le fichier



// MailParticipants sends new comment emails to repository watchers // MailParticipants sends new comment emails to repository watchers
// and mentioned people. // and mentioned people.
func (c *Comment) MailParticipants(opType ActionType, issue *Issue) (err error) {
func (c *Comment) MailParticipants(e Engine, opType ActionType, issue *Issue) (err error) {
mentions := markdown.FindAllMentions(c.Content) mentions := markdown.FindAllMentions(c.Content)
if err = UpdateIssueMentions(c.IssueID, mentions); err != nil {
if err = UpdateIssueMentions(e, c.IssueID, mentions); err != nil {
return fmt.Errorf("UpdateIssueMentions [%d]: %v", c.IssueID, err) return fmt.Errorf("UpdateIssueMentions [%d]: %v", c.IssueID, err)
} }


if err = notifyWatchers(e, act); err != nil { if err = notifyWatchers(e, act); err != nil {
log.Error(4, "notifyWatchers: %v", err) log.Error(4, "notifyWatchers: %v", err)
} }
comment.MailParticipants(act.OpType, opts.Issue)
if err = comment.MailParticipants(e, act.OpType, opts.Issue); err != nil {
log.Error(4, "MailParticipants: %v", err)
}
} }


return comment, nil return comment, nil

+ 1
- 1
models/issue_mail.go Voir le fichier

// and mentioned people. // and mentioned people.
func (issue *Issue) MailParticipants() (err error) { func (issue *Issue) MailParticipants() (err error) {
mentions := markdown.FindAllMentions(issue.Content) mentions := markdown.FindAllMentions(issue.Content)
if err = UpdateIssueMentions(issue.ID, mentions); err != nil {
if err = UpdateIssueMentions(x, issue.ID, mentions); err != nil {
return fmt.Errorf("UpdateIssueMentions [%d]: %v", issue.ID, err) return fmt.Errorf("UpdateIssueMentions [%d]: %v", issue.ID, err)
} }



Chargement…
Annuler
Enregistrer