SQL: Add more legacy helpers (#92006)

This commit is contained in:
Ryan McKinley 2024-08-19 12:15:43 +03:00 committed by GitHub
parent 87c4f2448c
commit 9567275365
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
57 changed files with 491 additions and 448 deletions

View File

@ -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"),
}
}

View File

@ -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,
}),
},
},
},

View File

@ -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 }}

View File

@ -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()

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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

View File

@ -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'

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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

View File

@ -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'

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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

View File

@ -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'

View File

@ -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(),
},
}

View File

@ -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)
}

View File

@ -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 {

View File

@ -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},
}),
},
},
},

View File

@ -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 }}

View File

@ -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 }}

View File

@ -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 }}

View File

@ -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

View File

@ -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)
)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)
)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)
)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View 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()

View File

@ -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
}
}