This commit is contained in:
parent
09c4f13f2c
commit
2d962d18d2
16 changed files with 520 additions and 89 deletions
53
server/sqlstore/file.go
Normal file
53
server/sqlstore/file.go
Normal file
|
@ -0,0 +1,53 @@
|
|||
package sqlstore
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
sq "github.com/Masterminds/squirrel"
|
||||
|
||||
"github.com/mattermost/mattermost/server/public/model"
|
||||
)
|
||||
|
||||
const (
|
||||
fileInfoTable = "FileInfo"
|
||||
)
|
||||
|
||||
func (s *SQLStore) DetatchAttachmentFromChannel(fileID string) error {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
|
||||
defer cancel()
|
||||
|
||||
update := map[string]interface{}{
|
||||
"ChannelId": "",
|
||||
"PostId": "",
|
||||
"DeleteAt": model.GetMillis(),
|
||||
}
|
||||
|
||||
query := s.masterBuilder.
|
||||
Update(fileInfoTable).
|
||||
SetMap(update).
|
||||
Where(sq.Eq{"Id": fileID})
|
||||
|
||||
tx, err := s.master.Begin()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error starting transaction: %w", err)
|
||||
}
|
||||
|
||||
q, args, err := query.ToSql()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error creating query: %w", err)
|
||||
}
|
||||
|
||||
_, err = tx.ExecContext(ctx, q, args...)
|
||||
if err != nil {
|
||||
s.logger.Error("error detaching attachment from channel", "fileId", fileID, "err", err)
|
||||
return tx.Rollback()
|
||||
}
|
||||
|
||||
if err := tx.Commit(); err != nil {
|
||||
return fmt.Errorf("error committing transaction: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
51
server/sqlstore/post.go
Normal file
51
server/sqlstore/post.go
Normal file
|
@ -0,0 +1,51 @@
|
|||
package sqlstore
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
sq "github.com/Masterminds/squirrel"
|
||||
)
|
||||
|
||||
const (
|
||||
postsTable = "Posts"
|
||||
)
|
||||
|
||||
func (s *SQLStore) AttachFileIDsToPost(postID string, fileIDs []string) error {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
|
||||
defer cancel()
|
||||
|
||||
fileIDsJSON, err := json.Marshal(fileIDs)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error marshaling fileIds: %w", err)
|
||||
}
|
||||
|
||||
query := s.masterBuilder.
|
||||
Update(postsTable).
|
||||
Set("FileIds", fileIDsJSON).
|
||||
Where(sq.Eq{"Id": postID})
|
||||
|
||||
tx, err := s.master.Begin()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error starting transaction: %w", err)
|
||||
}
|
||||
|
||||
q, args, err := query.ToSql()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error creating query: %w", err)
|
||||
}
|
||||
|
||||
_, err = tx.ExecContext(ctx, q, args...)
|
||||
if err != nil {
|
||||
s.logger.Error("error attaching file to post", "postId", postID, "err", err)
|
||||
return tx.Rollback()
|
||||
}
|
||||
|
||||
if err := tx.Commit(); err != nil {
|
||||
return fmt.Errorf("error committing transaction: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
79
server/sqlstore/store.go
Normal file
79
server/sqlstore/store.go
Normal file
|
@ -0,0 +1,79 @@
|
|||
package sqlstore
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
|
||||
sq "github.com/Masterminds/squirrel"
|
||||
"github.com/jmoiron/sqlx"
|
||||
"github.com/mattermost/mattermost/server/public/model"
|
||||
)
|
||||
|
||||
type Source interface {
|
||||
GetMasterDB() (*sql.DB, error)
|
||||
GetReplicaDB() (*sql.DB, error)
|
||||
DriverName() string
|
||||
}
|
||||
|
||||
type Logger interface {
|
||||
Error(message string, keyValuePairs ...interface{})
|
||||
Warn(message string, keyValuePairs ...interface{})
|
||||
Info(message string, keyValuePairs ...interface{})
|
||||
Debug(message string, keyValuePairs ...interface{})
|
||||
}
|
||||
|
||||
type SQLStore struct {
|
||||
src Source
|
||||
master *sqlx.DB
|
||||
replica *sqlx.DB
|
||||
masterBuilder sq.StatementBuilderType
|
||||
replicaBuilder sq.StatementBuilderType
|
||||
logger Logger
|
||||
}
|
||||
|
||||
// New constructs a new instance of SQLStore.
|
||||
func New(src Source, logger Logger) (*SQLStore, error) {
|
||||
var master, replica *sqlx.DB
|
||||
|
||||
masterDB, err := src.GetMasterDB()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
master = sqlx.NewDb(masterDB, src.DriverName())
|
||||
|
||||
replicaDB, err := src.GetReplicaDB()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
replica = sqlx.NewDb(replicaDB, src.DriverName())
|
||||
|
||||
masterBuilder := sq.StatementBuilder.PlaceholderFormat(sq.Question)
|
||||
if src.DriverName() == model.DatabaseDriverPostgres {
|
||||
masterBuilder = masterBuilder.PlaceholderFormat(sq.Dollar)
|
||||
}
|
||||
|
||||
if src.DriverName() == model.DatabaseDriverMysql {
|
||||
master.MapperFunc(func(s string) string { return s })
|
||||
}
|
||||
|
||||
masterBuilder = masterBuilder.RunWith(master)
|
||||
|
||||
replicaBuilder := sq.StatementBuilder.PlaceholderFormat(sq.Question)
|
||||
if src.DriverName() == model.DatabaseDriverPostgres {
|
||||
replicaBuilder = replicaBuilder.PlaceholderFormat(sq.Dollar)
|
||||
}
|
||||
|
||||
if src.DriverName() == model.DatabaseDriverMysql {
|
||||
replica.MapperFunc(func(s string) string { return s })
|
||||
}
|
||||
|
||||
replicaBuilder = replicaBuilder.RunWith(replica)
|
||||
|
||||
return &SQLStore{
|
||||
src,
|
||||
master,
|
||||
replica,
|
||||
masterBuilder,
|
||||
replicaBuilder,
|
||||
logger,
|
||||
}, nil
|
||||
}
|
Reference in a new issue