mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
SQL: Add more legacy helpers (#92006)
This commit is contained in:
parent
87c4f2448c
commit
9567275365
@ -5,6 +5,7 @@ import (
|
||||
"fmt"
|
||||
"text/template"
|
||||
|
||||
"github.com/grafana/grafana/pkg/storage/legacysql"
|
||||
"github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate"
|
||||
)
|
||||
|
||||
@ -31,8 +32,25 @@ var (
|
||||
type sqlQuery struct {
|
||||
sqltemplate.SQLTemplate
|
||||
Query *DashboardQuery
|
||||
|
||||
DashboardTable string
|
||||
VersionTable string
|
||||
ProvisioningTable string
|
||||
UserTable string
|
||||
}
|
||||
|
||||
func (r sqlQuery) Validate() error {
|
||||
return nil // TODO
|
||||
}
|
||||
|
||||
func newQueryReq(sql *legacysql.LegacyDatabaseHelper, query *DashboardQuery) sqlQuery {
|
||||
return sqlQuery{
|
||||
SQLTemplate: sqltemplate.New(sql.DialectForDriver()),
|
||||
Query: query,
|
||||
|
||||
DashboardTable: sql.Table("dashboard"),
|
||||
VersionTable: sql.Table("dashboard_version"),
|
||||
ProvisioningTable: sql.Table("dashboard_provisioning"),
|
||||
UserTable: sql.Table("user"),
|
||||
}
|
||||
}
|
||||
|
@ -4,64 +4,64 @@ import (
|
||||
"testing"
|
||||
"text/template"
|
||||
|
||||
"github.com/grafana/grafana/pkg/storage/legacysql"
|
||||
"github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate"
|
||||
"github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate/mocks"
|
||||
)
|
||||
|
||||
func TestQueries(t *testing.T) {
|
||||
// prefix tables with grafana
|
||||
nodb := &legacysql.LegacyDatabaseHelper{
|
||||
Table: func(n string) string {
|
||||
return "grafana." + n
|
||||
},
|
||||
}
|
||||
|
||||
getQuery := func(q *DashboardQuery) sqltemplate.SQLTemplate {
|
||||
v := newQueryReq(nodb, q)
|
||||
v.SQLTemplate = mocks.NewTestingSQLTemplate()
|
||||
return &v
|
||||
}
|
||||
|
||||
mocks.CheckQuerySnapshots(t, mocks.TemplateTestSetup{
|
||||
RootDir: "testdata",
|
||||
Templates: map[*template.Template][]mocks.TemplateTestCase{
|
||||
sqlQueryDashboards: {
|
||||
{
|
||||
Name: "history_uid",
|
||||
Data: &sqlQuery{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Query: &DashboardQuery{
|
||||
OrgID: 2,
|
||||
UID: "UUU",
|
||||
},
|
||||
},
|
||||
Data: getQuery(&DashboardQuery{
|
||||
OrgID: 2,
|
||||
UID: "UUU",
|
||||
}),
|
||||
},
|
||||
{
|
||||
Name: "history_uid_at_version",
|
||||
Data: &sqlQuery{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Query: &DashboardQuery{
|
||||
OrgID: 2,
|
||||
UID: "UUU",
|
||||
Version: 3,
|
||||
},
|
||||
},
|
||||
Data: getQuery(&DashboardQuery{
|
||||
OrgID: 2,
|
||||
UID: "UUU",
|
||||
Version: 3,
|
||||
}),
|
||||
},
|
||||
{
|
||||
Name: "history_uid_second_page",
|
||||
Data: &sqlQuery{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Query: &DashboardQuery{
|
||||
OrgID: 2,
|
||||
UID: "UUU",
|
||||
LastID: 7,
|
||||
},
|
||||
},
|
||||
Data: getQuery(&DashboardQuery{
|
||||
OrgID: 2,
|
||||
UID: "UUU",
|
||||
LastID: 7,
|
||||
}),
|
||||
},
|
||||
{
|
||||
Name: "dashboard",
|
||||
Data: &sqlQuery{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Query: &DashboardQuery{
|
||||
OrgID: 2,
|
||||
},
|
||||
},
|
||||
Data: getQuery(&DashboardQuery{
|
||||
OrgID: 2,
|
||||
}),
|
||||
},
|
||||
{
|
||||
Name: "dashboard_next_page",
|
||||
Data: &sqlQuery{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Query: &DashboardQuery{
|
||||
OrgID: 2,
|
||||
LastID: 22,
|
||||
},
|
||||
},
|
||||
Data: getQuery(&DashboardQuery{
|
||||
OrgID: 2,
|
||||
LastID: 22,
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -2,10 +2,10 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
{{ if .Query.UseHistoryTable }}
|
||||
dashboard_version.created, updated_user.uid as updated_by,updated_user.id as created_by_id,
|
||||
@ -14,13 +14,13 @@ SELECT
|
||||
dashboard.updated, updated_user.uid as updated_by, dashboard.updated_by as updated_by_id,
|
||||
dashboard.version, '' as message, dashboard.data
|
||||
{{ end }}
|
||||
FROM dashboard
|
||||
FROM {{ .Ident .DashboardTable }} as dashboard
|
||||
{{ if .Query.UseHistoryTable }}
|
||||
LEFT OUTER JOIN dashboard_version ON dashboard.id = dashboard_version.dashboard_id
|
||||
LEFT OUTER JOIN {{ .Ident .VersionTable }} as dashboard_version ON dashboard.id = dashboard_version.dashboard_id
|
||||
{{ end }}
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN {{ .Ident "user" }} AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN {{ .Ident "user" }} AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
LEFT OUTER JOIN {{ .Ident .ProvisioningTable }} as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN {{ .Ident .UserTable }} as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN {{ .Ident .UserTable }} as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = {{ .Arg .Query.OrgID }}
|
||||
{{ if .Query.UseHistoryTable }}
|
||||
|
@ -14,7 +14,6 @@ import (
|
||||
"github.com/grafana/grafana/pkg/apimachinery/utils"
|
||||
dashboardsV0 "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1"
|
||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||
"github.com/grafana/grafana/pkg/infra/db"
|
||||
"github.com/grafana/grafana/pkg/services/apiserver/endpoints/request"
|
||||
gapiutil "github.com/grafana/grafana/pkg/services/apiserver/utils"
|
||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||
@ -46,43 +45,32 @@ type dashboardRow struct {
|
||||
}
|
||||
|
||||
type dashboardSqlAccess struct {
|
||||
sql legacysql.NamespacedDBProvider
|
||||
dialect sqltemplate.Dialect
|
||||
sql legacysql.LegacyDatabaseProvider
|
||||
namespacer request.NamespaceMapper
|
||||
dashStore dashboards.Store
|
||||
provisioning provisioning.ProvisioningService
|
||||
currentRV legacysql.ResourceVersionLookup
|
||||
|
||||
// Use for writing (not reading)
|
||||
dashStore dashboards.Store
|
||||
|
||||
// Typically one... the server wrapper
|
||||
subscribers []chan *resource.WrittenEvent
|
||||
mutex sync.Mutex
|
||||
}
|
||||
|
||||
func NewDashboardAccess(sql db.DB,
|
||||
func NewDashboardAccess(sql legacysql.LegacyDatabaseProvider,
|
||||
namespacer request.NamespaceMapper,
|
||||
dashStore dashboards.Store,
|
||||
provisioning provisioning.ProvisioningService,
|
||||
) DashboardAccess {
|
||||
dialect := sqltemplate.DialectForDriver(string(sql.GetDBType()))
|
||||
if dialect == nil {
|
||||
// panic?
|
||||
// fmt.Errorf("no dialect for driver %q", driverName)
|
||||
fmt.Printf("ERROR: NO DIALECT")
|
||||
}
|
||||
|
||||
nssql := func(ctx context.Context) (db.DB, error) { return sql, nil }
|
||||
|
||||
return &dashboardSqlAccess{
|
||||
sql: nssql,
|
||||
dialect: dialect,
|
||||
sql: sql,
|
||||
namespacer: namespacer,
|
||||
dashStore: dashStore,
|
||||
provisioning: provisioning,
|
||||
currentRV: legacysql.GetResourceVersionLookup(nssql, "dashboard", "updated"),
|
||||
}
|
||||
}
|
||||
|
||||
func (a *dashboardSqlAccess) getRows(ctx context.Context, query *DashboardQuery) (*rowsWrapper, error) {
|
||||
func (a *dashboardSqlAccess) getRows(ctx context.Context, sql *legacysql.LegacyDatabaseHelper, query *DashboardQuery) (*rowsWrapper, error) {
|
||||
if len(query.Labels) > 0 {
|
||||
return nil, fmt.Errorf("labels not yet supported")
|
||||
// if query.Requirements.Folder != nil {
|
||||
@ -91,10 +79,7 @@ func (a *dashboardSqlAccess) getRows(ctx context.Context, query *DashboardQuery)
|
||||
// }
|
||||
}
|
||||
|
||||
req := sqlQuery{
|
||||
SQLTemplate: sqltemplate.New(a.dialect),
|
||||
Query: query,
|
||||
}
|
||||
req := newQueryReq(sql, query)
|
||||
|
||||
tmpl := sqlQueryDashboards
|
||||
if query.UseHistoryTable() && query.GetTrash {
|
||||
@ -109,11 +94,7 @@ func (a *dashboardSqlAccess) getRows(ctx context.Context, query *DashboardQuery)
|
||||
// q = sqltemplate.RemoveEmptyLines(rawQuery)
|
||||
// fmt.Printf(">>%s [%+v]", q, req.GetArgs())
|
||||
|
||||
db, err := a.sql(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
rows, err := db.GetSqlxSession().Query(ctx, q, req.GetArgs()...)
|
||||
rows, err := sql.DB.GetSqlxSession().Query(ctx, q, req.GetArgs()...)
|
||||
if err != nil {
|
||||
if rows != nil {
|
||||
_ = rows.Close()
|
||||
|
@ -102,7 +102,12 @@ func (a *dashboardSqlAccess) WriteEvent(ctx context.Context, event resource.Writ
|
||||
}
|
||||
|
||||
func (a *dashboardSqlAccess) GetDashboard(ctx context.Context, orgId int64, uid string, v int64) (*dashboard.Dashboard, int64, error) {
|
||||
rows, err := a.getRows(ctx, &DashboardQuery{
|
||||
sql, err := a.sql(ctx)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
rows, err := a.getRows(ctx, sql, &DashboardQuery{
|
||||
OrgID: orgId,
|
||||
UID: uid,
|
||||
Limit: 2, // will only be one!
|
||||
@ -183,11 +188,16 @@ func (a *dashboardSqlAccess) ListIterator(ctx context.Context, req *resource.Lis
|
||||
Labels: req.Options.Labels,
|
||||
}
|
||||
|
||||
listRV, err := a.currentRV(ctx)
|
||||
sql, err := a.sql(ctx)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
rows, err := a.getRows(ctx, query)
|
||||
|
||||
listRV, err := sql.GetResourceVersion(ctx, "dashboard", "updated")
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
rows, err := a.getRows(ctx, sql, query)
|
||||
if rows != nil {
|
||||
defer func() {
|
||||
_ = rows.Close()
|
||||
@ -268,7 +278,12 @@ func (a *dashboardSqlAccess) History(ctx context.Context, req *resource.HistoryR
|
||||
query.GetHistory = true
|
||||
}
|
||||
|
||||
rows, err := a.getRows(ctx, query)
|
||||
sql, err := a.sql(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
rows, err := a.getRows(ctx, sql, query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -2,17 +2,17 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard.updated, updated_user.uid as updated_by, dashboard.updated_by as updated_by_id,
|
||||
dashboard.version, '' as message, dashboard.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN `user` AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN `user` AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
ORDER BY dashboard.id DESC
|
||||
|
@ -2,17 +2,17 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard.updated, updated_user.uid as updated_by, dashboard.updated_by as updated_by_id,
|
||||
dashboard.version, '' as message, dashboard.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN `user` AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN `user` AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
AND dashboard.id > 22
|
||||
|
@ -2,17 +2,17 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard.updated, updated_user.uid as updated_by, dashboard.updated_by as updated_by_id,
|
||||
dashboard.version, '' as message, dashboard.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN `user` AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN `user` AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
AND dashboard.uid = 'UUU'
|
||||
|
@ -2,18 +2,18 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard_version.created, updated_user.uid as updated_by,updated_user.id as created_by_id,
|
||||
dashboard_version.version, dashboard_version.message, dashboard_version.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_version ON dashboard.id = dashboard_version.dashboard_id
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN `user` AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN `user` AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_version" as dashboard_version ON dashboard.id = dashboard_version.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
AND dashboard_version.version = 3
|
||||
|
@ -2,17 +2,17 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard.updated, updated_user.uid as updated_by, dashboard.updated_by as updated_by_id,
|
||||
dashboard.version, '' as message, dashboard.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN `user` AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN `user` AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
AND dashboard.uid = 'UUU'
|
||||
|
@ -2,17 +2,17 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard.updated, updated_user.uid as updated_by, dashboard.updated_by as updated_by_id,
|
||||
dashboard.version, '' as message, dashboard.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "user" AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "user" AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
ORDER BY dashboard.id DESC
|
||||
|
@ -2,17 +2,17 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard.updated, updated_user.uid as updated_by, dashboard.updated_by as updated_by_id,
|
||||
dashboard.version, '' as message, dashboard.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "user" AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "user" AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
AND dashboard.id > 22
|
||||
|
@ -2,17 +2,17 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard.updated, updated_user.uid as updated_by, dashboard.updated_by as updated_by_id,
|
||||
dashboard.version, '' as message, dashboard.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "user" AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "user" AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
AND dashboard.uid = 'UUU'
|
||||
|
@ -2,18 +2,18 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard_version.created, updated_user.uid as updated_by,updated_user.id as created_by_id,
|
||||
dashboard_version.version, dashboard_version.message, dashboard_version.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_version ON dashboard.id = dashboard_version.dashboard_id
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "user" AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "user" AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_version" as dashboard_version ON dashboard.id = dashboard_version.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
AND dashboard_version.version = 3
|
||||
|
@ -2,17 +2,17 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard.updated, updated_user.uid as updated_by, dashboard.updated_by as updated_by_id,
|
||||
dashboard.version, '' as message, dashboard.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "user" AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "user" AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
AND dashboard.uid = 'UUU'
|
||||
|
@ -2,17 +2,17 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard.updated, updated_user.uid as updated_by, dashboard.updated_by as updated_by_id,
|
||||
dashboard.version, '' as message, dashboard.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "user" AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "user" AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
ORDER BY dashboard.id DESC
|
||||
|
@ -2,17 +2,17 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard.updated, updated_user.uid as updated_by, dashboard.updated_by as updated_by_id,
|
||||
dashboard.version, '' as message, dashboard.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "user" AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "user" AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
AND dashboard.id > 22
|
||||
|
@ -2,17 +2,17 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard.updated, updated_user.uid as updated_by, dashboard.updated_by as updated_by_id,
|
||||
dashboard.version, '' as message, dashboard.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "user" AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "user" AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
AND dashboard.uid = 'UUU'
|
||||
|
@ -2,18 +2,18 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard_version.created, updated_user.uid as updated_by,updated_user.id as created_by_id,
|
||||
dashboard_version.version, dashboard_version.message, dashboard_version.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_version ON dashboard.id = dashboard_version.dashboard_id
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "user" AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "user" AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_version" as dashboard_version ON dashboard.id = dashboard_version.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
AND dashboard_version.version = 3
|
||||
|
@ -2,17 +2,17 @@ SELECT
|
||||
dashboard.org_id, dashboard.id,
|
||||
dashboard.uid, dashboard.folder_uid,
|
||||
dashboard.deleted, plugin_id,
|
||||
dashboard_provisioning.name as origin_name,
|
||||
dashboard_provisioning.external_id as origin_path,
|
||||
dashboard_provisioning.check_sum as origin_key,
|
||||
dashboard_provisioning.updated as origin_ts,
|
||||
provisioning.name as origin_name,
|
||||
provisioning.external_id as origin_path,
|
||||
provisioning.check_sum as origin_key,
|
||||
provisioning.updated as origin_ts,
|
||||
dashboard.created, created_user.uid as created_by, dashboard.created_by as created_by_id,
|
||||
dashboard.updated, updated_user.uid as updated_by, dashboard.updated_by as updated_by_id,
|
||||
dashboard.version, '' as message, dashboard.data
|
||||
FROM dashboard
|
||||
LEFT OUTER JOIN dashboard_provisioning ON dashboard.id = dashboard_provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "user" AS created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "user" AS updated_user ON dashboard.updated_by = updated_user.id
|
||||
FROM "grafana.dashboard" as dashboard
|
||||
LEFT OUTER JOIN "grafana.dashboard_provisioning" as provisioning ON dashboard.id = provisioning.dashboard_id
|
||||
LEFT OUTER JOIN "grafana.user" as created_user ON dashboard.created_by = created_user.id
|
||||
LEFT OUTER JOIN "grafana.user" as updated_user ON dashboard.updated_by = updated_user.id
|
||||
WHERE dashboard.is_folder = false
|
||||
AND dashboard.org_id = 2
|
||||
AND dashboard.uid = 'UUU'
|
||||
|
@ -26,6 +26,7 @@ import (
|
||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||
"github.com/grafana/grafana/pkg/services/provisioning"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
"github.com/grafana/grafana/pkg/storage/legacysql"
|
||||
"github.com/grafana/grafana/pkg/storage/unified/apistore"
|
||||
)
|
||||
|
||||
@ -55,6 +56,7 @@ func RegisterAPIService(cfg *setting.Cfg, features featuremgmt.FeatureToggles,
|
||||
return nil // skip registration unless opting into experimental apis
|
||||
}
|
||||
|
||||
dbp := legacysql.NewDatabaseProvider(sql)
|
||||
namespacer := request.GetNamespaceMapper(cfg)
|
||||
builder := &DashboardsAPIBuilder{
|
||||
log: log.New("grafana-apiserver.dashboards"),
|
||||
@ -64,7 +66,7 @@ func RegisterAPIService(cfg *setting.Cfg, features featuremgmt.FeatureToggles,
|
||||
|
||||
legacy: &dashboardStorage{
|
||||
resource: dashboard.DashboardResourceInfo,
|
||||
access: legacy.NewDashboardAccess(sql, namespacer, dashStore, provisioning),
|
||||
access: legacy.NewDashboardAccess(dbp, namespacer, dashStore, provisioning),
|
||||
tableConverter: dashboard.DashboardResourceInfo.TableConverter(),
|
||||
},
|
||||
}
|
||||
|
@ -17,28 +17,13 @@ var (
|
||||
)
|
||||
|
||||
type legacySQLStore struct {
|
||||
dialect sqltemplate.Dialect
|
||||
sql legacysql.NamespacedDBProvider
|
||||
teamsRV legacysql.ResourceVersionLookup
|
||||
usersRV legacysql.ResourceVersionLookup
|
||||
sql legacysql.LegacyDatabaseProvider
|
||||
}
|
||||
|
||||
func NewLegacySQLStores(sql legacysql.NamespacedDBProvider) (LegacyIdentityStore, error) {
|
||||
db, err := sql(context.Background())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dialect := sqltemplate.DialectForDriver(string(db.GetDBType()))
|
||||
if dialect == nil {
|
||||
return nil, fmt.Errorf("unknown dialect")
|
||||
}
|
||||
|
||||
func NewLegacySQLStores(sql legacysql.LegacyDatabaseProvider) LegacyIdentityStore {
|
||||
return &legacySQLStore{
|
||||
sql: sql,
|
||||
dialect: dialect,
|
||||
teamsRV: legacysql.GetResourceVersionLookup(sql, "team", "updated"),
|
||||
usersRV: legacysql.GetResourceVersionLookup(sql, "user", "updated"),
|
||||
}, nil
|
||||
sql: sql,
|
||||
}
|
||||
}
|
||||
|
||||
// ListTeams implements LegacyIdentityStore.
|
||||
@ -54,11 +39,12 @@ func (s *legacySQLStore) ListTeams(ctx context.Context, ns claims.NamespaceInfo,
|
||||
return nil, fmt.Errorf("expected non zero orgID")
|
||||
}
|
||||
|
||||
req := sqlQueryListTeams{
|
||||
SQLTemplate: sqltemplate.New(s.dialect),
|
||||
Query: &query,
|
||||
sql, err := s.sql(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
req := newListTeams(sql, &query)
|
||||
rawQuery, err := sqltemplate.Execute(sqlQueryTeams, req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("execute template %q: %w", sqlQueryTeams.Name(), err)
|
||||
@ -67,13 +53,8 @@ func (s *legacySQLStore) ListTeams(ctx context.Context, ns claims.NamespaceInfo,
|
||||
|
||||
// fmt.Printf("%s // %v\n", rawQuery, req.GetArgs())
|
||||
|
||||
db, err := s.sql(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
res := &ListTeamResult{}
|
||||
rows, err := db.GetSqlxSession().Query(ctx, q, req.GetArgs()...)
|
||||
rows, err := sql.DB.GetSqlxSession().Query(ctx, q, req.GetArgs()...)
|
||||
defer func() {
|
||||
if rows != nil {
|
||||
_ = rows.Close()
|
||||
@ -97,7 +78,7 @@ func (s *legacySQLStore) ListTeams(ctx context.Context, ns claims.NamespaceInfo,
|
||||
}
|
||||
}
|
||||
if query.UID == "" {
|
||||
res.RV, err = s.teamsRV(ctx)
|
||||
res.RV, err = sql.GetResourceVersion(ctx, "team", "updated")
|
||||
}
|
||||
}
|
||||
return res, err
|
||||
@ -116,13 +97,35 @@ func (s *legacySQLStore) ListUsers(ctx context.Context, ns claims.NamespaceInfo,
|
||||
return nil, fmt.Errorf("expected non zero orgID")
|
||||
}
|
||||
|
||||
return s.queryUsers(ctx, sqlQueryUsers, sqlQueryListUsers{
|
||||
SQLTemplate: sqltemplate.New(s.dialect),
|
||||
Query: &query,
|
||||
}, limit, query.UID != "")
|
||||
sql, err := s.sql(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
res, err := s.queryUsers(ctx, sql, sqlQueryUsers, newListUser(sql, &query), limit)
|
||||
|
||||
if err == nil && query.UID != "" {
|
||||
res.RV, err = sql.GetResourceVersion(ctx, "user", "updated")
|
||||
}
|
||||
return res, err
|
||||
}
|
||||
|
||||
func (s *legacySQLStore) queryUsers(ctx context.Context, t *template.Template, req sqltemplate.Args, limit int, getRV bool) (*ListUserResult, error) {
|
||||
// GetDisplay implements LegacyIdentityStore.
|
||||
func (s *legacySQLStore) GetDisplay(ctx context.Context, ns claims.NamespaceInfo, query GetUserDisplayQuery) (*ListUserResult, error) {
|
||||
query.OrgID = ns.OrgID
|
||||
if ns.OrgID == 0 {
|
||||
return nil, fmt.Errorf("expected non zero orgID")
|
||||
}
|
||||
|
||||
sql, err := s.sql(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return s.queryUsers(ctx, sql, sqlQueryDisplay, newGetDisplay(sql, &query), 10000)
|
||||
}
|
||||
|
||||
func (s *legacySQLStore) queryUsers(ctx context.Context, sql *legacysql.LegacyDatabaseHelper, t *template.Template, req sqltemplate.Args, limit int) (*ListUserResult, error) {
|
||||
rawQuery, err := sqltemplate.Execute(t, req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("execute template %q: %w", sqlQueryUsers.Name(), err)
|
||||
@ -130,13 +133,9 @@ func (s *legacySQLStore) queryUsers(ctx context.Context, t *template.Template, r
|
||||
q := rawQuery
|
||||
|
||||
// fmt.Printf("%s // %v\n", rawQuery, req.GetArgs())
|
||||
db, err := s.sql(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
res := &ListUserResult{}
|
||||
rows, err := db.GetSqlxSession().Query(ctx, q, req.GetArgs()...)
|
||||
rows, err := sql.DB.GetSqlxSession().Query(ctx, q, req.GetArgs()...)
|
||||
defer func() {
|
||||
if rows != nil {
|
||||
_ = rows.Close()
|
||||
@ -160,9 +159,6 @@ func (s *legacySQLStore) queryUsers(ctx context.Context, t *template.Template, r
|
||||
break
|
||||
}
|
||||
}
|
||||
if getRV {
|
||||
res.RV, err = s.usersRV(ctx)
|
||||
}
|
||||
}
|
||||
return res, err
|
||||
}
|
||||
@ -171,16 +167,3 @@ func (s *legacySQLStore) queryUsers(ctx context.Context, t *template.Template, r
|
||||
func (s *legacySQLStore) GetUserTeams(ctx context.Context, ns claims.NamespaceInfo, uid string) ([]team.Team, error) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// GetDisplay implements LegacyIdentityStore.
|
||||
func (s *legacySQLStore) GetDisplay(ctx context.Context, ns claims.NamespaceInfo, query GetUserDisplayQuery) (*ListUserResult, error) {
|
||||
query.OrgID = ns.OrgID
|
||||
if ns.OrgID == 0 {
|
||||
return nil, fmt.Errorf("expected non zero orgID")
|
||||
}
|
||||
|
||||
return s.queryUsers(ctx, sqlQueryDisplay, sqlQueryGetDisplay{
|
||||
SQLTemplate: sqltemplate.New(s.dialect),
|
||||
Query: &query,
|
||||
}, 10000, false)
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import (
|
||||
"fmt"
|
||||
"text/template"
|
||||
|
||||
"github.com/grafana/grafana/pkg/storage/legacysql"
|
||||
"github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate"
|
||||
)
|
||||
|
||||
@ -32,7 +33,18 @@ var (
|
||||
|
||||
type sqlQueryListUsers struct {
|
||||
sqltemplate.SQLTemplate
|
||||
Query *ListUserQuery
|
||||
Query *ListUserQuery
|
||||
UserTable string
|
||||
OrgUserTable string
|
||||
}
|
||||
|
||||
func newListUser(sql *legacysql.LegacyDatabaseHelper, q *ListUserQuery) sqlQueryListUsers {
|
||||
return sqlQueryListUsers{
|
||||
SQLTemplate: sqltemplate.New(sql.DialectForDriver()),
|
||||
UserTable: sql.Table("user"),
|
||||
OrgUserTable: sql.Table("org_user"),
|
||||
Query: q,
|
||||
}
|
||||
}
|
||||
|
||||
func (r sqlQueryListUsers) Validate() error {
|
||||
@ -41,7 +53,16 @@ func (r sqlQueryListUsers) Validate() error {
|
||||
|
||||
type sqlQueryListTeams struct {
|
||||
sqltemplate.SQLTemplate
|
||||
Query *ListTeamQuery
|
||||
Query *ListTeamQuery
|
||||
TeamTable string
|
||||
}
|
||||
|
||||
func newListTeams(sql *legacysql.LegacyDatabaseHelper, q *ListTeamQuery) sqlQueryListTeams {
|
||||
return sqlQueryListTeams{
|
||||
SQLTemplate: sqltemplate.New(sql.DialectForDriver()),
|
||||
TeamTable: sql.Table("team"),
|
||||
Query: q,
|
||||
}
|
||||
}
|
||||
|
||||
func (r sqlQueryListTeams) Validate() error {
|
||||
@ -50,7 +71,18 @@ func (r sqlQueryListTeams) Validate() error {
|
||||
|
||||
type sqlQueryGetDisplay struct {
|
||||
sqltemplate.SQLTemplate
|
||||
Query *GetUserDisplayQuery
|
||||
Query *GetUserDisplayQuery
|
||||
UserTable string
|
||||
OrgUserTable string
|
||||
}
|
||||
|
||||
func newGetDisplay(sql *legacysql.LegacyDatabaseHelper, q *GetUserDisplayQuery) sqlQueryGetDisplay {
|
||||
return sqlQueryGetDisplay{
|
||||
SQLTemplate: sqltemplate.New(sql.DialectForDriver()),
|
||||
UserTable: sql.Table("user"),
|
||||
OrgUserTable: sql.Table("org_user"),
|
||||
Query: q,
|
||||
}
|
||||
}
|
||||
|
||||
func (r sqlQueryGetDisplay) Validate() error {
|
||||
|
@ -4,104 +4,104 @@ import (
|
||||
"testing"
|
||||
"text/template"
|
||||
|
||||
"github.com/grafana/grafana/pkg/storage/legacysql"
|
||||
"github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate"
|
||||
"github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate/mocks"
|
||||
)
|
||||
|
||||
func TestQueries(t *testing.T) {
|
||||
// prefix tables with grafana
|
||||
nodb := &legacysql.LegacyDatabaseHelper{
|
||||
Table: func(n string) string {
|
||||
return "grafana." + n
|
||||
},
|
||||
}
|
||||
|
||||
getDisplay := func(q *GetUserDisplayQuery) sqltemplate.SQLTemplate {
|
||||
v := newGetDisplay(nodb, q)
|
||||
v.SQLTemplate = mocks.NewTestingSQLTemplate()
|
||||
return &v
|
||||
}
|
||||
|
||||
listUsers := func(q *ListUserQuery) sqltemplate.SQLTemplate {
|
||||
v := newListUser(nodb, q)
|
||||
v.SQLTemplate = mocks.NewTestingSQLTemplate()
|
||||
return &v
|
||||
}
|
||||
|
||||
listTeams := func(q *ListTeamQuery) sqltemplate.SQLTemplate {
|
||||
v := newListTeams(nodb, q)
|
||||
v.SQLTemplate = mocks.NewTestingSQLTemplate()
|
||||
return &v
|
||||
}
|
||||
|
||||
mocks.CheckQuerySnapshots(t, mocks.TemplateTestSetup{
|
||||
RootDir: "testdata",
|
||||
Templates: map[*template.Template][]mocks.TemplateTestCase{
|
||||
sqlQueryTeams: {
|
||||
{
|
||||
Name: "teams_uid",
|
||||
Data: &sqlQueryListTeams{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Query: &ListTeamQuery{
|
||||
UID: "abc",
|
||||
},
|
||||
},
|
||||
Data: listTeams(&ListTeamQuery{
|
||||
UID: "abc",
|
||||
}),
|
||||
},
|
||||
{
|
||||
Name: "teams_page_1",
|
||||
Data: &sqlQueryListTeams{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Query: &ListTeamQuery{
|
||||
Limit: 5,
|
||||
},
|
||||
},
|
||||
Data: listTeams(&ListTeamQuery{
|
||||
Limit: 5,
|
||||
}),
|
||||
},
|
||||
{
|
||||
Name: "teams_page_2",
|
||||
Data: &sqlQueryListTeams{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Query: &ListTeamQuery{
|
||||
ContinueID: 1,
|
||||
Limit: 2,
|
||||
},
|
||||
},
|
||||
Data: listTeams(&ListTeamQuery{
|
||||
ContinueID: 1,
|
||||
Limit: 2,
|
||||
}),
|
||||
},
|
||||
},
|
||||
sqlQueryUsers: {
|
||||
{
|
||||
Name: "users_uid",
|
||||
Data: &sqlQueryListUsers{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Query: &ListUserQuery{
|
||||
UID: "abc",
|
||||
},
|
||||
},
|
||||
Data: listUsers(&ListUserQuery{
|
||||
UID: "abc",
|
||||
}),
|
||||
},
|
||||
{
|
||||
Name: "users_page_1",
|
||||
Data: &sqlQueryListUsers{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Query: &ListUserQuery{
|
||||
Limit: 5,
|
||||
},
|
||||
},
|
||||
Data: listUsers(&ListUserQuery{
|
||||
Limit: 5,
|
||||
}),
|
||||
},
|
||||
{
|
||||
Name: "users_page_2",
|
||||
Data: &sqlQueryListUsers{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Query: &ListUserQuery{
|
||||
ContinueID: 1,
|
||||
Limit: 2,
|
||||
},
|
||||
},
|
||||
Data: listUsers(&ListUserQuery{
|
||||
ContinueID: 1,
|
||||
Limit: 2,
|
||||
}),
|
||||
},
|
||||
},
|
||||
sqlQueryDisplay: {
|
||||
{
|
||||
Name: "display_uids",
|
||||
Data: &sqlQueryGetDisplay{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Query: &GetUserDisplayQuery{
|
||||
OrgID: 2,
|
||||
UIDs: []string{"a", "b"},
|
||||
},
|
||||
},
|
||||
Data: getDisplay(&GetUserDisplayQuery{
|
||||
OrgID: 2,
|
||||
UIDs: []string{"a", "b"},
|
||||
}),
|
||||
},
|
||||
{
|
||||
Name: "display_ids",
|
||||
Data: &sqlQueryGetDisplay{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Query: &GetUserDisplayQuery{
|
||||
OrgID: 2,
|
||||
IDs: []int64{1, 2},
|
||||
},
|
||||
},
|
||||
Data: getDisplay(&GetUserDisplayQuery{
|
||||
OrgID: 2,
|
||||
IDs: []int64{1, 2},
|
||||
}),
|
||||
},
|
||||
{
|
||||
Name: "display_ids_uids",
|
||||
Data: &sqlQueryGetDisplay{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
Query: &GetUserDisplayQuery{
|
||||
OrgID: 2,
|
||||
UIDs: []string{"a", "b"},
|
||||
IDs: []int64{1, 2},
|
||||
},
|
||||
},
|
||||
Data: getDisplay(&GetUserDisplayQuery{
|
||||
OrgID: 2,
|
||||
UIDs: []string{"a", "b"},
|
||||
IDs: []int64{1, 2},
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM {{ .Ident "user" }} as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = {{ .Arg .Query.OrgID }} AND ( 1=2
|
||||
FROM {{ .Ident .UserTable }} as u JOIN {{ .Ident .OrgUserTable }} as o ON u.id = o.user_id
|
||||
WHERE o.org_id = {{ .Arg .Query.OrgID }} AND ( 1=2
|
||||
{{ if .Query.UIDs }}
|
||||
OR uid IN ({{ .ArgList .Query.UIDs }})
|
||||
{{ end }}
|
||||
|
@ -1,5 +1,5 @@
|
||||
SELECT id, uid, name, email, created, updated
|
||||
FROM {{ .Ident "team" }}
|
||||
FROM {{ .Ident .TeamTable }}
|
||||
WHERE org_id = {{ .Arg .Query.OrgID }}
|
||||
{{ if .Query.UID }}
|
||||
AND uid = {{ .Arg .Query.UID }}
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM {{ .Ident "user" }} as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = {{ .Arg .Query.OrgID }}
|
||||
FROM {{ .Ident .UserTable }} as u JOIN {{ .Ident .OrgUserTable }} as o ON u.id = o.user_id
|
||||
WHERE o.org_id = {{ .Arg .Query.OrgID }}
|
||||
AND u.is_service_account = {{ .Arg .Query.IsServiceAccount }}
|
||||
{{ if .Query.UID }}
|
||||
AND uid = {{ .Arg .Query.UID }}
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM `user` as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 2 AND ( 1=2
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 2 AND ( 1=2
|
||||
OR u.id IN (1, 2)
|
||||
)
|
||||
ORDER BY u.id asc
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM `user` as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 2 AND ( 1=2
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 2 AND ( 1=2
|
||||
OR uid IN ('a', 'b')
|
||||
OR u.id IN (1, 2)
|
||||
)
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM `user` as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 2 AND ( 1=2
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 2 AND ( 1=2
|
||||
OR uid IN ('a', 'b')
|
||||
)
|
||||
ORDER BY u.id asc
|
||||
|
@ -1,5 +1,5 @@
|
||||
SELECT id, uid, name, email, created, updated
|
||||
FROM "team"
|
||||
FROM "grafana.team"
|
||||
WHERE org_id = 0
|
||||
ORDER BY id asc
|
||||
LIMIT 5
|
||||
|
@ -1,5 +1,5 @@
|
||||
SELECT id, uid, name, email, created, updated
|
||||
FROM "team"
|
||||
FROM "grafana.team"
|
||||
WHERE org_id = 0
|
||||
AND id > 1
|
||||
ORDER BY id asc
|
||||
|
@ -1,5 +1,5 @@
|
||||
SELECT id, uid, name, email, created, updated
|
||||
FROM "team"
|
||||
FROM "grafana.team"
|
||||
WHERE org_id = 0
|
||||
AND uid = 'abc'
|
||||
ORDER BY id asc
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM `user` as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 0
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 0
|
||||
AND u.is_service_account = FALSE
|
||||
ORDER BY u.id asc
|
||||
LIMIT 5
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM `user` as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 0
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 0
|
||||
AND u.is_service_account = FALSE
|
||||
AND id > 1
|
||||
ORDER BY u.id asc
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM `user` as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 0
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 0
|
||||
AND u.is_service_account = FALSE
|
||||
AND uid = 'abc'
|
||||
ORDER BY u.id asc
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM "user" as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 2 AND ( 1=2
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 2 AND ( 1=2
|
||||
OR u.id IN (1, 2)
|
||||
)
|
||||
ORDER BY u.id asc
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM "user" as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 2 AND ( 1=2
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 2 AND ( 1=2
|
||||
OR uid IN ('a', 'b')
|
||||
OR u.id IN (1, 2)
|
||||
)
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM "user" as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 2 AND ( 1=2
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 2 AND ( 1=2
|
||||
OR uid IN ('a', 'b')
|
||||
)
|
||||
ORDER BY u.id asc
|
||||
|
@ -1,5 +1,5 @@
|
||||
SELECT id, uid, name, email, created, updated
|
||||
FROM "team"
|
||||
FROM "grafana.team"
|
||||
WHERE org_id = 0
|
||||
ORDER BY id asc
|
||||
LIMIT 5
|
||||
|
@ -1,5 +1,5 @@
|
||||
SELECT id, uid, name, email, created, updated
|
||||
FROM "team"
|
||||
FROM "grafana.team"
|
||||
WHERE org_id = 0
|
||||
AND id > 1
|
||||
ORDER BY id asc
|
||||
|
@ -1,5 +1,5 @@
|
||||
SELECT id, uid, name, email, created, updated
|
||||
FROM "team"
|
||||
FROM "grafana.team"
|
||||
WHERE org_id = 0
|
||||
AND uid = 'abc'
|
||||
ORDER BY id asc
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM "user" as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 0
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 0
|
||||
AND u.is_service_account = FALSE
|
||||
ORDER BY u.id asc
|
||||
LIMIT 5
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM "user" as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 0
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 0
|
||||
AND u.is_service_account = FALSE
|
||||
AND id > 1
|
||||
ORDER BY u.id asc
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM "user" as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 0
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 0
|
||||
AND u.is_service_account = FALSE
|
||||
AND uid = 'abc'
|
||||
ORDER BY u.id asc
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM "user" as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 2 AND ( 1=2
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 2 AND ( 1=2
|
||||
OR u.id IN (1, 2)
|
||||
)
|
||||
ORDER BY u.id asc
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM "user" as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 2 AND ( 1=2
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 2 AND ( 1=2
|
||||
OR uid IN ('a', 'b')
|
||||
OR u.id IN (1, 2)
|
||||
)
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM "user" as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 2 AND ( 1=2
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 2 AND ( 1=2
|
||||
OR uid IN ('a', 'b')
|
||||
)
|
||||
ORDER BY u.id asc
|
||||
|
@ -1,5 +1,5 @@
|
||||
SELECT id, uid, name, email, created, updated
|
||||
FROM "team"
|
||||
FROM "grafana.team"
|
||||
WHERE org_id = 0
|
||||
ORDER BY id asc
|
||||
LIMIT 5
|
||||
|
@ -1,5 +1,5 @@
|
||||
SELECT id, uid, name, email, created, updated
|
||||
FROM "team"
|
||||
FROM "grafana.team"
|
||||
WHERE org_id = 0
|
||||
AND id > 1
|
||||
ORDER BY id asc
|
||||
|
@ -1,5 +1,5 @@
|
||||
SELECT id, uid, name, email, created, updated
|
||||
FROM "team"
|
||||
FROM "grafana.team"
|
||||
WHERE org_id = 0
|
||||
AND uid = 'abc'
|
||||
ORDER BY id asc
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM "user" as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 0
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 0
|
||||
AND u.is_service_account = FALSE
|
||||
ORDER BY u.id asc
|
||||
LIMIT 5
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM "user" as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 0
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 0
|
||||
AND u.is_service_account = FALSE
|
||||
AND id > 1
|
||||
ORDER BY u.id asc
|
||||
|
@ -1,7 +1,7 @@
|
||||
SELECT org_user.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
SELECT o.org_id, u.id, u.uid, u.login, u.email, u.name,
|
||||
u.created, u.updated, u.is_service_account, u.is_disabled, u.is_admin
|
||||
FROM "user" as u JOIN org_user ON u.id = org_user.user_id
|
||||
WHERE org_user.org_id = 0
|
||||
FROM "grafana.user" as u JOIN "grafana.org_user" as o ON u.id = o.user_id
|
||||
WHERE o.org_id = 0
|
||||
AND u.is_service_account = FALSE
|
||||
AND uid = 'abc'
|
||||
ORDER BY u.id asc
|
||||
|
@ -20,6 +20,7 @@ import (
|
||||
"github.com/grafana/grafana/pkg/registry/apis/identity/legacy"
|
||||
"github.com/grafana/grafana/pkg/services/apiserver/builder"
|
||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||
"github.com/grafana/grafana/pkg/storage/legacysql"
|
||||
)
|
||||
|
||||
var _ builder.APIGroupBuilder = (*IdentityAPIBuilder)(nil)
|
||||
@ -40,15 +41,8 @@ func RegisterAPIService(
|
||||
return nil, nil // skip registration unless opting into experimental apis
|
||||
}
|
||||
|
||||
store, err := legacy.NewLegacySQLStores(func(context.Context) (db.DB, error) {
|
||||
return sql, nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
builder := &IdentityAPIBuilder{
|
||||
Store: store,
|
||||
Store: legacy.NewLegacySQLStores(legacysql.NewDatabaseProvider(sql)),
|
||||
}
|
||||
apiregistration.RegisterAPI(builder)
|
||||
return builder, nil
|
||||
|
69
pkg/storage/legacysql/db.go
Normal file
69
pkg/storage/legacysql/db.go
Normal file
@ -0,0 +1,69 @@
|
||||
package legacysql
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/grafana/grafana/pkg/infra/db"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore"
|
||||
"github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate"
|
||||
)
|
||||
|
||||
// The database may depend on the request context
|
||||
type LegacyDatabaseProvider func(ctx context.Context) (*LegacyDatabaseHelper, error)
|
||||
|
||||
// NewDatabaseProvider returns a simple provider that always uses the same database implementation
|
||||
func NewDatabaseProvider(db db.DB) LegacyDatabaseProvider {
|
||||
helper := &LegacyDatabaseHelper{
|
||||
DB: db,
|
||||
Table: func(n string) string {
|
||||
return n
|
||||
},
|
||||
}
|
||||
return func(ctx context.Context) (*LegacyDatabaseHelper, error) {
|
||||
return helper, nil
|
||||
}
|
||||
}
|
||||
|
||||
type LegacyDatabaseHelper struct {
|
||||
// The database connection
|
||||
DB db.DB
|
||||
|
||||
// table name locator
|
||||
Table func(n string) string
|
||||
}
|
||||
|
||||
// Helper to pick the correct dialect
|
||||
func (h *LegacyDatabaseHelper) DialectForDriver() sqltemplate.Dialect {
|
||||
if h.DB == nil {
|
||||
return nil
|
||||
}
|
||||
return sqltemplate.DialectForDriver(string(h.DB.GetDBType()))
|
||||
}
|
||||
|
||||
// Get a resource version from the max value the updated field
|
||||
func (h *LegacyDatabaseHelper) GetResourceVersion(ctx context.Context, table string, column string) (int64, error) {
|
||||
table = h.Table(table)
|
||||
column = h.DB.Quote(column)
|
||||
|
||||
var rv int64
|
||||
_ = h.DB.WithDbSession(ctx, func(sess *sqlstore.DBSession) error {
|
||||
v := struct {
|
||||
M time.Time `db:"m"` // xorm date parsing magic
|
||||
}{}
|
||||
ok, err := sess.Table(h.Table(table)).Select("MAX(" + column + ") as m").Get(&v)
|
||||
if ok {
|
||||
rv = v.M.UnixMilli()
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
})
|
||||
|
||||
// When no RV, use a stable non-zero number
|
||||
if rv < 1 {
|
||||
return startup, nil
|
||||
}
|
||||
return rv, nil
|
||||
}
|
||||
|
||||
var startup = time.Now().UnixMilli()
|
@ -1,51 +0,0 @@
|
||||
package legacysql
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/grafana/grafana/pkg/infra/db"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||
)
|
||||
|
||||
// The database may depend on the request context
|
||||
type NamespacedDBProvider func(ctx context.Context) (db.DB, error)
|
||||
|
||||
// Get the list RV from the maximum updated time
|
||||
type ResourceVersionLookup = func(ctx context.Context) (int64, error)
|
||||
|
||||
// Get a resource version from the max value the updated field
|
||||
func GetResourceVersionLookup(sql NamespacedDBProvider, table string, column string) ResourceVersionLookup {
|
||||
return func(ctx context.Context) (int64, error) {
|
||||
db, err := sql(ctx)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
table = db.GetDialect().Quote(table)
|
||||
column = db.GetDialect().Quote(column)
|
||||
switch db.GetDBType() {
|
||||
case migrator.Postgres:
|
||||
max := time.Now()
|
||||
err := db.GetSqlxSession().Get(ctx, &max, "SELECT MAX("+column+") FROM "+table)
|
||||
if err != nil {
|
||||
return 1, nil
|
||||
}
|
||||
return max.UnixMilli(), nil
|
||||
case migrator.MySQL:
|
||||
max := int64(1)
|
||||
_ = db.GetSqlxSession().Get(ctx, &max, "SELECT UNIX_TIMESTAMP(MAX("+column+")) FROM "+table)
|
||||
return max, nil
|
||||
default:
|
||||
// fallthrough to string version
|
||||
}
|
||||
|
||||
max := ""
|
||||
err = db.GetSqlxSession().Get(ctx, &max, "SELECT MAX("+column+") FROM "+table)
|
||||
if err == nil && max != "" {
|
||||
t, _ := time.Parse(time.DateTime, max) // ignore null errors
|
||||
return t.UnixMilli(), nil
|
||||
}
|
||||
return 1, nil
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user