session_stats.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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 "database/sql"
  6. // Count counts the records. bean's non-empty fields
  7. // are conditions.
  8. func (session *Session) Count(bean ...interface{}) (int64, error) {
  9. defer session.resetStatement()
  10. if session.IsAutoClose {
  11. defer session.Close()
  12. }
  13. var sqlStr string
  14. var args []interface{}
  15. var err error
  16. if session.Statement.RawSQL == "" {
  17. sqlStr, args, err = session.Statement.genCountSQL(bean...)
  18. if err != nil {
  19. return 0, err
  20. }
  21. } else {
  22. sqlStr = session.Statement.RawSQL
  23. args = session.Statement.RawParams
  24. }
  25. session.queryPreprocess(&sqlStr, args...)
  26. var total int64
  27. if session.IsAutoCommit {
  28. err = session.DB().QueryRow(sqlStr, args...).Scan(&total)
  29. } else {
  30. err = session.Tx.QueryRow(sqlStr, args...).Scan(&total)
  31. }
  32. if err == sql.ErrNoRows || err == nil {
  33. return total, nil
  34. }
  35. return 0, err
  36. }
  37. // Sum call sum some column. bean's non-empty fields are conditions.
  38. func (session *Session) Sum(bean interface{}, columnName string) (float64, error) {
  39. defer session.resetStatement()
  40. if session.IsAutoClose {
  41. defer session.Close()
  42. }
  43. var sqlStr string
  44. var args []interface{}
  45. var err error
  46. if len(session.Statement.RawSQL) == 0 {
  47. sqlStr, args, err = session.Statement.genSumSQL(bean, columnName)
  48. if err != nil {
  49. return 0, err
  50. }
  51. } else {
  52. sqlStr = session.Statement.RawSQL
  53. args = session.Statement.RawParams
  54. }
  55. session.queryPreprocess(&sqlStr, args...)
  56. var res float64
  57. if session.IsAutoCommit {
  58. err = session.DB().QueryRow(sqlStr, args...).Scan(&res)
  59. } else {
  60. err = session.Tx.QueryRow(sqlStr, args...).Scan(&res)
  61. }
  62. if err == sql.ErrNoRows || err == nil {
  63. return res, nil
  64. }
  65. return 0, err
  66. }
  67. // SumInt call sum some column. bean's non-empty fields are conditions.
  68. func (session *Session) SumInt(bean interface{}, columnName string) (int64, error) {
  69. defer session.resetStatement()
  70. if session.IsAutoClose {
  71. defer session.Close()
  72. }
  73. var sqlStr string
  74. var args []interface{}
  75. var err error
  76. if len(session.Statement.RawSQL) == 0 {
  77. sqlStr, args, err = session.Statement.genSumSQL(bean, columnName)
  78. if err != nil {
  79. return 0, err
  80. }
  81. } else {
  82. sqlStr = session.Statement.RawSQL
  83. args = session.Statement.RawParams
  84. }
  85. session.queryPreprocess(&sqlStr, args...)
  86. var res int64
  87. if session.IsAutoCommit {
  88. err = session.DB().QueryRow(sqlStr, args...).Scan(&res)
  89. } else {
  90. err = session.Tx.QueryRow(sqlStr, args...).Scan(&res)
  91. }
  92. if err == sql.ErrNoRows || err == nil {
  93. return res, nil
  94. }
  95. return 0, err
  96. }
  97. // Sums call sum some columns. bean's non-empty fields are conditions.
  98. func (session *Session) Sums(bean interface{}, columnNames ...string) ([]float64, error) {
  99. defer session.resetStatement()
  100. if session.IsAutoClose {
  101. defer session.Close()
  102. }
  103. var sqlStr string
  104. var args []interface{}
  105. var err error
  106. if len(session.Statement.RawSQL) == 0 {
  107. sqlStr, args, err = session.Statement.genSumSQL(bean, columnNames...)
  108. if err != nil {
  109. return nil, err
  110. }
  111. } else {
  112. sqlStr = session.Statement.RawSQL
  113. args = session.Statement.RawParams
  114. }
  115. session.queryPreprocess(&sqlStr, args...)
  116. var res = make([]float64, len(columnNames), len(columnNames))
  117. if session.IsAutoCommit {
  118. err = session.DB().QueryRow(sqlStr, args...).ScanSlice(&res)
  119. } else {
  120. err = session.Tx.QueryRow(sqlStr, args...).ScanSlice(&res)
  121. }
  122. if err == sql.ErrNoRows || err == nil {
  123. return res, nil
  124. }
  125. return nil, err
  126. }
  127. // SumsInt sum specify columns and return as []int64 instead of []float64
  128. func (session *Session) SumsInt(bean interface{}, columnNames ...string) ([]int64, error) {
  129. defer session.resetStatement()
  130. if session.IsAutoClose {
  131. defer session.Close()
  132. }
  133. var sqlStr string
  134. var args []interface{}
  135. var err error
  136. if len(session.Statement.RawSQL) == 0 {
  137. sqlStr, args, err = session.Statement.genSumSQL(bean, columnNames...)
  138. if err != nil {
  139. return nil, err
  140. }
  141. } else {
  142. sqlStr = session.Statement.RawSQL
  143. args = session.Statement.RawParams
  144. }
  145. session.queryPreprocess(&sqlStr, args...)
  146. var res = make([]int64, len(columnNames), len(columnNames))
  147. if session.IsAutoCommit {
  148. err = session.DB().QueryRow(sqlStr, args...).ScanSlice(&res)
  149. } else {
  150. err = session.Tx.QueryRow(sqlStr, args...).ScanSlice(&res)
  151. }
  152. if err == sql.ErrNoRows || err == nil {
  153. return res, nil
  154. }
  155. return nil, err
  156. }