avoid SELECT * in channel_store_categories.go (#31245)

This commit is contained in:
Jesse Hallam 2025-05-30 16:14:17 -03:00 committed by GitHub
parent 2cf345dd5c
commit 86a2368fe0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -16,12 +16,6 @@ import (
"github.com/mattermost/mattermost/server/v8/channels/store" "github.com/mattermost/mattermost/server/v8/channels/store"
) )
// dbSelecter is an interface used to enable some internal store methods
// using both transaction and normal queries.
type dbSelecter interface {
Select(i any, query string, args ...any) error
}
func (s SqlChannelStore) CreateInitialSidebarCategories(c request.CTX, userId string, opts *store.SidebarCategorySearchOpts) (_ *model.OrderedSidebarCategories, err error) { func (s SqlChannelStore) CreateInitialSidebarCategories(c request.CTX, userId string, opts *store.SidebarCategorySearchOpts) (_ *model.OrderedSidebarCategories, err error) {
transaction, err := s.GetMaster().Beginx() transaction, err := s.GetMaster().Beginx()
if err != nil { if err != nil {
@ -420,7 +414,7 @@ func (s SqlChannelStore) CreateSidebarCategory(userId, teamId string, newCategor
return result, nil return result, nil
} }
func (s SqlChannelStore) completePopulatingCategoryChannelsT(db dbSelecter, category *model.SidebarCategoryWithChannels) (*model.SidebarCategoryWithChannels, error) { func (s SqlChannelStore) completePopulatingCategoryChannelsT(db sqlxExecutor, category *model.SidebarCategoryWithChannels) (*model.SidebarCategoryWithChannels, error) {
if category.Type == model.SidebarCategoryCustom || category.Type == model.SidebarCategoryFavorites { if category.Type == model.SidebarCategoryCustom || category.Type == model.SidebarCategoryFavorites {
return category, nil return category, nil
} }
@ -501,7 +495,7 @@ func (s SqlChannelStore) GetSidebarCategory(categoryId string) (*model.SidebarCa
return s.getSidebarCategoryT(s.GetReplica(), categoryId) return s.getSidebarCategoryT(s.GetReplica(), categoryId)
} }
func (s SqlChannelStore) getSidebarCategoryT(db dbSelecter, categoryId string) (*model.SidebarCategoryWithChannels, error) { func (s SqlChannelStore) getSidebarCategoryT(db sqlxExecutor, categoryId string) (*model.SidebarCategoryWithChannels, error) {
query := s.sidebarCategorySelectQuery. query := s.sidebarCategorySelectQuery.
Columns("SidebarChannels.ChannelId"). Columns("SidebarChannels.ChannelId").
LeftJoin("SidebarChannels ON SidebarChannels.CategoryId=SidebarCategories.Id"). LeftJoin("SidebarChannels ON SidebarChannels.CategoryId=SidebarCategories.Id").
@ -534,7 +528,7 @@ func (s SqlChannelStore) getSidebarCategoryT(db dbSelecter, categoryId string) (
return s.completePopulatingCategoryChannelsT(db, result) return s.completePopulatingCategoryChannelsT(db, result)
} }
func (s SqlChannelStore) getSidebarCategoriesT(db dbSelecter, userId string, opts *store.SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, error) { func (s SqlChannelStore) getSidebarCategoriesT(db sqlxExecutor, userId string, opts *store.SidebarCategorySearchOpts) (*model.OrderedSidebarCategories, error) {
oc := model.OrderedSidebarCategories{ oc := model.OrderedSidebarCategories{
Categories: make(model.SidebarCategoriesWithChannels, 0), Categories: make(model.SidebarCategoriesWithChannels, 0),
Order: make([]string, 0), Order: make([]string, 0),
@ -620,23 +614,19 @@ func (s SqlChannelStore) GetSidebarCategoryOrder(userId, teamId string) ([]strin
return s.getSidebarCategoryOrderT(s.GetReplica(), userId, teamId) return s.getSidebarCategoryOrderT(s.GetReplica(), userId, teamId)
} }
func (s SqlChannelStore) getSidebarCategoryOrderT(db dbSelecter, userId, teamId string) ([]string, error) { func (s SqlChannelStore) getSidebarCategoryOrderT(db sqlxExecutor, userId, teamId string) ([]string, error) {
ids := []string{} ids := []string{}
sql, args, err := s.getQueryBuilder(). query := s.getQueryBuilder().
Select("Id"). Select("Id").
From("SidebarCategories"). From("SidebarCategories").
Where(sq.And{ Where(sq.And{
sq.Eq{"UserId": userId}, sq.Eq{"UserId": userId},
sq.Eq{"TeamId": teamId}, sq.Eq{"TeamId": teamId},
}). }).
OrderBy("SidebarCategories.SortOrder ASC").ToSql() OrderBy("SidebarCategories.SortOrder ASC")
if err != nil { if err := db.SelectBuilder(&ids, query); err != nil {
return nil, errors.Wrap(err, "sidebar_category_tosql")
}
if err := db.Select(&ids, sql, args...); err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("failed to get category order for userId=%s, teamId=%s", userId, teamId)) return nil, errors.Wrap(err, fmt.Sprintf("failed to get category order for userId=%s, teamId=%s", userId, teamId))
} }
@ -1129,7 +1119,8 @@ func (s SqlChannelStore) DeleteSidebarCategory(categoryId string) (err error) {
// Ensure that we're deleting a custom category // Ensure that we're deleting a custom category
var category model.SidebarCategory var category model.SidebarCategory
if err = transaction.Get(&category, "SELECT * FROM SidebarCategories WHERE Id = ?", categoryId); err != nil { query := s.sidebarCategorySelectQuery.Where(sq.Eq{"Id": categoryId})
if err = transaction.GetBuilder(&category, query); err != nil {
return errors.Wrapf(err, "failed to find SidebarCategories with id=%s", categoryId) return errors.Wrapf(err, "failed to find SidebarCategories with id=%s", categoryId)
} }
@ -1143,24 +1134,18 @@ func (s SqlChannelStore) DeleteSidebarCategory(categoryId string) (err error) {
// operating on the tables in reverse order. // operating on the tables in reverse order.
// Delete the category itself // Delete the category itself
query, args, err := s.getQueryBuilder(). deleteCategoryQuery := s.getQueryBuilder().
Delete("SidebarCategories"). Delete("SidebarCategories").
Where(sq.Eq{"Id": categoryId}).ToSql() Where(sq.Eq{"Id": categoryId})
if err != nil { if _, err = transaction.ExecBuilder(deleteCategoryQuery); err != nil {
return errors.Wrap(err, "delete_sidebar_category_tosql")
}
if _, err = transaction.Exec(query, args...); err != nil {
return errors.Wrap(err, "failed to delete SidebarCategory") return errors.Wrap(err, "failed to delete SidebarCategory")
} }
// Delete the channels in the category // Delete the channels in the category
query, args, err = s.getQueryBuilder(). deleteCategoryChannelsQuery := s.getQueryBuilder().
Delete("SidebarChannels"). Delete("SidebarChannels").
Where(sq.Eq{"CategoryId": categoryId}).ToSql() Where(sq.Eq{"CategoryId": categoryId})
if err != nil { if _, err = transaction.ExecBuilder(deleteCategoryChannelsQuery); err != nil {
return errors.Wrap(err, "delete_sidebar_category_tosql")
}
if _, err = transaction.Exec(query, args...); err != nil {
return errors.Wrap(err, "failed to delete SidebarChannel") return errors.Wrap(err, "failed to delete SidebarChannel")
} }
@ -1177,7 +1162,6 @@ func (s SqlChannelStore) DeleteAllSidebarChannelForChannel(channelID string) err
Where(sq.Eq{ Where(sq.Eq{
"ChannelId": channelID, "ChannelId": channelID,
}).ToSql() }).ToSql()
if err != nil { if err != nil {
return errors.Wrap(err, "delete_all_sidebar_channel_for_channel_to_sql") return errors.Wrap(err, "delete_all_sidebar_channel_for_channel_to_sql")
} }