Unistore Chore: Make it easier to implement DB interface (#94680)

make it easier to implement DB interface
This commit is contained in:
Diego Augusto Molina
2024-10-16 13:40:35 -03:00
committed by GitHub
parent bd321216db
commit 44282134da
4 changed files with 185 additions and 180 deletions
+10 -41
View File
@@ -3,62 +3,31 @@ package dbimpl
import (
"context"
"database/sql"
"fmt"
"strings"
"github.com/grafana/grafana/pkg/storage/unified/sql/db"
)
// NewDB converts a *sql.DB to a db.DB.
func NewDB(d *sql.DB, driverName string) db.DB {
// remove the suffix from the instrumented driver created by the older
// Grafana code
driverName = strings.TrimSuffix(driverName, "WithHooks")
return sqldb{
ret := sqlDB{
DB: d,
driverName: driverName,
}
ret.WithTxFunc = db.NewWithTxFunc(ret.BeginTx)
return ret
}
type sqldb struct {
type sqlDB struct {
*sql.DB
db.WithTxFunc
driverName string
}
func (d sqldb) DriverName() string {
func (d sqlDB) DriverName() string {
return d.driverName
}
func (d sqldb) BeginTx(ctx context.Context, opts *sql.TxOptions) (db.Tx, error) {
t, err := d.DB.BeginTx(ctx, opts)
if err != nil {
return nil, err
}
return tx{
Tx: t,
}, nil
}
func (d sqldb) WithTx(ctx context.Context, opts *sql.TxOptions, f db.TxFunc) error {
t, err := d.BeginTx(ctx, opts)
if err != nil {
return fmt.Errorf("begin tx: %w", err)
}
if err := f(ctx, t); err != nil {
if rollbackErr := t.Rollback(); rollbackErr != nil {
return fmt.Errorf("tx err: %w; rollback err: %w", err, rollbackErr)
}
return fmt.Errorf("tx err: %w", err)
}
if err = t.Commit(); err != nil {
return fmt.Errorf("commit err: %w", err)
}
return nil
}
type tx struct {
*sql.Tx
func (d sqlDB) BeginTx(ctx context.Context, opts *sql.TxOptions) (db.Tx, error) {
return d.DB.BeginTx(ctx, opts)
}