db locks rather than returning dbInUse errs

main
Bel LaPointe 2025-05-08 11:31:37 -06:00
parent 786ea3ef8f
commit 3ac7ae63b6
2 changed files with 10 additions and 7 deletions

View File

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"path" "path"
"strings" "strings"
"sync"
"testing" "testing"
"time" "time"
@ -25,7 +26,7 @@ func Test(t *testing.T, ctx context.Context) context.Context {
t.Fatalf("failed to inject db %s: %v", p, err) t.Fatalf("failed to inject db %s: %v", p, err)
} }
t.Cleanup(func() { t.Cleanup(func() {
db, err := extract(ctx) db, _, err := extract(ctx)
if err != nil { if err != nil {
return return
} }
@ -35,7 +36,7 @@ func Test(t *testing.T, ctx context.Context) context.Context {
} }
func Inject(ctx context.Context, conn string) (context.Context, error) { func Inject(ctx context.Context, conn string) (context.Context, error) {
if _, err := extract(ctx); err == nil { if _, _, err := extract(ctx); err == nil {
return ctx, nil return ctx, nil
} }
@ -69,13 +70,13 @@ func Inject(ctx context.Context, conn string) (context.Context, error) {
return ctx, err return ctx, err
} }
return context.WithValue(ctx, ctxKey, db), ctx.Err() return context.WithValue(context.WithValue(ctx, ctxKey+"_lock", &sync.Mutex{}), ctxKey, db), ctx.Err()
} }
func extract(ctx context.Context) (*sql.DB, error) { func extract(ctx context.Context) (*sql.DB, *sync.Mutex, error) {
db := ctx.Value(ctxKey) db := ctx.Value(ctxKey)
if db == nil { if db == nil {
return nil, fmt.Errorf("db not injected") return nil, nil, fmt.Errorf("db not injected")
} }
return db.(*sql.DB), nil return db.(*sql.DB), ctx.Value(ctxKey + "_lock").(*sync.Mutex), nil
} }

View File

@ -129,9 +129,11 @@ func Exec(ctx context.Context, q string, args ...any) error {
} }
func with(ctx context.Context, foo func(*sql.DB) error) error { func with(ctx context.Context, foo func(*sql.DB) error) error {
db, err := extract(ctx) db, lock, err := extract(ctx)
if err != nil { if err != nil {
return err return err
} }
lock.Lock()
defer lock.Unlock()
return foo(db) return foo(db)
} }