Add RowQuery callback

This commit is contained in:
Jinzhu 2015-04-17 18:27:20 +08:00
parent 4fbc9d2a8f
commit ef4299b398
4 changed files with 30 additions and 20 deletions

View File

@ -9,6 +9,7 @@ type callback struct {
updates []*func(scope *Scope) updates []*func(scope *Scope)
deletes []*func(scope *Scope) deletes []*func(scope *Scope)
queries []*func(scope *Scope) queries []*func(scope *Scope)
rowQueries []*func(scope *Scope)
processors []*callbackProcessor processors []*callbackProcessor
} }
@ -55,6 +56,10 @@ func (c *callback) Query() *callbackProcessor {
return c.addProcessor("query") return c.addProcessor("query")
} }
func (c *callback) RowQuery() *callbackProcessor {
return c.addProcessor("row_query")
}
func (cp *callbackProcessor) Before(name string) *callbackProcessor { func (cp *callbackProcessor) Before(name string) *callbackProcessor {
cp.before = name cp.before = name
return cp return cp
@ -168,7 +173,7 @@ func sortProcessors(cps []*callbackProcessor) []*func(scope *Scope) {
} }
func (c *callback) sort() { func (c *callback) sort() {
creates, updates, deletes, queries := []*callbackProcessor{}, []*callbackProcessor{}, []*callbackProcessor{}, []*callbackProcessor{} var creates, updates, deletes, queries, rowQueries []*callbackProcessor
for _, processor := range c.processors { for _, processor := range c.processors {
switch processor.typ { switch processor.typ {
@ -180,6 +185,8 @@ func (c *callback) sort() {
deletes = append(deletes, processor) deletes = append(deletes, processor)
case "query": case "query":
queries = append(queries, processor) queries = append(queries, processor)
case "row_query":
rowQueries = append(rowQueries, processor)
} }
} }
@ -187,6 +194,7 @@ func (c *callback) sort() {
c.updates = sortProcessors(updates) c.updates = sortProcessors(updates)
c.deletes = sortProcessors(deletes) c.deletes = sortProcessors(deletes)
c.queries = sortProcessors(queries) c.queries = sortProcessors(queries)
c.rowQueries = sortProcessors(rowQueries)
} }
var DefaultCallback = &callback{processors: []*callbackProcessor{}} var DefaultCallback = &callback{processors: []*callbackProcessor{}}

View File

@ -16,17 +16,17 @@ func Query(scope *Scope) {
destType reflect.Type destType reflect.Type
) )
var dest = scope.IndirectValue()
if value, ok := scope.InstanceGet("gorm:query_destination"); ok {
dest = reflect.Indirect(reflect.ValueOf(value))
}
if orderBy, ok := scope.Get("gorm:order_by_primary_key"); ok { if orderBy, ok := scope.Get("gorm:order_by_primary_key"); ok {
if primaryKey := scope.PrimaryKey(); primaryKey != "" { if primaryKey := scope.PrimaryKey(); primaryKey != "" {
scope.Search.Order(fmt.Sprintf("%v.%v %v", scope.QuotedTableName(), primaryKey, orderBy)) scope.Search.Order(fmt.Sprintf("%v.%v %v", scope.QuotedTableName(), primaryKey, orderBy))
} }
} }
var dest = scope.IndirectValue()
if value, ok := scope.InstanceGet("gorm:query_destination"); ok {
dest = reflect.Indirect(reflect.ValueOf(value))
}
if kind := dest.Kind(); kind == reflect.Slice { if kind := dest.Kind(); kind == reflect.Slice {
isSlice = true isSlice = true
destType = dest.Type().Elem() destType = dest.Type().Elem()

28
main.go
View File

@ -211,6 +211,10 @@ func (s *DB) Find(out interface{}, where ...interface{}) *DB {
return s.clone().NewScope(out).inlineCondition(where...).callCallbacks(s.parent.callback.queries).db return s.clone().NewScope(out).inlineCondition(where...).callCallbacks(s.parent.callback.queries).db
} }
func (s *DB) Scan(dest interface{}) *DB {
return s.clone().NewScope(s.Value).InstanceSet("gorm:query_destination", dest).callCallbacks(s.parent.callback.queries).db
}
func (s *DB) Row() *sql.Row { func (s *DB) Row() *sql.Row {
return s.NewScope(s.Value).row() return s.NewScope(s.Value).row()
} }
@ -219,8 +223,16 @@ func (s *DB) Rows() (*sql.Rows, error) {
return s.NewScope(s.Value).rows() return s.NewScope(s.Value).rows()
} }
func (s *DB) Scan(dest interface{}) *DB { func (s *DB) Pluck(column string, value interface{}) *DB {
return s.clone().NewScope(s.Value).InstanceSet("gorm:query_destination", dest).callCallbacks(s.parent.callback.queries).db return s.NewScope(s.Value).pluck(column, value).db
}
func (s *DB) Count(value interface{}) *DB {
return s.NewScope(s.Value).count(value).db
}
func (s *DB) Related(value interface{}, foreignKeys ...string) *DB {
return s.clone().NewScope(s.Value).related(value, foreignKeys...).db
} }
func (s *DB) FirstOrInit(out interface{}, where ...interface{}) *DB { func (s *DB) FirstOrInit(out interface{}, where ...interface{}) *DB {
@ -307,18 +319,6 @@ func (s *DB) Model(value interface{}) *DB {
return c return c
} }
func (s *DB) Related(value interface{}, foreignKeys ...string) *DB {
return s.clone().NewScope(s.Value).related(value, foreignKeys...).db
}
func (s *DB) Pluck(column string, value interface{}) *DB {
return s.NewScope(s.Value).pluck(column, value).db
}
func (s *DB) Count(value interface{}) *DB {
return s.NewScope(s.Value).count(value).db
}
func (s *DB) Table(name string) *DB { func (s *DB) Table(name string) *DB {
clone := s.clone() clone := s.clone()
clone.search.Table(name) clone.search.Table(name)

View File

@ -336,12 +336,14 @@ func (scope *Scope) updatedAttrsWithValues(values map[string]interface{}, ignore
func (scope *Scope) row() *sql.Row { func (scope *Scope) row() *sql.Row {
defer scope.Trace(NowFunc()) defer scope.Trace(NowFunc())
scope.callCallbacks(scope.db.parent.callback.rowQueries)
scope.prepareQuerySql() scope.prepareQuerySql()
return scope.SqlDB().QueryRow(scope.Sql, scope.SqlVars...) return scope.SqlDB().QueryRow(scope.Sql, scope.SqlVars...)
} }
func (scope *Scope) rows() (*sql.Rows, error) { func (scope *Scope) rows() (*sql.Rows, error) {
defer scope.Trace(NowFunc()) defer scope.Trace(NowFunc())
scope.callCallbacks(scope.db.parent.callback.rowQueries)
scope.prepareQuerySql() scope.prepareQuerySql()
return scope.SqlDB().Query(scope.Sql, scope.SqlVars...) return scope.SqlDB().Query(scope.Sql, scope.SqlVars...)
} }