| 
									
										
										
										
											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-04-01 04:06:19 +08:00
										 |  |  | 	sql.WriteString(fmt.Sprintf(" ORDER BY dashboard.title ASC LIMIT %d", query.Limit)) | 
					
						
							| 
									
										
										
										
											2015-02-05 18:10:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | } |