Update search.go

This commit is contained in:
Jinzhu 2013-11-16 08:22:04 +08:00
parent 85109e104e
commit 2b4a4a06f0
2 changed files with 30 additions and 29 deletions

View File

@ -1,5 +1,7 @@
package gorm package gorm
import "strconv"
type search struct { type search struct {
conditions map[string][]interface{} conditions map[string][]interface{}
orders []string orders []string
@ -10,31 +12,31 @@ type search struct {
unscope bool unscope bool
} }
func (s search) addToCondition(typ string, value interface{}) { func (s *search) addToCondition(typ string, value interface{}) {
s.conditions[typ] = append(s.conditions[typ], value) s.conditions[typ] = append(s.conditions[typ], value)
} }
func (s search) where(query string, values ...interface{}) { func (s *search) where(query string, values ...interface{}) {
s.addToCondition("where", map[string]interface{}{"query": query, "args": values}) s.addToCondition("where", map[string]interface{}{"query": query, "args": values})
} }
func (s search) not(query string, values ...interface{}) { func (s *search) not(query string, values ...interface{}) {
s.addToCondition("not", map[string]interface{}{"query": query, "args": values}) s.addToCondition("not", map[string]interface{}{"query": query, "args": values})
} }
func (s search) or(query string, values ...interface{}) { func (s *search) or(query string, values ...interface{}) {
s.addToCondition("or", map[string]interface{}{"query": query, "args": values}) s.addToCondition("or", map[string]interface{}{"query": query, "args": values})
} }
func (s search) attrs(attrs ...interface{}) { func (s *search) attrs(attrs ...interface{}) {
s.addToCondition("attrs", toSearchableMap(attrs...)) s.addToCondition("attrs", toSearchableMap(attrs...))
} }
func (s search) assign(attrs ...interface{}) { func (s *search) assign(attrs ...interface{}) {
s.addToCondition("assign", toSearchableMap(attrs...)) s.addToCondition("assign", toSearchableMap(attrs...))
} }
func (s search) order(value string, reorder ...bool) { func (s *search) order(value string, reorder ...bool) {
if len(reorder) > 0 && reorder[0] { if len(reorder) > 0 && reorder[0] {
s.orders = []string{value} s.orders = []string{value}
} else { } else {
@ -42,24 +44,40 @@ func (s search) order(value string, reorder ...bool) {
} }
} }
func (s search) selects(value interface{}) { func (s *search) selects(value interface{}) {
if str, err := getInterfaceAsString(value); err == nil { if str, err := getInterfaceAsString(value); err == nil {
s.selectStr = str s.selectStr = str
} }
} }
func (s search) limit(value interface{}) { func (s *search) limit(value interface{}) {
if str, err := getInterfaceAsString(value); err == nil { if str, err := getInterfaceAsString(value); err == nil {
s.limitStr = str s.limitStr = str
} }
} }
func (s search) offset(value interface{}) { func (s *search) offset(value interface{}) {
if str, err := getInterfaceAsString(value); err == nil { if str, err := getInterfaceAsString(value); err == nil {
s.offsetStr = str s.offsetStr = str
} }
} }
func (s search) unscoped() { func (s *search) unscoped() {
s.unscope = true s.unscope = true
} }
func getInterfaceAsString(value interface{}) (str string, err error) {
switch value := value.(type) {
case string:
str = value
case int:
if value < 0 {
str = ""
} else {
str = strconv.Itoa(value)
}
default:
err = InvalidSql
}
return
}

View File

@ -3,8 +3,7 @@ package gorm
import ( import (
"bytes" "bytes"
"database/sql" "database/sql"
"errors"
"fmt"
"reflect" "reflect"
"strconv" "strconv"
"strings" "strings"
@ -50,22 +49,6 @@ func toSearchableMap(attrs ...interface{}) (result interface{}) {
return return
} }
func getInterfaceAsString(value interface{}) (str string, err error) {
switch value := value.(type) {
case string:
str = value
case int:
if value < 0 {
str = ""
} else {
str = strconv.Itoa(value)
}
default:
err = errors.New(fmt.Sprintf("Can't understand %v", value))
}
return
}
func setFieldValue(field reflect.Value, value interface{}) bool { func setFieldValue(field reflect.Value, value interface{}) bool {
if field.IsValid() && field.CanAddr() { if field.IsValid() && field.CanAddr() {
switch field.Kind() { switch field.Kind() {