Callback for tracing sql queries

This commit is contained in:
Sukharev Maxim 2016-12-27 14:05:04 +07:00
parent 0fbff1e8f0
commit 0cf74aa0e6
2 changed files with 15 additions and 1 deletions

View File

@ -13,6 +13,7 @@ var DefaultCallback = &Callback{}
// Field `deletes` contains callbacks will be call when deleting object // Field `deletes` contains callbacks will be call when deleting object
// Field `queries` contains callbacks will be call when querying object with query methods like Find, First, Related, Association... // Field `queries` contains callbacks will be call when querying object with query methods like Find, First, Related, Association...
// Field `rowQueries` contains callbacks will be call when querying object with Row, Rows... // Field `rowQueries` contains callbacks will be call when querying object with Row, Rows...
// Field `trace` contains callbacks will be call after any sql query was executed
// Field `processors` contains all callback processors, will be used to generate above callbacks in order // Field `processors` contains all callback processors, will be used to generate above callbacks in order
type Callback struct { type Callback struct {
creates []*func(scope *Scope) creates []*func(scope *Scope)
@ -20,6 +21,7 @@ type Callback struct {
deletes []*func(scope *Scope) deletes []*func(scope *Scope)
queries []*func(scope *Scope) queries []*func(scope *Scope)
rowQueries []*func(scope *Scope) rowQueries []*func(scope *Scope)
trace []*func(scope *Scope)
processors []*CallbackProcessor processors []*CallbackProcessor
} }
@ -43,6 +45,7 @@ func (c *Callback) clone() *Callback {
queries: c.queries, queries: c.queries,
rowQueries: c.rowQueries, rowQueries: c.rowQueries,
processors: c.processors, processors: c.processors,
trace: c.trace,
} }
} }
@ -79,6 +82,11 @@ func (c *Callback) RowQuery() *CallbackProcessor {
return &CallbackProcessor{kind: "row_query", parent: c} return &CallbackProcessor{kind: "row_query", parent: c}
} }
// Trace could be used to register callbacks for tracing sql queries, refer `Create` for usage
func (c *Callback) Trace() *CallbackProcessor {
return &CallbackProcessor{kind: "trace", parent: c}
}
// After insert a new callback after callback `callbackName`, refer `Callbacks.Create` // After insert a new callback after callback `callbackName`, refer `Callbacks.Create`
func (cp *CallbackProcessor) After(callbackName string) *CallbackProcessor { func (cp *CallbackProcessor) After(callbackName string) *CallbackProcessor {
cp.after = callbackName cp.after = callbackName
@ -210,7 +218,7 @@ func sortProcessors(cps []*CallbackProcessor) []*func(scope *Scope) {
// reorder all registered processors, and reset CURD callbacks // reorder all registered processors, and reset CURD callbacks
func (c *Callback) reorder() { func (c *Callback) reorder() {
var creates, updates, deletes, queries, rowQueries []*CallbackProcessor var creates, updates, deletes, queries, rowQueries, trace []*CallbackProcessor
for _, processor := range c.processors { for _, processor := range c.processors {
if processor.name != "" { if processor.name != "" {
@ -225,6 +233,8 @@ func (c *Callback) reorder() {
queries = append(queries, processor) queries = append(queries, processor)
case "row_query": case "row_query":
rowQueries = append(rowQueries, processor) rowQueries = append(rowQueries, processor)
case "trace":
trace = append(trace, processor)
} }
} }
} }
@ -234,4 +244,5 @@ func (c *Callback) reorder() {
c.deletes = sortProcessors(deletes) c.deletes = sortProcessors(deletes)
c.queries = sortProcessors(queries) c.queries = sortProcessors(queries)
c.rowQueries = sortProcessors(rowQueries) c.rowQueries = sortProcessors(rowQueries)
c.trace = sortProcessors(trace)
} }

View File

@ -947,6 +947,9 @@ func (scope *Scope) typeName() string {
// trace print sql log // trace print sql log
func (scope *Scope) trace(t time.Time) { func (scope *Scope) trace(t time.Time) {
scope.Set("gorm:trace-time", t)
scope.callCallbacks(scope.db.parent.callbacks.trace)
if len(scope.SQL) > 0 { if len(scope.SQL) > 0 {
scope.db.slog(scope.SQL, t, scope.SQLVars...) scope.db.slog(scope.SQL, t, scope.SQLVars...)
} }