aboutsummaryrefslogtreecommitdiff
path: root/models/issue.go
diff options
context:
space:
mode:
authorstroucki <stroucki@andrew.cmu.edu>2016-12-21 04:11:07 -0500
committer无闻 <u@gogs.io>2016-12-21 04:11:07 -0500
commite9f6a4307372b8e82518b10c89a9a7d649153d73 (patch)
treeae297d7914a18fbd3b66eb3fa86a86061c0e21dd /models/issue.go
parent67380cf47b6dfd6ff9999acc73dd7da8f620948f (diff)
Fix database write context interleaving bug (#3822)
* UpdateIssueUsersByMentions was calling database write operations while 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 * issue: forgot debug statement
Diffstat (limited to 'models/issue.go')
-rw-r--r--models/issue.go14
1 files changed, 7 insertions, 7 deletions
diff --git a/models/issue.go b/models/issue.go
index 6dfb4717..e14b4462 100644
--- a/models/issue.go
+++ b/models/issue.go
@@ -1026,7 +1026,7 @@ func GetIssueUserPairsByMode(uid, rid int64, isClosed bool, page, filterMode int
// UpdateIssueMentions extracts mentioned people from content and
// 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 {
return nil
}
@@ -1036,7 +1036,7 @@ func UpdateIssueMentions(issueID int64, mentions []string) error {
}
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)
}
@@ -1060,7 +1060,7 @@ func UpdateIssueMentions(issueID int64, mentions []string) error {
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)
}
@@ -1293,22 +1293,22 @@ func UpdateIssueUserByRead(uid, issueID int64) error {
}
// 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 {
iu := &IssueUser{
UID: uid,
IssueID: issueID,
}
- has, err := x.Get(iu)
+ has, err := e.Get(iu)
if err != nil {
return err
}
iu.IsMentioned = true
if has {
- _, err = x.Id(iu.ID).AllCols().Update(iu)
+ _, err = e.Id(iu.ID).AllCols().Update(iu)
} else {
- _, err = x.Insert(iu)
+ _, err = e.Insert(iu)
}
if err != nil {
return err