Documentation
¶
Overview ¶
This example shows how to instrument sql queries in order to display the time that they consume package main
import (
"context" "database/sql" "fmt" "time" "github.com/gchaincl/sqlhooks" "github.com/mattn/go-sqlite3"
)
// Hooks satisfies the sqlhook.Hooks interface type Hooks struct {}
// Before hook will print the query with it's args and return the context with the timestamp
func (h *Hooks) Before(ctx context.Context, query string, args ...interface{}) (context.Context, error) { fmt.Printf("> %s %q", query, args) return context.WithValue(ctx, "begin", time.Now()), nil }
// After hook will get the timestamp registered on the Before hook and print the elapsed time
func (h *Hooks) After(ctx context.Context, query string, args ...interface{}) (context.Context, error) { begin := ctx.Value("begin").(time.Time) fmt.Printf(". took: %s\n", time.Since(begin)) return ctx, nil }
func main() { // First, register the wrapper sql.Register("sqlite3WithHooks", sqlhooks.Wrap(&sqlite3.SQLiteDriver{}, &Hooks{})) // Connect to the registered wrapped driver db, _ := sql.Open("sqlite3WithHooks", ":memory:") // Do you're stuff db.Exec("CREATE TABLE t (id INTEGER, text VARCHAR(16))") db.Exec("INSERT into t (text) VALUES(?), (?)", "foo", "bar") db.Query("SELECT id, text FROM t") }
/* Output should look like: > CREATE TABLE t (id INTEGER, text VARCHAR(16)) []. took: 121.238µs > INSERT into t (text) VALUES(?), (?) ["foo" "bar"]. took: 36.364µs > SELECT id, text FROM t []. took: 4.653µs */
Index ¶
- func Wrap(driver driver.Driver, hooks Hooks) driver.Driver
- type Conn
- type Driver
- type ErrorHook
- type ExecerContext
- type ExecerQueryerContext
- type ExecerQueryerContextWithSessionResetter
- type Hook
- type Hooks
- type MultipleErrors
- type OnErrorer
- type QueryerContext
- type SessionResetter
- type Stmt
- func (stmt *Stmt) Close() error
- func (stmt *Stmt) Exec(args []driver.Value) (driver.Result, error)
- func (stmt *Stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error)
- func (stmt *Stmt) NumInput() int
- func (stmt *Stmt) Query(args []driver.Value) (driver.Rows, error)
- func (stmt *Stmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error)
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Conn ¶
Conn implements a database/sql.driver.Conn
func (*Conn) CheckNamedValue ¶ added in v1.4.2
func (conn *Conn) CheckNamedValue(nv *driver.NamedValue) error
type ExecerContext ¶ added in v1.1.0
type ExecerContext struct {
*Conn
}
ExecerContext implements a database/sql.driver.ExecerContext
func (*ExecerContext) ExecContext ¶ added in v1.1.0
func (conn *ExecerContext) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error)
type ExecerQueryerContext ¶ added in v1.4.1
type ExecerQueryerContext struct { *Conn *ExecerContext *QueryerContext }
ExecerQueryerContext implements database/sql.driver.ExecerContext and database/sql.driver.QueryerContext
type ExecerQueryerContextWithSessionResetter ¶ added in v1.4.1
type ExecerQueryerContextWithSessionResetter struct { *Conn *ExecerContext *QueryerContext *SessionResetter }
ExecerQueryerContext implements database/sql.driver.ExecerContext and database/sql.driver.QueryerContext
type Hooks ¶
type Hooks interface { Before(ctx context.Context, query string, args ...interface{}) (context.Context, error) After(ctx context.Context, query string, args ...interface{}) (context.Context, error) }
Hooks instances may be passed to Wrap() to define an instrumented driver
func Compose ¶ added in v1.4.1
Compose allows for composing multiple Hooks into one. It runs every callback on every hook in argument order, even if previous hooks return an error. If multiple hooks return errors, the error return value will be MultipleErrors, which allows for introspecting the errors if necessary.
type MultipleErrors ¶ added in v1.4.1
type MultipleErrors []error
MultipleErrors is an error that contains multiple errors.
func (MultipleErrors) As ¶ added in v1.4.1
func (m MultipleErrors) As(target interface{}) bool
Is tries to convert each wrapped error to target with errors.As() and returns true that succeeds. If none of the errors are convertible, returns false.
func (MultipleErrors) Error ¶ added in v1.4.1
func (m MultipleErrors) Error() string
func (MultipleErrors) Is ¶ added in v1.4.1
func (m MultipleErrors) Is(target error) bool
Is returns true if any of the wrapped errors is target according to errors.Is()
type OnErrorer ¶ added in v1.1.0
type OnErrorer interface {
OnError(ctx context.Context, err error, query string, args ...interface{}) error
}
OnErrorer instances will be called if any error happens
type QueryerContext ¶ added in v1.4.1
type QueryerContext struct {
*Conn
}
QueryerContext implements a database/sql.driver.QueryerContext
func (*QueryerContext) QueryContext ¶ added in v1.4.1
func (conn *QueryerContext) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error)
type SessionResetter ¶ added in v1.4.1
type SessionResetter struct {
*Conn
}
func (*SessionResetter) ResetSession ¶ added in v1.4.1
func (s *SessionResetter) ResetSession(ctx context.Context) error
type Stmt ¶
Stmt implements a database/sql/driver.Stmt