quota.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. package sqlstore
  2. import (
  3. "fmt"
  4. "github.com/grafana/grafana/pkg/bus"
  5. m "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/setting"
  7. )
  8. func init() {
  9. bus.AddHandler("sql", GetOrgQuotaByTarget)
  10. bus.AddHandler("sql", GetOrgQuotas)
  11. bus.AddHandler("sql", UpdateOrgQuota)
  12. bus.AddHandler("sql", GetUserQuotaByTarget)
  13. bus.AddHandler("sql", GetUserQuotas)
  14. bus.AddHandler("sql", UpdateUserQuota)
  15. bus.AddHandler("sql", GetGlobalQuotaByTarget)
  16. }
  17. type targetCount struct {
  18. Count int64
  19. }
  20. func GetOrgQuotaByTarget(query *m.GetOrgQuotaByTargetQuery) error {
  21. quota := m.Quota{
  22. Target: query.Target,
  23. OrgId: query.OrgId,
  24. }
  25. has, err := x.Get(&quota)
  26. if err != nil {
  27. return err
  28. } else if has == false {
  29. quota.Limit = query.Default
  30. }
  31. //get quota used.
  32. rawSql := fmt.Sprintf("SELECT COUNT(*) as count from %s where org_id=?", dialect.Quote(query.Target))
  33. resp := make([]*targetCount, 0)
  34. if err := x.Sql(rawSql, query.OrgId).Find(&resp); err != nil {
  35. return err
  36. }
  37. query.Result = &m.OrgQuotaDTO{
  38. Target: query.Target,
  39. Limit: quota.Limit,
  40. OrgId: query.OrgId,
  41. Used: resp[0].Count,
  42. }
  43. return nil
  44. }
  45. func GetOrgQuotas(query *m.GetOrgQuotasQuery) error {
  46. quotas := make([]*m.Quota, 0)
  47. sess := x.Table("quota")
  48. if err := sess.Where("org_id=? AND user_id=0", query.OrgId).Find(&quotas); err != nil {
  49. return err
  50. }
  51. defaultQuotas := setting.Quota.Org.ToMap()
  52. seenTargets := make(map[string]bool)
  53. for _, q := range quotas {
  54. seenTargets[q.Target] = true
  55. }
  56. for t, v := range defaultQuotas {
  57. if _, ok := seenTargets[t]; !ok {
  58. quotas = append(quotas, &m.Quota{
  59. OrgId: query.OrgId,
  60. Target: t,
  61. Limit: v,
  62. })
  63. }
  64. }
  65. result := make([]*m.OrgQuotaDTO, len(quotas))
  66. for i, q := range quotas {
  67. //get quota used.
  68. rawSql := fmt.Sprintf("SELECT COUNT(*) as count from %s where org_id=?", dialect.Quote(q.Target))
  69. resp := make([]*targetCount, 0)
  70. if err := x.Sql(rawSql, q.OrgId).Find(&resp); err != nil {
  71. return err
  72. }
  73. result[i] = &m.OrgQuotaDTO{
  74. Target: q.Target,
  75. Limit: q.Limit,
  76. OrgId: q.OrgId,
  77. Used: resp[0].Count,
  78. }
  79. }
  80. query.Result = result
  81. return nil
  82. }
  83. func UpdateOrgQuota(cmd *m.UpdateOrgQuotaCmd) error {
  84. return inTransaction2(func(sess *session) error {
  85. //Check if quota is already defined in the DB
  86. quota := m.Quota{
  87. Target: cmd.Target,
  88. OrgId: cmd.OrgId,
  89. }
  90. has, err := sess.Get(&quota)
  91. if err != nil {
  92. return err
  93. }
  94. quota.Limit = cmd.Limit
  95. if has == false {
  96. //No quota in the DB for this target, so create a new one.
  97. if _, err := sess.Insert(&quota); err != nil {
  98. return err
  99. }
  100. } else {
  101. //update existing quota entry in the DB.
  102. if _, err := sess.Id(quota.Id).Update(&quota); err != nil {
  103. return err
  104. }
  105. }
  106. return nil
  107. })
  108. }
  109. func GetUserQuotaByTarget(query *m.GetUserQuotaByTargetQuery) error {
  110. quota := m.Quota{
  111. Target: query.Target,
  112. UserId: query.UserId,
  113. }
  114. has, err := x.Get(&quota)
  115. if err != nil {
  116. return err
  117. } else if has == false {
  118. quota.Limit = query.Default
  119. }
  120. //get quota used.
  121. rawSql := fmt.Sprintf("SELECT COUNT(*) as count from %s where user_id=?", dialect.Quote(query.Target))
  122. resp := make([]*targetCount, 0)
  123. if err := x.Sql(rawSql, query.UserId).Find(&resp); err != nil {
  124. return err
  125. }
  126. query.Result = &m.UserQuotaDTO{
  127. Target: query.Target,
  128. Limit: quota.Limit,
  129. UserId: query.UserId,
  130. Used: resp[0].Count,
  131. }
  132. return nil
  133. }
  134. func GetUserQuotas(query *m.GetUserQuotasQuery) error {
  135. quotas := make([]*m.Quota, 0)
  136. sess := x.Table("quota")
  137. if err := sess.Where("user_id=? AND org_id=0", query.UserId).Find(&quotas); err != nil {
  138. return err
  139. }
  140. defaultQuotas := setting.Quota.User.ToMap()
  141. seenTargets := make(map[string]bool)
  142. for _, q := range quotas {
  143. seenTargets[q.Target] = true
  144. }
  145. for t, v := range defaultQuotas {
  146. if _, ok := seenTargets[t]; !ok {
  147. quotas = append(quotas, &m.Quota{
  148. UserId: query.UserId,
  149. Target: t,
  150. Limit: v,
  151. })
  152. }
  153. }
  154. result := make([]*m.UserQuotaDTO, len(quotas))
  155. for i, q := range quotas {
  156. //get quota used.
  157. rawSql := fmt.Sprintf("SELECT COUNT(*) as count from %s where user_id=?", dialect.Quote(q.Target))
  158. resp := make([]*targetCount, 0)
  159. if err := x.Sql(rawSql, q.UserId).Find(&resp); err != nil {
  160. return err
  161. }
  162. result[i] = &m.UserQuotaDTO{
  163. Target: q.Target,
  164. Limit: q.Limit,
  165. UserId: q.UserId,
  166. Used: resp[0].Count,
  167. }
  168. }
  169. query.Result = result
  170. return nil
  171. }
  172. func UpdateUserQuota(cmd *m.UpdateUserQuotaCmd) error {
  173. return inTransaction2(func(sess *session) error {
  174. //Check if quota is already defined in the DB
  175. quota := m.Quota{
  176. Target: cmd.Target,
  177. UserId: cmd.UserId,
  178. }
  179. has, err := sess.Get(&quota)
  180. if err != nil {
  181. return err
  182. }
  183. quota.Limit = cmd.Limit
  184. if has == false {
  185. //No quota in the DB for this target, so create a new one.
  186. if _, err := sess.Insert(&quota); err != nil {
  187. return err
  188. }
  189. } else {
  190. //update existing quota entry in the DB.
  191. if _, err := sess.Id(quota.Id).Update(&quota); err != nil {
  192. return err
  193. }
  194. }
  195. return nil
  196. })
  197. }
  198. func GetGlobalQuotaByTarget(query *m.GetGlobalQuotaByTargetQuery) error {
  199. //get quota used.
  200. rawSql := fmt.Sprintf("SELECT COUNT(*) as count from %s", dialect.Quote(query.Target))
  201. resp := make([]*targetCount, 0)
  202. if err := x.Sql(rawSql).Find(&resp); err != nil {
  203. return err
  204. }
  205. query.Result = &m.GlobalQuotaDTO{
  206. Target: query.Target,
  207. Limit: query.Default,
  208. Used: resp[0].Count,
  209. }
  210. return nil
  211. }