Documentation
¶
Overview ¶
Package sql wraps a database/sql driver so calls are subject to chaos. Register a chaos driver name that points at an existing registered driver, then sql.Open chaos name.
Example:
chaossql.Register("chaos:postgres", "postgres", eng)
db, _ := sql.Open("chaos:postgres", dsn)
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Register ¶
Register registers a driver that wraps wrappedDriverName with chaos. The wrapped driver must already be registered with database/sql. Subsequent calls to sql.Open(driverName, dsn) get chaos-wrapped driver.
Panics if driverName is already registered (per database/sql semantics).
Example ¶
//go:build !chaos_off
package main
import (
"context"
"database/sql"
"errors"
"fmt"
chaossql "github.com/RomanAgaltsev/chaotic/adapter/sql"
"github.com/RomanAgaltsev/chaotic/engine"
"github.com/RomanAgaltsev/chaotic/fault"
)
func init() { sql.Register("example-fake", fakeDriver{}) }
func main() {
eng := engine.New().AddRule(engine.NewRule(
engine.MatchKind(engine.OpSQL),
engine.Times(1),
engine.WithFault(fault.Error(errors.New("deadlock detected"))),
).Named("db-flap"))
// Wrap the already-registered "example-fake" driver with chaos.
chaossql.Register("chaos:example-fake", "example-fake", eng)
db, err := sql.Open("chaos:example-fake", "")
if err != nil {
fmt.Println("open:", err)
return
}
defer db.Close()
_, err1 := db.ExecContext(context.Background(), "UPDATE accounts SET balance = balance - 1")
fmt.Println("exec 1 error:", err1)
_, err2 := db.ExecContext(context.Background(), "UPDATE accounts SET balance = balance - 1")
fmt.Println("exec 2 error:", err2)
}
Output: exec 1 error: deadlock detected exec 2 error: <nil>
Types ¶
This section is empty.
Click to show internal directories.
Click to hide internal directories.