// Copyright 2017 The Xorm Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package xorm import ( "errors" "fmt" "reflect" "xorm.io/builder" "xorm.io/core" ) // Exist returns true if the record exist otherwise return false func (session *Session) Exist(bean ...interface{}) (bool, error) { if session.isAutoClose { defer session.Close() } if session.statement.lastError != nil { return false, session.statement.lastError } var sqlStr string var args []interface{} var err error if session.statement.RawSQL == "" { if len(bean) == 0 { tableName := session.statement.TableName() if len(tableName) <= 0 { return false, ErrTableNotFound } tableName = session.statement.Engine.Quote(tableName) if session.statement.cond.IsValid() { condSQL, condArgs, err := builder.ToSQL(session.statement.cond) if err != nil { return false, err } if session.engine.dialect.DBType() == core.MSSQL { sqlStr = fmt.Sprintf("SELECT TOP 1 * FROM %s WHERE %s", tableName, condSQL) } else if session.engine.dialect.DBType() == core.ORACLE { sqlStr = fmt.Sprintf("SELECT * FROM %s WHERE (%s) AND ROWNUM=1", tableName, condSQL) } else { sqlStr = fmt.Sprintf("SELECT * FROM %s WHERE %s LIMIT 1", tableName, condSQL) } args = condArgs } else { if session.engine.dialect.DBType() == core.MSSQL { sqlStr = fmt.Sprintf("SELECT TOP 1 * FROM %s", tableName) } else if session.engine.dialect.DBType() == core.ORACLE { sqlStr = fmt.Sprintf("SELECT * FROM %s WHERE ROWNUM=1", tableName) } else { sqlStr = fmt.Sprintf("SELECT * FROM %s LIMIT 1", tableName) } args = []interface{}{} } } else { beanValue := reflect.ValueOf(bean[0]) if beanValue.Kind() != reflect.Ptr { return false, errors.New("needs a pointer") } if beanValue.Elem().Kind() == reflect.Struct { if err := session.statement.setRefBean(bean[0]); err != nil { return false, err } } if len(session.statement.TableName()) <= 0 { return false, ErrTableNotFound } session.statement.Limit(1) sqlStr, args, err = session.statement.genGetSQL(bean[0]) if err != nil { return false, err } } } else { sqlStr = session.statement.RawSQL args = session.statement.RawParams } rows, err := session.queryRows(sqlStr, args...) if err != nil { return false, err } defer rows.Close() return rows.Next(), nil }