112 lines
2.9 KiB
Go
112 lines
2.9 KiB
Go
|
// Copyright 2022 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 statements
|
||
|
|
||
|
import (
|
||
|
"xorm.io/builder"
|
||
|
"xorm.io/xorm/schemas"
|
||
|
)
|
||
|
|
||
|
type QuoteReplacer struct {
|
||
|
*builder.BytesWriter
|
||
|
quoter schemas.Quoter
|
||
|
}
|
||
|
|
||
|
func (q *QuoteReplacer) Write(p []byte) (n int, err error) {
|
||
|
c := q.quoter.Replace(string(p))
|
||
|
return q.BytesWriter.Builder.WriteString(c)
|
||
|
}
|
||
|
|
||
|
func (statement *Statement) QuoteReplacer(w *builder.BytesWriter) *QuoteReplacer {
|
||
|
return &QuoteReplacer{
|
||
|
BytesWriter: w,
|
||
|
quoter: statement.dialect.Quoter(),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Where add Where statement
|
||
|
func (statement *Statement) Where(query interface{}, args ...interface{}) *Statement {
|
||
|
return statement.And(query, args...)
|
||
|
}
|
||
|
|
||
|
// And add Where & and statement
|
||
|
func (statement *Statement) And(query interface{}, args ...interface{}) *Statement {
|
||
|
switch qr := query.(type) {
|
||
|
case string:
|
||
|
cond := builder.Expr(qr, args...)
|
||
|
statement.cond = statement.cond.And(cond)
|
||
|
case map[string]interface{}:
|
||
|
cond := make(builder.Eq)
|
||
|
for k, v := range qr {
|
||
|
cond[statement.quote(k)] = v
|
||
|
}
|
||
|
statement.cond = statement.cond.And(cond)
|
||
|
case builder.Cond:
|
||
|
statement.cond = statement.cond.And(qr)
|
||
|
for _, v := range args {
|
||
|
if vv, ok := v.(builder.Cond); ok {
|
||
|
statement.cond = statement.cond.And(vv)
|
||
|
}
|
||
|
}
|
||
|
default:
|
||
|
statement.LastError = ErrConditionType
|
||
|
}
|
||
|
|
||
|
return statement
|
||
|
}
|
||
|
|
||
|
// Or add Where & Or statement
|
||
|
func (statement *Statement) Or(query interface{}, args ...interface{}) *Statement {
|
||
|
switch qr := query.(type) {
|
||
|
case string:
|
||
|
cond := builder.Expr(qr, args...)
|
||
|
statement.cond = statement.cond.Or(cond)
|
||
|
case map[string]interface{}:
|
||
|
cond := make(builder.Eq)
|
||
|
for k, v := range qr {
|
||
|
cond[statement.quote(k)] = v
|
||
|
}
|
||
|
statement.cond = statement.cond.Or(cond)
|
||
|
case builder.Cond:
|
||
|
statement.cond = statement.cond.Or(qr)
|
||
|
for _, v := range args {
|
||
|
if vv, ok := v.(builder.Cond); ok {
|
||
|
statement.cond = statement.cond.Or(vv)
|
||
|
}
|
||
|
}
|
||
|
default:
|
||
|
statement.LastError = ErrConditionType
|
||
|
}
|
||
|
return statement
|
||
|
}
|
||
|
|
||
|
// In generate "Where column IN (?) " statement
|
||
|
func (statement *Statement) In(column string, args ...interface{}) *Statement {
|
||
|
in := builder.In(statement.quote(column), args...)
|
||
|
statement.cond = statement.cond.And(in)
|
||
|
return statement
|
||
|
}
|
||
|
|
||
|
// NotIn generate "Where column NOT IN (?) " statement
|
||
|
func (statement *Statement) NotIn(column string, args ...interface{}) *Statement {
|
||
|
notIn := builder.NotIn(statement.quote(column), args...)
|
||
|
statement.cond = statement.cond.And(notIn)
|
||
|
return statement
|
||
|
}
|
||
|
|
||
|
// SetNoAutoCondition if you do not want convert bean's field as query condition, then use this function
|
||
|
func (statement *Statement) SetNoAutoCondition(no ...bool) *Statement {
|
||
|
statement.NoAutoCondition = true
|
||
|
if len(no) > 0 {
|
||
|
statement.NoAutoCondition = no[0]
|
||
|
}
|
||
|
return statement
|
||
|
}
|
||
|
|
||
|
// Conds returns condtions
|
||
|
func (statement *Statement) Conds() builder.Cond {
|
||
|
return statement.cond
|
||
|
}
|