session_exist.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. )
  11. // Exist returns true if the record exist otherwise return false
  12. func (session *Session) Exist(bean ...interface{}) (bool, error) {
  13. if session.isAutoClose {
  14. defer session.Close()
  15. }
  16. var sqlStr string
  17. var args []interface{}
  18. var err error
  19. if session.statement.RawSQL == "" {
  20. if len(bean) == 0 {
  21. tableName := session.statement.TableName()
  22. if len(tableName) <= 0 {
  23. return false, ErrTableNotFound
  24. }
  25. if session.statement.cond.IsValid() {
  26. condSQL, condArgs, err := builder.ToSQL(session.statement.cond)
  27. if err != nil {
  28. return false, err
  29. }
  30. sqlStr = fmt.Sprintf("SELECT * FROM %s WHERE %s LIMIT 1", tableName, condSQL)
  31. args = condArgs
  32. } else {
  33. sqlStr = fmt.Sprintf("SELECT * FROM %s LIMIT 1", tableName)
  34. args = []interface{}{}
  35. }
  36. } else {
  37. beanValue := reflect.ValueOf(bean[0])
  38. if beanValue.Kind() != reflect.Ptr {
  39. return false, errors.New("needs a pointer")
  40. }
  41. if beanValue.Elem().Kind() == reflect.Struct {
  42. if err := session.statement.setRefValue(beanValue.Elem()); err != nil {
  43. return false, err
  44. }
  45. }
  46. if len(session.statement.TableName()) <= 0 {
  47. return false, ErrTableNotFound
  48. }
  49. session.statement.Limit(1)
  50. sqlStr, args, err = session.statement.genGetSQL(bean[0])
  51. if err != nil {
  52. return false, err
  53. }
  54. }
  55. } else {
  56. sqlStr = session.statement.RawSQL
  57. args = session.statement.RawParams
  58. }
  59. rows, err := session.queryRows(sqlStr, args...)
  60. if err != nil {
  61. return false, err
  62. }
  63. defer rows.Close()
  64. return rows.Next(), nil
  65. }