improve scope.go

This commit is contained in:
Jinzhu 2014-01-26 13:51:23 +08:00
parent 34122c12d1
commit 79cacf7f09
2 changed files with 52 additions and 4 deletions

View File

@ -182,7 +182,7 @@ func (s *DB) Save(value interface{}) *DB {
} }
func (s *DB) Delete(value interface{}) *DB { func (s *DB) Delete(value interface{}) *DB {
return s.clone().do(value).begin().delete().commit_or_rollback().db return s.clone().newScope(value).callCallbacks(s.parent.callback.deletes).db
} }
func (s *DB) Raw(sql string, values ...interface{}) *DB { func (s *DB) Raw(sql string, values ...interface{}) *DB {

View File

@ -1,14 +1,32 @@
package gorm package gorm
import "github.com/jinzhu/gorm/dialect" import (
"errors"
"fmt"
"github.com/jinzhu/gorm/dialect"
"reflect"
)
type Scope struct { type Scope struct {
Value interface{}
Search *search Search *search
Sql string Sql string
SqlVars []interface{} SqlVars []interface{}
db *DB db *DB
} }
func (db *DB) newScope(value interface{}) *Scope {
return &Scope{db: db, Search: db.search, Value: value}
}
func (scope *Scope) callCallbacks(funcs []*func(s *Scope)) *Scope {
for _, f := range funcs {
(*f)(scope)
}
return scope
}
func (scope *Scope) DB() sqlCommon { func (scope *Scope) DB() sqlCommon {
return scope.db.db return scope.db.db
} }
@ -25,21 +43,50 @@ func (scope *Scope) Err(err error) error {
} }
func (scope *Scope) HasError() bool { func (scope *Scope) HasError() bool {
return true return scope.db.hasError()
} }
func (scope *Scope) PrimaryKey() string { func (scope *Scope) PrimaryKey() string {
return "" return "Id"
} }
func (scope *Scope) HasColumn(name string) bool { func (scope *Scope) HasColumn(name string) bool {
data := reflect.Indirect(reflect.ValueOf(scope.Value))
if data.Kind() == reflect.Struct {
return data.FieldByName(name).IsValid()
} else if data.Kind() == reflect.Slice {
return reflect.New(data.Type().Elem()).Elem().FieldByName(name).IsValid()
}
return false return false
} }
func (scope *Scope) SetColumn(column string, value interface{}) { func (scope *Scope) SetColumn(column string, value interface{}) {
data := reflect.Indirect(reflect.ValueOf(scope.Value))
setFieldValue(data.FieldByName(snakeToUpperCamel(column)), value)
} }
func (scope *Scope) CallMethod(name string) { func (scope *Scope) CallMethod(name string) {
if fm := reflect.ValueOf(scope.Value).MethodByName(name); fm.IsValid() {
fi := fm.Interface()
if f, ok := fi.(func()); ok {
f()
} else if f, ok := fi.(func(s *Scope)); ok {
f(scope)
} else if f, ok := fi.(func(s *DB)); ok {
f(scope.db.new())
} else if f, ok := fi.(func() error); ok {
scope.Err(f())
} else if f, ok := fi.(func(s *Scope) error); ok {
scope.Err(f(scope))
} else if f, ok := fi.(func(s *DB) error); ok {
scope.Err(f(scope.db.new()))
} else {
scope.Err(errors.New(fmt.Sprintf("unsupported function %v", name)))
}
} else {
scope.Err(errors.New(fmt.Sprintf("no valid function %v found", name)))
}
} }
func (scope *Scope) CombinedConditionSql() string { func (scope *Scope) CombinedConditionSql() string {
@ -55,6 +102,7 @@ func (scope *Scope) TableName() string {
} }
func (scope *Scope) Raw(sql string, values ...interface{}) { func (scope *Scope) Raw(sql string, values ...interface{}) {
fmt.Println(sql, values)
} }
func (scope *Scope) Exec() { func (scope *Scope) Exec() {