mirror of
https://github.com/grafana/grafana.git
synced 2025-02-16 02:23:31 -06:00
* Add features dependency to SQLBuilder * Add features dependency to AccessControlDashboardPermissionFilter * Add test for folder inheritance * Dashboard permissions: Return recursive query * Recursive query for inherited folders * Modify search builder * Adjust db.SQLBuilder * Pass flag to SQLbuilder if CTEs are supported * Add support for mysql < 8.0 * Add benchmarking for search with nested folders * Set features to AlertStore * Update pkg/infra/db/sqlbuilder.go Co-authored-by: Ieva <ieva.vasiljeva@grafana.com> * Set features to LibraryElementService * SQLBuilder tests with nested folder flag set * Apply suggestion from code review Co-authored-by: IevaVasiljeva <ieva.vasiljeva@grafana.com> Co-authored-by: Emil Tullstedt <emil.tullstedt@grafana.com>
89 lines
2.5 KiB
Go
89 lines
2.5 KiB
Go
package db
|
|
|
|
import (
|
|
"bytes"
|
|
|
|
ac "github.com/grafana/grafana/pkg/services/accesscontrol"
|
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
|
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
|
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
|
"github.com/grafana/grafana/pkg/services/sqlstore/permissions"
|
|
"github.com/grafana/grafana/pkg/services/user"
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
)
|
|
|
|
func NewSqlBuilder(cfg *setting.Cfg, features featuremgmt.FeatureToggles, dialect migrator.Dialect, recursiveQueriesAreSupported bool) SQLBuilder {
|
|
return SQLBuilder{cfg: cfg, features: features, dialect: dialect, recursiveQueriesAreSupported: recursiveQueriesAreSupported}
|
|
}
|
|
|
|
type SQLBuilder struct {
|
|
cfg *setting.Cfg
|
|
features featuremgmt.FeatureToggles
|
|
sql bytes.Buffer
|
|
params []interface{}
|
|
recQry string
|
|
recQryParams []interface{}
|
|
recursiveQueriesAreSupported bool
|
|
|
|
dialect migrator.Dialect
|
|
}
|
|
|
|
func (sb *SQLBuilder) Write(sql string, params ...interface{}) {
|
|
sb.sql.WriteString(sql)
|
|
|
|
if len(params) > 0 {
|
|
sb.params = append(sb.params, params...)
|
|
}
|
|
}
|
|
|
|
func (sb *SQLBuilder) GetSQLString() string {
|
|
if sb.recQry == "" {
|
|
return sb.sql.String()
|
|
}
|
|
|
|
var bf bytes.Buffer
|
|
bf.WriteString(sb.recQry)
|
|
bf.WriteString(sb.sql.String())
|
|
return bf.String()
|
|
}
|
|
|
|
func (sb *SQLBuilder) GetParams() []interface{} {
|
|
if len(sb.recQryParams) == 0 {
|
|
return sb.params
|
|
}
|
|
|
|
sb.params = append(sb.recQryParams, sb.params...)
|
|
return sb.params
|
|
}
|
|
|
|
func (sb *SQLBuilder) AddParams(params ...interface{}) {
|
|
sb.params = append(sb.params, params...)
|
|
}
|
|
|
|
func (sb *SQLBuilder) WriteDashboardPermissionFilter(user *user.SignedInUser, permission dashboards.PermissionType) {
|
|
var (
|
|
sql string
|
|
params []interface{}
|
|
recQry string
|
|
recQryParams []interface{}
|
|
)
|
|
if !ac.IsDisabled(sb.cfg) {
|
|
filterRBAC := permissions.NewAccessControlDashboardPermissionFilter(user, permission, "", sb.features, sb.recursiveQueriesAreSupported)
|
|
sql, params = filterRBAC.Where()
|
|
recQry, recQryParams = filterRBAC.With()
|
|
} else {
|
|
sql, params = permissions.DashboardPermissionFilter{
|
|
OrgRole: user.OrgRole,
|
|
Dialect: sb.dialect,
|
|
UserId: user.UserID,
|
|
OrgId: user.OrgID,
|
|
PermissionLevel: permission,
|
|
}.Where()
|
|
}
|
|
|
|
sb.sql.WriteString(" AND " + sql)
|
|
sb.params = append(sb.params, params...)
|
|
sb.recQry = recQry
|
|
sb.recQryParams = recQryParams
|
|
}
|