Make DB connection thread safe
This commit is contained in:
parent
cf932e6691
commit
88bd90ef89
|
@ -25,6 +25,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"github.com/jmoiron/sqlx"
|
"github.com/jmoiron/sqlx"
|
||||||
"go.elara.ws/lure/internal/config"
|
"go.elara.ws/lure/internal/config"
|
||||||
|
@ -66,6 +67,7 @@ type version struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
mu sync.Mutex
|
||||||
conn *sqlx.DB
|
conn *sqlx.DB
|
||||||
closed = true
|
closed = true
|
||||||
)
|
)
|
||||||
|
@ -76,13 +78,18 @@ var (
|
||||||
func DB(ctx context.Context) *sqlx.DB {
|
func DB(ctx context.Context) *sqlx.DB {
|
||||||
log := loggerctx.From(ctx)
|
log := loggerctx.From(ctx)
|
||||||
if conn != nil && !closed {
|
if conn != nil && !closed {
|
||||||
return conn
|
return getConn()
|
||||||
}
|
}
|
||||||
db, err := open(ctx, config.GetPaths(ctx).DBPath)
|
_, err := open(ctx, config.GetPaths(ctx).DBPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("Error opening database").Err(err).Send()
|
log.Fatal("Error opening database").Err(err).Send()
|
||||||
}
|
}
|
||||||
conn = db
|
return getConn()
|
||||||
|
}
|
||||||
|
|
||||||
|
func getConn() *sqlx.DB {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
return conn
|
return conn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,8 +98,11 @@ func open(ctx context.Context, dsn string) (*sqlx.DB, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mu.Lock()
|
||||||
conn = db
|
conn = db
|
||||||
closed = false
|
closed = false
|
||||||
|
mu.Unlock()
|
||||||
|
|
||||||
err = initDB(ctx, dsn)
|
err = initDB(ctx, dsn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in New Issue