mirror of
https://github.com/mattermost/mattermost.git
synced 2025-02-25 18:55:24 -06:00
[MM-60989] Add SelectBuilderCtx to simplify db code (#29988)
* add SelectBuilderCtx; change the few calls where it's appropriate to use * tests (wip) * tests improved * use SelectCtx's own WithTimeout * improve tests based on PR feedback --------- Co-authored-by: Mattermost Build <build@mattermost.com>
This commit is contained in:
parent
97e2a4382b
commit
1ce29f8466
@ -330,13 +330,8 @@ func (s SqlComplianceStore) MessageExport(c request.CTX, cursor model.MessageExp
|
|||||||
builder = builder.Where(sq.LtOrEq{"Posts.UpdateAt": cursor.UntilUpdateAt})
|
builder = builder.Where(sq.LtOrEq{"Posts.UpdateAt": cursor.UntilUpdateAt})
|
||||||
}
|
}
|
||||||
|
|
||||||
query, args, err := builder.ToSql()
|
|
||||||
if err != nil {
|
|
||||||
return nil, cursor, errors.Wrap(err, "unable to construct query to export messages")
|
|
||||||
}
|
|
||||||
|
|
||||||
cposts := []*model.MessageExport{}
|
cposts := []*model.MessageExport{}
|
||||||
if err := s.GetReplica().SelectCtx(c.Context(), &cposts, query, args...); err != nil {
|
if err := s.GetReplica().SelectBuilderCtx(c.Context(), &cposts, builder); err != nil {
|
||||||
return nil, cursor, errors.Wrap(err, "unable to export messages")
|
return nil, cursor, errors.Wrap(err, "unable to export messages")
|
||||||
}
|
}
|
||||||
if len(cposts) > 0 {
|
if len(cposts) > 0 {
|
||||||
|
@ -121,7 +121,7 @@ func (s *SqlOutgoingOAuthConnectionStore) GetConnections(c request.CTX, filters
|
|||||||
query = query.Where(sq.Like{"Audiences": fmt.Sprint("%", filters.Audience, "%")})
|
query = query.Where(sq.Like{"Audiences": fmt.Sprint("%", filters.Audience, "%")})
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := s.GetReplica().SelectBuilder(&conns, query); err != nil {
|
if err := s.GetReplica().SelectBuilderCtx(c.Context(), &conns, query); err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to get OutgoingOAuthConnections")
|
return nil, errors.Wrap(err, "failed to get OutgoingOAuthConnections")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -249,12 +249,16 @@ func (w *sqlxDBWrapper) SelectCtx(ctx context.Context, dest any, query string, a
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (w *sqlxDBWrapper) SelectBuilder(dest any, builder Builder) error {
|
func (w *sqlxDBWrapper) SelectBuilder(dest any, builder Builder) error {
|
||||||
|
return w.SelectBuilderCtx(context.Background(), dest, builder)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *sqlxDBWrapper) SelectBuilderCtx(ctx context.Context, dest any, builder Builder) error {
|
||||||
query, args, err := builder.ToSql()
|
query, args, err := builder.ToSql()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return w.Select(dest, query, args...)
|
return w.SelectCtx(ctx, dest, query, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
type sqlxTxWrapper struct {
|
type sqlxTxWrapper struct {
|
||||||
|
@ -90,3 +90,73 @@ func TestSqlX(t *testing.T) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSqlxSelect(t *testing.T) {
|
||||||
|
testDrivers := []string{
|
||||||
|
model.DatabaseDriverPostgres,
|
||||||
|
model.DatabaseDriverMysql,
|
||||||
|
}
|
||||||
|
for _, driver := range testDrivers {
|
||||||
|
t.Run(driver, func(t *testing.T) {
|
||||||
|
settings, err := makeSqlSettings(driver)
|
||||||
|
if err != nil {
|
||||||
|
t.Skip(err)
|
||||||
|
}
|
||||||
|
*settings.QueryTimeout = 1
|
||||||
|
store := &SqlStore{
|
||||||
|
rrCounter: 0,
|
||||||
|
srCounter: 0,
|
||||||
|
settings: settings,
|
||||||
|
logger: mlog.CreateConsoleTestLogger(t),
|
||||||
|
quitMonitor: make(chan struct{}),
|
||||||
|
wgMonitor: &sync.WaitGroup{},
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NoError(t, store.initConnection())
|
||||||
|
defer store.Close()
|
||||||
|
|
||||||
|
t.Run("SelectCtx", func(t *testing.T) {
|
||||||
|
var result []string
|
||||||
|
err := store.GetMaster().SelectCtx(context.Background(), &result, "SELECT 'test' AS col")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, []string{"test"}, result)
|
||||||
|
|
||||||
|
// Test timeout
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), 1)
|
||||||
|
defer cancel()
|
||||||
|
var query string
|
||||||
|
if driver == model.DatabaseDriverMysql {
|
||||||
|
query = "SELECT SLEEP(2)"
|
||||||
|
} else {
|
||||||
|
query = "SELECT pg_sleep(2)"
|
||||||
|
}
|
||||||
|
err = store.GetMaster().SelectCtx(ctx, &result, query)
|
||||||
|
require.Error(t, err)
|
||||||
|
require.Equal(t, context.DeadlineExceeded, err)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("SelectBuilderCtx", func(t *testing.T) {
|
||||||
|
var result []string
|
||||||
|
builder := store.getQueryBuilder().
|
||||||
|
Select("'test' AS col")
|
||||||
|
err := store.GetMaster().SelectBuilderCtx(context.Background(), &result, builder)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, []string{"test"}, result)
|
||||||
|
|
||||||
|
// Test timeout
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), 1)
|
||||||
|
defer cancel()
|
||||||
|
if driver == model.DatabaseDriverMysql {
|
||||||
|
builder = store.getQueryBuilder().
|
||||||
|
Select("SLEEP(2)")
|
||||||
|
} else {
|
||||||
|
builder = store.getQueryBuilder().
|
||||||
|
Select("pg_sleep(2)")
|
||||||
|
}
|
||||||
|
err = store.GetMaster().SelectBuilderCtx(ctx, &result, builder)
|
||||||
|
require.Error(t, err)
|
||||||
|
require.Equal(t, context.DeadlineExceeded, err)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -501,7 +501,7 @@ func (us SqlUserStore) GetMfaUsedTimestamps(userId string) ([]int, error) {
|
|||||||
func (us SqlUserStore) GetMany(ctx context.Context, ids []string) ([]*model.User, error) {
|
func (us SqlUserStore) GetMany(ctx context.Context, ids []string) ([]*model.User, error) {
|
||||||
query := us.usersQuery.Where(sq.Eq{"Id": ids})
|
query := us.usersQuery.Where(sq.Eq{"Id": ids})
|
||||||
users := []*model.User{}
|
users := []*model.User{}
|
||||||
if err := us.SqlStore.DBXFromContext(ctx).SelectBuilder(&users, query); err != nil {
|
if err := us.SqlStore.DBXFromContext(ctx).SelectBuilderCtx(ctx, &users, query); err != nil {
|
||||||
return nil, errors.Wrap(err, "users_get_many_select")
|
return nil, errors.Wrap(err, "users_get_many_select")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user