123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- // 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 (
- "reflect"
- "strings"
- "time"
- "github.com/go-xorm/core"
- )
- type incrParam struct {
- colName string
- arg interface{}
- }
- type decrParam struct {
- colName string
- arg interface{}
- }
- type exprParam struct {
- colName string
- expr string
- }
- type columnMap []string
- func (m columnMap) contain(colName string) bool {
- if len(m) == 0 {
- return false
- }
- n := len(colName)
- for _, mk := range m {
- if len(mk) != n {
- continue
- }
- if strings.EqualFold(mk, colName) {
- return true
- }
- }
- return false
- }
- func (m *columnMap) add(colName string) bool {
- if m.contain(colName) {
- return false
- }
- *m = append(*m, colName)
- return true
- }
- func setColumnInt(bean interface{}, col *core.Column, t int64) {
- v, err := col.ValueOf(bean)
- if err != nil {
- return
- }
- if v.CanSet() {
- switch v.Type().Kind() {
- case reflect.Int, reflect.Int64, reflect.Int32:
- v.SetInt(t)
- case reflect.Uint, reflect.Uint64, reflect.Uint32:
- v.SetUint(uint64(t))
- }
- }
- }
- func setColumnTime(bean interface{}, col *core.Column, t time.Time) {
- v, err := col.ValueOf(bean)
- if err != nil {
- return
- }
- if v.CanSet() {
- switch v.Type().Kind() {
- case reflect.Struct:
- v.Set(reflect.ValueOf(t).Convert(v.Type()))
- case reflect.Int, reflect.Int64, reflect.Int32:
- v.SetInt(t.Unix())
- case reflect.Uint, reflect.Uint64, reflect.Uint32:
- v.SetUint(uint64(t.Unix()))
- }
- }
- }
- func getFlagForColumn(m map[string]bool, col *core.Column) (val bool, has bool) {
- if len(m) == 0 {
- return false, false
- }
- n := len(col.Name)
- for mk := range m {
- if len(mk) != n {
- continue
- }
- if strings.EqualFold(mk, col.Name) {
- return m[mk], true
- }
- }
- return false, false
- }
- func col2NewCols(columns ...string) []string {
- newColumns := make([]string, 0, len(columns))
- for _, col := range columns {
- col = strings.Replace(col, "`", "", -1)
- col = strings.Replace(col, `"`, "", -1)
- ccols := strings.Split(col, ",")
- for _, c := range ccols {
- newColumns = append(newColumns, strings.TrimSpace(c))
- }
- }
- return newColumns
- }
- // Incr provides a query string like "count = count + 1"
- func (session *Session) Incr(column string, arg ...interface{}) *Session {
- session.statement.Incr(column, arg...)
- return session
- }
- // Decr provides a query string like "count = count - 1"
- func (session *Session) Decr(column string, arg ...interface{}) *Session {
- session.statement.Decr(column, arg...)
- return session
- }
- // SetExpr provides a query string like "column = {expression}"
- func (session *Session) SetExpr(column string, expression string) *Session {
- session.statement.SetExpr(column, expression)
- return session
- }
- // Select provides some columns to special
- func (session *Session) Select(str string) *Session {
- session.statement.Select(str)
- return session
- }
- // Cols provides some columns to special
- func (session *Session) Cols(columns ...string) *Session {
- session.statement.Cols(columns...)
- return session
- }
- // AllCols ask all columns
- func (session *Session) AllCols() *Session {
- session.statement.AllCols()
- return session
- }
- // MustCols specify some columns must use even if they are empty
- func (session *Session) MustCols(columns ...string) *Session {
- session.statement.MustCols(columns...)
- return session
- }
- // UseBool automatically retrieve condition according struct, but
- // if struct has bool field, it will ignore them. So use UseBool
- // to tell system to do not ignore them.
- // If no parameters, it will use all the bool field of struct, or
- // it will use parameters's columns
- func (session *Session) UseBool(columns ...string) *Session {
- session.statement.UseBool(columns...)
- return session
- }
- // Distinct use for distinct columns. Caution: when you are using cache,
- // distinct will not be cached because cache system need id,
- // but distinct will not provide id
- func (session *Session) Distinct(columns ...string) *Session {
- session.statement.Distinct(columns...)
- return session
- }
- // Omit Only not use the parameters as select or update columns
- func (session *Session) Omit(columns ...string) *Session {
- session.statement.Omit(columns...)
- return session
- }
- // Nullable Set null when column is zero-value and nullable for update
- func (session *Session) Nullable(columns ...string) *Session {
- session.statement.Nullable(columns...)
- return session
- }
- // NoAutoTime means do not automatically give created field and updated field
- // the current time on the current session temporarily
- func (session *Session) NoAutoTime() *Session {
- session.statement.UseAutoTime = false
- return session
- }
|