1package db23import (4 "context"5 "database/sql"6 "strings"78 "github.com/charmbracelet/log/v2"9 "github.com/jmoiron/sqlx"10)1112func trace(l *log.Logger, query string, args ...interface{}) {13 if l != nil {14 // Remove newlines and tabs15 query = strings.ReplaceAll(query, "\t", "")16 query = strings.TrimSpace(query)17 l.Debug("trace", "query", query, "args", args)18 }19}2021// Select is a wrapper around sqlx.Select that logs the query and arguments.22func (d *DB) Select(dest interface{}, query string, args ...interface{}) error {23 trace(d.logger, query, args...)24 return d.DB.Select(dest, query, args...)25}2627// Get is a wrapper around sqlx.Get that logs the query and arguments.28func (d *DB) Get(dest interface{}, query string, args ...interface{}) error {29 trace(d.logger, query, args...)30 return d.DB.Get(dest, query, args...)31}3233// Queryx is a wrapper around sqlx.Queryx that logs the query and arguments.34func (d *DB) Queryx(query string, args ...interface{}) (*sqlx.Rows, error) {35 trace(d.logger, query, args...)36 return d.DB.Queryx(query, args...)37}3839// QueryRowx is a wrapper around sqlx.QueryRowx that logs the query and arguments.40func (d *DB) QueryRowx(query string, args ...interface{}) *sqlx.Row {41 trace(d.logger, query, args...)42 return d.DB.QueryRowx(query, args...)43}4445// Exec is a wrapper around sqlx.Exec that logs the query and arguments.46func (d *DB) Exec(query string, args ...interface{}) (sql.Result, error) {47 trace(d.logger, query, args...)48 return d.DB.Exec(query, args...)49}5051// SelectContext is a wrapper around sqlx.SelectContext that logs the query and arguments.52func (d *DB) SelectContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error {53 trace(d.logger, query, args...)54 return d.DB.SelectContext(ctx, dest, query, args...)55}5657// GetContext is a wrapper around sqlx.GetContext that logs the query and arguments.58func (d *DB) GetContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error {59 trace(d.logger, query, args...)60 return d.DB.GetContext(ctx, dest, query, args...)61}6263// QueryxContext is a wrapper around sqlx.QueryxContext that logs the query and arguments.64func (d *DB) QueryxContext(ctx context.Context, query string, args ...interface{}) (*sqlx.Rows, error) {65 trace(d.logger, query, args...)66 return d.DB.QueryxContext(ctx, query, args...)67}6869// QueryRowxContext is a wrapper around sqlx.QueryRowxContext that logs the query and arguments.70func (d *DB) QueryRowxContext(ctx context.Context, query string, args ...interface{}) *sqlx.Row {71 trace(d.logger, query, args...)72 return d.DB.QueryRowxContext(ctx, query, args...)73}7475// ExecContext is a wrapper around sqlx.ExecContext that logs the query and arguments.76func (d *DB) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) {77 trace(d.logger, query, args...)78 return d.DB.ExecContext(ctx, query, args...)79}8081// Select is a wrapper around sqlx.Select that logs the query and arguments.82func (t *Tx) Select(dest interface{}, query string, args ...interface{}) error {83 trace(t.logger, query, args...)84 return t.Tx.Select(dest, query, args...)85}8687// Get is a wrapper around sqlx.Get that logs the query and arguments.88func (t *Tx) Get(dest interface{}, query string, args ...interface{}) error {89 trace(t.logger, query, args...)90 return t.Tx.Get(dest, query, args...)91}9293// Queryx is a wrapper around sqlx.Queryx that logs the query and arguments.94func (t *Tx) Queryx(query string, args ...interface{}) (*sqlx.Rows, error) {95 trace(t.logger, query, args...)96 return t.Tx.Queryx(query, args...)97}9899// QueryRowx is a wrapper around sqlx.QueryRowx that logs the query and arguments.100func (t *Tx) QueryRowx(query string, args ...interface{}) *sqlx.Row {101 trace(t.logger, query, args...)102 return t.Tx.QueryRowx(query, args...)103}104105// Exec is a wrapper around sqlx.Exec that logs the query and arguments.106func (t *Tx) Exec(query string, args ...interface{}) (sql.Result, error) {107 trace(t.logger, query, args...)108 return t.Tx.Exec(query, args...)109}110111// SelectContext is a wrapper around sqlx.SelectContext that logs the query and arguments.112func (t *Tx) SelectContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error {113 trace(t.logger, query, args...)114 return t.Tx.SelectContext(ctx, dest, query, args...)115}116117// GetContext is a wrapper around sqlx.GetContext that logs the query and arguments.118func (t *Tx) GetContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error {119 trace(t.logger, query, args...)120 return t.Tx.GetContext(ctx, dest, query, args...)121}122123// QueryxContext is a wrapper around sqlx.QueryxContext that logs the query and arguments.124func (t *Tx) QueryxContext(ctx context.Context, query string, args ...interface{}) (*sqlx.Rows, error) {125 trace(t.logger, query, args...)126 return t.Tx.QueryxContext(ctx, query, args...)127}128129// QueryRowxContext is a wrapper around sqlx.QueryRowxContext that logs the query and arguments.130func (t *Tx) QueryRowxContext(ctx context.Context, query string, args ...interface{}) *sqlx.Row {131 trace(t.logger, query, args...)132 return t.Tx.QueryRowxContext(ctx, query, args...)133}134135// ExecContext is a wrapper around sqlx.ExecContext that logs the query and arguments.136func (t *Tx) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) {137 trace(t.logger, query, args...)138 return t.Tx.ExecContext(ctx, query, args...)139}