quota.go 5.5 KB

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