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  }