2014-12-22 19:25:08 +08:00
|
|
|
package sqlstore
|
|
|
|
|
|
|
|
|
|
import (
|
2015-02-04 18:35:59 +08:00
|
|
|
"bytes"
|
2015-02-05 18:10:56 +08:00
|
|
|
"fmt"
|
2015-02-04 18:35:59 +08:00
|
|
|
|
2014-12-22 19:25:08 +08:00
|
|
|
"github.com/go-xorm/xorm"
|
2015-02-05 17:37:13 +08:00
|
|
|
"github.com/grafana/grafana/pkg/bus"
|
2015-03-23 03:14:00 +08:00
|
|
|
"github.com/grafana/grafana/pkg/metrics"
|
2015-02-05 17:37:13 +08:00
|
|
|
m "github.com/grafana/grafana/pkg/models"
|
2014-12-22 19:25:08 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func init() {
|
2014-12-29 20:58:06 +08:00
|
|
|
bus.AddHandler("sql", SaveDashboard)
|
|
|
|
|
bus.AddHandler("sql", GetDashboard)
|
|
|
|
|
bus.AddHandler("sql", DeleteDashboard)
|
|
|
|
|
bus.AddHandler("sql", SearchDashboards)
|
2015-01-07 01:39:26 +08:00
|
|
|
bus.AddHandler("sql", GetDashboardTags)
|
2014-12-22 19:25:08 +08:00
|
|
|
}
|
|
|
|
|
|
2014-12-29 20:58:06 +08:00
|
|
|
func SaveDashboard(cmd *m.SaveDashboardCommand) error {
|
2014-12-22 19:25:08 +08:00
|
|
|
return inTransaction(func(sess *xorm.Session) error {
|
|
|
|
|
dash := cmd.GetDashboardModel()
|
|
|
|
|
|
2015-01-06 00:04:29 +08:00
|
|
|
// try get existing dashboard
|
2015-02-24 03:07:49 +08:00
|
|
|
existing := m.Dashboard{Slug: dash.Slug, OrgId: dash.OrgId}
|
2015-01-06 00:04:29 +08:00
|
|
|
hasExisting, err := sess.Get(&existing)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-03 05:24:01 +08:00
|
|
|
if hasExisting {
|
|
|
|
|
// another dashboard with same name
|
|
|
|
|
if dash.Id != existing.Id {
|
|
|
|
|
if cmd.Overwrite {
|
|
|
|
|
dash.Id = existing.Id
|
|
|
|
|
} else {
|
|
|
|
|
return m.ErrDashboardWithSameNameExists
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// check for is someone else has written in between
|
|
|
|
|
if dash.Version != existing.Version {
|
|
|
|
|
if cmd.Overwrite {
|
|
|
|
|
dash.Version = existing.Version
|
|
|
|
|
} else {
|
|
|
|
|
return m.ErrDashboardVersionMismatch
|
|
|
|
|
}
|
|
|
|
|
}
|
2015-01-06 00:04:29 +08:00
|
|
|
}
|
|
|
|
|
|
2014-12-22 19:25:08 +08:00
|
|
|
if dash.Id == 0 {
|
2015-03-23 03:14:00 +08:00
|
|
|
metrics.M_Models_Dashboard_Insert.Inc(1)
|
2014-12-22 19:25:08 +08:00
|
|
|
_, err = sess.Insert(dash)
|
|
|
|
|
} else {
|
2015-03-03 05:24:01 +08:00
|
|
|
dash.Version += 1
|
|
|
|
|
dash.Data["version"] = dash.Version
|
2014-12-22 19:25:08 +08:00
|
|
|
_, err = sess.Id(dash.Id).Update(dash)
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-07 19:37:24 +08:00
|
|
|
// delete existing tabs
|
|
|
|
|
_, err = sess.Exec("DELETE FROM dashboard_tag WHERE dashboard_id=?", dash.Id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// insert new tags
|
|
|
|
|
tags := dash.GetTags()
|
|
|
|
|
if len(tags) > 0 {
|
|
|
|
|
for _, tag := range tags {
|
2015-01-20 21:15:48 +08:00
|
|
|
if _, err := sess.Insert(&DashboardTag{DashboardId: dash.Id, Term: tag}); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2015-01-07 19:37:24 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-22 19:25:08 +08:00
|
|
|
cmd.Result = dash
|
|
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-29 20:58:06 +08:00
|
|
|
func GetDashboard(query *m.GetDashboardQuery) error {
|
2015-02-24 03:07:49 +08:00
|
|
|
dashboard := m.Dashboard{Slug: query.Slug, OrgId: query.OrgId}
|
2014-12-22 19:25:08 +08:00
|
|
|
has, err := x.Get(&dashboard)
|
|
|
|
|
if err != nil {
|
2014-12-29 20:58:06 +08:00
|
|
|
return err
|
2014-12-22 19:25:08 +08:00
|
|
|
} else if has == false {
|
2014-12-29 20:58:06 +08:00
|
|
|
return m.ErrDashboardNotFound
|
2014-12-22 19:25:08 +08:00
|
|
|
}
|
|
|
|
|
|
2015-01-29 19:10:34 +08:00
|
|
|
dashboard.Data["id"] = dashboard.Id
|
2014-12-29 20:58:06 +08:00
|
|
|
query.Result = &dashboard
|
|
|
|
|
|
|
|
|
|
return nil
|
2014-12-22 19:25:08 +08:00
|
|
|
}
|
|
|
|
|
|
2015-01-07 19:37:24 +08:00
|
|
|
type DashboardSearchProjection struct {
|
|
|
|
|
Id int64
|
|
|
|
|
Title string
|
|
|
|
|
Slug string
|
|
|
|
|
Term string
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-29 20:58:06 +08:00
|
|
|
func SearchDashboards(query *m.SearchDashboardsQuery) error {
|
2015-02-04 18:35:59 +08:00
|
|
|
var sql bytes.Buffer
|
|
|
|
|
params := make([]interface{}, 0)
|
|
|
|
|
|
|
|
|
|
sql.WriteString(`SELECT
|
|
|
|
|
dashboard.id,
|
|
|
|
|
dashboard.title,
|
|
|
|
|
dashboard.slug,
|
|
|
|
|
dashboard_tag.term
|
|
|
|
|
FROM dashboard
|
|
|
|
|
LEFT OUTER JOIN dashboard_tag on dashboard_tag.dashboard_id = dashboard.id`)
|
|
|
|
|
|
|
|
|
|
if query.IsStarred {
|
|
|
|
|
sql.WriteString(" INNER JOIN star on star.dashboard_id = dashboard.id")
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-24 03:07:49 +08:00
|
|
|
sql.WriteString(` WHERE dashboard.org_id=?`)
|
2015-02-04 18:35:59 +08:00
|
|
|
|
2015-02-24 03:07:49 +08:00
|
|
|
params = append(params, query.OrgId)
|
2015-01-07 00:15:52 +08:00
|
|
|
|
2015-02-04 18:35:59 +08:00
|
|
|
if query.IsStarred {
|
|
|
|
|
sql.WriteString(` AND star.user_id=?`)
|
|
|
|
|
params = append(params, query.UserId)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(query.Title) > 0 {
|
|
|
|
|
sql.WriteString(" AND dashboard.title LIKE ?")
|
|
|
|
|
params = append(params, "%"+query.Title+"%")
|
|
|
|
|
}
|
2014-12-22 19:25:08 +08:00
|
|
|
|
2015-01-07 19:37:24 +08:00
|
|
|
if len(query.Tag) > 0 {
|
2015-02-04 18:35:59 +08:00
|
|
|
sql.WriteString(" AND dashboard_tag.term=?")
|
|
|
|
|
params = append(params, query.Tag)
|
2015-01-07 19:37:24 +08:00
|
|
|
}
|
|
|
|
|
|
2015-02-05 22:53:15 +08:00
|
|
|
if query.Limit == 0 || query.Limit > 10000 {
|
|
|
|
|
query.Limit = 300
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-05 18:10:56 +08:00
|
|
|
sql.WriteString(fmt.Sprintf(" LIMIT %d", query.Limit))
|
|
|
|
|
|
2015-01-07 19:37:24 +08:00
|
|
|
var res []DashboardSearchProjection
|
2015-02-04 18:35:59 +08:00
|
|
|
err := x.Sql(sql.String(), params...).Find(&res)
|
2015-01-07 19:37:24 +08:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
query.Result = make([]*m.DashboardSearchHit, 0)
|
|
|
|
|
hits := make(map[int64]*m.DashboardSearchHit)
|
|
|
|
|
|
|
|
|
|
for _, item := range res {
|
|
|
|
|
hit, exists := hits[item.Id]
|
|
|
|
|
if !exists {
|
|
|
|
|
hit = &m.DashboardSearchHit{
|
2015-02-03 00:17:57 +08:00
|
|
|
Id: item.Id,
|
2015-01-07 19:37:24 +08:00
|
|
|
Title: item.Title,
|
|
|
|
|
Slug: item.Slug,
|
|
|
|
|
Tags: []string{},
|
|
|
|
|
}
|
|
|
|
|
query.Result = append(query.Result, hit)
|
|
|
|
|
hits[item.Id] = hit
|
|
|
|
|
}
|
|
|
|
|
if len(item.Term) > 0 {
|
|
|
|
|
hit.Tags = append(hit.Tags, item.Term)
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-12-22 19:25:08 +08:00
|
|
|
|
2014-12-29 20:58:06 +08:00
|
|
|
return err
|
2014-12-22 19:25:08 +08:00
|
|
|
}
|
|
|
|
|
|
2015-01-07 01:39:26 +08:00
|
|
|
func GetDashboardTags(query *m.GetDashboardTagsQuery) error {
|
2015-01-20 22:23:14 +08:00
|
|
|
sql := `SELECT
|
|
|
|
|
COUNT(*) as count,
|
|
|
|
|
term
|
|
|
|
|
FROM dashboard
|
|
|
|
|
INNER JOIN dashboard_tag on dashboard_tag.dashboard_id = dashboard.id
|
2015-02-24 03:07:49 +08:00
|
|
|
WHERE dashboard.org_id=?
|
2015-01-20 22:23:14 +08:00
|
|
|
GROUP BY term`
|
|
|
|
|
|
|
|
|
|
query.Result = make([]*m.DashboardTagCloudItem, 0)
|
2015-02-24 03:07:49 +08:00
|
|
|
sess := x.Sql(sql, query.OrgId)
|
2015-01-07 19:37:24 +08:00
|
|
|
err := sess.Find(&query.Result)
|
|
|
|
|
return err
|
2015-01-07 01:39:26 +08:00
|
|
|
}
|
|
|
|
|
|
2014-12-29 20:58:06 +08:00
|
|
|
func DeleteDashboard(cmd *m.DeleteDashboardCommand) error {
|
2014-12-22 19:25:08 +08:00
|
|
|
sess := x.NewSession()
|
|
|
|
|
defer sess.Close()
|
|
|
|
|
|
2015-02-25 21:31:44 +08:00
|
|
|
rawSql := "DELETE FROM dashboard WHERE org_id=? and slug=?"
|
2015-02-24 03:07:49 +08:00
|
|
|
_, err := sess.Exec(rawSql, cmd.OrgId, cmd.Slug)
|
2014-12-22 19:25:08 +08:00
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
}
|