[MM-37202] Use native upsert query in StatusStore.SaveOrUpdate() (#18011)

Automatic Merge
Этот коммит содержится в:
Claudio Costa
2021-08-03 10:05:02 +02:00
коммит произвёл GitHub
родитель f2119d60fa
Коммит 404b7eeade

Просмотреть файл

@@ -6,7 +6,6 @@ package sqlstore
import ( import (
"database/sql" "database/sql"
"fmt" "fmt"
"strings"
"time" "time"
sq "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel"
@@ -39,18 +38,29 @@ func (s SqlStatusStore) createIndexesIfNotExists() {
s.CreateIndexIfNotExists("idx_status_status", "Status", "Status") s.CreateIndexIfNotExists("idx_status_status", "Status", "Status")
} }
func (s SqlStatusStore) SaveOrUpdate(status *model.Status) error { func (s SqlStatusStore) SaveOrUpdate(st *model.Status) error {
if err := s.GetReplica().SelectOne(&model.Status{}, "SELECT * FROM Status WHERE UserId = :UserId", map[string]interface{}{"UserId": status.UserId}); err == nil { query := s.getQueryBuilder().
if _, err := s.GetMaster().Update(status); err != nil { Insert("Status").
return errors.Wrap(err, "failed to update Status") Columns("UserId", "Status", "Manual", "LastActivityAt", "DNDEndTime", "PrevStatus").
} Values(st.UserId, st.Status, st.Manual, st.LastActivityAt, st.DNDEndTime, st.PrevStatus)
if s.DriverName() == model.DatabaseDriverMysql {
query = query.SuffixExpr(sq.Expr("ON DUPLICATE KEY UPDATE Status = ?, Manual = ?, LastActivityAt = ?, DNDEndTime = ?, PrevStatus = ?",
st.Status, st.Manual, st.LastActivityAt, st.DNDEndTime, st.PrevStatus))
} else { } else {
if err := s.GetMaster().Insert(status); err != nil { query = query.SuffixExpr(sq.Expr("ON CONFLICT (userid) DO UPDATE SET Status = ?, Manual = ?, LastActivityAt = ?, DNDEndTime = ?, PrevStatus = ?",
if !(strings.Contains(err.Error(), "for key 'PRIMARY'") && strings.Contains(err.Error(), "Duplicate entry")) { st.Status, st.Manual, st.LastActivityAt, st.DNDEndTime, st.PrevStatus))
return errors.Wrap(err, "failed in save Status")
}
}
} }
queryString, args, err := query.ToSql()
if err != nil {
return errors.Wrap(err, "status_tosql")
}
if _, err := s.GetMaster().Exec(queryString, args...); err != nil {
return errors.Wrap(err, "failed to upsert Status")
}
return nil return nil
} }