ChannelStore: Use native upsert for Postgres (#17880)
Now that version 10 is minimum, we can start to use advanced postgres features. https://focalboard-community.octo.mattermost.com/workspace/zyoahc9uapdn3xdptac6jb69ic?id=285b80a3-257d-41f6-8cf4-ed80ca9d92e5&v=495cdb4d-c13a-4992-8eb9-80cfee2819a4&c=0445b560-91b9-469b-8f19-febf1881bcd6 ```release-note NONE ```
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
5b99df7bcd
Коммит
7653100835
@@ -485,11 +485,18 @@ func (s SqlChannelStore) upsertPublicChannelT(transaction *gorp.Transaction, cha
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vals := map[string]interface{}{
|
||||||
|
"Id": publicChannel.Id,
|
||||||
|
"DeleteAt": publicChannel.DeleteAt,
|
||||||
|
"TeamId": publicChannel.TeamId,
|
||||||
|
"DisplayName": publicChannel.DisplayName,
|
||||||
|
"Name": publicChannel.Name,
|
||||||
|
"Header": publicChannel.Header,
|
||||||
|
"Purpose": publicChannel.Purpose,
|
||||||
|
}
|
||||||
|
var err error
|
||||||
if s.DriverName() == model.DATABASE_DRIVER_MYSQL {
|
if s.DriverName() == model.DATABASE_DRIVER_MYSQL {
|
||||||
// Leverage native upsert for MySQL, since RowsAffected returns 0 if the row exists
|
_, err = transaction.Exec(`
|
||||||
// but no changes were made, breaking the update-then-insert paradigm below when
|
|
||||||
// the row already exists. (Postgres 9.4 doesn't support native upsert.)
|
|
||||||
if _, err := transaction.Exec(`
|
|
||||||
INSERT INTO
|
INSERT INTO
|
||||||
PublicChannels(Id, DeleteAt, TeamId, DisplayName, Name, Header, Purpose)
|
PublicChannels(Id, DeleteAt, TeamId, DisplayName, Name, Header, Purpose)
|
||||||
VALUES
|
VALUES
|
||||||
@@ -501,30 +508,25 @@ func (s SqlChannelStore) upsertPublicChannelT(transaction *gorp.Transaction, cha
|
|||||||
Name = :Name,
|
Name = :Name,
|
||||||
Header = :Header,
|
Header = :Header,
|
||||||
Purpose = :Purpose;
|
Purpose = :Purpose;
|
||||||
`, map[string]interface{}{
|
`, vals)
|
||||||
"Id": publicChannel.Id,
|
|
||||||
"DeleteAt": publicChannel.DeleteAt,
|
|
||||||
"TeamId": publicChannel.TeamId,
|
|
||||||
"DisplayName": publicChannel.DisplayName,
|
|
||||||
"Name": publicChannel.Name,
|
|
||||||
"Header": publicChannel.Header,
|
|
||||||
"Purpose": publicChannel.Purpose,
|
|
||||||
}); err != nil {
|
|
||||||
return errors.Wrap(err, "failed to insert public channel")
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
count, err := transaction.Update(publicChannel)
|
_, err = transaction.Exec(`
|
||||||
|
INSERT INTO
|
||||||
|
PublicChannels(Id, DeleteAt, TeamId, DisplayName, Name, Header, Purpose)
|
||||||
|
VALUES
|
||||||
|
(:Id, :DeleteAt, :TeamId, :DisplayName, :Name, :Header, :Purpose)
|
||||||
|
ON CONFLICT (id) DO UPDATE
|
||||||
|
SET DeleteAt = :DeleteAt,
|
||||||
|
TeamId = :TeamId,
|
||||||
|
DisplayName = :DisplayName,
|
||||||
|
Name = :Name,
|
||||||
|
Header = :Header,
|
||||||
|
Purpose = :Purpose;
|
||||||
|
`, vals)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to update public channel")
|
|
||||||
}
|
|
||||||
if count > 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := transaction.Insert(publicChannel); err != nil {
|
|
||||||
return errors.Wrap(err, "failed to insert public channel")
|
return errors.Wrap(err, "failed to insert public channel")
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user