Stars: Add dashboard_uid and org_id to table (#96408)
This commit is contained in:
@@ -35,6 +35,7 @@ func (oss *OSSMigrations) AddMigration(mg *Migrator) {
|
||||
addStarMigrations(mg)
|
||||
addOrgMigrations(mg)
|
||||
addDashboardMigration(mg) // Do NOT add more migrations to this function.
|
||||
addDashboardUIDStarMigrations(mg)
|
||||
addDataSourceMigration(mg)
|
||||
addApiKeyMigrations(mg)
|
||||
addDashboardSnapshotMigrations(mg)
|
||||
@@ -141,20 +142,3 @@ func (oss *OSSMigrations) AddMigration(mg *Migrator) {
|
||||
|
||||
accesscontrol.AddReceiverCreateScopeMigration(mg)
|
||||
}
|
||||
|
||||
func addStarMigrations(mg *Migrator) {
|
||||
starV1 := Table{
|
||||
Name: "star",
|
||||
Columns: []*Column{
|
||||
{Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true},
|
||||
{Name: "user_id", Type: DB_BigInt, Nullable: false},
|
||||
{Name: "dashboard_id", Type: DB_BigInt, Nullable: false},
|
||||
},
|
||||
Indices: []*Index{
|
||||
{Cols: []string{"user_id", "dashboard_id"}, Type: UniqueIndex},
|
||||
},
|
||||
}
|
||||
|
||||
mg.AddMigration("create star table", NewAddTableMigration(starV1))
|
||||
mg.AddMigration("add unique index star.user_id_dashboard_id", NewAddIndexMigration(starV1, starV1.Indices[0]))
|
||||
}
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
package migrations
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
. "github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||
"xorm.io/xorm"
|
||||
)
|
||||
|
||||
// does not rely on dashboard table existing, can be run before dashboard migrations
|
||||
func addStarMigrations(mg *Migrator) {
|
||||
starV1 := Table{
|
||||
Name: "star",
|
||||
Columns: []*Column{
|
||||
{Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true},
|
||||
{Name: "user_id", Type: DB_BigInt, Nullable: false},
|
||||
{Name: "dashboard_id", Type: DB_BigInt, Nullable: false},
|
||||
},
|
||||
Indices: []*Index{
|
||||
{Cols: []string{"user_id", "dashboard_id"}, Type: UniqueIndex},
|
||||
},
|
||||
}
|
||||
|
||||
mg.AddMigration("create star table", NewAddTableMigration(starV1))
|
||||
mg.AddMigration("add unique index star.user_id_dashboard_id", NewAddIndexMigration(starV1, starV1.Indices[0]))
|
||||
mg.AddMigration("Add column dashboard_uid in star", NewAddColumnMigration(starV1, &Column{
|
||||
Name: "dashboard_uid", Type: DB_NVarchar, Length: 40, Nullable: true,
|
||||
}))
|
||||
mg.AddMigration("Add column org_id in star", NewAddColumnMigration(starV1, &Column{
|
||||
Name: "org_id", Type: DB_BigInt, Nullable: true, Default: "1",
|
||||
}))
|
||||
mg.AddMigration("Add column updated in star", NewAddColumnMigration(starV1, &Column{
|
||||
Name: "updated", Type: DB_DateTime, Nullable: true,
|
||||
}))
|
||||
mg.AddMigration("add index in star table on dashboard_uid, org_id and user_id columns",
|
||||
NewAddIndexMigration(starV1, &Index{
|
||||
Cols: []string{"user_id", "dashboard_uid", "org_id"},
|
||||
Type: UniqueIndex,
|
||||
}))
|
||||
}
|
||||
|
||||
// relies on the dashboard table existing & must be run after the dashboard migrations are run
|
||||
func addDashboardUIDStarMigrations(mg *Migrator) {
|
||||
mg.AddMigration("Add missing dashboard_uid and org_id to star", &FillDashbordUIDMigration{})
|
||||
}
|
||||
|
||||
type FillDashbordUIDMigration struct {
|
||||
MigrationBase
|
||||
}
|
||||
|
||||
func (m *FillDashbordUIDMigration) SQL(dialect Dialect) string {
|
||||
return "code migration"
|
||||
}
|
||||
|
||||
func (m *FillDashbordUIDMigration) Exec(sess *xorm.Session, mg *Migrator) error {
|
||||
return RunStarMigrations(sess, mg.Dialect.DriverName())
|
||||
}
|
||||
|
||||
func RunStarMigrations(sess *xorm.Session, driverName string) error {
|
||||
// sqlite
|
||||
sql := `UPDATE star
|
||||
SET
|
||||
dashboard_uid = (SELECT uid FROM dashboard WHERE dashboard.id = star.dashboard_id),
|
||||
org_id = (SELECT org_id FROM dashboard WHERE dashboard.id = star.dashboard_id),
|
||||
updated = DATETIME('now')
|
||||
WHERE
|
||||
(dashboard_uid IS NULL OR org_id IS NULL)
|
||||
AND EXISTS (SELECT 1 FROM dashboard WHERE dashboard.id = star.dashboard_id);`
|
||||
if driverName == Postgres {
|
||||
sql = `UPDATE star
|
||||
SET dashboard_uid = dashboard.uid,
|
||||
org_id = dashboard.org_id,
|
||||
updated = NOW()
|
||||
FROM dashboard
|
||||
WHERE star.dashboard_id = dashboard.id
|
||||
AND (star.dashboard_uid IS NULL OR star.org_id IS NULL);`
|
||||
} else if driverName == MySQL {
|
||||
sql = `UPDATE star
|
||||
LEFT JOIN dashboard ON star.dashboard_id = dashboard.id
|
||||
SET star.dashboard_uid = dashboard.uid,
|
||||
star.org_id = dashboard.org_id,
|
||||
star.updated = NOW()
|
||||
WHERE star.dashboard_uid IS NULL OR star.org_id IS NULL;`
|
||||
}
|
||||
|
||||
if _, err := sess.Exec(sql); err != nil {
|
||||
return fmt.Errorf("failed to set dashboard_uid, org_id, and updated for star: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user