MM-30300: Add coalesce to get null content as empty string on FileInfo store (#16216)
* MM-30300: Add coalesce to get null content as empty string on FileInfo store * Making explicit the fields get from the FileInfo table * Addressing PR review comments
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
d2ec53f1e9
Коммит
b08b51d52d
@@ -18,6 +18,7 @@ import (
|
|||||||
type SqlFileInfoStore struct {
|
type SqlFileInfoStore struct {
|
||||||
SqlStore
|
SqlStore
|
||||||
metrics einterfaces.MetricsInterface
|
metrics einterfaces.MetricsInterface
|
||||||
|
queryFields []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fs SqlFileInfoStore) ClearCaches() {
|
func (fs SqlFileInfoStore) ClearCaches() {
|
||||||
@@ -29,6 +30,27 @@ func newSqlFileInfoStore(sqlStore SqlStore, metrics einterfaces.MetricsInterface
|
|||||||
metrics: metrics,
|
metrics: metrics,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s.queryFields = []string{
|
||||||
|
"FileInfo.Id",
|
||||||
|
"FileInfo.CreatorId",
|
||||||
|
"FileInfo.PostId",
|
||||||
|
"FileInfo.CreateAt",
|
||||||
|
"FileInfo.UpdateAt",
|
||||||
|
"FileInfo.DeleteAt",
|
||||||
|
"FileInfo.Path",
|
||||||
|
"FileInfo.ThumbnailPath",
|
||||||
|
"FileInfo.PreviewPath",
|
||||||
|
"FileInfo.Name",
|
||||||
|
"FileInfo.Extension",
|
||||||
|
"FileInfo.Size",
|
||||||
|
"FileInfo.MimeType",
|
||||||
|
"FileInfo.Width",
|
||||||
|
"FileInfo.Height",
|
||||||
|
"FileInfo.HasPreviewImage",
|
||||||
|
"FileInfo.MiniPreview",
|
||||||
|
"Coalesce(FileInfo.Content, '') AS Content",
|
||||||
|
}
|
||||||
|
|
||||||
for _, db := range sqlStore.GetAllConns() {
|
for _, db := range sqlStore.GetAllConns() {
|
||||||
table := db.AddTableWithName(model.FileInfo{}, "FileInfo").SetKeys(false, "Id")
|
table := db.AddTableWithName(model.FileInfo{}, "FileInfo").SetKeys(false, "Id")
|
||||||
table.ColMap("Id").SetMaxSize(26)
|
table.ColMap("Id").SetMaxSize(26)
|
||||||
@@ -86,14 +108,18 @@ func (fs SqlFileInfoStore) Upsert(info *model.FileInfo) (*model.FileInfo, error)
|
|||||||
func (fs SqlFileInfoStore) Get(id string) (*model.FileInfo, error) {
|
func (fs SqlFileInfoStore) Get(id string) (*model.FileInfo, error) {
|
||||||
info := &model.FileInfo{}
|
info := &model.FileInfo{}
|
||||||
|
|
||||||
if err := fs.GetReplica().SelectOne(info,
|
query := fs.getQueryBuilder().
|
||||||
`SELECT
|
Select(fs.queryFields...).
|
||||||
*
|
From("FileInfo").
|
||||||
FROM
|
Where(sq.Eq{"Id": id}).
|
||||||
FileInfo
|
Where(sq.Eq{"DeleteAt": 0})
|
||||||
WHERE
|
|
||||||
Id = :Id
|
queryString, args, err := query.ToSql()
|
||||||
AND DeleteAt = 0`, map[string]interface{}{"Id": id}); err != nil {
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "file_info_tosql")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := fs.GetReplica().SelectOne(info, queryString, args...); err != nil {
|
||||||
if err == sql.ErrNoRows {
|
if err == sql.ErrNoRows {
|
||||||
return nil, store.NewErrNotFound("FileInfo", id)
|
return nil, store.NewErrNotFound("FileInfo", id)
|
||||||
}
|
}
|
||||||
@@ -117,7 +143,7 @@ func (fs SqlFileInfoStore) GetWithOptions(page, perPage int, opt *model.GetFileI
|
|||||||
}
|
}
|
||||||
|
|
||||||
query := fs.getQueryBuilder().
|
query := fs.getQueryBuilder().
|
||||||
Select("FileInfo.*").
|
Select(fs.queryFields...).
|
||||||
From("FileInfo")
|
From("FileInfo")
|
||||||
|
|
||||||
if len(opt.ChannelIds) > 0 {
|
if len(opt.ChannelIds) > 0 {
|
||||||
@@ -172,15 +198,19 @@ func (fs SqlFileInfoStore) GetWithOptions(page, perPage int, opt *model.GetFileI
|
|||||||
func (fs SqlFileInfoStore) GetByPath(path string) (*model.FileInfo, error) {
|
func (fs SqlFileInfoStore) GetByPath(path string) (*model.FileInfo, error) {
|
||||||
info := &model.FileInfo{}
|
info := &model.FileInfo{}
|
||||||
|
|
||||||
if err := fs.GetReplica().SelectOne(info,
|
query := fs.getQueryBuilder().
|
||||||
`SELECT
|
Select(fs.queryFields...).
|
||||||
*
|
From("FileInfo").
|
||||||
FROM
|
Where(sq.Eq{"Path": path}).
|
||||||
FileInfo
|
Where(sq.Eq{"DeleteAt": 0}).
|
||||||
WHERE
|
Limit(1)
|
||||||
Path = :Path
|
|
||||||
AND DeleteAt = 0
|
queryString, args, err := query.ToSql()
|
||||||
LIMIT 1`, map[string]interface{}{"Path": path}); err != nil {
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "file_info_tosql")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := fs.GetReplica().SelectOne(info, queryString, args...); err != nil {
|
||||||
if err == sql.ErrNoRows {
|
if err == sql.ErrNoRows {
|
||||||
return nil, store.NewErrNotFound("FileInfo", fmt.Sprintf("path=%s", path))
|
return nil, store.NewErrNotFound("FileInfo", fmt.Sprintf("path=%s", path))
|
||||||
}
|
}
|
||||||
@@ -203,7 +233,7 @@ func (fs SqlFileInfoStore) GetForPost(postId string, readFromMaster, includeDele
|
|||||||
}
|
}
|
||||||
|
|
||||||
query := fs.getQueryBuilder().
|
query := fs.getQueryBuilder().
|
||||||
Select("*").
|
Select(fs.queryFields...).
|
||||||
From("FileInfo").
|
From("FileInfo").
|
||||||
Where(sq.Eq{"PostId": postId}).
|
Where(sq.Eq{"PostId": postId}).
|
||||||
OrderBy("CreateAt")
|
OrderBy("CreateAt")
|
||||||
@@ -228,16 +258,19 @@ func (fs SqlFileInfoStore) GetForUser(userId string) ([]*model.FileInfo, error)
|
|||||||
|
|
||||||
dbmap := fs.GetReplica()
|
dbmap := fs.GetReplica()
|
||||||
|
|
||||||
if _, err := dbmap.Select(&infos,
|
query := fs.getQueryBuilder().
|
||||||
`SELECT
|
Select(fs.queryFields...).
|
||||||
*
|
From("FileInfo").
|
||||||
FROM
|
Where(sq.Eq{"CreatorId": userId}).
|
||||||
FileInfo
|
Where(sq.Eq{"DeleteAt": 0}).
|
||||||
WHERE
|
OrderBy("CreateAt")
|
||||||
CreatorId = :CreatorId
|
|
||||||
AND DeleteAt = 0
|
queryString, args, err := query.ToSql()
|
||||||
ORDER BY
|
if err != nil {
|
||||||
CreateAt`, map[string]interface{}{"CreatorId": userId}); err != nil {
|
return nil, errors.Wrap(err, "file_info_tosql")
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := dbmap.Select(&infos, queryString, args...); err != nil {
|
||||||
return nil, errors.Wrapf(err, "failed to find FileInfos with creatorId=%s", userId)
|
return nil, errors.Wrapf(err, "failed to find FileInfos with creatorId=%s", userId)
|
||||||
}
|
}
|
||||||
return infos, nil
|
return infos, nil
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user