github.com/RevenueMonster/sqlike@v1.0.6/sql/instrumented/stmt.go (about) 1 package instrumented 2 3 import ( 4 "context" 5 "database/sql/driver" 6 ) 7 8 // Stmt : 9 type Stmt interface { 10 driver.Stmt 11 driver.StmtExecContext 12 driver.StmtQueryContext 13 } 14 15 type wrappedStmt struct { 16 ctx context.Context 17 itpr Interceptor 18 query string 19 stmt Stmt 20 } 21 22 var _ Stmt = (*wrappedStmt)(nil) 23 24 // Exec : 25 func (w wrappedStmt) Exec(args []driver.Value) (driver.Result, error) { 26 result, err := w.stmt.Exec(args) 27 if err != nil { 28 return nil, err 29 } 30 return wrappedResult{ctx: w.ctx, itpr: w.itpr, result: result}, nil 31 } 32 33 // ExecContext : 34 func (w wrappedStmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) { 35 result, err := w.itpr.StmtExecContext(ctx, w.stmt, w.query, args) 36 if err != nil { 37 return nil, err 38 } 39 return wrappedResult{ctx: ctx, itpr: w.itpr, result: result}, nil 40 } 41 42 // Query : 43 func (w wrappedStmt) Query(args []driver.Value) (driver.Rows, error) { 44 rows, err := w.stmt.Query(args) 45 if err != nil { 46 return nil, err 47 } 48 x, ok := rows.(Rows) 49 if !ok { 50 return nil, driver.ErrSkip 51 } 52 return wrappedRows{ctx: w.ctx, itpr: w.itpr, rows: x}, nil 53 } 54 55 // QueryContext : 56 func (w wrappedStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) { 57 rows, err := w.itpr.StmtQueryContext(ctx, w.stmt, w.query, args) 58 if err != nil { 59 return nil, err 60 } 61 x, ok := rows.(Rows) 62 if !ok { 63 return nil, driver.ErrSkip 64 } 65 return wrappedRows{ctx: ctx, itpr: w.itpr, rows: x}, nil 66 } 67 68 // NumInput : 69 func (w wrappedStmt) NumInput() int { 70 return w.stmt.NumInput() 71 } 72 73 // Close : 74 func (w wrappedStmt) Close() error { 75 return w.itpr.StmtClose(w.ctx, w.stmt) 76 }