session_exist.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // Copyright 2017 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. "errors"
  7. "fmt"
  8. "reflect"
  9. "github.com/go-xorm/builder"
  10. "github.com/xormplus/core"
  11. )
  12. // Exist returns true if the record exist otherwise return false
  13. func (session *Session) Exist(bean ...interface{}) (bool, error) {
  14. defer session.resetStatement()
  15. if session.IsAutoClose {
  16. defer session.Close()
  17. }
  18. var sqlStr string
  19. var args []interface{}
  20. var err error
  21. if session.Statement.RawSQL == "" {
  22. if len(bean) == 0 {
  23. tableName := session.Statement.TableName()
  24. if len(tableName) <= 0 {
  25. return false, ErrTableNotFound
  26. }
  27. if session.Statement.cond.IsValid() {
  28. condSQL, condArgs, err := builder.ToSQL(session.Statement.cond)
  29. if err != nil {
  30. return false, err
  31. }
  32. sqlStr = fmt.Sprintf("SELECT * FROM %s WHERE %s LIMIT 1", tableName, condSQL)
  33. args = condArgs
  34. } else {
  35. sqlStr = fmt.Sprintf("SELECT * FROM %s LIMIT 1", tableName)
  36. args = []interface{}{}
  37. }
  38. } else {
  39. beanValue := reflect.ValueOf(bean[0])
  40. if beanValue.Kind() != reflect.Ptr {
  41. return false, errors.New("needs a pointer")
  42. }
  43. if beanValue.Elem().Kind() == reflect.Struct {
  44. if err := session.Statement.setRefValue(beanValue.Elem()); err != nil {
  45. return false, err
  46. }
  47. }
  48. if len(session.Statement.TableName()) <= 0 {
  49. return false, ErrTableNotFound
  50. }
  51. session.Statement.Limit(1)
  52. sqlStr, args, err = session.Statement.genGetSQL(bean[0])
  53. if err != nil {
  54. return false, err
  55. }
  56. }
  57. } else {
  58. sqlStr = session.Statement.RawSQL
  59. args = session.Statement.RawParams
  60. }
  61. session.queryPreprocess(&sqlStr, args...)
  62. var rawRows *core.Rows
  63. if session.IsAutoCommit {
  64. _, rawRows, err = session.innerQuery(sqlStr, args...)
  65. } else {
  66. rawRows, err = session.Tx.Query(sqlStr, args...)
  67. }
  68. if err != nil {
  69. return false, err
  70. }
  71. defer rawRows.Close()
  72. return rawRows.Next(), nil
  73. }