session_stats.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // Copyright 2016 The Xorm Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package xorm
  5. import (
  6. "database/sql"
  7. "errors"
  8. "reflect"
  9. )
  10. // Count counts the records. bean's non-empty fields
  11. // are conditions.
  12. func (session *Session) Count(bean ...interface{}) (int64, error) {
  13. defer session.resetStatement()
  14. if session.isAutoClose {
  15. defer session.Close()
  16. }
  17. var sqlStr string
  18. var args []interface{}
  19. var err error
  20. if session.statement.RawSQL == "" {
  21. sqlStr, args, err = session.statement.genCountSQL(bean...)
  22. if err != nil {
  23. return 0, err
  24. }
  25. } else {
  26. sqlStr = session.statement.RawSQL
  27. args = session.statement.RawParams
  28. }
  29. session.queryPreprocess(&sqlStr, args...)
  30. var total int64
  31. if session.isAutoCommit {
  32. err = session.DB().QueryRow(sqlStr, args...).Scan(&total)
  33. } else {
  34. err = session.tx.QueryRow(sqlStr, args...).Scan(&total)
  35. }
  36. if err == sql.ErrNoRows || err == nil {
  37. return total, nil
  38. }
  39. return 0, err
  40. }
  41. // sum call sum some column. bean's non-empty fields are conditions.
  42. func (session *Session) sum(res interface{}, bean interface{}, columnNames ...string) error {
  43. defer session.resetStatement()
  44. if session.isAutoClose {
  45. defer session.Close()
  46. }
  47. v := reflect.ValueOf(res)
  48. if v.Kind() != reflect.Ptr {
  49. return errors.New("need a pointer to a variable")
  50. }
  51. var isSlice = v.Elem().Kind() == reflect.Slice
  52. var sqlStr string
  53. var args []interface{}
  54. var err error
  55. if len(session.statement.RawSQL) == 0 {
  56. sqlStr, args, err = session.statement.genSumSQL(bean, columnNames...)
  57. if err != nil {
  58. return err
  59. }
  60. } else {
  61. sqlStr = session.statement.RawSQL
  62. args = session.statement.RawParams
  63. }
  64. session.queryPreprocess(&sqlStr, args...)
  65. if isSlice {
  66. if session.isAutoCommit {
  67. err = session.DB().QueryRow(sqlStr, args...).ScanSlice(res)
  68. } else {
  69. err = session.tx.QueryRow(sqlStr, args...).ScanSlice(res)
  70. }
  71. } else {
  72. if session.isAutoCommit {
  73. err = session.DB().QueryRow(sqlStr, args...).Scan(res)
  74. } else {
  75. err = session.tx.QueryRow(sqlStr, args...).Scan(res)
  76. }
  77. }
  78. if err == sql.ErrNoRows || err == nil {
  79. return nil
  80. }
  81. return err
  82. }
  83. // Sum call sum some column. bean's non-empty fields are conditions.
  84. func (session *Session) Sum(bean interface{}, columnName string) (res float64, err error) {
  85. return res, session.sum(&res, bean, columnName)
  86. }
  87. // SumInt call sum some column. bean's non-empty fields are conditions.
  88. func (session *Session) SumInt(bean interface{}, columnName string) (res int64, err error) {
  89. return res, session.sum(&res, bean, columnName)
  90. }
  91. // Sums call sum some columns. bean's non-empty fields are conditions.
  92. func (session *Session) Sums(bean interface{}, columnNames ...string) ([]float64, error) {
  93. var res = make([]float64, len(columnNames), len(columnNames))
  94. return res, session.sum(&res, bean, columnNames...)
  95. }
  96. // SumsInt sum specify columns and return as []int64 instead of []float64
  97. func (session *Session) SumsInt(bean interface{}, columnNames ...string) ([]int64, error) {
  98. var res = make([]int64, len(columnNames), len(columnNames))
  99. return res, session.sum(&res, bean, columnNames...)
  100. }