2022-05-25 03:41:51 -05:00
package dashverimpl
import (
"context"
2022-05-31 04:56:05 -05:00
"strings"
2022-05-25 03:41:51 -05:00
dashver "github.com/grafana/grafana/pkg/services/dashboardversion"
"github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/services/sqlstore/db"
)
type store interface {
2022-05-31 04:56:05 -05:00
Get ( context . Context , * dashver . GetDashboardVersionQuery ) ( * dashver . DashboardVersion , error )
GetBatch ( context . Context , * dashver . DeleteExpiredVersionsCommand , int , int ) ( [ ] interface { } , error )
DeleteBatch ( context . Context , * dashver . DeleteExpiredVersionsCommand , [ ] interface { } ) ( int64 , error )
2022-05-25 03:41:51 -05:00
}
type sqlStore struct {
db db . DB
}
2022-05-31 04:56:05 -05:00
func ( ss * sqlStore ) Get ( ctx context . Context , query * dashver . GetDashboardVersionQuery ) ( * dashver . DashboardVersion , error ) {
2022-05-25 03:41:51 -05:00
var version dashver . DashboardVersion
2022-05-31 04:56:05 -05:00
err := ss . db . WithDbSession ( ctx , func ( sess * sqlstore . DBSession ) error {
2022-05-25 03:41:51 -05:00
has , err := sess . Where ( "dashboard_version.dashboard_id=? AND dashboard_version.version=? AND dashboard.org_id=?" , query . DashboardID , query . Version , query . OrgID ) .
Join ( "LEFT" , "dashboard" , ` dashboard.id = dashboard_version.dashboard_id ` ) .
Get ( & version )
if err != nil {
return err
}
if ! has {
2022-05-31 04:56:05 -05:00
return dashver . ErrDashboardVersionNotFound
2022-05-25 03:41:51 -05:00
}
return nil
} )
if err != nil {
return nil , err
}
return & version , nil
}
2022-05-31 04:56:05 -05:00
func ( ss * sqlStore ) GetBatch ( ctx context . Context , cmd * dashver . DeleteExpiredVersionsCommand , perBatch int , versionsToKeep int ) ( [ ] interface { } , error ) {
var versionIds [ ] interface { }
err := ss . db . WithTransactionalDbSession ( ctx , func ( sess * sqlstore . DBSession ) error {
versionIdsToDeleteQuery := ` SELECT id
FROM dashboard_version , (
SELECT dashboard_id , count ( version ) as count , min ( version ) as min
FROM dashboard_version
GROUP BY dashboard_id
) AS vtd
WHERE dashboard_version . dashboard_id = vtd . dashboard_id
AND version < vtd . min + vtd . count - ?
LIMIT ? `
err := sess . SQL ( versionIdsToDeleteQuery , versionsToKeep , perBatch ) . Find ( & versionIds )
return err
} )
return versionIds , err
}
func ( ss * sqlStore ) DeleteBatch ( ctx context . Context , cmd * dashver . DeleteExpiredVersionsCommand , versionIdsToDelete [ ] interface { } ) ( int64 , error ) {
var deleted int64
err := ss . db . WithTransactionalDbSession ( ctx , func ( sess * sqlstore . DBSession ) error {
deleteExpiredSQL := ` DELETE FROM dashboard_version WHERE id IN (? ` + strings . Repeat ( ",?" , len ( versionIdsToDelete ) - 1 ) + ` ) `
sqlOrArgs := append ( [ ] interface { } { deleteExpiredSQL } , versionIdsToDelete ... )
expiredResponse , err := sess . Exec ( sqlOrArgs ... )
if err != nil {
return err
}
deleted , err = expiredResponse . RowsAffected ( )
return err
} )
return deleted , err
}