Callback for tracing sql queries
This commit is contained in:
		
							parent
							
								
									0fbff1e8f0
								
							
						
					
					
						commit
						0cf74aa0e6
					
				
							
								
								
									
										13
									
								
								callback.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								callback.go
									
									
									
									
									
								
							@ -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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										3
									
								
								scope.go
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								scope.go
									
									
									
									
									
								
							@ -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...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user