summaryrefslogtreecommitdiffstats
path: root/vendor/xorm.io/xorm/rows.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/xorm.io/xorm/rows.go')
-rw-r--r--vendor/xorm.io/xorm/rows.go49
1 files changed, 43 insertions, 6 deletions
diff --git a/vendor/xorm.io/xorm/rows.go b/vendor/xorm.io/xorm/rows.go
index bdd44589f8..a56ea1c9e6 100644
--- a/vendor/xorm.io/xorm/rows.go
+++ b/vendor/xorm.io/xorm/rows.go
@@ -6,10 +6,13 @@ package xorm
import (
"database/sql"
+ "errors"
"fmt"
"reflect"
- "xorm.io/core"
+ "xorm.io/builder"
+ "xorm.io/xorm/core"
+ "xorm.io/xorm/internal/utils"
)
// Rows rows wrapper a rows to
@@ -29,7 +32,14 @@ func newRows(session *Session, bean interface{}) (*Rows, error) {
var args []interface{}
var err error
- if err = rows.session.statement.setRefBean(bean); err != nil {
+ beanValue := reflect.ValueOf(bean)
+ if beanValue.Kind() != reflect.Ptr {
+ return nil, errors.New("needs a pointer to a value")
+ } else if beanValue.Elem().Kind() == reflect.Ptr {
+ return nil, errors.New("a pointer to a pointer is not allowed")
+ }
+
+ if err = rows.session.statement.SetRefBean(bean); err != nil {
return nil, err
}
@@ -38,12 +48,39 @@ func newRows(session *Session, bean interface{}) (*Rows, error) {
}
if rows.session.statement.RawSQL == "" {
- sqlStr, args, err = rows.session.statement.genGetSQL(bean)
+ var autoCond builder.Cond
+ var addedTableName = (len(session.statement.JoinStr) > 0)
+ var table = rows.session.statement.RefTable
+
+ if !session.statement.NoAutoCondition {
+ var err error
+ autoCond, err = session.statement.BuildConds(table, bean, true, true, false, true, addedTableName)
+ if err != nil {
+ return nil, err
+ }
+ } else {
+ // !oinume! Add "<col> IS NULL" to WHERE whatever condiBean is given.
+ // See https://gitea.com/xorm/xorm/issues/179
+ if col := table.DeletedColumn(); col != nil && !session.statement.GetUnscoped() { // tag "deleted" is enabled
+ var colName = session.engine.Quote(col.Name)
+ if addedTableName {
+ var nm = session.statement.TableName()
+ if len(session.statement.TableAlias) > 0 {
+ nm = session.statement.TableAlias
+ }
+ colName = session.engine.Quote(nm) + "." + colName
+ }
+
+ autoCond = session.statement.CondDeleted(col)
+ }
+ }
+
+ sqlStr, args, err = rows.session.statement.GenFindSQL(autoCond)
if err != nil {
return nil, err
}
} else {
- sqlStr = rows.session.statement.RawSQL
+ sqlStr = rows.session.statement.GenRawSQL()
args = rows.session.statement.RawParams
}
@@ -84,7 +121,7 @@ func (rows *Rows) Scan(bean interface{}) error {
return fmt.Errorf("scan arg is incompatible type to [%v]", rows.beanType)
}
- if err := rows.session.statement.setRefBean(bean); err != nil {
+ if err := rows.session.statement.SetRefBean(bean); err != nil {
return err
}
@@ -98,7 +135,7 @@ func (rows *Rows) Scan(bean interface{}) error {
return err
}
- dataStruct := rValue(bean)
+ dataStruct := utils.ReflectValue(bean)
_, err = rows.session.slice2Bean(scanResults, fields, bean, &dataStruct, rows.session.statement.RefTable)
if err != nil {
return err