package mysql import ( "context" "database/sql" "fmt" "time" // registers the MySQL driver with database/sql _ "github.com/go-sql-driver/mysql" ) type DB struct { sql *sql.DB } func Open(dsn string) (*DB, error) { if dsn == "" { return &DB{}, nil } sqlDB, err := sql.Open("mysql", dsn) if err != nil { return nil, fmt.Errorf("mysql open: %w", err) } sqlDB.SetMaxOpenConns(64) sqlDB.SetConnMaxLifetime(30 * time.Minute) ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() if err := sqlDB.PingContext(ctx); err != nil { _ = sqlDB.Close() return nil, fmt.Errorf("mysql ping: %w", err) } return &DB{sql: sqlDB}, nil } func (d *DB) SQL() *sql.DB { return d.sql } func (d *DB) Close() error { if d == nil || d.sql == nil { return nil } return d.sql.Close() } func (d *DB) Ready() bool { return d != nil && d.sql != nil }