mirror of https://github.com/go-gorm/gorm.git
Add RowQuery callback
This commit is contained in:
parent
4fbc9d2a8f
commit
ef4299b398
10
callback.go
10
callback.go
|
@ -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{}}
|
||||||
|
|
|
@ -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
28
main.go
|
@ -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)
|
||||||
|
|
|
@ -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...)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue