Simple and Powerful ORM for Go, support mysql,postgres,tidb,sqlite3,sqlite,mssql,oracle,cockroach
https://xorm.io
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.7 KiB
143 lines
3.7 KiB
// 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" |
|
|
|
"xorm.io/xorm/schemas" |
|
) |
|
|
|
func setColumnInt(bean interface{}, col *schemas.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 *schemas.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 *schemas.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 |
|
} |
|
|
|
// 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 interface{}) *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 |
|
}
|
|
|